| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Tobias Koppers @sokra*/"use strict";const path = require("path");const ContextElementDependency = require("./dependencies/ContextElementDependency");class ContextReplacementPlugin {	constructor(		resourceRegExp,		newContentResource,		newContentRecursive,		newContentRegExp	) {		this.resourceRegExp = resourceRegExp;		if (typeof newContentResource === "function") {			this.newContentCallback = newContentResource;		} else if (			typeof newContentResource === "string" &&			typeof newContentRecursive === "object"		) {			this.newContentResource = newContentResource;			this.newContentCreateContextMap = (fs, callback) => {				callback(null, newContentRecursive);			};		} else if (			typeof newContentResource === "string" &&			typeof newContentRecursive === "function"		) {			this.newContentResource = newContentResource;			this.newContentCreateContextMap = newContentRecursive;		} else {			if (typeof newContentResource !== "string") {				newContentRegExp = newContentRecursive;				newContentRecursive = newContentResource;				newContentResource = undefined;			}			if (typeof newContentRecursive !== "boolean") {				newContentRegExp = newContentRecursive;				newContentRecursive = undefined;			}			this.newContentResource = newContentResource;			this.newContentRecursive = newContentRecursive;			this.newContentRegExp = newContentRegExp;		}	}	apply(compiler) {		const resourceRegExp = this.resourceRegExp;		const newContentCallback = this.newContentCallback;		const newContentResource = this.newContentResource;		const newContentRecursive = this.newContentRecursive;		const newContentRegExp = this.newContentRegExp;		const newContentCreateContextMap = this.newContentCreateContextMap;		compiler.hooks.contextModuleFactory.tap("ContextReplacementPlugin", cmf => {			cmf.hooks.beforeResolve.tap("ContextReplacementPlugin", result => {				if (!result) return;				if (resourceRegExp.test(result.request)) {					if (newContentResource !== undefined) {						result.request = newContentResource;					}					if (newContentRecursive !== undefined) {						result.recursive = newContentRecursive;					}					if (newContentRegExp !== undefined) {						result.regExp = newContentRegExp;					}					if (typeof newContentCallback === "function") {						newContentCallback(result);					} else {						for (const d of result.dependencies) {							if (d.critical) d.critical = false;						}					}				}				return result;			});			cmf.hooks.afterResolve.tap("ContextReplacementPlugin", result => {				if (!result) return;				if (resourceRegExp.test(result.resource)) {					if (newContentResource !== undefined) {						result.resource = path.resolve(result.resource, newContentResource);					}					if (newContentRecursive !== undefined) {						result.recursive = newContentRecursive;					}					if (newContentRegExp !== undefined) {						result.regExp = newContentRegExp;					}					if (typeof newContentCreateContextMap === "function") {						result.resolveDependencies = createResolveDependenciesFromContextMap(							newContentCreateContextMap						);					}					if (typeof newContentCallback === "function") {						const origResource = result.resource;						newContentCallback(result);						if (result.resource !== origResource) {							result.resource = path.resolve(origResource, result.resource);						}					} else {						for (const d of result.dependencies) {							if (d.critical) d.critical = false;						}					}				}				return result;			});		});	}}const createResolveDependenciesFromContextMap = createContextMap => {	const resolveDependenciesFromContextMap = (fs, options, callback) => {		createContextMap(fs, (err, map) => {			if (err) return callback(err);			const dependencies = Object.keys(map).map(key => {				return new ContextElementDependency(					map[key] + options.resourceQuery,					key				);			});			callback(null, dependencies);		});	};	return resolveDependenciesFromContextMap;};module.exports = ContextReplacementPlugin;
 |