| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-01 19:21:55 +08:00
										 |  |  | const LazySet = require("../util/LazySet"); | 
					
						
							| 
									
										
										
										
											2020-01-28 18:01:36 +08:00
										 |  |  | const makeSerializable = require("../util/makeSerializable"); | 
					
						
							| 
									
										
										
										
											2019-11-01 19:21:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | /** @typedef {import("enhanced-resolve/lib/Resolver")} Resolver */ | 
					
						
							|  |  |  | /** @typedef {import("../Compiler")} Compiler */ | 
					
						
							|  |  |  | /** @typedef {import("../FileSystemInfo")} FileSystemInfo */ | 
					
						
							| 
									
										
										
										
											2019-07-18 05:35:05 +08:00
										 |  |  | /** @typedef {import("../FileSystemInfo").Snapshot} Snapshot */ | 
					
						
							| 
									
										
										
										
											2019-08-07 15:54:43 +08:00
										 |  |  | /** @template T @typedef {import("../util/LazySet")<T>} LazySet<T> */ | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-28 18:01:36 +08:00
										 |  |  | class CacheEntry { | 
					
						
							|  |  |  | 	constructor( | 
					
						
							|  |  |  | 		result, | 
					
						
							|  |  |  | 		fileDependencies, | 
					
						
							|  |  |  | 		contextDependencies, | 
					
						
							|  |  |  | 		missingDependencies, | 
					
						
							|  |  |  | 		snapshot | 
					
						
							|  |  |  | 	) { | 
					
						
							|  |  |  | 		this.result = result; | 
					
						
							|  |  |  | 		this.fileDependencies = fileDependencies; | 
					
						
							|  |  |  | 		this.contextDependencies = contextDependencies; | 
					
						
							|  |  |  | 		this.missingDependencies = missingDependencies; | 
					
						
							|  |  |  | 		this.snapshot = snapshot; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	serialize({ write }) { | 
					
						
							|  |  |  | 		write(this.result); | 
					
						
							|  |  |  | 		write(this.fileDependencies); | 
					
						
							|  |  |  | 		write(this.contextDependencies); | 
					
						
							|  |  |  | 		write(this.missingDependencies); | 
					
						
							|  |  |  | 		write(this.snapshot); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	deserialize({ read }) { | 
					
						
							|  |  |  | 		this.result = read(); | 
					
						
							|  |  |  | 		this.fileDependencies = read(); | 
					
						
							|  |  |  | 		this.contextDependencies = read(); | 
					
						
							|  |  |  | 		this.missingDependencies = read(); | 
					
						
							|  |  |  | 		this.snapshot = read(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | makeSerializable(CacheEntry, "webpack/lib/cache/ResolverCachePlugin"); | 
					
						
							| 
									
										
										
										
											2019-07-18 05:35:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-07 15:54:43 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @template T | 
					
						
							|  |  |  |  * @param {Set<T> | LazySet<T>} set set to add items to | 
					
						
							| 
									
										
										
										
											2019-11-01 19:21:55 +08:00
										 |  |  |  * @param {Set<T> | LazySet<T>} otherSet set to add items from | 
					
						
							| 
									
										
										
										
											2019-08-07 15:54:43 +08:00
										 |  |  |  * @returns {void} | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const addAllToSet = (set, otherSet) => { | 
					
						
							|  |  |  | 	if ("addAll" in set) { | 
					
						
							|  |  |  | 		set.addAll(otherSet); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		for (const item of otherSet) { | 
					
						
							|  |  |  | 			set.add(item); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-18 05:35:05 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2019-11-08 17:13:46 +08:00
										 |  |  |  * @param {Object} object an object | 
					
						
							| 
									
										
										
										
											2019-11-07 23:33:29 +08:00
										 |  |  |  * @param {boolean} excludeContext if true, context is not included in string | 
					
						
							| 
									
										
										
										
											2019-07-18 05:35:05 +08:00
										 |  |  |  * @returns {string} stringified version | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-11-08 17:13:46 +08:00
										 |  |  | const objectToString = (object, excludeContext) => { | 
					
						
							| 
									
										
										
										
											2019-01-05 04:09:36 +08:00
										 |  |  | 	let str = ""; | 
					
						
							| 
									
										
										
										
											2019-11-08 17:13:46 +08:00
										 |  |  | 	for (const key in object) { | 
					
						
							| 
									
										
										
										
											2019-11-07 23:33:29 +08:00
										 |  |  | 		if (excludeContext && key === "context") continue; | 
					
						
							| 
									
										
										
										
											2019-11-08 17:13:46 +08:00
										 |  |  | 		const value = object[key]; | 
					
						
							| 
									
										
										
										
											2019-01-05 04:09:36 +08:00
										 |  |  | 		if (typeof value === "object" && value !== null) { | 
					
						
							| 
									
										
										
										
											2019-11-08 17:13:46 +08:00
										 |  |  | 			str += `/${key}=[${objectToString(value, false)}]`; | 
					
						
							| 
									
										
										
										
											2019-01-05 04:09:36 +08:00
										 |  |  | 		} else { | 
					
						
							|  |  |  | 			str += `/${key}=${value}`; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return str; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | class ResolverCachePlugin { | 
					
						
							|  |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2020-02-11 23:51:37 +08:00
										 |  |  | 	 * @param {Compiler} compiler webpack compiler | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	apply(compiler) { | 
					
						
							|  |  |  | 		const cache = compiler.cache; | 
					
						
							|  |  |  | 		/** @type {FileSystemInfo} */ | 
					
						
							|  |  |  | 		let fileSystemInfo; | 
					
						
							| 
									
										
										
										
											2019-07-26 16:42:57 +08:00
										 |  |  | 		let realResolves = 0; | 
					
						
							|  |  |  | 		let cachedResolves = 0; | 
					
						
							|  |  |  | 		let cacheInvalidResolves = 0; | 
					
						
							| 
									
										
										
										
											2019-11-08 00:29:23 +08:00
										 |  |  | 		let concurrentResolves = 0; | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 		compiler.hooks.thisCompilation.tap("ResolverCachePlugin", compilation => { | 
					
						
							|  |  |  | 			fileSystemInfo = compilation.fileSystemInfo; | 
					
						
							| 
									
										
										
										
											2019-07-26 16:42:57 +08:00
										 |  |  | 			compilation.hooks.finishModules.tap("ResolverCachePlugin", () => { | 
					
						
							| 
									
										
										
										
											2019-11-01 19:17:35 +08:00
										 |  |  | 				if (realResolves + cachedResolves > 0) { | 
					
						
							|  |  |  | 					const logger = compilation.getLogger("webpack.ResolverCachePlugin"); | 
					
						
							|  |  |  | 					logger.debug( | 
					
						
							|  |  |  | 						`${Math.round( | 
					
						
							|  |  |  | 							(100 * realResolves) / (realResolves + cachedResolves) | 
					
						
							| 
									
										
										
										
											2019-11-08 00:29:23 +08:00
										 |  |  | 						)}% really resolved (${realResolves} real resolves with ${cacheInvalidResolves} cached but invalid, ${cachedResolves} cached valid, ${concurrentResolves} concurrent)`
 | 
					
						
							| 
									
										
										
										
											2019-11-01 19:17:35 +08:00
										 |  |  | 					); | 
					
						
							|  |  |  | 					realResolves = 0; | 
					
						
							|  |  |  | 					cachedResolves = 0; | 
					
						
							|  |  |  | 					cacheInvalidResolves = 0; | 
					
						
							| 
									
										
										
										
											2019-11-08 00:29:23 +08:00
										 |  |  | 					concurrentResolves = 0; | 
					
						
							| 
									
										
										
										
											2019-11-01 19:17:35 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2019-07-26 16:42:57 +08:00
										 |  |  | 			}); | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2019-07-18 05:35:05 +08:00
										 |  |  | 		/** | 
					
						
							|  |  |  | 		 * @param {string} identifier cache key | 
					
						
							|  |  |  | 		 * @param {string} type resolver type | 
					
						
							|  |  |  | 		 * @param {Resolver} resolver the resolver | 
					
						
							|  |  |  | 		 * @param {Object} resolveContext context for resolving meta info | 
					
						
							|  |  |  | 		 * @param {Object} request the request info object | 
					
						
							|  |  |  | 		 * @param {function(Error=, Object=): void} callback callback function | 
					
						
							|  |  |  | 		 * @returns {void} | 
					
						
							|  |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 		const doRealResolve = ( | 
					
						
							|  |  |  | 			identifier, | 
					
						
							|  |  |  | 			type, | 
					
						
							|  |  |  | 			resolver, | 
					
						
							|  |  |  | 			resolveContext, | 
					
						
							|  |  |  | 			request, | 
					
						
							|  |  |  | 			callback | 
					
						
							|  |  |  | 		) => { | 
					
						
							| 
									
										
										
										
											2019-07-26 16:42:57 +08:00
										 |  |  | 			realResolves++; | 
					
						
							| 
									
										
										
										
											2019-06-19 19:16:05 +08:00
										 |  |  | 			const newRequest = { | 
					
						
							|  |  |  | 				_ResolverCachePluginCacheMiss: true, | 
					
						
							|  |  |  | 				...request | 
					
						
							|  |  |  | 			}; | 
					
						
							|  |  |  | 			const newResolveContext = { | 
					
						
							|  |  |  | 				...resolveContext, | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 				stack: new Set(), | 
					
						
							| 
									
										
										
										
											2019-11-01 19:21:55 +08:00
										 |  |  | 				missingDependencies: new LazySet(), | 
					
						
							|  |  |  | 				fileDependencies: new LazySet(), | 
					
						
							|  |  |  | 				contextDependencies: new LazySet() | 
					
						
							| 
									
										
										
										
											2019-06-19 19:16:05 +08:00
										 |  |  | 			}; | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 			const propagate = key => { | 
					
						
							|  |  |  | 				if (resolveContext[key]) { | 
					
						
							| 
									
										
										
										
											2019-11-01 19:21:55 +08:00
										 |  |  | 					addAllToSet(resolveContext[key], newResolveContext[key]); | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			}; | 
					
						
							|  |  |  | 			const resolveTime = Date.now(); | 
					
						
							|  |  |  | 			resolver.doResolve( | 
					
						
							|  |  |  | 				resolver.hooks.resolve, | 
					
						
							|  |  |  | 				newRequest, | 
					
						
							|  |  |  | 				"Cache miss", | 
					
						
							|  |  |  | 				newResolveContext, | 
					
						
							|  |  |  | 				(err, result) => { | 
					
						
							|  |  |  | 					propagate("fileDependencies"); | 
					
						
							|  |  |  | 					propagate("contextDependencies"); | 
					
						
							| 
									
										
										
										
											2019-07-05 06:41:30 +08:00
										 |  |  | 					propagate("missingDependencies"); | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 					if (err) return callback(err); | 
					
						
							| 
									
										
										
										
											2019-01-05 21:58:06 +08:00
										 |  |  | 					const fileDependencies = newResolveContext.fileDependencies; | 
					
						
							|  |  |  | 					const contextDependencies = newResolveContext.contextDependencies; | 
					
						
							| 
									
										
										
										
											2019-07-05 06:41:30 +08:00
										 |  |  | 					const missingDependencies = newResolveContext.missingDependencies; | 
					
						
							| 
									
										
										
										
											2019-01-05 21:58:06 +08:00
										 |  |  | 					fileSystemInfo.createSnapshot( | 
					
						
							|  |  |  | 						resolveTime, | 
					
						
							|  |  |  | 						fileDependencies, | 
					
						
							|  |  |  | 						contextDependencies, | 
					
						
							|  |  |  | 						missingDependencies, | 
					
						
							|  |  |  | 						null, | 
					
						
							|  |  |  | 						(err, snapshot) => { | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 							if (err) return callback(err); | 
					
						
							| 
									
										
										
										
											2019-01-05 21:58:06 +08:00
										 |  |  | 							cache.store( | 
					
						
							|  |  |  | 								identifier, | 
					
						
							|  |  |  | 								null, | 
					
						
							| 
									
										
										
										
											2020-01-28 18:01:36 +08:00
										 |  |  | 								new CacheEntry( | 
					
						
							| 
									
										
										
										
											2019-01-05 21:58:06 +08:00
										 |  |  | 									result, | 
					
						
							| 
									
										
										
										
											2020-01-28 18:01:36 +08:00
										 |  |  | 									newResolveContext.fileDependencies, | 
					
						
							|  |  |  | 									newResolveContext.contextDependencies, | 
					
						
							|  |  |  | 									newResolveContext.missingDependencies, | 
					
						
							| 
									
										
										
										
											2019-01-05 21:58:06 +08:00
										 |  |  | 									snapshot | 
					
						
							| 
									
										
										
										
											2020-01-28 18:01:36 +08:00
										 |  |  | 								), | 
					
						
							| 
									
										
										
										
											2019-01-05 21:58:06 +08:00
										 |  |  | 								storeErr => { | 
					
						
							|  |  |  | 									if (storeErr) return callback(storeErr); | 
					
						
							|  |  |  | 									if (result) return callback(null, result); | 
					
						
							|  |  |  | 									callback(); | 
					
						
							|  |  |  | 								} | 
					
						
							|  |  |  | 							); | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 						} | 
					
						
							|  |  |  | 					); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			); | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 		compiler.resolverFactory.hooks.resolver.intercept({ | 
					
						
							|  |  |  | 			factory(type, hook) { | 
					
						
							| 
									
										
										
										
											2019-11-08 00:29:23 +08:00
										 |  |  | 				/** @type {Map<string, (function(Error=, Object=): void)[]>} */ | 
					
						
							|  |  |  | 				const activeRequests = new Map(); | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 				hook.tap( | 
					
						
							|  |  |  | 					"ResolverCachePlugin", | 
					
						
							|  |  |  | 					/** | 
					
						
							|  |  |  | 					 * @param {Resolver} resolver the resolver | 
					
						
							|  |  |  | 					 * @param {Object} options resolve options | 
					
						
							| 
									
										
										
										
											2019-11-08 17:13:46 +08:00
										 |  |  | 					 * @param {Object} userOptions resolve options passed by the user | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 					 * @returns {void} | 
					
						
							|  |  |  | 					 */ | 
					
						
							| 
									
										
										
										
											2019-11-08 17:13:46 +08:00
										 |  |  | 					(resolver, options, userOptions) => { | 
					
						
							| 
									
										
										
										
											2018-10-31 20:53:38 +08:00
										 |  |  | 						if (options.cache !== true) return; | 
					
						
							| 
									
										
										
										
											2019-11-08 17:13:46 +08:00
										 |  |  | 						const optionsIdent = objectToString(userOptions, false); | 
					
						
							| 
									
										
										
										
											2019-11-07 23:33:29 +08:00
										 |  |  | 						const cacheWithContext = | 
					
						
							|  |  |  | 							options.cacheWithContext !== undefined | 
					
						
							|  |  |  | 								? options.cacheWithContext | 
					
						
							|  |  |  | 								: false; | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 						resolver.hooks.resolve.tapAsync( | 
					
						
							|  |  |  | 							{ | 
					
						
							|  |  |  | 								name: "ResolverCachePlugin", | 
					
						
							|  |  |  | 								stage: -100 | 
					
						
							|  |  |  | 							}, | 
					
						
							|  |  |  | 							(request, resolveContext, callback) => { | 
					
						
							|  |  |  | 								if (request._ResolverCachePluginCacheMiss || !fileSystemInfo) { | 
					
						
							|  |  |  | 									return callback(); | 
					
						
							|  |  |  | 								} | 
					
						
							| 
									
										
										
										
											2019-11-08 17:13:46 +08:00
										 |  |  | 								const identifier = `/resolve/${type}${optionsIdent}${objectToString( | 
					
						
							| 
									
										
										
										
											2019-11-07 23:33:29 +08:00
										 |  |  | 									request, | 
					
						
							| 
									
										
										
										
											2019-11-13 19:18:32 +08:00
										 |  |  | 									!cacheWithContext | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 								)}`;
 | 
					
						
							| 
									
										
										
										
											2019-11-08 00:29:23 +08:00
										 |  |  | 								const activeRequest = activeRequests.get(identifier); | 
					
						
							|  |  |  | 								if (activeRequest) { | 
					
						
							|  |  |  | 									activeRequest.push(callback); | 
					
						
							|  |  |  | 									return; | 
					
						
							|  |  |  | 								} | 
					
						
							|  |  |  | 								let callbacks; | 
					
						
							|  |  |  | 								const done = (err, result) => { | 
					
						
							|  |  |  | 									if (callbacks === undefined) { | 
					
						
							|  |  |  | 										callback(err, result); | 
					
						
							|  |  |  | 										callbacks = false; | 
					
						
							|  |  |  | 									} else { | 
					
						
							|  |  |  | 										for (const callback of callbacks) { | 
					
						
							|  |  |  | 											callback(err, result); | 
					
						
							|  |  |  | 										} | 
					
						
							|  |  |  | 										activeRequests.delete(identifier); | 
					
						
							|  |  |  | 										callbacks = false; | 
					
						
							|  |  |  | 									} | 
					
						
							|  |  |  | 								}; | 
					
						
							| 
									
										
										
										
											2019-07-18 05:35:05 +08:00
										 |  |  | 								/** | 
					
						
							|  |  |  | 								 * @param {Error=} err error if any | 
					
						
							|  |  |  | 								 * @param {CacheEntry=} cacheEntry cache entry | 
					
						
							|  |  |  | 								 * @returns {void} | 
					
						
							|  |  |  | 								 */ | 
					
						
							| 
									
										
										
										
											2019-01-05 21:58:06 +08:00
										 |  |  | 								const processCacheResult = (err, cacheEntry) => { | 
					
						
							| 
									
										
										
										
											2019-11-08 00:29:23 +08:00
										 |  |  | 									if (err) return done(err); | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 									if (cacheEntry) { | 
					
						
							| 
									
										
										
										
											2019-01-05 21:58:06 +08:00
										 |  |  | 										fileSystemInfo.checkSnapshotValid( | 
					
						
							|  |  |  | 											cacheEntry.snapshot, | 
					
						
							|  |  |  | 											(err, valid) => { | 
					
						
							|  |  |  | 												if (err || !valid) { | 
					
						
							| 
									
										
										
										
											2019-07-26 16:42:57 +08:00
										 |  |  | 													cacheInvalidResolves++; | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 													return doRealResolve( | 
					
						
							|  |  |  | 														identifier, | 
					
						
							|  |  |  | 														type, | 
					
						
							|  |  |  | 														resolver, | 
					
						
							|  |  |  | 														resolveContext, | 
					
						
							|  |  |  | 														request, | 
					
						
							| 
									
										
										
										
											2019-11-08 00:29:23 +08:00
										 |  |  | 														done | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 													); | 
					
						
							|  |  |  | 												} | 
					
						
							| 
									
										
										
										
											2019-07-26 16:42:57 +08:00
										 |  |  | 												cachedResolves++; | 
					
						
							| 
									
										
										
										
											2019-07-05 06:41:30 +08:00
										 |  |  | 												if (resolveContext.missingDependencies) { | 
					
						
							| 
									
										
										
										
											2019-08-07 15:54:43 +08:00
										 |  |  | 													addAllToSet( | 
					
						
							|  |  |  | 														resolveContext.missingDependencies, | 
					
						
							|  |  |  | 														cacheEntry.missingDependencies | 
					
						
							|  |  |  | 													); | 
					
						
							| 
									
										
										
										
											2019-01-05 21:58:06 +08:00
										 |  |  | 												} | 
					
						
							|  |  |  | 												if (resolveContext.fileDependencies) { | 
					
						
							| 
									
										
										
										
											2019-08-07 15:54:43 +08:00
										 |  |  | 													addAllToSet( | 
					
						
							|  |  |  | 														resolveContext.fileDependencies, | 
					
						
							|  |  |  | 														cacheEntry.fileDependencies | 
					
						
							|  |  |  | 													); | 
					
						
							| 
									
										
										
										
											2019-01-05 21:58:06 +08:00
										 |  |  | 												} | 
					
						
							|  |  |  | 												if (resolveContext.contextDependencies) { | 
					
						
							| 
									
										
										
										
											2019-08-07 15:54:43 +08:00
										 |  |  | 													addAllToSet( | 
					
						
							|  |  |  | 														resolveContext.contextDependencies, | 
					
						
							|  |  |  | 														cacheEntry.contextDependencies | 
					
						
							|  |  |  | 													); | 
					
						
							| 
									
										
										
										
											2019-01-05 21:58:06 +08:00
										 |  |  | 												} | 
					
						
							| 
									
										
										
										
											2019-11-08 00:29:23 +08:00
										 |  |  | 												done(null, cacheEntry.result); | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 											} | 
					
						
							|  |  |  | 										); | 
					
						
							|  |  |  | 									} else { | 
					
						
							|  |  |  | 										doRealResolve( | 
					
						
							|  |  |  | 											identifier, | 
					
						
							|  |  |  | 											type, | 
					
						
							|  |  |  | 											resolver, | 
					
						
							|  |  |  | 											resolveContext, | 
					
						
							|  |  |  | 											request, | 
					
						
							| 
									
										
										
										
											2019-11-08 00:29:23 +08:00
										 |  |  | 											done | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 										); | 
					
						
							|  |  |  | 									} | 
					
						
							| 
									
										
										
										
											2019-01-05 21:58:06 +08:00
										 |  |  | 								}; | 
					
						
							|  |  |  | 								cache.get(identifier, null, processCacheResult); | 
					
						
							| 
									
										
										
										
											2019-11-08 00:29:23 +08:00
										 |  |  | 								if (callbacks === undefined) { | 
					
						
							|  |  |  | 									callbacks = [callback]; | 
					
						
							|  |  |  | 									activeRequests.set(identifier, callbacks); | 
					
						
							|  |  |  | 								} | 
					
						
							| 
									
										
										
										
											2018-10-23 13:22:44 +08:00
										 |  |  | 							} | 
					
						
							|  |  |  | 						); | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				return hook; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = ResolverCachePlugin; |