| 
									
										
										
										
											2013-01-31 09:33:11 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | "use strict"; | 
					
						
							| 
									
										
										
										
											2014-06-18 04:46:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | const path = require("path"); | 
					
						
							|  |  |  | const ContextElementDependency = require("./dependencies/ContextElementDependency"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ContextReplacementPlugin { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	constructor( | 
					
						
							|  |  |  | 		resourceRegExp, | 
					
						
							|  |  |  | 		newContentResource, | 
					
						
							|  |  |  | 		newContentRecursive, | 
					
						
							|  |  |  | 		newContentRegExp | 
					
						
							|  |  |  | 	) { | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 		this.resourceRegExp = resourceRegExp; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		if (typeof newContentResource === "function") { | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 			this.newContentCallback = newContentResource; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		} else if ( | 
					
						
							|  |  |  | 			typeof newContentResource === "string" && | 
					
						
							|  |  |  | 			typeof newContentRecursive === "object" | 
					
						
							|  |  |  | 		) { | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 			this.newContentResource = newContentResource; | 
					
						
							|  |  |  | 			this.newContentCreateContextMap = (fs, callback) => { | 
					
						
							|  |  |  | 				callback(null, newContentRecursive); | 
					
						
							|  |  |  | 			}; | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		} else if ( | 
					
						
							|  |  |  | 			typeof newContentResource === "string" && | 
					
						
							|  |  |  | 			typeof newContentRecursive === "function" | 
					
						
							|  |  |  | 		) { | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 			this.newContentResource = newContentResource; | 
					
						
							|  |  |  | 			this.newContentCreateContextMap = newContentRecursive; | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (typeof newContentResource !== "string") { | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 				newContentRegExp = newContentRecursive; | 
					
						
							|  |  |  | 				newContentRecursive = newContentResource; | 
					
						
							|  |  |  | 				newContentResource = undefined; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (typeof newContentRecursive !== "boolean") { | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 				newContentRegExp = newContentRecursive; | 
					
						
							|  |  |  | 				newContentRecursive = undefined; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			this.newContentResource = newContentResource; | 
					
						
							|  |  |  | 			this.newContentRecursive = newContentRecursive; | 
					
						
							|  |  |  | 			this.newContentRegExp = newContentRegExp; | 
					
						
							| 
									
										
										
										
											2014-10-23 16:58:26 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-06-18 04:38:17 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 		compiler.hooks.contextModuleFactory.tap("ContextReplacementPlugin", cmf => { | 
					
						
							|  |  |  | 			cmf.hooks.beforeResolve.tap("ContextReplacementPlugin", result => { | 
					
						
							|  |  |  | 				if (!result) return; | 
					
						
							|  |  |  | 				if (resourceRegExp.test(result.request)) { | 
					
						
							| 
									
										
										
										
											2018-08-17 05:49:30 +08:00
										 |  |  | 					if (newContentResource !== undefined) { | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 						result.request = newContentResource; | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-08-17 05:49:30 +08:00
										 |  |  | 					if (newContentRecursive !== undefined) { | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 						result.recursive = newContentRecursive; | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-08-17 05:49:30 +08:00
										 |  |  | 					if (newContentRegExp !== undefined) { | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 						result.regExp = newContentRegExp; | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (typeof newContentCallback === "function") { | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 						newContentCallback(result); | 
					
						
							|  |  |  | 					} else { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						for (const d of result.dependencies) { | 
					
						
							|  |  |  | 							if (d.critical) d.critical = false; | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 						} | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2014-10-23 16:58:26 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-12-14 21:38:53 +08:00
										 |  |  | 				return result; | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			cmf.hooks.afterResolve.tap("ContextReplacementPlugin", result => { | 
					
						
							|  |  |  | 				if (!result) return; | 
					
						
							|  |  |  | 				if (resourceRegExp.test(result.resource)) { | 
					
						
							| 
									
										
										
										
											2018-08-17 05:49:30 +08:00
										 |  |  | 					if (newContentResource !== undefined) { | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 						result.resource = path.resolve(result.resource, newContentResource); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-08-17 05:49:30 +08:00
										 |  |  | 					if (newContentRecursive !== undefined) { | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 						result.recursive = newContentRecursive; | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-08-17 05:49:30 +08:00
										 |  |  | 					if (newContentRegExp !== undefined) { | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 						result.regExp = newContentRegExp; | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 					} | 
					
						
							|  |  |  | 					if (typeof newContentCreateContextMap === "function") { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						result.resolveDependencies = createResolveDependenciesFromContextMap( | 
					
						
							|  |  |  | 							newContentCreateContextMap | 
					
						
							|  |  |  | 						); | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 					} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 					if (typeof newContentCallback === "function") { | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 						const origResource = result.resource; | 
					
						
							|  |  |  | 						newContentCallback(result); | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						if (result.resource !== origResource) { | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 							result.resource = path.resolve(origResource, result.resource); | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} else { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 						for (const d of result.dependencies) { | 
					
						
							|  |  |  | 							if (d.critical) d.critical = false; | 
					
						
							| 
									
										
										
										
											2018-01-22 20:52:43 +08:00
										 |  |  | 						} | 
					
						
							| 
									
										
										
										
											2014-10-23 16:58:26 +08:00
										 |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2017-12-14 21:38:53 +08:00
										 |  |  | 				return result; | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2013-01-31 09:33:11 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-01-07 02:56:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | const createResolveDependenciesFromContextMap = createContextMap => { | 
					
						
							| 
									
										
										
										
											2017-11-09 03:49:41 +08:00
										 |  |  | 	const resolveDependenciesFromContextMap = (fs, options, callback) => { | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | 		createContextMap(fs, (err, map) => { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 			if (err) return callback(err); | 
					
						
							|  |  |  | 			const dependencies = Object.keys(map).map(key => { | 
					
						
							|  |  |  | 				return new ContextElementDependency( | 
					
						
							|  |  |  | 					map[key] + options.resourceQuery, | 
					
						
							|  |  |  | 					key | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2016-01-07 02:56:17 +08:00
										 |  |  | 			}); | 
					
						
							|  |  |  | 			callback(null, dependencies); | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-01-11 17:51:58 +08:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2017-11-09 03:49:41 +08:00
										 |  |  | 	return resolveDependenciesFromContextMap; | 
					
						
							| 
									
										
										
										
											2017-03-11 01:27:53 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = ContextReplacementPlugin; |