Code coverage report for lib\optimize\OccurrenceOrderPlugin.js

Statements: 96.1% (74 / 77)      Branches: 95.24% (40 / 42)      Functions: 100% (20 / 20)      Lines: 98.31% (58 / 59)      Ignored: none     

All files » lib\optimize\ » OccurrenceOrderPlugin.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81        1 31   1 1 115 115 127 1 1145 1146     1 564 581 581 581   1 3010 4761 4761 4761   127 1661 282 282 282 245   1505 1505 1505 1273 815 340 4     127 1 316 282     1 236   127 201 1445 596 4     127 158 158 158 148 118 118 118 116 84 63 27 28 19            
/*
	MIT License http://www.opensource.org/licenses/mit-license.php
	Author Tobias Koppers @sokra
*/
function OccurrenceOrderPlugin(preferEntry) {
	this.preferEntry = preferEntry;
}
module.exports = OccurrenceOrderPlugin;
OccurrenceOrderPlugin.prototype.apply = function(compiler) {
	var preferEntry = this.preferEntry;
	compiler.plugin("compilation", function(compilation) {
		compilation.plugin("optimize-module-order", function(modules) {
			function entryChunks(m) {
				return m.chunks.filter(function(c) {
					return c.initial;
				}).length;
			}
			function occursInEntry(m) {
				return m.reasons.map(function(r) {
					Iif(!r.module) return 0;
					return entryChunks(r.module);
				}).reduce(function(a, b) { return a+b; }, 0) + entryChunks(m);
			}
			function occurs(m) {
				return m.reasons.map(function(r) {
					Iif(!r.module) return 0;
					return r.module.chunks.length;
				}).reduce(function(a, b) { return a+b; }, 0) + m.chunks.length;
			}
			modules.sort(function(a, b) {
				if(preferEntry) {
					var aEntryOccurs = occursInEntry(a);
					var bEntryOccurs = occursInEntry(b);
					if(aEntryOccurs > bEntryOccurs) return -1;
					if(aEntryOccurs < bEntryOccurs) return 1;
				}
				var aOccurs = occurs(a);
				var bOccurs = occurs(b);
				if(aOccurs > bOccurs) return -1;
				if(aOccurs < bOccurs) return 1;
				if(a.identifier() > b.identifier()) return 1;
				if(a.identifier() < b.identifier()) return -1;
				return 0;
			});
		});
		compilation.plugin("optimize-chunk-order", function(chunks) {
			function occursInEntry(c) {
				return c.parents.filter(function(p) {
					return p.initial;
				}).length + (c.entry ? 1 : 0);
			}
			function occurs(c) {
				return c.blocks.length + (c.entry ? 1 : 0);
			}
			chunks.forEach(function(c) {
				c.modules.sort(function(a, b) {
					if(a.identifier() > b.identifier()) return 1;
					if(a.identifier() < b.identifier()) return -1;
					return 0;
				});
			});
			chunks.sort(function(a, b) {
				var aEntryOccurs = occursInEntry(a);
				var bEntryOccurs = occursInEntry(b);
				if(aEntryOccurs > bEntryOccurs) return -1;
				if(aEntryOccurs < bEntryOccurs) return 1;
				var aOccurs = occurs(a);
				var bOccurs = occurs(b);
				if(aOccurs > bOccurs) return -1;
				if(aOccurs < bOccurs) return 1;
				if(a.modules.length > b.modules.length) return -1;
				if(a.modules.length < b.modules.length) return 1;
				for(var i = 0; i < a.modules.length; i++) {
					if(a.modules[i].identifier() > b.modules[i].identifier()) return -1;
					if(a.modules[i].identifier() < b.modules[i].identifier()) return 1;
				}
				return 0;
			});
		});
	});
};