Code coverage report for lib\ExternalModuleFactoryDecorator.js

Statements: 73.85% (48 / 65)      Branches: 68.18% (30 / 44)      Functions: 77.78% (7 / 9)      Lines: 77.19% (44 / 57)      Ignored: none     

All files » lib\ » ExternalModuleFactoryDecorator.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 82 83        1   1 455 455 455   1   1       1 3727 3727 1 3727 3727 3727   3727 110 110         110 110   3727 148867 145138 106   3729 3721 3721 3721 148754 148754 145140 145140 145140 145033     107     107   3721 8       8                   8 4   145036   3727 3727 110      
/*
	MIT License http://www.opensource.org/licenses/mit-license.php
	Author Tobias Koppers @sokra
*/
var ExternalModule = require("./ExternalModule");
 
function ExternalModuleFactoryDecorator(factory, type, externals) {
	this.factory = factory;
	this.type = type;
	this.externals = externals;
}
module.exports = ExternalModuleFactoryDecorator;
 
ExternalModuleFactoryDecorator.prototype.plugin = function() {
	return this.factory.plugin.apply(this.factory, arguments);
};
 
ExternalModuleFactoryDecorator.prototype.create = function(context, dependency, callback) {
	var factory = this.factory;
	var globalType = this.type;
	function handleExternal(value, type, callback) {
		Eif(typeof type === "function") {
			callback = type;
			type = undefined;
		}
		if(value === false) return factory.create(context, dependency, callback);
		Iif(value === true) value = dependency.request;
		Iif(typeof type === "undefined" && /^[a-z0-9]+ /.test(value)) {
			var idx = value.indexOf(" ");
			type = value.substr(0, idx);
			value = value.substr(idx+1);
		}
		callback(null, new ExternalModule(value, type || globalType));
		return true;
	}
	(function handleExternals(externals, callback) {
		if(typeof externals === "string") {
			if(externals === dependency.request) {
				return handleExternal(dependency.request, callback);
			}
		} else if(Array.isArray(externals)) {
			var i = 0;
			(function next() {
				do {
					var async = true;
					if(i >= externals.length) return callback();
					handleExternals(externals[i++], function(err, module) {
						Iif(err) return callback(err);
						if(!module) {
							Eif(async) return async = false;;
							return next();
						}
						callback(null, module);
					});
				} while(!async);
				async = false;
			}());
			return;
		} else Iif(externals instanceof RegExp) {
			if(externals.test(dependency.request)) {
				return handleExternal(dependency.request, callback);
			}
		} else Iif(typeof externals === "function") {
			externals.call(null, context, dependency.request, function(err, value, type) {
				if(err) return callback(err);
				if(typeof value !== "undefined") {
					handleExternal(value, type, callback);
				} else {
					callback();
				}
			});
			return;
		} else if(typeof externals === "object" && Object.prototype.hasOwnProperty.call(externals, dependency.request)) {
			return handleExternal(externals[dependency.request], callback);
		}
		callback();
	}(this.externals, function(err, module) {
		Iif(err) return callback(err);
		if(!module) return handleExternal(false, callback);
		return callback(null, module);
	}));
};