| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | var async = require("async"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var Tapable = require("tapable"); | 
					
						
							|  |  |  | var NormalModule = require("./NormalModule"); | 
					
						
							| 
									
										
										
										
											2014-03-02 03:07:42 +08:00
										 |  |  | var RawModule = require("./RawModule"); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | var LoadersList = require("webpack-core/lib/LoadersList"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-04 20:59:43 +08:00
										 |  |  | function NormalModuleFactory(context, resolvers, parser, options) { | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 	Tapable.call(this); | 
					
						
							|  |  |  | 	this.resolvers = resolvers; | 
					
						
							|  |  |  | 	this.parser = parser; | 
					
						
							|  |  |  | 	this.loaders = new LoadersList(options.loaders); | 
					
						
							|  |  |  | 	this.preLoaders = new LoadersList(options.preLoaders); | 
					
						
							|  |  |  | 	this.postLoaders = new LoadersList(options.postLoaders); | 
					
						
							| 
									
										
										
										
											2013-02-04 20:59:43 +08:00
										 |  |  | 	this.context = context || ""; | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | } | 
					
						
							|  |  |  | module.exports = NormalModuleFactory; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | NormalModuleFactory.prototype = Object.create(Tapable.prototype); | 
					
						
							|  |  |  | NormalModuleFactory.prototype.create = function(context, dependency, callback) { | 
					
						
							|  |  |  | 	context = context || this.context; | 
					
						
							|  |  |  | 	var request = dependency.request; | 
					
						
							|  |  |  | 	this.applyPluginsAsyncWaterfall("before-resolve", { | 
					
						
							|  |  |  | 		context: context, | 
					
						
							|  |  |  | 		request: request | 
					
						
							|  |  |  | 	}, function(err, result) { | 
					
						
							|  |  |  | 		if(err) return callback(err); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-06 01:19:04 +08:00
										 |  |  | 		// Ignored
 | 
					
						
							|  |  |  | 		if(!result) return callback(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 		context = result.context; | 
					
						
							|  |  |  | 		request = result.request; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-28 23:21:29 +08:00
										 |  |  | 		var noAutoLoaders = /^-?!/.test(request); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 		var noPrePostAutoLoaders = /^!!/.test(request); | 
					
						
							| 
									
										
										
										
											2013-10-28 23:21:29 +08:00
										 |  |  | 		var noPostAutoLoaders = /^-!/.test(request); | 
					
						
							|  |  |  | 		var elements = request.replace(/^-?!+/, "").replace(/!!+/g, "!").split("!"); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 		var resource = elements.pop(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		async.parallel([ | 
					
						
							|  |  |  | 			function(callback) { | 
					
						
							|  |  |  | 				this.resolveRequestArray(context, elements, this.resolvers.loader, callback); | 
					
						
							|  |  |  | 			}.bind(this), | 
					
						
							|  |  |  | 			function(callback) { | 
					
						
							|  |  |  | 				if(resource == "" || resource[0] == "?") | 
					
						
							|  |  |  | 					return callback(null, resource); | 
					
						
							|  |  |  | 				this.resolvers.normal.resolve(context, resource, callback); | 
					
						
							|  |  |  | 			}.bind(this) | 
					
						
							|  |  |  | 		], function(err, results) { | 
					
						
							|  |  |  | 			if(err) return callback(err); | 
					
						
							|  |  |  | 			var loaders = results[0]; | 
					
						
							|  |  |  | 			resource = results[1]; | 
					
						
							| 
									
										
										
										
											2014-03-01 20:37:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-02 03:07:42 +08:00
										 |  |  | 			if(resource === false) | 
					
						
							|  |  |  | 				return callback(null, | 
					
						
							|  |  |  | 					new RawModule("/* (ignored) */", | 
					
						
							|  |  |  | 						"ignored " + context + " " + request, | 
					
						
							|  |  |  | 						request + " (ignored)")); // ignored
 | 
					
						
							| 
									
										
										
										
											2014-03-01 20:37:13 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 			var userRequest = loaders.concat([resource]).join("!"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(noPrePostAutoLoaders) | 
					
						
							|  |  |  | 				return onDoneResolving.call(this); | 
					
						
							|  |  |  | 			if(noAutoLoaders) { | 
					
						
							|  |  |  | 				async.parallel([ | 
					
						
							| 
									
										
										
										
											2013-10-28 23:21:29 +08:00
										 |  |  | 					this.resolveRequestArray.bind(this, context, noPostAutoLoaders ? [] : this.postLoaders.match(resource), this.resolvers.loader), | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 					this.resolveRequestArray.bind(this, context, this.preLoaders.match(resource), this.resolvers.loader) | 
					
						
							|  |  |  | 				], function(err, results) { | 
					
						
							|  |  |  | 					if(err) return callback(err); | 
					
						
							|  |  |  | 					loaders = results[0].concat(loaders).concat(results[1]); | 
					
						
							|  |  |  | 					onDoneResolving.call(this); | 
					
						
							|  |  |  | 				}.bind(this)); | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				async.parallel([ | 
					
						
							| 
									
										
										
										
											2013-10-28 23:21:29 +08:00
										 |  |  | 					this.resolveRequestArray.bind(this, context, noPostAutoLoaders ? [] : this.postLoaders.match(resource), this.resolvers.loader), | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 					this.resolveRequestArray.bind(this, context, this.loaders.match(resource), this.resolvers.loader), | 
					
						
							|  |  |  | 					this.resolveRequestArray.bind(this, context, this.preLoaders.match(resource), this.resolvers.loader) | 
					
						
							|  |  |  | 				], function(err, results) { | 
					
						
							|  |  |  | 					if(err) return callback(err); | 
					
						
							| 
									
										
										
										
											2013-02-13 20:00:01 +08:00
										 |  |  | 					loaders = results[0].concat(loaders).concat(results[1]).concat(results[2]); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 					onDoneResolving.call(this); | 
					
						
							|  |  |  | 				}.bind(this)); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			function onDoneResolving() { | 
					
						
							|  |  |  | 				this.applyPluginsAsyncWaterfall("after-resolve", { | 
					
						
							| 
									
										
										
										
											2014-05-28 12:31:11 +08:00
										 |  |  | 					context: context, | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 					request: loaders.concat([resource]).join("!"), | 
					
						
							|  |  |  | 					userRequest: userRequest, | 
					
						
							|  |  |  | 					rawRequest: request, | 
					
						
							|  |  |  | 					loaders: loaders, | 
					
						
							|  |  |  | 					resource: resource, | 
					
						
							|  |  |  | 					parser: this.parser | 
					
						
							|  |  |  | 				},  function(err, result) { | 
					
						
							|  |  |  | 					if(err) return callback(err); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-06 01:19:04 +08:00
										 |  |  | 					// Ignored
 | 
					
						
							|  |  |  | 					if(!result) return callback(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 					return callback(null, | 
					
						
							|  |  |  | 						new NormalModule( | 
					
						
							|  |  |  | 							result.request, | 
					
						
							|  |  |  | 							result.userRequest, | 
					
						
							|  |  |  | 							result.rawRequest, | 
					
						
							|  |  |  | 							result.loaders, | 
					
						
							|  |  |  | 							result.resource, | 
					
						
							|  |  |  | 							result.parser | 
					
						
							|  |  |  | 						) | 
					
						
							|  |  |  | 					); | 
					
						
							| 
									
										
										
										
											2013-10-14 19:59:44 +08:00
										 |  |  | 				}); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		}.bind(this)); | 
					
						
							|  |  |  | 	}.bind(this)); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | NormalModuleFactory.prototype.resolveRequestArray = function resolveRequestArray(context, array, resolver, callback) { | 
					
						
							|  |  |  | 	if(array.length === 0) return callback(null, []); | 
					
						
							|  |  |  | 	async.map(array, function(item, callback) { | 
					
						
							|  |  |  | 		if(item == "" || item[0] == "?") | 
					
						
							|  |  |  | 			return callback(null, item); | 
					
						
							|  |  |  | 		resolver.resolve(context, item, callback); | 
					
						
							|  |  |  | 	}, callback); | 
					
						
							|  |  |  | }; |