mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			108 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| /*
 | |
| 	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) {
 | |
| 		if(err) return callback(err);
 | |
| 
 | |
| 		var context = result.context;
 | |
| 		var request = result.request;
 | |
| 		var recursive = result.recursive;
 | |
| 		var regExp = result.regExp;
 | |
| 
 | |
| 		var loaders, resource;
 | |
| 		var idx = request.lastIndexOf("!");
 | |
| 		if(idx >= 0) {
 | |
| 			loaders = request.substr(0, idx+1);
 | |
| 			resource = request.substr(idx+1);
 | |
| 		} else {
 | |
| 			loaders = "";
 | |
| 			resource = request;
 | |
| 		}
 | |
| 
 | |
| 		this.resolvers.context.resolve(context, resource, function(err, resource) {
 | |
| 			if(err) return callback(err);
 | |
| 
 | |
| 			this.applyPluginsAsyncWaterfall("after-resolve", {
 | |
| 				loaders: loaders,
 | |
| 				resource: resource,
 | |
| 				recursive: recursive,
 | |
| 				regExp: regExp
 | |
| 			},  function(err, result) {
 | |
| 				if(err) return callback(err);
 | |
| 
 | |
| 				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) {
 | |
| 			if(!files || files.length == 0) return callback();
 | |
| 			async.map(files, function(seqment, callback) {
 | |
| 
 | |
| 				var subResource = path.join(directory, seqment)
 | |
| 
 | |
| 				fs.stat(subResource, function(err, stat) {
 | |
| 					if(err) return callback(err);
 | |
| 
 | |
| 					if(stat.isDirectory()) {
 | |
| 
 | |
| 						if(!recursive) return callback();
 | |
| 						addDirectory.call(this, subResource, callback);
 | |
| 					
 | |
| 					} else if(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) {
 | |
| 				if(err) return callback(err);
 | |
| 				
 | |
| 				if(!result) return callback();
 | |
| 				
 | |
| 				callback(null, result.filter(function(i) { return !!i; }).reduce(function(a, i) {
 | |
| 					return a.concat(i);
 | |
| 				}, []));
 | |
| 			});
 | |
| 		}.bind(this));
 | |
| 	}.call(this, resource, callback));
 | |
| };
 |