| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 | 
							- /*
 
- 	MIT License http://www.opensource.org/licenses/mit-license.php
 
- 	Author Tobias Koppers @sokra
 
- */
 
- "use strict";
 
- const RequireContextDependency = require("./RequireContextDependency");
 
- const ContextElementDependency = require("./ContextElementDependency");
 
- const RequireContextDependencyParserPlugin = require("./RequireContextDependencyParserPlugin");
 
- class RequireContextPlugin {
 
- 	constructor(modulesDirectories, extensions, mainFiles) {
 
- 		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;
 
- 		this.mainFiles = mainFiles;
 
- 	}
 
- 	apply(compiler) {
 
- 		compiler.hooks.compilation.tap(
 
- 			"RequireContextPlugin",
 
- 			(compilation, { contextModuleFactory, normalModuleFactory }) => {
 
- 				compilation.dependencyFactories.set(
 
- 					RequireContextDependency,
 
- 					contextModuleFactory
 
- 				);
 
- 				compilation.dependencyTemplates.set(
 
- 					RequireContextDependency,
 
- 					new RequireContextDependency.Template()
 
- 				);
 
- 				compilation.dependencyFactories.set(
 
- 					ContextElementDependency,
 
- 					normalModuleFactory
 
- 				);
 
- 				const handler = (parser, parserOptions) => {
 
- 					if (
 
- 						parserOptions.requireContext !== undefined &&
 
- 						!parserOptions.requireContext
 
- 					)
 
- 						return;
 
- 					new RequireContextDependencyParserPlugin().apply(parser);
 
- 				};
 
- 				normalModuleFactory.hooks.parser
 
- 					.for("javascript/auto")
 
- 					.tap("RequireContextPlugin", handler);
 
- 				normalModuleFactory.hooks.parser
 
- 					.for("javascript/dynamic")
 
- 					.tap("RequireContextPlugin", handler);
 
- 				contextModuleFactory.hooks.alternatives.tap(
 
- 					"RequireContextPlugin",
 
- 					items => {
 
- 						if (items.length === 0) return items;
 
- 						return items
 
- 							.map(obj => {
 
- 								return this.extensions
 
- 									.filter(ext => {
 
- 										const l = obj.request.length;
 
- 										return (
 
- 											l > ext.length &&
 
- 											obj.request.substr(l - ext.length, l) === ext
 
- 										);
 
- 									})
 
- 									.map(ext => {
 
- 										const l = obj.request.length;
 
- 										return {
 
- 											context: obj.context,
 
- 											request: obj.request.substr(0, l - ext.length)
 
- 										};
 
- 									})
 
- 									.concat(obj);
 
- 							})
 
- 							.reduce((a, b) => a.concat(b), []);
 
- 					}
 
- 				);
 
- 				contextModuleFactory.hooks.alternatives.tap(
 
- 					"RequireContextPlugin",
 
- 					items => {
 
- 						if (items.length === 0) return items;
 
- 						return items
 
- 							.map(obj => {
 
- 								return this.mainFiles
 
- 									.filter(mainFile => {
 
- 										const l = obj.request.length;
 
- 										return (
 
- 											l > mainFile.length + 1 &&
 
- 											obj.request.substr(l - mainFile.length - 1, l) ===
 
- 												"/" + mainFile
 
- 										);
 
- 									})
 
- 									.map(mainFile => {
 
- 										const l = obj.request.length;
 
- 										return [
 
- 											{
 
- 												context: obj.context,
 
- 												request: obj.request.substr(0, l - mainFile.length)
 
- 											},
 
- 											{
 
- 												context: obj.context,
 
- 												request: obj.request.substr(0, l - mainFile.length - 1)
 
- 											}
 
- 										];
 
- 									})
 
- 									.reduce((a, b) => a.concat(b), [])
 
- 									.concat(obj);
 
- 							})
 
- 							.reduce((a, b) => a.concat(b), []);
 
- 					}
 
- 				);
 
- 				contextModuleFactory.hooks.alternatives.tap(
 
- 					"RequireContextPlugin",
 
- 					items => {
 
- 						if (items.length === 0) return items;
 
- 						return items.map(obj => {
 
- 							for (let i = 0; i < this.modulesDirectories.length; i++) {
 
- 								const dir = this.modulesDirectories[i];
 
- 								const idx = obj.request.indexOf("./" + dir + "/");
 
- 								if (idx === 0) {
 
- 									obj.request = obj.request.slice(dir.length + 3);
 
- 									break;
 
- 								}
 
- 							}
 
- 							return obj;
 
- 						});
 
- 					}
 
- 				);
 
- 			}
 
- 		);
 
- 	}
 
- }
 
- module.exports = RequireContextPlugin;
 
 
  |