mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			76 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| /*
 | |
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | |
| 	Author Tobias Koppers @sokra
 | |
| */
 | |
| var RequireContextDependency = require("./RequireContextDependency");
 | |
| var ContextElementDependency = require("./ContextElementDependency");
 | |
| 
 | |
| var RequireContextDependencyParserPlugin = require("./RequireContextDependencyParserPlugin");
 | |
| 
 | |
| function RequireContextPlugin(modulesDirectories, extensions) {
 | |
| 	if(!Array.isArray(modulesDirectories))
 | |
| 		throw new Error("modulesDirectories must be an array");
 | |
| 	if(!Array.isArray(extensions))
 | |
| 		throw new Error("extensions must be an array");
 | |
| 	this.modulesDirectories = modulesDirectories;
 | |
| 	this.extensions = extensions;
 | |
| }
 | |
| module.exports = RequireContextPlugin;
 | |
| 
 | |
| RequireContextPlugin.prototype.apply = function(compiler) {
 | |
| 	var modulesDirectories = this.modulesDirectories;
 | |
| 	var extensions = this.extensions;
 | |
| 	compiler.plugin("compilation", function(compilation, params) {
 | |
| 		var contextModuleFactory = params.contextModuleFactory;
 | |
| 		var normalModuleFactory = params.normalModuleFactory;
 | |
| 
 | |
| 		compilation.dependencyFactories.set(RequireContextDependency, contextModuleFactory);
 | |
| 		compilation.dependencyTemplates.set(RequireContextDependency, new RequireContextDependency.Template());
 | |
| 
 | |
| 		compilation.dependencyFactories.set(ContextElementDependency, normalModuleFactory);
 | |
| 
 | |
| 		params.normalModuleFactory.plugin("parser", function(parser, parserOptions) {
 | |
| 
 | |
| 			if(typeof parserOptions.requireContext !== "undefined" && !parserOptions.requireContext)
 | |
| 				return;
 | |
| 
 | |
| 			parser.apply(new RequireContextDependencyParserPlugin());
 | |
| 		});
 | |
| 
 | |
| 		params.contextModuleFactory.plugin("alternatives", function(items, callback) {
 | |
| 			if(items.length === 0) return callback(null, items);
 | |
| 
 | |
| 			callback(null, items.map(function(obj) {
 | |
| 				return extensions.filter(function(ext) {
 | |
| 					var l = obj.request.length;
 | |
| 					return l > ext.length && obj.request.substr(l - ext.length, l) === ext;
 | |
| 				}).map(function(ext) {
 | |
| 					var l = obj.request.length;
 | |
| 					return {
 | |
| 						context: obj.context,
 | |
| 						request: obj.request.substr(0, l - ext.length)
 | |
| 					};
 | |
| 				}).concat(obj);
 | |
| 			}).reduce(function(a, b) {
 | |
| 				return a.concat(b);
 | |
| 			}, []));
 | |
| 		});
 | |
| 
 | |
| 		params.contextModuleFactory.plugin("alternatives", function(items, callback) {
 | |
| 			if(items.length === 0) return callback(null, items);
 | |
| 
 | |
| 			callback(null, items.map(function(obj) {
 | |
| 				for(var i = 0; i < modulesDirectories.length; i++) {
 | |
| 					var dir = modulesDirectories[i];
 | |
| 					var idx = obj.request.indexOf("./" + dir + "/");
 | |
| 					if(idx === 0) {
 | |
| 						obj.request = obj.request.slice(dir.length + 3);
 | |
| 						break;
 | |
| 					}
 | |
| 				}
 | |
| 				return obj;
 | |
| 			}));
 | |
| 		});
 | |
| 	});
 | |
| };
 |