| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const AsyncDependencyToInitialChunkError = require("./AsyncDependencyToInitialChunkError"); | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | const { connectChunkGroupParentAndChild } = require("./GraphHelpers"); | 
					
						
							| 
									
										
										
										
											2020-10-05 22:57:31 +08:00
										 |  |  | const ModuleGraphConnection = require("./ModuleGraphConnection"); | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | const { getEntryRuntime, mergeRuntime } = require("./util/runtime"); | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** @typedef {import("./AsyncDependenciesBlock")} AsyncDependenciesBlock */ | 
					
						
							|  |  |  | /** @typedef {import("./Chunk")} Chunk */ | 
					
						
							|  |  |  | /** @typedef {import("./ChunkGroup")} ChunkGroup */ | 
					
						
							|  |  |  | /** @typedef {import("./Compilation")} Compilation */ | 
					
						
							|  |  |  | /** @typedef {import("./DependenciesBlock")} DependenciesBlock */ | 
					
						
							|  |  |  | /** @typedef {import("./Dependency")} Dependency */ | 
					
						
							| 
									
										
										
										
											2023-06-22 08:59:10 +08:00
										 |  |  | /** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */ | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | /** @typedef {import("./Entrypoint")} Entrypoint */ | 
					
						
							|  |  |  | /** @typedef {import("./Module")} Module */ | 
					
						
							|  |  |  | /** @typedef {import("./ModuleGraph")} ModuleGraph */ | 
					
						
							| 
									
										
										
										
											2020-10-05 22:57:31 +08:00
										 |  |  | /** @typedef {import("./ModuleGraphConnection").ConnectionState} ConnectionState */ | 
					
						
							| 
									
										
										
										
											2019-07-26 15:56:55 +08:00
										 |  |  | /** @typedef {import("./logging/Logger").Logger} Logger */ | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | /** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */ | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  |  * @typedef {object} QueueItem | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  |  * @property {number} action | 
					
						
							|  |  |  |  * @property {DependenciesBlock} block | 
					
						
							|  |  |  |  * @property {Module} module | 
					
						
							|  |  |  |  * @property {Chunk} chunk | 
					
						
							|  |  |  |  * @property {ChunkGroup} chunkGroup | 
					
						
							| 
									
										
										
										
											2020-01-28 22:44:03 +08:00
										 |  |  |  * @property {ChunkGroupInfo} chunkGroupInfo | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  |  * @typedef {object} ChunkGroupInfo | 
					
						
							| 
									
										
										
										
											2019-08-27 18:25:02 +08:00
										 |  |  |  * @property {ChunkGroup} chunkGroup the chunk group | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  |  * @property {RuntimeSpec} runtime the runtimes | 
					
						
							| 
									
										
										
										
											2024-09-04 12:52:18 +08:00
										 |  |  |  * @property {boolean} initialized is this chunk group initialized | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  |  * @property {bigint | undefined} minAvailableModules current minimal set of modules available at this point | 
					
						
							|  |  |  |  * @property {bigint[]} availableModulesToBeMerged enqueued updates to the minimal set of available modules | 
					
						
							| 
									
										
										
										
											2020-01-29 01:28:53 +08:00
										 |  |  |  * @property {Set<Module>=} skippedItems modules that were skipped because module is already available in parent chunks (need to reconsider when minAvailableModules is shrinking) | 
					
						
							| 
									
										
										
										
											2024-02-07 19:35:11 +08:00
										 |  |  |  * @property {Set<[Module, ModuleGraphConnection[]]>=} skippedModuleConnections referenced modules that where skipped because they were not active in this runtime | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  |  * @property {bigint | undefined} resultingAvailableModules set of modules available including modules from this chunk group | 
					
						
							| 
									
										
										
										
											2023-06-22 08:59:10 +08:00
										 |  |  |  * @property {Set<ChunkGroupInfo> | undefined} children set of children chunk groups, that will be revisited when availableModules shrink | 
					
						
							|  |  |  |  * @property {Set<ChunkGroupInfo> | undefined} availableSources set of chunk groups that are the source for minAvailableModules | 
					
						
							|  |  |  |  * @property {Set<ChunkGroupInfo> | undefined} availableChildren set of chunk groups which depend on the this chunk group as availableSource | 
					
						
							| 
									
										
										
										
											2020-01-28 22:13:10 +08:00
										 |  |  |  * @property {number} preOrderIndex next pre order index | 
					
						
							|  |  |  |  * @property {number} postOrderIndex next post order index | 
					
						
							| 
									
										
										
										
											2021-11-10 21:23:03 +08:00
										 |  |  |  * @property {boolean} chunkLoading has a chunk loading mechanism | 
					
						
							|  |  |  |  * @property {boolean} asyncChunks create async chunks | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  |  * @typedef {object} BlockChunkGroupConnection | 
					
						
							| 
									
										
										
										
											2020-09-17 15:55:42 +08:00
										 |  |  |  * @property {ChunkGroupInfo} originChunkGroupInfo origin chunk group | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  |  * @property {ChunkGroup} chunkGroup referenced chunk group | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | /** @typedef {(Module | ConnectionState | ModuleGraphConnection)[]} BlockModulesInTuples */ | 
					
						
							|  |  |  | /** @typedef {(Module | ConnectionState | ModuleGraphConnection[])[]} BlockModulesInFlattenTuples */ | 
					
						
							|  |  |  | /** @typedef {Map<DependenciesBlock, BlockModulesInFlattenTuples>} BlockModulesMap */ | 
					
						
							|  |  |  | /** @typedef {Map<Chunk, bigint>} MaskByChunk */ | 
					
						
							|  |  |  | /** @typedef {Set<DependenciesBlock>} BlocksWithNestedBlocks */ | 
					
						
							|  |  |  | /** @typedef {Map<AsyncDependenciesBlock, BlockChunkGroupConnection[]>} BlockConnections */ | 
					
						
							|  |  |  | /** @typedef {Map<ChunkGroup, ChunkGroupInfo>} ChunkGroupInfoMap */ | 
					
						
							|  |  |  | /** @typedef {Set<ChunkGroup>} AllCreatedChunkGroups */ | 
					
						
							|  |  |  | /** @typedef {Map<Entrypoint, Module[]>} InputEntrypointsAndModules */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | const ZERO_BIGINT = BigInt(0); | 
					
						
							|  |  |  | const ONE_BIGINT = BigInt(1); | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  |  * @param {bigint} mask The mask to test | 
					
						
							|  |  |  |  * @param {number} ordinal The ordinal of the bit to test | 
					
						
							|  |  |  |  * @returns {boolean} If the ordinal-th bit is set in the mask | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | const isOrdinalSetInMask = (mask, ordinal) => | 
					
						
							|  |  |  | 	BigInt.asUintN(1, mask >> BigInt(ordinal)) !== ZERO_BIGINT; | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-07 19:35:11 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {ModuleGraphConnection[]} connections list of connections | 
					
						
							|  |  |  |  * @param {RuntimeSpec} runtime for which runtime | 
					
						
							|  |  |  |  * @returns {ConnectionState} connection state | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const getActiveStateOfConnections = (connections, runtime) => { | 
					
						
							|  |  |  | 	let merged = connections[0].getActiveState(runtime); | 
					
						
							|  |  |  | 	if (merged === true) return true; | 
					
						
							|  |  |  | 	for (let i = 1; i < connections.length; i++) { | 
					
						
							|  |  |  | 		const c = connections[i]; | 
					
						
							|  |  |  | 		merged = ModuleGraphConnection.addConnectionStates( | 
					
						
							|  |  |  | 			merged, | 
					
						
							|  |  |  | 			c.getActiveState(runtime) | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 		if (merged === true) return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return merged; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {Module} module module | 
					
						
							|  |  |  |  * @param {ModuleGraph} moduleGraph module graph | 
					
						
							|  |  |  |  * @param {RuntimeSpec} runtime runtime | 
					
						
							|  |  |  |  * @param {BlockModulesMap} blockModulesMap block modules map | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | const extractBlockModules = (module, moduleGraph, runtime, blockModulesMap) => { | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 	/** @type {DependenciesBlock | undefined} */ | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 	let blockCache; | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 	/** @type {BlockModulesInTuples | undefined} */ | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 	let modules; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 	/** @type {BlockModulesInTuples[]} */ | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 	const arrays = []; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 	/** @type {DependenciesBlock[]} */ | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 	const queue = [module]; | 
					
						
							|  |  |  | 	while (queue.length > 0) { | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 		const block = /** @type {DependenciesBlock} */ (queue.pop()); | 
					
						
							|  |  |  | 		/** @type {Module[]} */ | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 		const arr = []; | 
					
						
							|  |  |  | 		arrays.push(arr); | 
					
						
							|  |  |  | 		blockModulesMap.set(block, arr); | 
					
						
							|  |  |  | 		for (const b of block.blocks) { | 
					
						
							|  |  |  | 			queue.push(b); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 	for (const connection of moduleGraph.getOutgoingConnections(module)) { | 
					
						
							|  |  |  | 		const d = connection.dependency; | 
					
						
							|  |  |  | 		// We skip connections without dependency
 | 
					
						
							|  |  |  | 		if (!d) continue; | 
					
						
							|  |  |  | 		const m = connection.module; | 
					
						
							|  |  |  | 		// We skip connections without Module pointer
 | 
					
						
							|  |  |  | 		if (!m) continue; | 
					
						
							|  |  |  | 		// We skip weak connections
 | 
					
						
							|  |  |  | 		if (connection.weak) continue; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		const block = moduleGraph.getParentBlock(d); | 
					
						
							|  |  |  | 		let index = moduleGraph.getParentBlockIndex(d); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// deprecated fallback
 | 
					
						
							|  |  |  | 		if (index < 0) { | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 			index = /** @type {DependenciesBlock} */ (block).dependencies.indexOf(d); | 
					
						
							| 
									
										
										
										
											2019-10-30 07:09:51 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 		if (blockCache !== block) { | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 			modules = | 
					
						
							|  |  |  | 				/** @type {BlockModulesInTuples} */ | 
					
						
							|  |  |  | 				( | 
					
						
							|  |  |  | 					blockModulesMap.get( | 
					
						
							|  |  |  | 						(blockCache = /** @type {DependenciesBlock} */ (block)) | 
					
						
							|  |  |  | 					) | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-07 19:35:11 +08:00
										 |  |  | 		const i = index * 3; | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 		/** @type {BlockModulesInTuples} */ | 
					
						
							|  |  |  | 		(modules)[i] = m; | 
					
						
							|  |  |  | 		/** @type {BlockModulesInTuples} */ | 
					
						
							|  |  |  | 		(modules)[i + 1] = connection.getActiveState(runtime); | 
					
						
							|  |  |  | 		/** @type {BlockModulesInTuples} */ | 
					
						
							|  |  |  | 		(modules)[i + 2] = connection; | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (const modules of arrays) { | 
					
						
							|  |  |  | 		if (modules.length === 0) continue; | 
					
						
							|  |  |  | 		let indexMap; | 
					
						
							|  |  |  | 		let length = 0; | 
					
						
							| 
									
										
										
										
											2024-02-07 19:35:11 +08:00
										 |  |  | 		outer: for (let j = 0; j < modules.length; j += 3) { | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 			const m = modules[j]; | 
					
						
							|  |  |  | 			if (m === undefined) continue; | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 			const state = /** @type {ConnectionState} */ (modules[j + 1]); | 
					
						
							|  |  |  | 			const connection = /** @type {ModuleGraphConnection} */ (modules[j + 2]); | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 			if (indexMap === undefined) { | 
					
						
							|  |  |  | 				let i = 0; | 
					
						
							| 
									
										
										
										
											2024-02-07 19:35:11 +08:00
										 |  |  | 				for (; i < length; i += 3) { | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 					if (modules[i] === m) { | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 						const merged = /** @type {ConnectionState} */ (modules[i + 1]); | 
					
						
							|  |  |  | 						/** @type {ModuleGraphConnection[]} */ | 
					
						
							|  |  |  | 						(/** @type {unknown} */ (modules[i + 2])).push(connection); | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 						if (merged === true) continue outer; | 
					
						
							|  |  |  | 						modules[i + 1] = ModuleGraphConnection.addConnectionStates( | 
					
						
							|  |  |  | 							merged, | 
					
						
							|  |  |  | 							state | 
					
						
							|  |  |  | 						); | 
					
						
							| 
									
										
										
										
											2024-02-07 19:35:11 +08:00
										 |  |  | 						continue outer; | 
					
						
							| 
									
										
										
										
											2019-10-30 07:09:51 +08:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 				modules[length] = m; | 
					
						
							|  |  |  | 				length++; | 
					
						
							|  |  |  | 				modules[length] = state; | 
					
						
							|  |  |  | 				length++; | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 				/** @type {ModuleGraphConnection[]} */ | 
					
						
							|  |  |  | 				(/** @type {unknown} */ (modules[length])) = [connection]; | 
					
						
							| 
									
										
										
										
											2024-02-07 19:35:11 +08:00
										 |  |  | 				length++; | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 				if (length > 30) { | 
					
						
							|  |  |  | 					// To avoid worse case performance, we will use an index map for
 | 
					
						
							|  |  |  | 					// linear cost access, which allows to maintain O(n) complexity
 | 
					
						
							|  |  |  | 					// while keeping allocations down to a minimum
 | 
					
						
							|  |  |  | 					indexMap = new Map(); | 
					
						
							| 
									
										
										
										
											2024-02-07 19:35:11 +08:00
										 |  |  | 					for (let i = 0; i < length; i += 3) { | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 						indexMap.set(modules[i], i + 1); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				const idx = indexMap.get(m); | 
					
						
							|  |  |  | 				if (idx !== undefined) { | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 					const merged = /** @type {ConnectionState} */ (modules[idx]); | 
					
						
							|  |  |  | 					/** @type {ModuleGraphConnection[]} */ | 
					
						
							|  |  |  | 					(/** @type {unknown} */ (modules[idx + 1])).push(connection); | 
					
						
							| 
									
										
										
										
											2024-07-31 09:37:24 +08:00
										 |  |  | 					if (merged === true) continue; | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 					modules[idx] = ModuleGraphConnection.addConnectionStates( | 
					
						
							|  |  |  | 						merged, | 
					
						
							|  |  |  | 						state | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					modules[length] = m; | 
					
						
							|  |  |  | 					length++; | 
					
						
							|  |  |  | 					modules[length] = state; | 
					
						
							|  |  |  | 					indexMap.set(m, length); | 
					
						
							|  |  |  | 					length++; | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 					/** @type {ModuleGraphConnection[]} */ | 
					
						
							|  |  |  | 					( | 
					
						
							|  |  |  | 						/** @type {unknown} */ | 
					
						
							|  |  |  | 						(modules[length]) | 
					
						
							|  |  |  | 					) = [connection]; | 
					
						
							| 
									
										
										
										
											2024-02-07 19:35:11 +08:00
										 |  |  | 					length++; | 
					
						
							| 
									
										
										
										
											2019-10-30 07:09:51 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 		modules.length = length; | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2019-07-26 15:56:55 +08:00
										 |  |  |  * @param {Logger} logger a logger | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  |  * @param {Compilation} compilation the compilation | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  |  * @param {InputEntrypointsAndModules} inputEntrypointsAndModules chunk groups which are processed with the modules | 
					
						
							|  |  |  |  * @param {ChunkGroupInfoMap} chunkGroupInfoMap mapping from chunk group to available modules | 
					
						
							|  |  |  |  * @param {BlockConnections} blockConnections connection for blocks | 
					
						
							|  |  |  |  * @param {BlocksWithNestedBlocks} blocksWithNestedBlocks flag for blocks that have nested blocks | 
					
						
							|  |  |  |  * @param {AllCreatedChunkGroups} allCreatedChunkGroups filled with all chunk groups that are created here | 
					
						
							|  |  |  |  * @param {MaskByChunk} maskByChunk module content mask by chunk | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | const visitModules = ( | 
					
						
							| 
									
										
										
										
											2019-07-26 15:56:55 +08:00
										 |  |  | 	logger, | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 	compilation, | 
					
						
							| 
									
										
										
										
											2020-05-23 22:08:51 +08:00
										 |  |  | 	inputEntrypointsAndModules, | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 	chunkGroupInfoMap, | 
					
						
							| 
									
										
										
										
											2020-09-17 15:55:42 +08:00
										 |  |  | 	blockConnections, | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 	blocksWithNestedBlocks, | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 	allCreatedChunkGroups, | 
					
						
							|  |  |  | 	maskByChunk | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | ) => { | 
					
						
							| 
									
										
										
										
											2021-10-06 01:13:28 +08:00
										 |  |  | 	const { moduleGraph, chunkGraph, moduleMemCaches } = compilation; | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-16 22:04:11 +08:00
										 |  |  | 	/** @type {Map<RuntimeSpec, BlockModulesMap>} */ | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 	const blockModulesRuntimeMap = new Map(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 	/** @type {BlockModulesMap | undefined} */ | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 	let blockModulesMap; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 	/** @type {Map<Module, number>} */ | 
					
						
							|  |  |  | 	const ordinalByModule = new Map(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {Module} module The module to look up | 
					
						
							|  |  |  | 	 * @returns {number} The ordinal of the module in masks | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	const getModuleOrdinal = module => { | 
					
						
							|  |  |  | 		let ordinal = ordinalByModule.get(module); | 
					
						
							|  |  |  | 		if (ordinal === undefined) { | 
					
						
							|  |  |  | 			ordinal = ordinalByModule.size; | 
					
						
							|  |  |  | 			ordinalByModule.set(module, ordinal); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return ordinal; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (const chunk of compilation.chunks) { | 
					
						
							|  |  |  | 		let mask = ZERO_BIGINT; | 
					
						
							|  |  |  | 		for (const m of chunkGraph.getChunkModulesIterable(chunk)) { | 
					
						
							|  |  |  | 			mask |= ONE_BIGINT << BigInt(getModuleOrdinal(m)); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		maskByChunk.set(chunk, mask); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {DependenciesBlock} block block | 
					
						
							|  |  |  | 	 * @param {RuntimeSpec} runtime runtime | 
					
						
							| 
									
										
										
										
											2025-04-16 22:04:11 +08:00
										 |  |  | 	 * @returns {BlockModulesInFlattenTuples | undefined} block modules in flatten tuples | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 	 */ | 
					
						
							|  |  |  | 	const getBlockModules = (block, runtime) => { | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 		blockModulesMap = blockModulesRuntimeMap.get(runtime); | 
					
						
							|  |  |  | 		if (blockModulesMap === undefined) { | 
					
						
							| 
									
										
										
										
											2025-04-16 22:04:11 +08:00
										 |  |  | 			/** @type {BlockModulesMap} */ | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 			blockModulesMap = new Map(); | 
					
						
							|  |  |  | 			blockModulesRuntimeMap.set(runtime, blockModulesMap); | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		let blockModules = blockModulesMap.get(block); | 
					
						
							|  |  |  | 		if (blockModules !== undefined) return blockModules; | 
					
						
							| 
									
										
										
										
											2021-10-06 01:13:28 +08:00
										 |  |  | 		const module = /** @type {Module} */ (block.getRootBlock()); | 
					
						
							|  |  |  | 		const memCache = moduleMemCaches && moduleMemCaches.get(module); | 
					
						
							|  |  |  | 		if (memCache !== undefined) { | 
					
						
							| 
									
										
										
										
											2025-04-16 22:04:11 +08:00
										 |  |  | 			/** @type {BlockModulesMap} */ | 
					
						
							| 
									
										
										
										
											2021-10-06 01:13:28 +08:00
										 |  |  | 			const map = memCache.provide( | 
					
						
							|  |  |  | 				"bundleChunkGraph.blockModules", | 
					
						
							|  |  |  | 				runtime, | 
					
						
							|  |  |  | 				() => { | 
					
						
							| 
									
										
										
										
											2021-10-06 16:12:48 +08:00
										 |  |  | 					logger.time("visitModules: prepare"); | 
					
						
							| 
									
										
										
										
											2021-10-06 01:13:28 +08:00
										 |  |  | 					const map = new Map(); | 
					
						
							|  |  |  | 					extractBlockModules(module, moduleGraph, runtime, map); | 
					
						
							| 
									
										
										
										
											2021-10-06 16:12:48 +08:00
										 |  |  | 					logger.timeAggregate("visitModules: prepare"); | 
					
						
							| 
									
										
										
										
											2021-10-06 01:13:28 +08:00
										 |  |  | 					return map; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 			for (const [block, blockModules] of map) | 
					
						
							|  |  |  | 				blockModulesMap.set(block, blockModules); | 
					
						
							| 
									
										
										
										
											2021-10-06 16:12:48 +08:00
										 |  |  | 			return map.get(block); | 
					
						
							| 
									
										
										
										
											2021-10-06 01:13:28 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-07-31 04:21:27 +08:00
										 |  |  | 		logger.time("visitModules: prepare"); | 
					
						
							|  |  |  | 		extractBlockModules(module, moduleGraph, runtime, blockModulesMap); | 
					
						
							|  |  |  | 		blockModules = | 
					
						
							|  |  |  | 			/** @type {BlockModulesInFlattenTuples} */ | 
					
						
							|  |  |  | 			(blockModulesMap.get(block)); | 
					
						
							|  |  |  | 		logger.timeAggregate("visitModules: prepare"); | 
					
						
							|  |  |  | 		return blockModules; | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-13 20:39:55 +08:00
										 |  |  | 	let statProcessedQueueItems = 0; | 
					
						
							|  |  |  | 	let statProcessedBlocks = 0; | 
					
						
							|  |  |  | 	let statConnectedChunkGroups = 0; | 
					
						
							|  |  |  | 	let statProcessedChunkGroupsForMerging = 0; | 
					
						
							|  |  |  | 	let statMergedAvailableModuleSets = 0; | 
					
						
							| 
									
										
										
										
											2024-07-31 04:09:42 +08:00
										 |  |  | 	const statForkedAvailableModules = 0; | 
					
						
							|  |  |  | 	const statForkedAvailableModulesCount = 0; | 
					
						
							|  |  |  | 	const statForkedAvailableModulesCountPlus = 0; | 
					
						
							|  |  |  | 	const statForkedMergedModulesCount = 0; | 
					
						
							|  |  |  | 	const statForkedMergedModulesCountPlus = 0; | 
					
						
							|  |  |  | 	const statForkedResultModulesCount = 0; | 
					
						
							| 
									
										
										
										
											2020-08-13 20:39:55 +08:00
										 |  |  | 	let statChunkGroupInfoUpdated = 0; | 
					
						
							|  |  |  | 	let statChildChunkGroupsReconnected = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-26 21:51:40 +08:00
										 |  |  | 	let nextChunkGroupIndex = 0; | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 	let nextFreeModulePreOrderIndex = 0; | 
					
						
							|  |  |  | 	let nextFreeModulePostOrderIndex = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-28 22:44:03 +08:00
										 |  |  | 	/** @type {Map<DependenciesBlock, ChunkGroupInfo>} */ | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 	const blockChunkGroups = new Map(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-02 16:42:51 +08:00
										 |  |  | 	/** @type {Map<ChunkGroupInfo, Set<DependenciesBlock>>} */ | 
					
						
							|  |  |  | 	const blocksByChunkGroups = new Map(); | 
					
						
							| 
									
										
										
										
											2024-01-26 16:21:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-28 22:44:03 +08:00
										 |  |  | 	/** @type {Map<string, ChunkGroupInfo>} */ | 
					
						
							|  |  |  | 	const namedChunkGroups = new Map(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 	/** @type {Map<string, ChunkGroupInfo>} */ | 
					
						
							|  |  |  | 	const namedAsyncEntrypoints = new Map(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-26 16:21:05 +08:00
										 |  |  | 	/** @type {Set<ChunkGroupInfo>} */ | 
					
						
							|  |  |  | 	const outdatedOrderIndexChunkGroups = new Set(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 	const ADD_AND_ENTER_ENTRY_MODULE = 0; | 
					
						
							|  |  |  | 	const ADD_AND_ENTER_MODULE = 1; | 
					
						
							|  |  |  | 	const ENTER_MODULE = 2; | 
					
						
							|  |  |  | 	const PROCESS_BLOCK = 3; | 
					
						
							|  |  |  | 	const PROCESS_ENTRY_BLOCK = 4; | 
					
						
							|  |  |  | 	const LEAVE_MODULE = 5; | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-17 04:22:05 +08:00
										 |  |  | 	/** @type {QueueItem[]} */ | 
					
						
							|  |  |  | 	let queue = []; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-04 12:52:18 +08:00
										 |  |  | 	/** @type {Map<ChunkGroupInfo, Set<[ChunkGroupInfo, QueueItem | null]>>} */ | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 	const queueConnect = new Map(); | 
					
						
							|  |  |  | 	/** @type {Set<ChunkGroupInfo>} */ | 
					
						
							|  |  |  | 	const chunkGroupsForCombining = new Set(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Fill queue with entrypoint modules
 | 
					
						
							|  |  |  | 	// Create ChunkGroupInfo for entrypoints
 | 
					
						
							| 
									
										
										
										
											2020-05-23 22:08:51 +08:00
										 |  |  | 	for (const [chunkGroup, modules] of inputEntrypointsAndModules) { | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 		const runtime = getEntryRuntime( | 
					
						
							|  |  |  | 			compilation, | 
					
						
							| 
									
										
										
										
											2023-06-22 08:59:10 +08:00
										 |  |  | 			/** @type {string} */ (chunkGroup.name), | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 			chunkGroup.options | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 		/** @type {ChunkGroupInfo} */ | 
					
						
							| 
									
										
										
										
											2020-01-28 22:44:03 +08:00
										 |  |  | 		const chunkGroupInfo = { | 
					
						
							| 
									
										
										
										
											2024-09-04 12:52:18 +08:00
										 |  |  | 			initialized: false, | 
					
						
							| 
									
										
										
										
											2020-01-28 22:44:03 +08:00
										 |  |  | 			chunkGroup, | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 			runtime, | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 			minAvailableModules: undefined, | 
					
						
							| 
									
										
										
										
											2020-01-28 22:44:03 +08:00
										 |  |  | 			availableModulesToBeMerged: [], | 
					
						
							| 
									
										
										
										
											2020-01-29 01:28:53 +08:00
										 |  |  | 			skippedItems: undefined, | 
					
						
							| 
									
										
										
										
											2020-01-28 22:44:03 +08:00
										 |  |  | 			resultingAvailableModules: undefined, | 
					
						
							|  |  |  | 			children: undefined, | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 			availableSources: undefined, | 
					
						
							|  |  |  | 			availableChildren: undefined, | 
					
						
							| 
									
										
										
										
											2020-01-28 22:44:03 +08:00
										 |  |  | 			preOrderIndex: 0, | 
					
						
							| 
									
										
										
										
											2021-11-10 02:57:57 +08:00
										 |  |  | 			postOrderIndex: 0, | 
					
						
							| 
									
										
										
										
											2021-11-10 21:23:03 +08:00
										 |  |  | 			chunkLoading: | 
					
						
							|  |  |  | 				chunkGroup.options.chunkLoading !== undefined | 
					
						
							|  |  |  | 					? chunkGroup.options.chunkLoading !== false | 
					
						
							|  |  |  | 					: compilation.outputOptions.chunkLoading !== false, | 
					
						
							|  |  |  | 			asyncChunks: | 
					
						
							|  |  |  | 				chunkGroup.options.asyncChunks !== undefined | 
					
						
							|  |  |  | 					? chunkGroup.options.asyncChunks | 
					
						
							|  |  |  | 					: compilation.outputOptions.asyncChunks !== false | 
					
						
							| 
									
										
										
										
											2020-01-28 22:44:03 +08:00
										 |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2019-09-26 21:51:40 +08:00
										 |  |  | 		chunkGroup.index = nextChunkGroupIndex++; | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 		if (chunkGroup.getNumberOfParents() > 0) { | 
					
						
							|  |  |  | 			// minAvailableModules for child entrypoints are unknown yet, set to undefined.
 | 
					
						
							|  |  |  | 			// This means no module is added until other sets are merged into
 | 
					
						
							|  |  |  | 			// this minAvailableModules (by the parent entrypoints)
 | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 			const skippedItems = new Set(modules); | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 			chunkGroupInfo.skippedItems = skippedItems; | 
					
						
							|  |  |  | 			chunkGroupsForCombining.add(chunkGroupInfo); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			// The application may start here: We start with an empty list of available modules
 | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 			chunkGroupInfo.minAvailableModules = ZERO_BIGINT; | 
					
						
							| 
									
										
										
										
											2020-07-21 16:22:10 +08:00
										 |  |  | 			const chunk = chunkGroup.getEntrypointChunk(); | 
					
						
							| 
									
										
										
										
											2020-05-23 22:08:51 +08:00
										 |  |  | 			for (const module of modules) { | 
					
						
							|  |  |  | 				queue.push({ | 
					
						
							|  |  |  | 					action: ADD_AND_ENTER_MODULE, | 
					
						
							|  |  |  | 					block: module, | 
					
						
							|  |  |  | 					module, | 
					
						
							|  |  |  | 					chunk, | 
					
						
							|  |  |  | 					chunkGroup, | 
					
						
							|  |  |  | 					chunkGroupInfo | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-01-28 22:44:03 +08:00
										 |  |  | 		chunkGroupInfoMap.set(chunkGroup, chunkGroupInfo); | 
					
						
							|  |  |  | 		if (chunkGroup.name) { | 
					
						
							|  |  |  | 			namedChunkGroups.set(chunkGroup.name, chunkGroupInfo); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-01-17 04:22:05 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 	// Fill availableSources with parent-child dependencies between entrypoints
 | 
					
						
							|  |  |  | 	for (const chunkGroupInfo of chunkGroupsForCombining) { | 
					
						
							|  |  |  | 		const { chunkGroup } = chunkGroupInfo; | 
					
						
							|  |  |  | 		chunkGroupInfo.availableSources = new Set(); | 
					
						
							|  |  |  | 		for (const parent of chunkGroup.parentsIterable) { | 
					
						
							| 
									
										
										
										
											2023-06-22 08:59:10 +08:00
										 |  |  | 			const parentChunkGroupInfo = | 
					
						
							|  |  |  | 				/** @type {ChunkGroupInfo} */ | 
					
						
							|  |  |  | 				(chunkGroupInfoMap.get(parent)); | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 			chunkGroupInfo.availableSources.add(parentChunkGroupInfo); | 
					
						
							|  |  |  | 			if (parentChunkGroupInfo.availableChildren === undefined) { | 
					
						
							|  |  |  | 				parentChunkGroupInfo.availableChildren = new Set(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			parentChunkGroupInfo.availableChildren.add(chunkGroupInfo); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-01-17 04:22:05 +08:00
										 |  |  | 	// pop() is used to read from the queue
 | 
					
						
							|  |  |  | 	// so it need to be reversed to be iterated in
 | 
					
						
							|  |  |  | 	// correct order
 | 
					
						
							|  |  |  | 	queue.reverse(); | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-26 14:05:16 +08:00
										 |  |  | 	/** @type {Set<ChunkGroupInfo>} */ | 
					
						
							|  |  |  | 	const outdatedChunkGroupInfo = new Set(); | 
					
						
							| 
									
										
										
										
											2024-10-02 09:21:28 +08:00
										 |  |  | 	/** @type {Set<[ChunkGroupInfo, QueueItem | null]>} */ | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 	const chunkGroupsForMerging = new Set(); | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 	/** @type {QueueItem[]} */ | 
					
						
							|  |  |  | 	let queueDelayed = []; | 
					
						
							| 
									
										
										
										
											2019-07-26 14:05:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-07 19:35:11 +08:00
										 |  |  | 	/** @type {[Module, ModuleGraphConnection[]][]} */ | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 	const skipConnectionBuffer = []; | 
					
						
							| 
									
										
										
										
											2020-01-29 01:28:53 +08:00
										 |  |  | 	/** @type {Module[]} */ | 
					
						
							|  |  |  | 	const skipBuffer = []; | 
					
						
							|  |  |  | 	/** @type {QueueItem[]} */ | 
					
						
							|  |  |  | 	const queueBuffer = []; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 	/** @type {Module} */ | 
					
						
							|  |  |  | 	let module; | 
					
						
							|  |  |  | 	/** @type {Chunk} */ | 
					
						
							|  |  |  | 	let chunk; | 
					
						
							|  |  |  | 	/** @type {ChunkGroup} */ | 
					
						
							|  |  |  | 	let chunkGroup; | 
					
						
							|  |  |  | 	/** @type {DependenciesBlock} */ | 
					
						
							|  |  |  | 	let block; | 
					
						
							| 
									
										
										
										
											2020-01-28 22:13:10 +08:00
										 |  |  | 	/** @type {ChunkGroupInfo} */ | 
					
						
							|  |  |  | 	let chunkGroupInfo; | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// For each async Block in graph
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {AsyncDependenciesBlock} b iterating over each Async DepBlock | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	const iteratorBlock = b => { | 
					
						
							| 
									
										
										
										
											2020-03-18 17:13:30 +08:00
										 |  |  | 		// 1. We create a chunk group with single chunk in it for this Block
 | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 		// but only once (blockChunkGroups map)
 | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 		/** @type {ChunkGroupInfo | undefined} */ | 
					
						
							| 
									
										
										
										
											2020-01-28 22:44:03 +08:00
										 |  |  | 		let cgi = blockChunkGroups.get(b); | 
					
						
							| 
									
										
										
										
											2023-06-22 08:59:10 +08:00
										 |  |  | 		/** @type {ChunkGroup | undefined} */ | 
					
						
							| 
									
										
										
										
											2020-01-28 22:44:03 +08:00
										 |  |  | 		let c; | 
					
						
							| 
									
										
										
										
											2023-06-22 08:59:10 +08:00
										 |  |  | 		/** @type {Entrypoint | undefined} */ | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 		let entrypoint; | 
					
						
							|  |  |  | 		const entryOptions = b.groupOptions && b.groupOptions.entryOptions; | 
					
						
							| 
									
										
										
										
											2020-01-28 22:44:03 +08:00
										 |  |  | 		if (cgi === undefined) { | 
					
						
							| 
									
										
										
										
											2020-01-28 22:13:10 +08:00
										 |  |  | 			const chunkName = (b.groupOptions && b.groupOptions.name) || b.chunkName; | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 			if (entryOptions) { | 
					
						
							| 
									
										
										
										
											2023-06-22 08:59:10 +08:00
										 |  |  | 				cgi = namedAsyncEntrypoints.get(/** @type {string} */ (chunkName)); | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 				if (!cgi) { | 
					
						
							|  |  |  | 					entrypoint = compilation.addAsyncEntrypoint( | 
					
						
							|  |  |  | 						entryOptions, | 
					
						
							|  |  |  | 						module, | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 						/** @type {DependencyLocation} */ (b.loc), | 
					
						
							|  |  |  | 						/** @type {string} */ (b.request) | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 					); | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 					maskByChunk.set(entrypoint.chunks[0], ZERO_BIGINT); | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 					entrypoint.index = nextChunkGroupIndex++; | 
					
						
							|  |  |  | 					cgi = { | 
					
						
							|  |  |  | 						chunkGroup: entrypoint, | 
					
						
							| 
									
										
										
										
											2024-09-04 12:52:18 +08:00
										 |  |  | 						initialized: false, | 
					
						
							| 
									
										
										
										
											2025-03-07 21:12:22 +08:00
										 |  |  | 						runtime: | 
					
						
							|  |  |  | 							entrypoint.options.runtime || | 
					
						
							|  |  |  | 							/** @type {string | undefined} */ (entrypoint.name), | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 						minAvailableModules: ZERO_BIGINT, | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 						availableModulesToBeMerged: [], | 
					
						
							|  |  |  | 						skippedItems: undefined, | 
					
						
							|  |  |  | 						resultingAvailableModules: undefined, | 
					
						
							|  |  |  | 						children: undefined, | 
					
						
							|  |  |  | 						availableSources: undefined, | 
					
						
							|  |  |  | 						availableChildren: undefined, | 
					
						
							|  |  |  | 						preOrderIndex: 0, | 
					
						
							| 
									
										
										
										
											2021-11-10 02:57:57 +08:00
										 |  |  | 						postOrderIndex: 0, | 
					
						
							| 
									
										
										
										
											2021-11-10 21:23:03 +08:00
										 |  |  | 						chunkLoading: | 
					
						
							| 
									
										
										
										
											2021-11-10 02:57:57 +08:00
										 |  |  | 							entryOptions.chunkLoading !== undefined | 
					
						
							|  |  |  | 								? entryOptions.chunkLoading !== false | 
					
						
							| 
									
										
										
										
											2021-11-10 21:23:03 +08:00
										 |  |  | 								: chunkGroupInfo.chunkLoading, | 
					
						
							|  |  |  | 						asyncChunks: | 
					
						
							|  |  |  | 							entryOptions.asyncChunks !== undefined | 
					
						
							|  |  |  | 								? entryOptions.asyncChunks | 
					
						
							|  |  |  | 								: chunkGroupInfo.asyncChunks | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 					}; | 
					
						
							| 
									
										
										
										
											2025-03-07 21:12:22 +08:00
										 |  |  | 					chunkGroupInfoMap.set( | 
					
						
							|  |  |  | 						entrypoint, | 
					
						
							|  |  |  | 						/** @type {ChunkGroupInfo} */ | 
					
						
							|  |  |  | 						(cgi) | 
					
						
							|  |  |  | 					); | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					chunkGraph.connectBlockAndChunkGroup(b, entrypoint); | 
					
						
							|  |  |  | 					if (chunkName) { | 
					
						
							| 
									
										
										
										
											2025-03-07 21:12:22 +08:00
										 |  |  | 						namedAsyncEntrypoints.set( | 
					
						
							|  |  |  | 							chunkName, | 
					
						
							|  |  |  | 							/** @type {ChunkGroupInfo} */ | 
					
						
							|  |  |  | 							(cgi) | 
					
						
							|  |  |  | 						); | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					entrypoint = /** @type {Entrypoint} */ (cgi.chunkGroup); | 
					
						
							|  |  |  | 					// TODO merge entryOptions
 | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 					entrypoint.addOrigin( | 
					
						
							|  |  |  | 						module, | 
					
						
							|  |  |  | 						/** @type {DependencyLocation} */ (b.loc), | 
					
						
							|  |  |  | 						/** @type {string} */ (b.request) | 
					
						
							|  |  |  | 					); | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 					chunkGraph.connectBlockAndChunkGroup(b, entrypoint); | 
					
						
							| 
									
										
										
										
											2020-01-28 22:44:03 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				// 2. We enqueue the DependenciesBlock for traversal
 | 
					
						
							|  |  |  | 				queueDelayed.push({ | 
					
						
							|  |  |  | 					action: PROCESS_ENTRY_BLOCK, | 
					
						
							|  |  |  | 					block: b, | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 					module, | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 					chunk: entrypoint.chunks[0], | 
					
						
							|  |  |  | 					chunkGroup: entrypoint, | 
					
						
							| 
									
										
										
										
											2025-03-07 21:12:22 +08:00
										 |  |  | 					chunkGroupInfo: /** @type {ChunkGroupInfo} */ (cgi) | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2021-11-10 21:23:03 +08:00
										 |  |  | 			} else if (!chunkGroupInfo.asyncChunks || !chunkGroupInfo.chunkLoading) { | 
					
						
							| 
									
										
										
										
											2021-11-10 02:57:57 +08:00
										 |  |  | 				// Just queue the block into the current chunk group
 | 
					
						
							|  |  |  | 				queue.push({ | 
					
						
							|  |  |  | 					action: PROCESS_BLOCK, | 
					
						
							|  |  |  | 					block: b, | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 					module, | 
					
						
							| 
									
										
										
										
											2021-11-10 02:57:57 +08:00
										 |  |  | 					chunk, | 
					
						
							|  |  |  | 					chunkGroup, | 
					
						
							|  |  |  | 					chunkGroupInfo | 
					
						
							|  |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2020-01-28 22:13:10 +08:00
										 |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 				cgi = chunkName ? namedChunkGroups.get(chunkName) : undefined; | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 				if (!cgi) { | 
					
						
							|  |  |  | 					c = compilation.addChunkInGroup( | 
					
						
							|  |  |  | 						b.groupOptions || b.chunkName, | 
					
						
							|  |  |  | 						module, | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 						/** @type {DependencyLocation} */ (b.loc), | 
					
						
							|  |  |  | 						/** @type {string} */ (b.request) | 
					
						
							| 
									
										
										
										
											2020-01-28 22:13:10 +08:00
										 |  |  | 					); | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 					maskByChunk.set(c.chunks[0], ZERO_BIGINT); | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 					c.index = nextChunkGroupIndex++; | 
					
						
							|  |  |  | 					cgi = { | 
					
						
							| 
									
										
										
										
											2024-09-04 12:52:18 +08:00
										 |  |  | 						initialized: false, | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 						chunkGroup: c, | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 						runtime: chunkGroupInfo.runtime, | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 						minAvailableModules: undefined, | 
					
						
							|  |  |  | 						availableModulesToBeMerged: [], | 
					
						
							|  |  |  | 						skippedItems: undefined, | 
					
						
							|  |  |  | 						resultingAvailableModules: undefined, | 
					
						
							|  |  |  | 						children: undefined, | 
					
						
							|  |  |  | 						availableSources: undefined, | 
					
						
							|  |  |  | 						availableChildren: undefined, | 
					
						
							|  |  |  | 						preOrderIndex: 0, | 
					
						
							| 
									
										
										
										
											2021-11-10 02:57:57 +08:00
										 |  |  | 						postOrderIndex: 0, | 
					
						
							| 
									
										
										
										
											2021-11-10 21:23:03 +08:00
										 |  |  | 						chunkLoading: chunkGroupInfo.chunkLoading, | 
					
						
							|  |  |  | 						asyncChunks: chunkGroupInfo.asyncChunks | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 					}; | 
					
						
							|  |  |  | 					allCreatedChunkGroups.add(c); | 
					
						
							|  |  |  | 					chunkGroupInfoMap.set(c, cgi); | 
					
						
							|  |  |  | 					if (chunkName) { | 
					
						
							|  |  |  | 						namedChunkGroups.set(chunkName, cgi); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					c = cgi.chunkGroup; | 
					
						
							|  |  |  | 					if (c.isInitial()) { | 
					
						
							|  |  |  | 						compilation.errors.push( | 
					
						
							| 
									
										
										
										
											2023-06-22 08:59:10 +08:00
										 |  |  | 							new AsyncDependencyToInitialChunkError( | 
					
						
							|  |  |  | 								/** @type {string} */ (chunkName), | 
					
						
							|  |  |  | 								module, | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 								/** @type {DependencyLocation} */ (b.loc) | 
					
						
							| 
									
										
										
										
											2023-06-22 08:59:10 +08:00
										 |  |  | 							) | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 						); | 
					
						
							|  |  |  | 						c = chunkGroup; | 
					
						
							| 
									
										
										
										
											2022-07-26 22:59:20 +08:00
										 |  |  | 					} else { | 
					
						
							|  |  |  | 						c.addOptions(b.groupOptions); | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 					c.addOrigin( | 
					
						
							|  |  |  | 						module, | 
					
						
							|  |  |  | 						/** @type {DependencyLocation} */ (b.loc), | 
					
						
							|  |  |  | 						/** @type {string} */ (b.request) | 
					
						
							|  |  |  | 					); | 
					
						
							| 
									
										
										
										
											2020-01-28 22:13:10 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-09-17 15:55:42 +08:00
										 |  |  | 				blockConnections.set(b, []); | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2023-06-22 08:59:10 +08:00
										 |  |  | 			blockChunkGroups.set(b, /** @type {ChunkGroupInfo} */ (cgi)); | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 		} else if (entryOptions) { | 
					
						
							|  |  |  | 			entrypoint = /** @type {Entrypoint} */ (cgi.chunkGroup); | 
					
						
							| 
									
										
										
										
											2020-01-28 22:44:03 +08:00
										 |  |  | 		} else { | 
					
						
							|  |  |  | 			c = cgi.chunkGroup; | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 		if (c !== undefined) { | 
					
						
							| 
									
										
										
										
											2020-09-17 15:55:42 +08:00
										 |  |  | 			// 2. We store the connection for the block
 | 
					
						
							|  |  |  | 			// to connect it later if needed
 | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 			/** @type {BlockChunkGroupConnection[]} */ | 
					
						
							|  |  |  | 			(blockConnections.get(b)).push({ | 
					
						
							| 
									
										
										
										
											2020-09-17 15:55:42 +08:00
										 |  |  | 				originChunkGroupInfo: chunkGroupInfo, | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 				chunkGroup: c | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// 3. We enqueue the chunk group info creation/updating
 | 
					
						
							|  |  |  | 			let connectList = queueConnect.get(chunkGroupInfo); | 
					
						
							|  |  |  | 			if (connectList === undefined) { | 
					
						
							|  |  |  | 				connectList = new Set(); | 
					
						
							|  |  |  | 				queueConnect.set(chunkGroupInfo, connectList); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2024-09-04 12:52:18 +08:00
										 |  |  | 			connectList.add([ | 
					
						
							| 
									
										
										
										
											2024-10-01 03:05:27 +08:00
										 |  |  | 				/** @type {ChunkGroupInfo} */ (cgi), | 
					
						
							| 
									
										
										
										
											2024-09-04 12:52:18 +08:00
										 |  |  | 				{ | 
					
						
							|  |  |  | 					action: PROCESS_BLOCK, | 
					
						
							|  |  |  | 					block: b, | 
					
						
							|  |  |  | 					module, | 
					
						
							|  |  |  | 					chunk: c.chunks[0], | 
					
						
							|  |  |  | 					chunkGroup: c, | 
					
						
							|  |  |  | 					chunkGroupInfo: /** @type {ChunkGroupInfo} */ (cgi) | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			]); | 
					
						
							| 
									
										
										
										
											2021-11-10 02:57:57 +08:00
										 |  |  | 		} else if (entrypoint !== undefined) { | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 			chunkGroupInfo.chunkGroup.addAsyncEntrypoint(entrypoint); | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-30 06:39:36 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {DependenciesBlock} block the block | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	const processBlock = block => { | 
					
						
							| 
									
										
										
										
											2020-08-13 20:39:55 +08:00
										 |  |  | 		statProcessedBlocks++; | 
					
						
							| 
									
										
										
										
											2020-04-30 06:39:36 +08:00
										 |  |  | 		// get prepared block info
 | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 		const blockModules = getBlockModules(block, chunkGroupInfo.runtime); | 
					
						
							| 
									
										
										
										
											2020-04-30 06:39:36 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (blockModules !== undefined) { | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 			const minAvailableModules = | 
					
						
							|  |  |  | 				/** @type {bigint} */ | 
					
						
							|  |  |  | 				(chunkGroupInfo.minAvailableModules); | 
					
						
							| 
									
										
										
										
											2020-04-30 06:39:36 +08:00
										 |  |  | 			// Buffer items because order need to be reversed to get indices correct
 | 
					
						
							|  |  |  | 			// Traverse all referenced modules
 | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 			for (let i = 0, len = blockModules.length; i < len; i += 3) { | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 				const refModule = /** @type {Module} */ (blockModules[i]); | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 				// For single comparisons this might be cheaper
 | 
					
						
							|  |  |  | 				const isModuleInChunk = chunkGraph.isModuleInChunk(refModule, chunk); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if (isModuleInChunk) { | 
					
						
							| 
									
										
										
										
											2020-04-30 06:39:36 +08:00
										 |  |  | 					// skip early if already connected
 | 
					
						
							|  |  |  | 					continue; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				const refOrdinal = /** @type {number} */ getModuleOrdinal(refModule); | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 				const activeState = /** @type {ConnectionState} */ ( | 
					
						
							|  |  |  | 					blockModules[i + 1] | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 				if (activeState !== true) { | 
					
						
							| 
									
										
										
										
											2024-02-07 19:35:11 +08:00
										 |  |  | 					const connections = /** @type {ModuleGraphConnection[]} */ ( | 
					
						
							|  |  |  | 						blockModules[i + 2] | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 					skipConnectionBuffer.push([refModule, connections]); | 
					
						
							|  |  |  | 					// We skip inactive connections
 | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 					if (activeState === false) continue; | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 				} else if (isOrdinalSetInMask(minAvailableModules, refOrdinal)) { | 
					
						
							| 
									
										
										
										
											2020-04-30 06:39:36 +08:00
										 |  |  | 					// already in parent chunks, skip it for now
 | 
					
						
							|  |  |  | 					skipBuffer.push(refModule); | 
					
						
							|  |  |  | 					continue; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				// enqueue, then add and enter to be in the correct order
 | 
					
						
							|  |  |  | 				// this is relevant with circular dependencies
 | 
					
						
							|  |  |  | 				queueBuffer.push({ | 
					
						
							| 
									
										
										
										
											2020-10-05 22:57:31 +08:00
										 |  |  | 					action: activeState === true ? ADD_AND_ENTER_MODULE : PROCESS_BLOCK, | 
					
						
							| 
									
										
										
										
											2020-04-30 06:39:36 +08:00
										 |  |  | 					block: refModule, | 
					
						
							|  |  |  | 					module: refModule, | 
					
						
							|  |  |  | 					chunk, | 
					
						
							|  |  |  | 					chunkGroup, | 
					
						
							|  |  |  | 					chunkGroupInfo | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			// Add buffered items in reverse order
 | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 			if (skipConnectionBuffer.length > 0) { | 
					
						
							|  |  |  | 				let { skippedModuleConnections } = chunkGroupInfo; | 
					
						
							|  |  |  | 				if (skippedModuleConnections === undefined) { | 
					
						
							| 
									
										
										
										
											2021-05-11 15:31:46 +08:00
										 |  |  | 					chunkGroupInfo.skippedModuleConnections = skippedModuleConnections = | 
					
						
							|  |  |  | 						new Set(); | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 				for (let i = skipConnectionBuffer.length - 1; i >= 0; i--) { | 
					
						
							|  |  |  | 					skippedModuleConnections.add(skipConnectionBuffer[i]); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				skipConnectionBuffer.length = 0; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2020-04-30 06:39:36 +08:00
										 |  |  | 			if (skipBuffer.length > 0) { | 
					
						
							|  |  |  | 				let { skippedItems } = chunkGroupInfo; | 
					
						
							|  |  |  | 				if (skippedItems === undefined) { | 
					
						
							|  |  |  | 					chunkGroupInfo.skippedItems = skippedItems = new Set(); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				for (let i = skipBuffer.length - 1; i >= 0; i--) { | 
					
						
							|  |  |  | 					skippedItems.add(skipBuffer[i]); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				skipBuffer.length = 0; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if (queueBuffer.length > 0) { | 
					
						
							|  |  |  | 				for (let i = queueBuffer.length - 1; i >= 0; i--) { | 
					
						
							|  |  |  | 					queue.push(queueBuffer[i]); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				queueBuffer.length = 0; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Traverse all Blocks
 | 
					
						
							|  |  |  | 		for (const b of block.blocks) { | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 			iteratorBlock(b); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (block.blocks.length > 0 && module !== block) { | 
					
						
							|  |  |  | 			blocksWithNestedBlocks.add(block); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {DependenciesBlock} block the block | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	const processEntryBlock = block => { | 
					
						
							|  |  |  | 		statProcessedBlocks++; | 
					
						
							|  |  |  | 		// get prepared block info
 | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 		const blockModules = getBlockModules(block, chunkGroupInfo.runtime); | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (blockModules !== undefined) { | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 			// Traverse all referenced modules in reverse order
 | 
					
						
							|  |  |  | 			for (let i = blockModules.length - 3; i >= 0; i -= 3) { | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 				const refModule = /** @type {Module} */ (blockModules[i]); | 
					
						
							|  |  |  | 				const activeState = /** @type {ConnectionState} */ ( | 
					
						
							|  |  |  | 					blockModules[i + 1] | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 				// enqueue, then add and enter to be in the correct order
 | 
					
						
							|  |  |  | 				// this is relevant with circular dependencies
 | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 				queue.push({ | 
					
						
							| 
									
										
										
										
											2020-10-05 22:57:31 +08:00
										 |  |  | 					action: | 
					
						
							| 
									
										
										
										
											2020-10-07 15:10:29 +08:00
										 |  |  | 						activeState === true ? ADD_AND_ENTER_ENTRY_MODULE : PROCESS_BLOCK, | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 					block: refModule, | 
					
						
							|  |  |  | 					module: refModule, | 
					
						
							|  |  |  | 					chunk, | 
					
						
							|  |  |  | 					chunkGroup, | 
					
						
							|  |  |  | 					chunkGroupInfo | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2020-04-30 06:39:36 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 		// Traverse all Blocks
 | 
					
						
							|  |  |  | 		for (const b of block.blocks) { | 
					
						
							|  |  |  | 			iteratorBlock(b); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-30 06:39:36 +08:00
										 |  |  | 		if (block.blocks.length > 0 && module !== block) { | 
					
						
							|  |  |  | 			blocksWithNestedBlocks.add(block); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 	const processQueue = () => { | 
					
						
							|  |  |  | 		while (queue.length) { | 
					
						
							| 
									
										
										
										
											2020-08-13 20:39:55 +08:00
										 |  |  | 			statProcessedQueueItems++; | 
					
						
							| 
									
										
										
										
											2023-06-22 08:59:10 +08:00
										 |  |  | 			const queueItem = /** @type {QueueItem} */ (queue.pop()); | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 			module = queueItem.module; | 
					
						
							|  |  |  | 			block = queueItem.block; | 
					
						
							|  |  |  | 			chunk = queueItem.chunk; | 
					
						
							|  |  |  | 			chunkGroup = queueItem.chunkGroup; | 
					
						
							|  |  |  | 			chunkGroupInfo = queueItem.chunkGroupInfo; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			switch (queueItem.action) { | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 				case ADD_AND_ENTER_ENTRY_MODULE: | 
					
						
							|  |  |  | 					chunkGraph.connectChunkAndEntryModule( | 
					
						
							|  |  |  | 						chunk, | 
					
						
							|  |  |  | 						module, | 
					
						
							|  |  |  | 						/** @type {Entrypoint} */ (chunkGroup) | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 				// fallthrough
 | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 				case ADD_AND_ENTER_MODULE: { | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 					const isModuleInChunk = chunkGraph.isModuleInChunk(module, chunk); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					if (isModuleInChunk) { | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 						// already connected, skip it
 | 
					
						
							|  |  |  | 						break; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					// We connect Module and Chunk
 | 
					
						
							|  |  |  | 					chunkGraph.connectChunkAndModule(chunk, module); | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 					const moduleOrdinal = getModuleOrdinal(module); | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 					let chunkMask = /** @type {bigint} */ (maskByChunk.get(chunk)); | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 					chunkMask |= ONE_BIGINT << BigInt(moduleOrdinal); | 
					
						
							|  |  |  | 					maskByChunk.set(chunk, chunkMask); | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 				// fallthrough
 | 
					
						
							|  |  |  | 				case ENTER_MODULE: { | 
					
						
							|  |  |  | 					const index = chunkGroup.getModulePreOrderIndex(module); | 
					
						
							|  |  |  | 					if (index === undefined) { | 
					
						
							|  |  |  | 						chunkGroup.setModulePreOrderIndex( | 
					
						
							|  |  |  | 							module, | 
					
						
							|  |  |  | 							chunkGroupInfo.preOrderIndex++ | 
					
						
							|  |  |  | 						); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					if ( | 
					
						
							|  |  |  | 						moduleGraph.setPreOrderIndexIfUnset( | 
					
						
							|  |  |  | 							module, | 
					
						
							|  |  |  | 							nextFreeModulePreOrderIndex | 
					
						
							|  |  |  | 						) | 
					
						
							|  |  |  | 					) { | 
					
						
							|  |  |  | 						nextFreeModulePreOrderIndex++; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					// reuse queueItem
 | 
					
						
							|  |  |  | 					queueItem.action = LEAVE_MODULE; | 
					
						
							|  |  |  | 					queue.push(queueItem); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				// fallthrough
 | 
					
						
							|  |  |  | 				case PROCESS_BLOCK: { | 
					
						
							| 
									
										
										
										
											2020-04-30 06:39:36 +08:00
										 |  |  | 					processBlock(block); | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 					break; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-09-08 00:02:14 +08:00
										 |  |  | 				case PROCESS_ENTRY_BLOCK: { | 
					
						
							|  |  |  | 					processEntryBlock(block); | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 				case LEAVE_MODULE: { | 
					
						
							|  |  |  | 					const index = chunkGroup.getModulePostOrderIndex(module); | 
					
						
							|  |  |  | 					if (index === undefined) { | 
					
						
							|  |  |  | 						chunkGroup.setModulePostOrderIndex( | 
					
						
							|  |  |  | 							module, | 
					
						
							|  |  |  | 							chunkGroupInfo.postOrderIndex++ | 
					
						
							|  |  |  | 						); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					if ( | 
					
						
							|  |  |  | 						moduleGraph.setPostOrderIndexIfUnset( | 
					
						
							|  |  |  | 							module, | 
					
						
							|  |  |  | 							nextFreeModulePostOrderIndex | 
					
						
							|  |  |  | 						) | 
					
						
							|  |  |  | 					) { | 
					
						
							|  |  |  | 						nextFreeModulePostOrderIndex++; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {ChunkGroupInfo} chunkGroupInfo The info object for the chunk group | 
					
						
							|  |  |  | 	 * @returns {bigint} The mask of available modules after the chunk group | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 	const calculateResultingAvailableModules = chunkGroupInfo => { | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 		if (chunkGroupInfo.resultingAvailableModules !== undefined) | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 			return chunkGroupInfo.resultingAvailableModules; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 		let resultingAvailableModules = /** @type {bigint} */ ( | 
					
						
							|  |  |  | 			chunkGroupInfo.minAvailableModules | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// add the modules from the chunk group to the set
 | 
					
						
							|  |  |  | 		for (const chunk of chunkGroupInfo.chunkGroup.chunks) { | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 			const mask = /** @type {bigint} */ (maskByChunk.get(chunk)); | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 			resultingAvailableModules |= mask; | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-11 15:31:46 +08:00
										 |  |  | 		return (chunkGroupInfo.resultingAvailableModules = | 
					
						
							|  |  |  | 			resultingAvailableModules); | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 	const processConnectQueue = () => { | 
					
						
							|  |  |  | 		// Figure out new parents for chunk groups
 | 
					
						
							|  |  |  | 		// to get new available modules for these children
 | 
					
						
							|  |  |  | 		for (const [chunkGroupInfo, targets] of queueConnect) { | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 			// 1. Add new targets to the list of children
 | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 			if (chunkGroupInfo.children === undefined) { | 
					
						
							| 
									
										
										
										
											2024-09-02 16:42:51 +08:00
										 |  |  | 				chunkGroupInfo.children = new Set(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			for (const [target] of targets) { | 
					
						
							|  |  |  | 				chunkGroupInfo.children.add(target); | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 			// 2. Calculate resulting available modules
 | 
					
						
							| 
									
										
										
										
											2021-05-11 15:31:46 +08:00
										 |  |  | 			const resultingAvailableModules = | 
					
						
							|  |  |  | 				calculateResultingAvailableModules(chunkGroupInfo); | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 			const runtime = chunkGroupInfo.runtime; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 			// 3. Update chunk group info
 | 
					
						
							| 
									
										
										
										
											2024-09-04 12:52:18 +08:00
										 |  |  | 			for (const [target, processBlock] of targets) { | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 				target.availableModulesToBeMerged.push(resultingAvailableModules); | 
					
						
							| 
									
										
										
										
											2024-09-04 12:52:18 +08:00
										 |  |  | 				chunkGroupsForMerging.add([target, processBlock]); | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 				const oldRuntime = target.runtime; | 
					
						
							|  |  |  | 				const newRuntime = mergeRuntime(oldRuntime, runtime); | 
					
						
							|  |  |  | 				if (oldRuntime !== newRuntime) { | 
					
						
							|  |  |  | 					target.runtime = newRuntime; | 
					
						
							|  |  |  | 					outdatedChunkGroupInfo.add(target); | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2020-08-13 20:39:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			statConnectedChunkGroups += targets.size; | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		queueConnect.clear(); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 	const processChunkGroupsForMerging = () => { | 
					
						
							| 
									
										
										
										
											2020-08-13 20:39:55 +08:00
										 |  |  | 		statProcessedChunkGroupsForMerging += chunkGroupsForMerging.size; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 		// Execute the merge
 | 
					
						
							| 
									
										
										
										
											2024-09-04 12:52:18 +08:00
										 |  |  | 		for (const [info, processBlock] of chunkGroupsForMerging) { | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 			const availableModulesToBeMerged = info.availableModulesToBeMerged; | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 			const cachedMinAvailableModules = info.minAvailableModules; | 
					
						
							|  |  |  | 			let minAvailableModules = cachedMinAvailableModules; | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-13 20:39:55 +08:00
										 |  |  | 			statMergedAvailableModuleSets += availableModulesToBeMerged.length; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 			for (const availableModules of availableModulesToBeMerged) { | 
					
						
							|  |  |  | 				if (minAvailableModules === undefined) { | 
					
						
							|  |  |  | 					minAvailableModules = availableModules; | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 					minAvailableModules &= availableModules; | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			const changed = minAvailableModules !== cachedMinAvailableModules; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 			availableModulesToBeMerged.length = 0; | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 			if (changed) { | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 				info.minAvailableModules = minAvailableModules; | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 				info.resultingAvailableModules = undefined; | 
					
						
							|  |  |  | 				outdatedChunkGroupInfo.add(info); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2024-09-02 16:42:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-04 12:52:18 +08:00
										 |  |  | 			if (processBlock) { | 
					
						
							|  |  |  | 				let blocks = blocksByChunkGroups.get(info); | 
					
						
							|  |  |  | 				if (!blocks) { | 
					
						
							|  |  |  | 					blocksByChunkGroups.set(info, (blocks = new Set())); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// Whether to walk block depends on minAvailableModules and input block.
 | 
					
						
							|  |  |  | 				// We can treat creating chunk group as a function with 2 input, entry block and minAvailableModules
 | 
					
						
							|  |  |  | 				// If input is the same, we can skip re-walk
 | 
					
						
							|  |  |  | 				let needWalkBlock = !info.initialized || changed; | 
					
						
							|  |  |  | 				if (!blocks.has(processBlock.block)) { | 
					
						
							|  |  |  | 					needWalkBlock = true; | 
					
						
							|  |  |  | 					blocks.add(processBlock.block); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				if (needWalkBlock) { | 
					
						
							|  |  |  | 					info.initialized = true; | 
					
						
							|  |  |  | 					queueDelayed.push(processBlock); | 
					
						
							| 
									
										
										
										
											2024-09-02 16:42:51 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-08-13 20:39:55 +08:00
										 |  |  | 		chunkGroupsForMerging.clear(); | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const processChunkGroupsForCombining = () => { | 
					
						
							| 
									
										
										
										
											2021-04-30 18:47:45 +08:00
										 |  |  | 		for (const info of chunkGroupsForCombining) { | 
					
						
							| 
									
										
										
										
											2023-06-22 08:59:10 +08:00
										 |  |  | 			for (const source of /** @type {Set<ChunkGroupInfo>} */ ( | 
					
						
							|  |  |  | 				info.availableSources | 
					
						
							|  |  |  | 			)) { | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 				if (source.minAvailableModules === undefined) { | 
					
						
							| 
									
										
										
										
											2021-04-30 18:47:45 +08:00
										 |  |  | 					chunkGroupsForCombining.delete(info); | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2021-04-30 18:47:45 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-30 18:47:45 +08:00
										 |  |  | 		for (const info of chunkGroupsForCombining) { | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 			let availableModules = ZERO_BIGINT; | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 			// combine minAvailableModules from all resultingAvailableModules
 | 
					
						
							| 
									
										
										
										
											2023-06-22 08:59:10 +08:00
										 |  |  | 			for (const source of /** @type {Set<ChunkGroupInfo>} */ ( | 
					
						
							|  |  |  | 				info.availableSources | 
					
						
							|  |  |  | 			)) { | 
					
						
							| 
									
										
										
										
											2021-05-11 15:31:46 +08:00
										 |  |  | 				const resultingAvailableModules = | 
					
						
							|  |  |  | 					calculateResultingAvailableModules(source); | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 				availableModules |= resultingAvailableModules; | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			info.minAvailableModules = availableModules; | 
					
						
							|  |  |  | 			info.resultingAvailableModules = undefined; | 
					
						
							|  |  |  | 			outdatedChunkGroupInfo.add(info); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		chunkGroupsForCombining.clear(); | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 	const processOutdatedChunkGroupInfo = () => { | 
					
						
							| 
									
										
										
										
											2020-08-13 20:39:55 +08:00
										 |  |  | 		statChunkGroupInfoUpdated += outdatedChunkGroupInfo.size; | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 		// Revisit skipped elements
 | 
					
						
							|  |  |  | 		for (const info of outdatedChunkGroupInfo) { | 
					
						
							|  |  |  | 			// 1. Reconsider skipped items
 | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 			if (info.skippedItems !== undefined) { | 
					
						
							| 
									
										
										
										
											2023-06-22 08:59:10 +08:00
										 |  |  | 				const minAvailableModules = | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 					/** @type {bigint} */ | 
					
						
							| 
									
										
										
										
											2023-06-22 08:59:10 +08:00
										 |  |  | 					(info.minAvailableModules); | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 				for (const module of info.skippedItems) { | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 					const ordinal = getModuleOrdinal(module); | 
					
						
							|  |  |  | 					if (!isOrdinalSetInMask(minAvailableModules, ordinal)) { | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 						queue.push({ | 
					
						
							|  |  |  | 							action: ADD_AND_ENTER_MODULE, | 
					
						
							|  |  |  | 							block: module, | 
					
						
							|  |  |  | 							module, | 
					
						
							|  |  |  | 							chunk: info.chunkGroup.chunks[0], | 
					
						
							|  |  |  | 							chunkGroup: info.chunkGroup, | 
					
						
							|  |  |  | 							chunkGroupInfo: info | 
					
						
							|  |  |  | 						}); | 
					
						
							|  |  |  | 						info.skippedItems.delete(module); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 			// 2. Reconsider skipped connections
 | 
					
						
							|  |  |  | 			if (info.skippedModuleConnections !== undefined) { | 
					
						
							| 
									
										
										
										
											2023-06-22 08:59:10 +08:00
										 |  |  | 				const minAvailableModules = | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 					/** @type {bigint} */ | 
					
						
							| 
									
										
										
										
											2023-06-22 08:59:10 +08:00
										 |  |  | 					(info.minAvailableModules); | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 				for (const entry of info.skippedModuleConnections) { | 
					
						
							| 
									
										
										
										
											2024-02-07 19:35:11 +08:00
										 |  |  | 					const [module, connections] = entry; | 
					
						
							|  |  |  | 					const activeState = getActiveStateOfConnections( | 
					
						
							|  |  |  | 						connections, | 
					
						
							|  |  |  | 						info.runtime | 
					
						
							|  |  |  | 					); | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 					if (activeState === false) continue; | 
					
						
							|  |  |  | 					if (activeState === true) { | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 						const ordinal = getModuleOrdinal(module); | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 						info.skippedModuleConnections.delete(entry); | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 						if (isOrdinalSetInMask(minAvailableModules, ordinal)) { | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 							/** @type {NonNullable<ChunkGroupInfo["skippedItems"]>} */ | 
					
						
							|  |  |  | 							(info.skippedItems).add(module); | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 							continue; | 
					
						
							|  |  |  | 						} | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 					} | 
					
						
							|  |  |  | 					queue.push({ | 
					
						
							|  |  |  | 						action: activeState === true ? ADD_AND_ENTER_MODULE : PROCESS_BLOCK, | 
					
						
							|  |  |  | 						block: module, | 
					
						
							|  |  |  | 						module, | 
					
						
							|  |  |  | 						chunk: info.chunkGroup.chunks[0], | 
					
						
							|  |  |  | 						chunkGroup: info.chunkGroup, | 
					
						
							|  |  |  | 						chunkGroupInfo: info | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 			// 2. Reconsider children chunk groups
 | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 			if (info.children !== undefined) { | 
					
						
							| 
									
										
										
										
											2020-08-13 20:39:55 +08:00
										 |  |  | 				statChildChunkGroupsReconnected += info.children.size; | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 				for (const cgi of info.children) { | 
					
						
							|  |  |  | 					let connectList = queueConnect.get(info); | 
					
						
							|  |  |  | 					if (connectList === undefined) { | 
					
						
							|  |  |  | 						connectList = new Set(); | 
					
						
							|  |  |  | 						queueConnect.set(info, connectList); | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2024-09-04 12:52:18 +08:00
										 |  |  | 					connectList.add([cgi, null]); | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			// 3. Reconsider chunk groups for combining
 | 
					
						
							|  |  |  | 			if (info.availableChildren !== undefined) { | 
					
						
							|  |  |  | 				for (const cgi of info.availableChildren) { | 
					
						
							|  |  |  | 					chunkGroupsForCombining.add(cgi); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2024-01-26 16:21:05 +08:00
										 |  |  | 			outdatedOrderIndexChunkGroups.add(info); | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		outdatedChunkGroupInfo.clear(); | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 	// Iterative traversal of the Module graph
 | 
					
						
							|  |  |  | 	// Recursive would be simpler to write but could result in Stack Overflows
 | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 	while (queue.length || queueConnect.size) { | 
					
						
							| 
									
										
										
										
											2019-07-26 15:56:55 +08:00
										 |  |  | 		logger.time("visitModules: visiting"); | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 		processQueue(); | 
					
						
							| 
									
										
										
										
											2021-10-05 23:25:33 +08:00
										 |  |  | 		logger.timeAggregateEnd("visitModules: prepare"); | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 		logger.timeEnd("visitModules: visiting"); | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 		if (chunkGroupsForCombining.size > 0) { | 
					
						
							|  |  |  | 			logger.time("visitModules: combine available modules"); | 
					
						
							|  |  |  | 			processChunkGroupsForCombining(); | 
					
						
							|  |  |  | 			logger.timeEnd("visitModules: combine available modules"); | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-07-26 14:05:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 		if (queueConnect.size > 0) { | 
					
						
							| 
									
										
										
										
											2019-07-26 15:56:55 +08:00
										 |  |  | 			logger.time("visitModules: calculating available modules"); | 
					
						
							| 
									
										
										
										
											2020-01-31 23:38:04 +08:00
										 |  |  | 			processConnectQueue(); | 
					
						
							| 
									
										
										
										
											2019-07-26 15:56:55 +08:00
										 |  |  | 			logger.timeEnd("visitModules: calculating available modules"); | 
					
						
							| 
									
										
										
										
											2019-07-26 14:05:16 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 			if (chunkGroupsForMerging.size > 0) { | 
					
						
							| 
									
										
										
										
											2019-07-26 15:56:55 +08:00
										 |  |  | 				logger.time("visitModules: merging available modules"); | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 				processChunkGroupsForMerging(); | 
					
						
							| 
									
										
										
										
											2019-07-26 15:56:55 +08:00
										 |  |  | 				logger.timeEnd("visitModules: merging available modules"); | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 		if (outdatedChunkGroupInfo.size > 0) { | 
					
						
							| 
									
										
										
										
											2020-03-13 00:51:26 +08:00
										 |  |  | 			logger.time("visitModules: check modules for revisit"); | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 			processOutdatedChunkGroupInfo(); | 
					
						
							| 
									
										
										
										
											2020-03-13 00:51:26 +08:00
										 |  |  | 			logger.timeEnd("visitModules: check modules for revisit"); | 
					
						
							| 
									
										
										
										
											2020-02-07 17:05:51 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 		// Run queueDelayed when all items of the queue are processed
 | 
					
						
							| 
									
										
										
										
											2020-01-03 14:21:54 +08:00
										 |  |  | 		// This is important to get the global indexing correct
 | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 		// Async blocks should be processed after all sync blocks are processed
 | 
					
						
							|  |  |  | 		if (queue.length === 0) { | 
					
						
							|  |  |  | 			const tempQueue = queue; | 
					
						
							|  |  |  | 			queue = queueDelayed.reverse(); | 
					
						
							|  |  |  | 			queueDelayed = tempQueue; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-08-13 20:39:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-26 16:21:05 +08:00
										 |  |  | 	for (const info of outdatedOrderIndexChunkGroups) { | 
					
						
							|  |  |  | 		const { chunkGroup, runtime } = info; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-02 16:42:51 +08:00
										 |  |  | 		const blocks = blocksByChunkGroups.get(info); | 
					
						
							| 
									
										
										
										
											2024-01-26 16:21:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-02 16:42:51 +08:00
										 |  |  | 		if (!blocks) { | 
					
						
							| 
									
										
										
										
											2024-01-26 16:21:05 +08:00
										 |  |  | 			continue; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-02 16:42:51 +08:00
										 |  |  | 		for (const block of blocks) { | 
					
						
							|  |  |  | 			let preOrderIndex = 0; | 
					
						
							|  |  |  | 			let postOrderIndex = 0; | 
					
						
							|  |  |  | 			/** | 
					
						
							|  |  |  | 			 * @param {DependenciesBlock} current current | 
					
						
							|  |  |  | 			 * @param {BlocksWithNestedBlocks} visited visited dependencies blocks | 
					
						
							|  |  |  | 			 */ | 
					
						
							|  |  |  | 			const process = (current, visited) => { | 
					
						
							| 
									
										
										
										
											2025-04-16 22:04:11 +08:00
										 |  |  | 				const blockModules = | 
					
						
							|  |  |  | 					/** @type {BlockModulesInFlattenTuples} */ | 
					
						
							|  |  |  | 					(getBlockModules(current, runtime)); | 
					
						
							| 
									
										
										
										
											2024-09-02 16:42:51 +08:00
										 |  |  | 				for (let i = 0, len = blockModules.length; i < len; i += 3) { | 
					
						
							|  |  |  | 					const activeState = /** @type {ConnectionState} */ ( | 
					
						
							|  |  |  | 						blockModules[i + 1] | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 					if (activeState === false) { | 
					
						
							|  |  |  | 						continue; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					const refModule = /** @type {Module} */ (blockModules[i]); | 
					
						
							|  |  |  | 					if (visited.has(refModule)) { | 
					
						
							|  |  |  | 						continue; | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2024-03-14 15:13:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-02 16:42:51 +08:00
										 |  |  | 					visited.add(refModule); | 
					
						
							| 
									
										
										
										
											2024-01-26 16:21:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-02 16:42:51 +08:00
										 |  |  | 					if (refModule) { | 
					
						
							|  |  |  | 						chunkGroup.setModulePreOrderIndex(refModule, preOrderIndex++); | 
					
						
							|  |  |  | 						process(refModule, visited); | 
					
						
							|  |  |  | 						chunkGroup.setModulePostOrderIndex(refModule, postOrderIndex++); | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2024-01-26 16:21:05 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2024-09-02 16:42:51 +08:00
										 |  |  | 			}; | 
					
						
							|  |  |  | 			process(block, new Set()); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-01-26 16:21:05 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	outdatedOrderIndexChunkGroups.clear(); | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 	ordinalByModule.clear(); | 
					
						
							| 
									
										
										
										
											2024-01-26 16:21:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-13 20:39:55 +08:00
										 |  |  | 	logger.log( | 
					
						
							| 
									
										
										
										
											2020-08-14 12:29:10 +08:00
										 |  |  | 		`${statProcessedQueueItems} queue items processed (${statProcessedBlocks} blocks)` | 
					
						
							| 
									
										
										
										
											2020-08-13 20:39:55 +08:00
										 |  |  | 	); | 
					
						
							| 
									
										
										
										
											2020-08-14 12:29:10 +08:00
										 |  |  | 	logger.log(`${statConnectedChunkGroups} chunk groups connected`); | 
					
						
							| 
									
										
										
										
											2020-08-13 20:39:55 +08:00
										 |  |  | 	logger.log( | 
					
						
							| 
									
										
										
										
											2020-08-14 12:29:10 +08:00
										 |  |  | 		`${statProcessedChunkGroupsForMerging} chunk groups processed for merging (${statMergedAvailableModuleSets} module sets, ${statForkedAvailableModules} forked, ${statForkedAvailableModulesCount} + ${statForkedAvailableModulesCountPlus} modules forked, ${statForkedMergedModulesCount} + ${statForkedMergedModulesCountPlus} modules merged into fork, ${statForkedResultModulesCount} resulting modules)` | 
					
						
							| 
									
										
										
										
											2020-08-13 20:39:55 +08:00
										 |  |  | 	); | 
					
						
							|  |  |  | 	logger.log( | 
					
						
							| 
									
										
										
										
											2020-08-14 12:29:10 +08:00
										 |  |  | 		`${statChunkGroupInfoUpdated} chunk group info updated (${statChildChunkGroupsReconnected} already connected chunk groups reconnected)` | 
					
						
							| 
									
										
										
										
											2020-08-13 20:39:55 +08:00
										 |  |  | 	); | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @param {Compilation} compilation the compilation | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  |  * @param {BlocksWithNestedBlocks} blocksWithNestedBlocks flag for blocks that have nested blocks | 
					
						
							|  |  |  |  * @param {BlockConnections} blockConnections connection for blocks | 
					
						
							|  |  |  |  * @param {MaskByChunk} maskByChunk mapping from chunk to module mask | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | const connectChunkGroups = ( | 
					
						
							|  |  |  | 	compilation, | 
					
						
							|  |  |  | 	blocksWithNestedBlocks, | 
					
						
							| 
									
										
										
										
											2020-09-17 15:55:42 +08:00
										 |  |  | 	blockConnections, | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 	maskByChunk | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | ) => { | 
					
						
							|  |  |  | 	const { chunkGraph } = compilation; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * Helper function to check if all modules of a chunk are available | 
					
						
							|  |  |  | 	 * @param {ChunkGroup} chunkGroup the chunkGroup to scan | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 	 * @param {bigint} availableModules the comparator set | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 	 * @returns {boolean} return true if all modules of a chunk are available | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	const areModulesAvailable = (chunkGroup, availableModules) => { | 
					
						
							|  |  |  | 		for (const chunk of chunkGroup.chunks) { | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 			const chunkMask = /** @type {bigint} */ (maskByChunk.get(chunk)); | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 			if ((chunkMask & availableModules) !== chunkMask) return false; | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// For each edge in the basic chunk graph
 | 
					
						
							| 
									
										
										
										
											2020-09-17 15:55:42 +08:00
										 |  |  | 	for (const [block, connections] of blockConnections) { | 
					
						
							|  |  |  | 		// 1. Check if connection is needed
 | 
					
						
							|  |  |  | 		// When none of the dependencies need to be connected
 | 
					
						
							|  |  |  | 		// we can skip all of them
 | 
					
						
							|  |  |  | 		// It's not possible to filter each item so it doesn't create inconsistent
 | 
					
						
							|  |  |  | 		// connections and modules can only create one version
 | 
					
						
							|  |  |  | 		// TODO maybe decide this per runtime
 | 
					
						
							|  |  |  | 		if ( | 
					
						
							|  |  |  | 			// TODO is this needed?
 | 
					
						
							|  |  |  | 			!blocksWithNestedBlocks.has(block) && | 
					
						
							|  |  |  | 			connections.every(({ chunkGroup, originChunkGroupInfo }) => | 
					
						
							|  |  |  | 				areModulesAvailable( | 
					
						
							|  |  |  | 					chunkGroup, | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 					/** @type {bigint} */ (originChunkGroupInfo.resultingAvailableModules) | 
					
						
							| 
									
										
										
										
											2020-09-17 15:55:42 +08:00
										 |  |  | 				) | 
					
						
							|  |  |  | 			) | 
					
						
							|  |  |  | 		) { | 
					
						
							|  |  |  | 			continue; | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 		// 2. Foreach edge
 | 
					
						
							| 
									
										
										
										
											2020-09-17 15:55:42 +08:00
										 |  |  | 		for (let i = 0; i < connections.length; i++) { | 
					
						
							|  |  |  | 			const { chunkGroup, originChunkGroupInfo } = connections[i]; | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-17 15:55:42 +08:00
										 |  |  | 			// 3. Connect block with chunk
 | 
					
						
							|  |  |  | 			chunkGraph.connectBlockAndChunkGroup(block, chunkGroup); | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-17 15:55:42 +08:00
										 |  |  | 			// 4. Connect chunk with parent
 | 
					
						
							|  |  |  | 			connectChunkGroupParentAndChild( | 
					
						
							|  |  |  | 				originChunkGroupInfo.chunkGroup, | 
					
						
							|  |  |  | 				chunkGroup | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Remove all unconnected chunk groups | 
					
						
							|  |  |  |  * @param {Compilation} compilation the compilation | 
					
						
							|  |  |  |  * @param {Iterable<ChunkGroup>} allCreatedChunkGroups all chunk groups that where created before | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const cleanupUnconnectedGroups = (compilation, allCreatedChunkGroups) => { | 
					
						
							|  |  |  | 	const { chunkGraph } = compilation; | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	for (const chunkGroup of allCreatedChunkGroups) { | 
					
						
							|  |  |  | 		if (chunkGroup.getNumberOfParents() === 0) { | 
					
						
							|  |  |  | 			for (const chunk of chunkGroup.chunks) { | 
					
						
							|  |  |  | 				compilation.chunks.delete(chunk); | 
					
						
							|  |  |  | 				chunkGraph.disconnectChunk(chunk); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			chunkGraph.disconnectChunkGroup(chunkGroup); | 
					
						
							|  |  |  | 			chunkGroup.remove(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * This method creates the Chunk graph from the Module graph | 
					
						
							|  |  |  |  * @param {Compilation} compilation the compilation | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  |  * @param {InputEntrypointsAndModules} inputEntrypointsAndModules chunk groups which are processed with the modules | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  |  * @returns {void} | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2020-05-23 22:08:51 +08:00
										 |  |  | const buildChunkGraph = (compilation, inputEntrypointsAndModules) => { | 
					
						
							| 
									
										
										
										
											2019-07-26 15:56:55 +08:00
										 |  |  | 	const logger = compilation.getLogger("webpack.buildChunkGraph"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 	// SHARED STATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 	/** @type {BlockConnections} */ | 
					
						
							| 
									
										
										
										
											2020-09-17 15:55:42 +08:00
										 |  |  | 	const blockConnections = new Map(); | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 	/** @type {AllCreatedChunkGroups} */ | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 	const allCreatedChunkGroups = new Set(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 	/** @type {ChunkGroupInfoMap} */ | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 	const chunkGroupInfoMap = new Map(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 	/** @type {BlocksWithNestedBlocks} */ | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 	const blocksWithNestedBlocks = new Set(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-12 22:35:32 +08:00
										 |  |  | 	/** @type {MaskByChunk} */ | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 	const maskByChunk = new Map(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 	// PART ONE
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-01 00:10:53 +08:00
										 |  |  | 	logger.time("visitModules"); | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 	visitModules( | 
					
						
							| 
									
										
										
										
											2019-07-26 15:56:55 +08:00
										 |  |  | 		logger, | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 		compilation, | 
					
						
							| 
									
										
										
										
											2020-05-23 22:08:51 +08:00
										 |  |  | 		inputEntrypointsAndModules, | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 		chunkGroupInfoMap, | 
					
						
							| 
									
										
										
										
											2020-09-17 15:55:42 +08:00
										 |  |  | 		blockConnections, | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 		blocksWithNestedBlocks, | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 		allCreatedChunkGroups, | 
					
						
							|  |  |  | 		maskByChunk | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 	); | 
					
						
							| 
									
										
										
										
											2020-02-01 00:10:53 +08:00
										 |  |  | 	logger.timeEnd("visitModules"); | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// PART TWO
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-26 15:56:55 +08:00
										 |  |  | 	logger.time("connectChunkGroups"); | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 	connectChunkGroups( | 
					
						
							|  |  |  | 		compilation, | 
					
						
							|  |  |  | 		blocksWithNestedBlocks, | 
					
						
							| 
									
										
										
										
											2020-09-17 15:55:42 +08:00
										 |  |  | 		blockConnections, | 
					
						
							| 
									
										
										
										
											2024-02-17 09:01:38 +08:00
										 |  |  | 		maskByChunk | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 	); | 
					
						
							| 
									
										
										
										
											2019-07-26 15:56:55 +08:00
										 |  |  | 	logger.timeEnd("connectChunkGroups"); | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-16 17:43:48 +08:00
										 |  |  | 	for (const [chunkGroup, chunkGroupInfo] of chunkGroupInfoMap) { | 
					
						
							|  |  |  | 		for (const chunk of chunkGroup.chunks) | 
					
						
							|  |  |  | 			chunk.runtime = mergeRuntime(chunk.runtime, chunkGroupInfo.runtime); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-13 00:51:26 +08:00
										 |  |  | 	// Cleanup work
 | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-26 15:56:55 +08:00
										 |  |  | 	logger.time("cleanup"); | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | 	cleanupUnconnectedGroups(compilation, allCreatedChunkGroups); | 
					
						
							| 
									
										
										
										
											2019-07-26 15:56:55 +08:00
										 |  |  | 	logger.timeEnd("cleanup"); | 
					
						
							| 
									
										
										
										
											2019-07-25 17:25:29 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-25 14:07:55 +08:00
										 |  |  | module.exports = buildChunkGraph; |