You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			124 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
		
		
			
		
	
	
			124 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
| 
											9 months ago
										 | /* | ||
|  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||
|  | 	Author Tobias Koppers @sokra | ||
|  | */ | ||
|  | 
 | ||
|  | "use strict"; | ||
|  | 
 | ||
|  | const makeSerializable = require("./util/makeSerializable"); | ||
|  | 
 | ||
|  | /** @typedef {import("./AsyncDependenciesBlock")} AsyncDependenciesBlock */ | ||
|  | /** @typedef {import("./ChunkGraph")} ChunkGraph */ | ||
|  | /** @typedef {import("./ChunkGroup")} ChunkGroup */ | ||
|  | /** @typedef {import("./Dependency")} Dependency */ | ||
|  | /** @typedef {import("./Dependency").UpdateHashContext} UpdateHashContext */ | ||
|  | /** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */ | ||
|  | /** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */ | ||
|  | /** @typedef {import("./util/Hash")} Hash */ | ||
|  | 
 | ||
|  | /** @typedef {(d: Dependency) => boolean} DependencyFilterFunction */ | ||
|  | 
 | ||
|  | /** | ||
|  |  * DependenciesBlock is the base class for all Module classes in webpack. It describes a | ||
|  |  * "block" of dependencies which are pointers to other DependenciesBlock instances. For example | ||
|  |  * when a Module has a CommonJs require statement, the DependencyBlock for the CommonJs module | ||
|  |  * would be added as a dependency to the Module. DependenciesBlock is inherited by two types of classes: | ||
|  |  * Module subclasses and AsyncDependenciesBlock subclasses. The only difference between the two is that | ||
|  |  * AsyncDependenciesBlock subclasses are used for code-splitting (async boundary) and Module subclasses are not. | ||
|  |  */ | ||
|  | class DependenciesBlock { | ||
|  | 	constructor() { | ||
|  | 		/** @type {Dependency[]} */ | ||
|  | 		this.dependencies = []; | ||
|  | 		/** @type {AsyncDependenciesBlock[]} */ | ||
|  | 		this.blocks = []; | ||
|  | 		/** @type {DependenciesBlock | undefined} */ | ||
|  | 		this.parent = undefined; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	getRootBlock() { | ||
|  | 		/** @type {DependenciesBlock} */ | ||
|  | 		let current = this; | ||
|  | 		while (current.parent) current = current.parent; | ||
|  | 		return current; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Adds a DependencyBlock to DependencyBlock relationship. | ||
|  | 	 * This is used for when a Module has a AsyncDependencyBlock tie (for code-splitting) | ||
|  | 	 * | ||
|  | 	 * @param {AsyncDependenciesBlock} block block being added | ||
|  | 	 * @returns {void} | ||
|  | 	 */ | ||
|  | 	addBlock(block) { | ||
|  | 		this.blocks.push(block); | ||
|  | 		block.parent = this; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * @param {Dependency} dependency dependency being tied to block. | ||
|  | 	 * This is an "edge" pointing to another "node" on module graph. | ||
|  | 	 * @returns {void} | ||
|  | 	 */ | ||
|  | 	addDependency(dependency) { | ||
|  | 		this.dependencies.push(dependency); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * @param {Dependency} dependency dependency being removed | ||
|  | 	 * @returns {void} | ||
|  | 	 */ | ||
|  | 	removeDependency(dependency) { | ||
|  | 		const idx = this.dependencies.indexOf(dependency); | ||
|  | 		if (idx >= 0) { | ||
|  | 			this.dependencies.splice(idx, 1); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Removes all dependencies and blocks | ||
|  | 	 * @returns {void} | ||
|  | 	 */ | ||
|  | 	clearDependenciesAndBlocks() { | ||
|  | 		this.dependencies.length = 0; | ||
|  | 		this.blocks.length = 0; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * @param {Hash} hash the hash used to track dependencies | ||
|  | 	 * @param {UpdateHashContext} context context | ||
|  | 	 * @returns {void} | ||
|  | 	 */ | ||
|  | 	updateHash(hash, context) { | ||
|  | 		for (const dep of this.dependencies) { | ||
|  | 			dep.updateHash(hash, context); | ||
|  | 		} | ||
|  | 		for (const block of this.blocks) { | ||
|  | 			block.updateHash(hash, context); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * @param {ObjectSerializerContext} context context | ||
|  | 	 */ | ||
|  | 	serialize({ write }) { | ||
|  | 		write(this.dependencies); | ||
|  | 		write(this.blocks); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * @param {ObjectDeserializerContext} context context | ||
|  | 	 */ | ||
|  | 	deserialize({ read }) { | ||
|  | 		this.dependencies = read(); | ||
|  | 		this.blocks = read(); | ||
|  | 		for (const block of this.blocks) { | ||
|  | 			block.parent = this; | ||
|  | 		} | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | makeSerializable(DependenciesBlock, "webpack/lib/DependenciesBlock"); | ||
|  | 
 | ||
|  | module.exports = DependenciesBlock; |