Code coverage report for lib\ContextModuleFactory.js

Statements: 83.56% (61 / 73)      Branches: 64.71% (22 / 34)      Functions: 100% (16 / 16)      Lines: 98.36% (60 / 61)      Ignored: none     

All files » lib\ » ContextModuleFactory.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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124        1 1   1 1 1   1 496 496   1   1 1 260           260     260   260 260 260 260   260 260 260 41 41 10   41 41 41 41   219 219     260       260   260           260     260   260           1 170 322 322 322   857   857 857   857   152 152   705   705       705 705 1216   530 530 530   705               322   322   857 857            
/*
	MIT License http://www.opensource.org/licenses/mit-license.php
	Author Tobias Koppers @sokra
*/
var async = require("async");
var path = require("path");
 
var Tapable = require("tapable");
var ContextModule = require("./ContextModule");
var ContextElementDependency = require("./dependencies/ContextElementDependency");
 
function ContextModuleFactory(resolvers) {
	Tapable.call(this);
	this.resolvers = resolvers;
}
module.exports = ContextModuleFactory;
 
ContextModuleFactory.prototype = Object.create(Tapable.prototype);
ContextModuleFactory.prototype.create = function(context, dependency, callback) {
	this.applyPluginsAsyncWaterfall("before-resolve", {
		context: context,
		request: dependency.request,
		recursive: dependency.recursive,
		regExp: dependency.regExp
	}, function(err, result) {
		Iif(err) return callback(err);
 
		// Ignored
		Iif(!result) return callback();
 
		var context = result.context;
		var request = result.request;
		var recursive = result.recursive;
		var regExp = result.regExp;
 
		var loaders, resource, loadersPrefix = "";
		var idx = request.lastIndexOf("!");
		if(idx >= 0) {
			loaders = request.substr(0, idx+1);
			for(var i = 0; i < loaders.length && loaders[i] === "!"; i++) {
				loadersPrefix += "!";
			}
			loaders = loaders.substr(i).replace(/!+$/, "").replace(/!!+/g, "!");
			Iif(loaders === "") loaders = [];
			else loaders = loaders.split("!");
			resource = request.substr(idx+1);
		} else {
			loaders = [];
			resource = request;
		}
 
		async.parallel([
			this.resolvers.context.resolve.bind(this.resolvers.context, context, resource),
			async.map.bind(async, loaders, this.resolvers.loader.resolve.bind(this.resolvers.loader, context))
		], function(err, result) {
			Iif(err) return callback(err);
 
			this.applyPluginsAsyncWaterfall("after-resolve", {
				loaders: loadersPrefix + result[1].join("!") + (result[1].length > 0 ? "!" : ""),
				resource: result[0],
				recursive: recursive,
				regExp: regExp
			},  function(err, result) {
				Iif(err) return callback(err);
 
				// Ignored
				Iif(!result) return callback();
 
				return callback(null, new ContextModule(this.resolveDependencies.bind(this), result.resource, result.recursive, result.regExp, result.loaders));
			}.bind(this));
		}.bind(this));
	}.bind(this));
};
 
ContextModuleFactory.prototype.resolveDependencies = function resolveDependencies(fs, resource, recursive, regExp, callback) {
	(function addDirectory(directory, callback) {
		fs.readdir(directory, function(err, files) {
			Iif(!files || files.length === 0) return callback();
			async.map(files, function(seqment, callback) {
 
				var subResource = path.join(directory, seqment)
 
				fs.stat(subResource, function(err, stat) {
					Iif(err) return callback(err);
 
					if(stat.isDirectory()) {
 
						Iif(!recursive) return callback();
						addDirectory.call(this, subResource, callback);
 
					} else Eif(stat.isFile()) {
 
						var obj = {
							context: resource,
							request: "." + subResource.substr(resource.length).replace(/\\/g, "/")
						};
						this.applyPluginsAsyncWaterfall("alternatives", [obj], function(err, alternatives) {
							alternatives = alternatives.filter(function(obj) {
								return regExp.test(obj.request);
							}).map(function(obj) {
								var dep = new ContextElementDependency(obj.request);
								dep.optional = true;
								return dep;
							});
							callback(null, alternatives);
						});
 
					} else callback();
 
				}.bind(this));
 
			}.bind(this), function(err, result) {
				Iif(err) return callback(err);
 
				Iif(!result) return callback(null, []);
 
				callback(null, result.filter(function(i) { return !!i; }).reduce(function(a, i) {
					return a.concat(i);
				}, []));
			});
		}.bind(this));
	}.call(this, resource, callback));
};