/* 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]; if(id === undefined) return; 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; var usedIds = {0: true}; if(records.chunks.byName) { chunks.forEach(function(chunk) { if(chunk.id !== null) return; if(!chunk.name) return; var id = records.chunks.byName[chunk.name]; if(id === undefined) return; 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; }); } }); }); };