| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const compareLocations = require("./compareLocations"); | 
					
						
							|  |  |  | let debugId = 1000; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const byId = (a, b) => { | 
					
						
							|  |  |  | 	if(a.id < b.id) return -1; | 
					
						
							|  |  |  | 	if(b.id < a.id) return 1; | 
					
						
							|  |  |  | 	return 0; | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | class Chunk { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	constructor(name, module, loc) { | 
					
						
							|  |  |  | 		this.id = null; | 
					
						
							|  |  |  | 		this.ids = null; | 
					
						
							|  |  |  | 		this.debugId = debugId++; | 
					
						
							|  |  |  | 		this.name = name; | 
					
						
							|  |  |  | 		this.modules = []; | 
					
						
							|  |  |  | 		this.entrypoints = []; | 
					
						
							|  |  |  | 		this.chunks = []; | 
					
						
							|  |  |  | 		this.parents = []; | 
					
						
							|  |  |  | 		this.blocks = []; | 
					
						
							|  |  |  | 		this.origins = []; | 
					
						
							|  |  |  | 		this.files = []; | 
					
						
							|  |  |  | 		this.rendered = false; | 
					
						
							|  |  |  | 		if(module) { | 
					
						
							|  |  |  | 			this.origins.push({ | 
					
						
							|  |  |  | 				module, | 
					
						
							|  |  |  | 				loc, | 
					
						
							|  |  |  | 				name | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	get entry() { | 
					
						
							| 
									
										
										
										
											2016-07-13 17:03:14 +08:00
										 |  |  | 		throw new Error("Chunk.entry was removed. Use hasRuntime()"); | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	set entry(data) { | 
					
						
							| 
									
										
										
										
											2016-07-13 17:03:14 +08:00
										 |  |  | 		throw new Error("Chunk.entry was removed. Use hasRuntime()"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 	get initial() { | 
					
						
							| 
									
										
										
										
											2016-07-13 17:03:14 +08:00
										 |  |  | 		throw new Error("Chunk.initial was removed. Use isInitial()"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 	set initial(data) { | 
					
						
							|  |  |  | 		throw new Error("Chunk.initial was removed. Use isInitial()"); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-07-13 17:03:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 	hasRuntime() { | 
					
						
							|  |  |  | 		if(this.entrypoints.length === 0) return false; | 
					
						
							|  |  |  | 		return this.entrypoints[0].chunks[0] === this; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-07-13 17:03:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 	isInitial() { | 
					
						
							|  |  |  | 		return this.entrypoints.length > 0; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-07-13 17:03:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 	hasEntryModule() { | 
					
						
							|  |  |  | 		return !!this.entryModule; | 
					
						
							| 
									
										
										
										
											2014-06-04 03:03:21 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 13:55:20 +08:00
										 |  |  | 	addToCollection(collection, item) { | 
					
						
							|  |  |  | 		if(item === this) { | 
					
						
							|  |  |  | 			return false; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if(collection.indexOf(item) > -1) { | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 			return false; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-26 13:55:20 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		collection.push(item); | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 13:55:20 +08:00
										 |  |  | 	addChunk(chunk) { | 
					
						
							|  |  |  | 		return this.addToCollection(this.chunks, chunk); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 15:46:49 +08:00
										 |  |  | 	addParent(parentChunk) { | 
					
						
							|  |  |  | 		return this.addToCollection(this.parents, parentChunk); | 
					
						
							| 
									
										
										
										
											2017-01-26 13:55:20 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	addModule(module) { | 
					
						
							|  |  |  | 		return this.addToCollection(this.modules, module); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	addBlock(block) { | 
					
						
							|  |  |  | 		return this.addToCollection(this.blocks, block); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 	removeModule(module) { | 
					
						
							| 
									
										
										
										
											2017-03-02 22:09:09 +08:00
										 |  |  | 		const idx = this.modules.indexOf(module); | 
					
						
							| 
									
										
										
										
											2017-02-13 18:26:25 +08:00
										 |  |  | 		if(idx >= 0) { | 
					
						
							|  |  |  | 			this.modules.splice(idx, 1); | 
					
						
							|  |  |  | 			module.removeChunk(this); | 
					
						
							|  |  |  | 			return true; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return false; | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 	removeChunk(chunk) { | 
					
						
							| 
									
										
										
										
											2017-03-02 22:09:09 +08:00
										 |  |  | 		const idx = this.chunks.indexOf(chunk); | 
					
						
							| 
									
										
										
										
											2017-02-13 18:26:25 +08:00
										 |  |  | 		if(idx >= 0) { | 
					
						
							|  |  |  | 			this.chunks.splice(idx, 1); | 
					
						
							|  |  |  | 			chunk.removeParent(this); | 
					
						
							|  |  |  | 			return true; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return false; | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 	removeParent(chunk) { | 
					
						
							| 
									
										
										
										
											2017-03-02 22:09:09 +08:00
										 |  |  | 		const idx = this.parents.indexOf(chunk); | 
					
						
							| 
									
										
										
										
											2017-02-13 18:26:25 +08:00
										 |  |  | 		if(idx >= 0) { | 
					
						
							|  |  |  | 			this.parents.splice(idx, 1); | 
					
						
							|  |  |  | 			chunk.removeChunk(this); | 
					
						
							|  |  |  | 			return true; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return false; | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 	addOrigin(module, loc) { | 
					
						
							|  |  |  | 		this.origins.push({ | 
					
						
							|  |  |  | 			module, | 
					
						
							|  |  |  | 			loc, | 
					
						
							|  |  |  | 			name: this.name | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-06-25 00:53:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 	remove(reason) { | 
					
						
							| 
									
										
										
										
											2017-01-26 12:47:31 +08:00
										 |  |  | 		// cleanup modules
 | 
					
						
							| 
									
										
										
										
											2017-01-26 12:42:23 +08:00
										 |  |  | 		this.modules.slice().forEach(module => { | 
					
						
							|  |  |  | 			module.removeChunk(this); | 
					
						
							| 
									
										
										
										
											2017-01-26 12:31:37 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-01-26 12:47:31 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// cleanup parents
 | 
					
						
							| 
									
										
										
										
											2017-01-26 15:46:49 +08:00
										 |  |  | 		this.parents.forEach(parentChunk => { | 
					
						
							| 
									
										
										
										
											2017-01-26 12:47:31 +08:00
										 |  |  | 			// remove this chunk from its parents
 | 
					
						
							| 
									
										
										
										
											2017-01-26 15:46:49 +08:00
										 |  |  | 			const idx = parentChunk.chunks.indexOf(this); | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 			if(idx >= 0) { | 
					
						
							| 
									
										
										
										
											2017-01-26 15:46:49 +08:00
										 |  |  | 				parentChunk.chunks.splice(idx, 1); | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-26 12:47:31 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			// cleanup "sub chunks"
 | 
					
						
							| 
									
										
										
										
											2017-01-26 12:42:23 +08:00
										 |  |  | 			this.chunks.forEach(chunk => { | 
					
						
							| 
									
										
										
										
											2017-01-26 12:47:31 +08:00
										 |  |  | 				/** | 
					
						
							|  |  |  | 				 * remove this chunk as "intermediary" and connect | 
					
						
							|  |  |  | 				 * it "sub chunks" and parents directly | 
					
						
							|  |  |  | 				 */ | 
					
						
							|  |  |  | 				// add parent to each "sub chunk"
 | 
					
						
							| 
									
										
										
										
											2017-01-26 15:46:49 +08:00
										 |  |  | 				chunk.addParent(parentChunk); | 
					
						
							| 
									
										
										
										
											2017-01-26 12:47:31 +08:00
										 |  |  | 				// add "sub chunk" to parent
 | 
					
						
							| 
									
										
										
										
											2017-01-26 15:46:49 +08:00
										 |  |  | 				parentChunk.addChunk(chunk); | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2017-01-26 12:31:37 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-01-26 12:47:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-13 18:32:33 +08:00
										 |  |  | 		/** | 
					
						
							|  |  |  | 		 * we need to iterate again over the chunks | 
					
						
							|  |  |  | 		 * to remove this from the chunks parents. | 
					
						
							|  |  |  | 		 * This can not be done in the above loop | 
					
						
							|  |  |  | 		 * as it is not garuanteed that `this.parents` contains anything. | 
					
						
							|  |  |  | 		 */ | 
					
						
							|  |  |  | 		this.chunks.forEach(chunk => { | 
					
						
							|  |  |  | 			// remove this as parent of every "sub chunk"
 | 
					
						
							|  |  |  | 			const idx = chunk.parents.indexOf(this); | 
					
						
							|  |  |  | 			if(idx >= 0) { | 
					
						
							|  |  |  | 				chunk.parents.splice(idx, 1); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 12:47:31 +08:00
										 |  |  | 		// cleanup blocks
 | 
					
						
							| 
									
										
										
										
											2017-01-26 12:42:23 +08:00
										 |  |  | 		this.blocks.forEach(block => { | 
					
						
							|  |  |  | 			const idx = block.chunks.indexOf(this); | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 			if(idx >= 0) { | 
					
						
							| 
									
										
										
										
											2017-01-26 12:42:23 +08:00
										 |  |  | 				block.chunks.splice(idx, 1); | 
					
						
							|  |  |  | 				if(block.chunks.length === 0) { | 
					
						
							|  |  |  | 					block.chunks = null; | 
					
						
							|  |  |  | 					block.chunkReason = reason; | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-26 12:31:37 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-06-25 00:53:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 14:08:35 +08:00
										 |  |  | 	moveModule(module, otherChunk) { | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 		module.removeChunk(this); | 
					
						
							| 
									
										
										
										
											2017-01-26 14:08:35 +08:00
										 |  |  | 		module.addChunk(otherChunk); | 
					
						
							|  |  |  | 		otherChunk.addModule(module); | 
					
						
							|  |  |  | 		module.rewriteChunkInReasons(this, [otherChunk]); | 
					
						
							| 
									
										
										
										
											2014-06-04 03:03:21 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 14:53:23 +08:00
										 |  |  | 	replaceChunk(oldChunk, newChunk) { | 
					
						
							|  |  |  | 		const idx = this.chunks.indexOf(oldChunk); | 
					
						
							|  |  |  | 		if(idx >= 0) { | 
					
						
							|  |  |  | 			this.chunks.splice(idx, 1); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if(this !== newChunk && newChunk.addParent(this)) { | 
					
						
							|  |  |  | 			this.addChunk(newChunk); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 15:46:49 +08:00
										 |  |  | 	replaceParentChunk(oldParentChunk, newParentChunk) { | 
					
						
							|  |  |  | 		const idx = this.parents.indexOf(oldParentChunk); | 
					
						
							| 
									
										
										
										
											2017-01-26 14:53:23 +08:00
										 |  |  | 		if(idx >= 0) { | 
					
						
							|  |  |  | 			this.parents.splice(idx, 1); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-26 15:46:49 +08:00
										 |  |  | 		if(this !== newParentChunk && newParentChunk.addChunk(this)) { | 
					
						
							|  |  |  | 			this.addParent(newParentChunk); | 
					
						
							| 
									
										
										
										
											2017-01-26 14:53:23 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 15:43:39 +08:00
										 |  |  | 	integrate(otherChunk, reason) { | 
					
						
							|  |  |  | 		if(!this.canBeIntegrated(otherChunk)) { | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 			return false; | 
					
						
							| 
									
										
										
										
											2014-06-04 03:03:21 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 15:43:39 +08:00
										 |  |  | 		const otherChunkModules = otherChunk.modules.slice(); | 
					
						
							|  |  |  | 		otherChunkModules.forEach(module => otherChunk.moveModule(module, this)); | 
					
						
							|  |  |  | 		otherChunk.modules.length = 0; | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 15:46:49 +08:00
										 |  |  | 		otherChunk.parents.forEach(parentChunk => parentChunk.replaceChunk(otherChunk, this)); | 
					
						
							| 
									
										
										
										
											2017-01-26 15:43:39 +08:00
										 |  |  | 		otherChunk.parents.length = 0; | 
					
						
							| 
									
										
										
										
											2017-01-26 14:56:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 15:46:49 +08:00
										 |  |  | 		otherChunk.chunks.forEach(chunk => chunk.replaceParentChunk(otherChunk, this)); | 
					
						
							| 
									
										
										
										
											2017-01-26 15:43:39 +08:00
										 |  |  | 		otherChunk.chunks.length = 0; | 
					
						
							| 
									
										
										
										
											2017-01-26 14:56:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 15:43:39 +08:00
										 |  |  | 		otherChunk.blocks.forEach(b => { | 
					
						
							| 
									
										
										
										
											2017-01-26 15:08:27 +08:00
										 |  |  | 			b.chunks = b.chunks ? b.chunks.map(c => { | 
					
						
							| 
									
										
										
										
											2017-01-26 15:43:39 +08:00
										 |  |  | 				return c === otherChunk ? this : c; | 
					
						
							| 
									
										
										
										
											2017-01-26 15:08:58 +08:00
										 |  |  | 			}) : [this]; | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 			b.chunkReason = reason; | 
					
						
							|  |  |  | 			this.addBlock(b); | 
					
						
							| 
									
										
										
										
											2017-01-26 15:08:58 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-01-26 15:43:39 +08:00
										 |  |  | 		otherChunk.blocks.length = 0; | 
					
						
							| 
									
										
										
										
											2017-01-26 15:08:58 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 15:43:39 +08:00
										 |  |  | 		otherChunk.origins.forEach(origin => { | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 			this.origins.push(origin); | 
					
						
							| 
									
										
										
										
											2017-01-26 15:08:58 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 		this.origins.forEach(origin => { | 
					
						
							|  |  |  | 			if(!origin.reasons) { | 
					
						
							|  |  |  | 				origin.reasons = [reason]; | 
					
						
							|  |  |  | 			} else if(origin.reasons[0] !== reason) { | 
					
						
							|  |  |  | 				origin.reasons.unshift(reason); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-01-26 15:43:39 +08:00
										 |  |  | 		this.chunks = this.chunks.filter(chunk => { | 
					
						
							|  |  |  | 			return chunk !== otherChunk && chunk !== this; | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-01-26 15:46:49 +08:00
										 |  |  | 		this.parents = this.parents.filter(parentChunk => { | 
					
						
							|  |  |  | 			return parentChunk !== otherChunk && parentChunk !== this; | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 		return true; | 
					
						
							| 
									
										
										
										
											2014-06-04 03:03:21 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-04 01:12:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 	split(newChunk) { | 
					
						
							| 
									
										
										
										
											2017-01-26 15:43:39 +08:00
										 |  |  | 		this.blocks.forEach(block => { | 
					
						
							|  |  |  | 			newChunk.blocks.push(block); | 
					
						
							|  |  |  | 			block.chunks.push(newChunk); | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-01-26 15:43:39 +08:00
										 |  |  | 		this.chunks.forEach(chunk => { | 
					
						
							|  |  |  | 			newChunk.chunks.push(chunk); | 
					
						
							|  |  |  | 			chunk.parents.push(newChunk); | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-01-26 15:46:49 +08:00
										 |  |  | 		this.parents.forEach(parentChunk => { | 
					
						
							|  |  |  | 			parentChunk.chunks.push(newChunk); | 
					
						
							|  |  |  | 			newChunk.parents.push(parentChunk); | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-01-26 15:43:39 +08:00
										 |  |  | 		this.entrypoints.forEach(entrypoint => { | 
					
						
							|  |  |  | 			entrypoint.insertChunk(newChunk, this); | 
					
						
							| 
									
										
										
										
											2014-06-25 00:53:32 +08:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	isEmpty() { | 
					
						
							|  |  |  | 		return this.modules.length === 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	updateHash(hash) { | 
					
						
							|  |  |  | 		hash.update(`${this.id} `); | 
					
						
							|  |  |  | 		hash.update(this.ids ? this.ids.join(",") : ""); | 
					
						
							|  |  |  | 		hash.update(`${this.name || ""} `); | 
					
						
							|  |  |  | 		this.modules.forEach(m => m.updateHash(hash)); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 15:47:45 +08:00
										 |  |  | 	canBeIntegrated(otherChunk) { | 
					
						
							|  |  |  | 		if(otherChunk.isInitial()) { | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 			return false; | 
					
						
							| 
									
										
										
										
											2014-08-22 19:51:24 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 		if(this.isInitial()) { | 
					
						
							| 
									
										
										
										
											2017-01-26 15:47:45 +08:00
										 |  |  | 			if(otherChunk.parents.length !== 1 || otherChunk.parents[0] !== this) { | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 				return false; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-06-04 03:03:21 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 		return true; | 
					
						
							| 
									
										
										
										
											2014-06-04 03:03:21 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 15:41:51 +08:00
										 |  |  | 	addMultiplierAndOverhead(size, options) { | 
					
						
							|  |  |  | 		const overhead = typeof options.chunkOverhead === "number" ? options.chunkOverhead : 10000; | 
					
						
							|  |  |  | 		const multiplicator = this.isInitial() ? (options.entryChunkMultiplicator || 10) : 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return size * multiplicator + overhead; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	modulesSize() { | 
					
						
							|  |  |  | 		let count = 0; | 
					
						
							|  |  |  | 		for(let i = 0; i < this.modules.length; i++) { | 
					
						
							|  |  |  | 			count += this.modules[i].size(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return count; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	size(options) { | 
					
						
							|  |  |  | 		return this.addMultiplierAndOverhead(this.modulesSize(), options); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 15:47:45 +08:00
										 |  |  | 	integratedSize(otherChunk, options) { | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 		// Chunk if it's possible to integrate this chunk
 | 
					
						
							| 
									
										
										
										
											2017-01-26 15:47:45 +08:00
										 |  |  | 		if(!this.canBeIntegrated(otherChunk)) { | 
					
						
							| 
									
										
										
										
											2014-06-04 03:03:21 +08:00
										 |  |  | 			return false; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-26 21:24:33 +08:00
										 |  |  | 		let integratedModulesSize = this.modulesSize(); | 
					
						
							|  |  |  | 		// only count modules that do not exist in this chunk!
 | 
					
						
							|  |  |  | 		for(let i = 0; i < otherChunk.modules.length; i++) { | 
					
						
							|  |  |  | 			const otherModule = otherChunk.modules[i]; | 
					
						
							|  |  |  | 			if(this.modules.indexOf(otherModule) === -1) { | 
					
						
							|  |  |  | 				integratedModulesSize += otherModule.size(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return this.addMultiplierAndOverhead(integratedModulesSize, options); | 
					
						
							| 
									
										
										
										
											2014-02-04 01:12:19 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 	getChunkMaps(includeEntries, realHash) { | 
					
						
							|  |  |  | 		const chunksProcessed = []; | 
					
						
							|  |  |  | 		const chunkHashMap = {}; | 
					
						
							|  |  |  | 		const chunkNameMap = {}; | 
					
						
							| 
									
										
										
										
											2017-01-26 15:41:19 +08:00
										 |  |  | 		(function addChunk(chunk) { | 
					
						
							|  |  |  | 			if(chunksProcessed.indexOf(chunk) >= 0) return; | 
					
						
							|  |  |  | 			chunksProcessed.push(chunk); | 
					
						
							|  |  |  | 			if(!chunk.hasRuntime() || includeEntries) { | 
					
						
							|  |  |  | 				chunkHashMap[chunk.id] = realHash ? chunk.hash : chunk.renderedHash; | 
					
						
							|  |  |  | 				if(chunk.name) | 
					
						
							|  |  |  | 					chunkNameMap[chunk.id] = chunk.name; | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2017-01-26 15:41:19 +08:00
										 |  |  | 			chunk.chunks.forEach(addChunk); | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 		}(this)); | 
					
						
							|  |  |  | 		return { | 
					
						
							|  |  |  | 			hash: chunkHashMap, | 
					
						
							|  |  |  | 			name: chunkNameMap | 
					
						
							|  |  |  | 		}; | 
					
						
							| 
									
										
										
										
											2014-06-04 03:03:21 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-04 01:12:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 	sortItems() { | 
					
						
							|  |  |  | 		this.modules.sort(byId); | 
					
						
							|  |  |  | 		this.origins.sort((a, b) => { | 
					
						
							|  |  |  | 			const aIdent = a.module.identifier(); | 
					
						
							|  |  |  | 			const bIdent = b.module.identifier(); | 
					
						
							|  |  |  | 			if(aIdent < bIdent) return -1; | 
					
						
							|  |  |  | 			if(aIdent > bIdent) return 1; | 
					
						
							|  |  |  | 			return compareLocations(a.loc, b.loc); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		this.origins.forEach(origin => { | 
					
						
							|  |  |  | 			if(origin.reasons) | 
					
						
							|  |  |  | 				origin.reasons.sort(); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		this.parents.sort(byId); | 
					
						
							|  |  |  | 		this.chunks.sort(byId); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-06-18 00:55:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 	toString() { | 
					
						
							|  |  |  | 		return `Chunk[${this.modules.join()}]`; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	checkConstraints() { | 
					
						
							|  |  |  | 		const chunk = this; | 
					
						
							|  |  |  | 		chunk.chunks.forEach((child, idx) => { | 
					
						
							|  |  |  | 			if(chunk.chunks.indexOf(child) !== idx) | 
					
						
							|  |  |  | 				throw new Error(`checkConstraints: duplicate child in chunk ${chunk.debugId} ${child.debugId}`); | 
					
						
							|  |  |  | 			if(child.parents.indexOf(chunk) < 0) | 
					
						
							|  |  |  | 				throw new Error(`checkConstraints: child missing parent ${chunk.debugId} -> ${child.debugId}`); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-01-26 15:46:49 +08:00
										 |  |  | 		chunk.parents.forEach((parentChunk, idx) => { | 
					
						
							|  |  |  | 			if(chunk.parents.indexOf(parentChunk) !== idx) | 
					
						
							|  |  |  | 				throw new Error(`checkConstraints: duplicate parent in chunk ${chunk.debugId} ${parentChunk.debugId}`); | 
					
						
							|  |  |  | 			if(parentChunk.chunks.indexOf(chunk) < 0) | 
					
						
							|  |  |  | 				throw new Error(`checkConstraints: parent missing child ${parentChunk.debugId} <- ${chunk.debugId}`); | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-07-13 17:03:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-05 00:17:49 +08:00
										 |  |  | module.exports = Chunk; |