Code coverage report for lib\dependencies\RequireEnsureDependenciesBlockParserPlugin.js

Statements: 88.1% (37 / 42)      Branches: 79.17% (19 / 24)      Functions: 100% (3 / 3)      Lines: 92.5% (37 / 40)      Ignored: none     

All files » lib\dependencies\ » RequireEnsureDependenciesBlockParserPlugin.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        1 1 1   1   258 258   43 43 43 43     258 258 258 258       258           20 20   258 258 258 258 258 258 258 130 130 130 130           258     258 238 238       258   258   258 20   258          
/*
	MIT License http://www.opensource.org/licenses/mit-license.php
	Author Tobias Koppers @sokra
*/
var AbstractPlugin = require("../AbstractPlugin");
var RequireEnsureDependenciesBlock = require("./RequireEnsureDependenciesBlock");
var RequireEnsureItemDependency = require("./RequireEnsureItemDependency");
 
module.exports = AbstractPlugin.create({
	"call require.ensure": function(expr) {
		var chunkName = null, chunkNameRange = null;
		switch(expr.arguments.length) {
		case 3:
			var chunkNameExpr = this.evaluateExpression(expr.arguments[2]);
			Iif(!chunkNameExpr.isString()) return;
			chunkNameRange = chunkNameExpr.range;
			chunkName = chunkNameExpr.string;
			// fall through
		case 2:
			var dependencies = null;
			var dependenciesExpr = this.evaluateExpression(expr.arguments[0]);
			Iif(!dependenciesExpr.isArray()) return;
			var fnExpression = expr.arguments[1];
 
			// extract the function expression from
			// expresions like "<FunctionExpression>.bind(<Expression>)"
			if(fnExpression.type === "CallExpression" &&
				fnExpression.callee.type === "MemberExpression" &&
				fnExpression.callee.object.type === "FunctionExpression" &&
				fnExpression.callee.property.type === "Identifier" &&
				fnExpression.callee.property.name === "bind" &&
				fnExpression.arguments.length === 1) {
				this.walkExpression(fnExpression.arguments[0]);
				fnExpression = fnExpression.callee.object;
			}
			var dep = new RequireEnsureDependenciesBlock(expr, fnExpression, chunkName, chunkNameRange, this.state.module, expr.loc);
			var old = this.state.current;
			this.state.current = dep;
			try {
				var failed = false;
				this.inScope([], function() {
					dependenciesExpr.items.forEach(function(ee) {
						Eif(ee.isString()) {
							var edep = new RequireEnsureItemDependency(ee.string, ee.range);
							edep.loc = dep.loc;
							dep.addDependency(edep);
						} else {
							failed = true;
						}
					});
				});
				Iif(failed) {
					return;
				}
				if(fnExpression.type === "FunctionExpression") {
					Eif(fnExpression.body.type === "BlockStatement")
						this.walkStatement(fnExpression.body);
					else
						this.walkExpression(fnExpression.body);
				}
				old.addBlock(dep);
			} finally {
				this.state.current = old;
			}
			if(fnExpression.type !== "FunctionExpression") {
				this.walkExpression(fnExpression);
			}
			return true;
		}
	}
});