| 
									
										
										
										
											2013-05-31 18:22:40 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | function RecordIdsPlugin() { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | module.exports = RecordIdsPlugin; | 
					
						
							|  |  |  | RecordIdsPlugin.prototype.apply = function(compiler) { | 
					
						
							|  |  |  | 	compiler.plugin("compilation", function(compilation) { | 
					
						
							|  |  |  | 		compilation.plugin("record-modules", function(modules, records) { | 
					
						
							|  |  |  | 			records.nextFreeModuleId = compilation.nextFreeModuleId; | 
					
						
							|  |  |  | 			if(!records.modules) records.modules = {}; | 
					
						
							|  |  |  | 			if(!records.modules.byIdentifier) records.modules.byIdentifier = {}; | 
					
						
							|  |  |  | 			modules.forEach(function(module) { | 
					
						
							|  |  |  | 				var identifier = module.identifier(); | 
					
						
							|  |  |  | 				records.modules.byIdentifier[identifier] = module.id; | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		compilation.plugin("revive-modules", function(modules, records) { | 
					
						
							|  |  |  | 			if(records.nextFreeModuleId) | 
					
						
							|  |  |  | 				compilation.nextFreeModuleId = records.nextFreeModuleId; | 
					
						
							|  |  |  | 			if(!records.modules || !records.modules.byIdentifier) return; | 
					
						
							|  |  |  | 			var usedIds = {0: true}; | 
					
						
							|  |  |  | 			modules.forEach(function(module) { | 
					
						
							|  |  |  | 				if(module.id !== null) return; | 
					
						
							|  |  |  | 				var identifier = module.identifier(); | 
					
						
							|  |  |  | 				var id = records.modules.byIdentifier[identifier]; | 
					
						
							| 
									
										
										
										
											2013-06-19 17:53:03 +08:00
										 |  |  | 				if(id === undefined) return; | 
					
						
							| 
									
										
										
										
											2013-05-31 18:22:40 +08:00
										 |  |  | 				if(usedIds[id]) return; | 
					
						
							|  |  |  | 				usedIds[id] = true; | 
					
						
							|  |  |  | 				module.id = id; | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		function getDepBlockIdent(block) { | 
					
						
							|  |  |  | 			var ident = []; | 
					
						
							|  |  |  | 			while(block.parent) { | 
					
						
							|  |  |  | 				var p = block.parent; | 
					
						
							|  |  |  | 				var idx = p.blocks.indexOf(block); | 
					
						
							|  |  |  | 				var l = p.blocks.length - 1; | 
					
						
							|  |  |  | 				ident.unshift(idx + "/" + l); | 
					
						
							|  |  |  | 				block = block.parent; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if(!block.identifier) return null; | 
					
						
							|  |  |  | 			ident.unshift(block.identifier()); | 
					
						
							|  |  |  | 			return ident.join(":"); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		compilation.plugin("record-chunks", function(chunks, records) { | 
					
						
							|  |  |  | 			records.nextFreeChunkId = compilation.nextFreeChunkId; | 
					
						
							|  |  |  | 			if(!records.chunks) records.chunks = {}; | 
					
						
							|  |  |  | 			if(!records.chunks.byName) records.chunks.byName = {}; | 
					
						
							|  |  |  | 			if(!records.chunks.byBlocks) records.chunks.byBlocks = {}; | 
					
						
							|  |  |  | 			chunks.forEach(function(chunk) { | 
					
						
							|  |  |  | 				var name = chunk.name; | 
					
						
							|  |  |  | 				var blockIdents = chunk.blocks.map(getDepBlockIdent).filter(Boolean); | 
					
						
							|  |  |  | 				if(name) records.chunks.byName[name] = chunk.id; | 
					
						
							|  |  |  | 				blockIdents.forEach(function(blockIdent) { | 
					
						
							|  |  |  | 					records.chunks.byBlocks[blockIdent] = chunk.id; | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 		compilation.plugin("revive-chunks", function(chunks, records) { | 
					
						
							|  |  |  | 			if(records.nextFreeChunkId) | 
					
						
							|  |  |  | 				compilation.nextFreeChunkId = records.nextFreeChunkId; | 
					
						
							|  |  |  | 			if(!records.chunks) return; | 
					
						
							| 
									
										
										
										
											2014-02-11 20:27:41 +08:00
										 |  |  | 			var usedIds = {}; | 
					
						
							| 
									
										
										
										
											2013-05-31 18:22:40 +08:00
										 |  |  | 			if(records.chunks.byName) { | 
					
						
							|  |  |  | 				chunks.forEach(function(chunk) { | 
					
						
							|  |  |  | 					if(chunk.id !== null) return; | 
					
						
							|  |  |  | 					if(!chunk.name) return; | 
					
						
							|  |  |  | 					var id = records.chunks.byName[chunk.name]; | 
					
						
							| 
									
										
										
										
											2013-06-19 17:53:03 +08:00
										 |  |  | 					if(id === undefined) return; | 
					
						
							| 
									
										
										
										
											2013-05-31 18:22:40 +08:00
										 |  |  | 					if(usedIds[id]) return; | 
					
						
							|  |  |  | 					usedIds[id] = true; | 
					
						
							|  |  |  | 					chunk.id = id; | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			if(records.chunks.byBlocks) { | 
					
						
							|  |  |  | 				var argumentedChunks = chunks.filter(function(chunk) { | 
					
						
							|  |  |  | 					return chunk.id === null | 
					
						
							|  |  |  | 				}).map(function(chunk) { | 
					
						
							|  |  |  | 					return { | 
					
						
							|  |  |  | 						chunk: chunk, | 
					
						
							|  |  |  | 						blockIdents: chunk.blocks.map(getDepBlockIdent).filter(Boolean) | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				}).filter(function(arg) { | 
					
						
							|  |  |  | 					return arg.blockIdents.length > 0; | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 				var blockIdentsCount = {}; | 
					
						
							|  |  |  | 				argumentedChunks.forEach(function(arg, idx) { | 
					
						
							|  |  |  | 					arg.blockIdents.forEach(function(blockIdent) { | 
					
						
							|  |  |  | 						var id = records.chunks.byBlocks[blockIdent] | 
					
						
							|  |  |  | 						if(!id) return; | 
					
						
							|  |  |  | 						var accessor = id + ":" + idx; | 
					
						
							|  |  |  | 						blockIdentsCount[accessor] = (blockIdentsCount[accessor] || 0) + 1; | 
					
						
							|  |  |  | 					}); | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 				blockIdentsCount = Object.keys(blockIdentsCount).map(function(accessor) { | 
					
						
							|  |  |  | 					return [blockIdentsCount[accessor]].concat(accessor.split(":").map(Number)); | 
					
						
							|  |  |  | 				}).sort(function(a, b) { | 
					
						
							|  |  |  | 					return b[0] - a[0]; | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 				blockIdentsCount.forEach(function(arg) { | 
					
						
							|  |  |  | 					var id = arg[1]; | 
					
						
							|  |  |  | 					if(usedIds[id]) return; | 
					
						
							|  |  |  | 					var idx = arg[2]; | 
					
						
							|  |  |  | 					var chunk = argumentedChunks[idx].chunk; | 
					
						
							|  |  |  | 					if(chunk.id !== null) return; | 
					
						
							|  |  |  | 					usedIds[id] = true; | 
					
						
							|  |  |  | 					chunk.id = id; | 
					
						
							|  |  |  | 				}); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	}); | 
					
						
							|  |  |  | }; |