| 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;
 |