| 
									
										
										
										
											2018-09-27 13:22:19 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const { AsyncParallelHook, AsyncSeriesBailHook, SyncHook } = require("tapable"); | 
					
						
							| 
									
										
										
										
											2019-08-09 20:49:47 +08:00
										 |  |  | const { | 
					
						
							|  |  |  | 	makeWebpackError, | 
					
						
							|  |  |  | 	makeWebpackErrorCallback | 
					
						
							|  |  |  | } = require("./HookWebpackError"); | 
					
						
							| 
									
										
										
										
											2018-09-27 13:22:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-18 05:20:58 +08:00
										 |  |  | /** @typedef {import("./WebpackError")} WebpackError */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-12 20:55:13 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  |  * @typedef {object} Etag | 
					
						
							| 
									
										
										
										
											2025-03-12 09:56:14 +08:00
										 |  |  |  * @property {() => string} toString | 
					
						
							| 
									
										
										
										
											2019-11-12 20:55:13 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-18 05:20:58 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @template T | 
					
						
							| 
									
										
										
										
											2020-07-15 17:14:28 +08:00
										 |  |  |  * @callback CallbackCache | 
					
						
							| 
									
										
										
										
											2024-02-21 22:05:29 +08:00
										 |  |  |  * @param {WebpackError | null} err | 
					
						
							| 
									
										
										
										
											2020-07-15 17:14:28 +08:00
										 |  |  |  * @param {T=} result | 
					
						
							| 
									
										
										
										
											2018-12-18 05:20:58 +08:00
										 |  |  |  * @returns {void} | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-16 22:04:11 +08:00
										 |  |  | /** @typedef {EXPECTED_ANY} Data */ | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-18 05:20:58 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @callback GotHandler | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  |  * @param {TODO} result | 
					
						
							| 
									
										
										
										
											2025-03-12 09:56:14 +08:00
										 |  |  |  * @param {(err?: Error) => void} callback | 
					
						
							| 
									
										
										
										
											2018-12-18 05:20:58 +08:00
										 |  |  |  * @returns {void} | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2018-12-28 03:57:54 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {number} times times | 
					
						
							| 
									
										
										
										
											2025-03-12 09:56:14 +08:00
										 |  |  |  * @param {(err?: Error) => void} callback callback | 
					
						
							|  |  |  |  * @returns {(err?: Error) => void} callback | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2025-07-17 00:13:14 +08:00
										 |  |  | const needCalls = (times, callback) => (err) => { | 
					
						
							| 
									
										
										
										
											2024-07-31 11:31:11 +08:00
										 |  |  | 	if (--times === 0) { | 
					
						
							|  |  |  | 		return callback(err); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (err && times > 0) { | 
					
						
							|  |  |  | 		times = 0; | 
					
						
							|  |  |  | 		return callback(err); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-01-19 19:31:24 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-27 13:22:19 +08:00
										 |  |  | class Cache { | 
					
						
							|  |  |  | 	constructor() { | 
					
						
							|  |  |  | 		this.hooks = { | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  | 			/** @type {AsyncSeriesBailHook<[string, Etag | null, GotHandler[]], Data>} */ | 
					
						
							| 
									
										
										
										
											2019-01-19 19:31:24 +08:00
										 |  |  | 			get: new AsyncSeriesBailHook(["identifier", "etag", "gotHandlers"]), | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  | 			/** @type {AsyncParallelHook<[string, Etag | null, Data]>} */ | 
					
						
							| 
									
										
										
										
											2018-10-11 16:46:48 +08:00
										 |  |  | 			store: new AsyncParallelHook(["identifier", "etag", "data"]), | 
					
						
							| 
									
										
										
										
											2019-08-09 20:46:42 +08:00
										 |  |  | 			/** @type {AsyncParallelHook<[Iterable<string>]>} */ | 
					
						
							|  |  |  | 			storeBuildDependencies: new AsyncParallelHook(["dependencies"]), | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 			/** @type {SyncHook<[]>} */ | 
					
						
							| 
									
										
										
										
											2018-09-27 13:22:19 +08:00
										 |  |  | 			beginIdle: new SyncHook([]), | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 			/** @type {AsyncParallelHook<[]>} */ | 
					
						
							| 
									
										
										
										
											2018-09-27 13:22:19 +08:00
										 |  |  | 			endIdle: new AsyncParallelHook([]), | 
					
						
							| 
									
										
										
										
											2018-12-09 19:54:17 +08:00
										 |  |  | 			/** @type {AsyncParallelHook<[]>} */ | 
					
						
							| 
									
										
										
										
											2018-09-27 13:22:19 +08:00
										 |  |  | 			shutdown: new AsyncParallelHook([]) | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-18 05:20:58 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @template T | 
					
						
							|  |  |  | 	 * @param {string} identifier the cache identifier | 
					
						
							| 
									
										
										
										
											2019-11-12 20:55:13 +08:00
										 |  |  | 	 * @param {Etag | null} etag the etag | 
					
						
							| 
									
										
										
										
											2020-07-15 17:14:28 +08:00
										 |  |  | 	 * @param {CallbackCache<T>} callback signals when the value is retrieved | 
					
						
							| 
									
										
										
										
											2018-12-18 05:20:58 +08:00
										 |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-10-11 16:46:48 +08:00
										 |  |  | 	get(identifier, etag, callback) { | 
					
						
							| 
									
										
										
										
											2024-02-22 22:20:17 +08:00
										 |  |  | 		/** @type {GotHandler[]} */ | 
					
						
							| 
									
										
										
										
											2019-01-19 19:31:24 +08:00
										 |  |  | 		const gotHandlers = []; | 
					
						
							|  |  |  | 		this.hooks.get.callAsync(identifier, etag, gotHandlers, (err, result) => { | 
					
						
							| 
									
										
										
										
											2018-12-28 03:57:54 +08:00
										 |  |  | 			if (err) { | 
					
						
							| 
									
										
										
										
											2019-05-11 03:37:35 +08:00
										 |  |  | 				callback(makeWebpackError(err, "Cache.hooks.get")); | 
					
						
							| 
									
										
										
										
											2018-12-28 03:57:54 +08:00
										 |  |  | 				return; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-11-12 20:55:13 +08:00
										 |  |  | 			if (result === null) { | 
					
						
							|  |  |  | 				result = undefined; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-01-19 19:31:24 +08:00
										 |  |  | 			if (gotHandlers.length > 1) { | 
					
						
							|  |  |  | 				const innerCallback = needCalls(gotHandlers.length, () => | 
					
						
							|  |  |  | 					callback(null, result) | 
					
						
							|  |  |  | 				); | 
					
						
							|  |  |  | 				for (const gotHandler of gotHandlers) { | 
					
						
							|  |  |  | 					gotHandler(result, innerCallback); | 
					
						
							| 
									
										
										
										
											2018-12-28 03:57:54 +08:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2019-01-19 19:31:24 +08:00
										 |  |  | 			} else if (gotHandlers.length === 1) { | 
					
						
							|  |  |  | 				gotHandlers[0](result, () => callback(null, result)); | 
					
						
							|  |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2018-12-28 03:57:54 +08:00
										 |  |  | 				callback(null, result); | 
					
						
							| 
									
										
										
										
											2019-01-19 19:31:24 +08:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2018-12-28 03:57:54 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2018-09-27 13:22:19 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-18 05:20:58 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @template T | 
					
						
							|  |  |  | 	 * @param {string} identifier the cache identifier | 
					
						
							| 
									
										
										
										
											2019-11-12 20:55:13 +08:00
										 |  |  | 	 * @param {Etag | null} etag the etag | 
					
						
							| 
									
										
										
										
											2018-12-18 05:20:58 +08:00
										 |  |  | 	 * @param {T} data the value to store | 
					
						
							| 
									
										
										
										
											2020-07-15 17:14:28 +08:00
										 |  |  | 	 * @param {CallbackCache<void>} callback signals when the value is stored | 
					
						
							| 
									
										
										
										
											2018-12-18 05:20:58 +08:00
										 |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-10-09 20:30:59 +08:00
										 |  |  | 	store(identifier, etag, data, callback) { | 
					
						
							| 
									
										
										
										
											2019-08-09 20:49:47 +08:00
										 |  |  | 		this.hooks.store.callAsync( | 
					
						
							|  |  |  | 			identifier, | 
					
						
							|  |  |  | 			etag, | 
					
						
							|  |  |  | 			data, | 
					
						
							|  |  |  | 			makeWebpackErrorCallback(callback, "Cache.hooks.store") | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-09-27 13:22:19 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-09 20:46:42 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * After this method has succeeded the cache can only be restored when build dependencies are | 
					
						
							|  |  |  | 	 * @param {Iterable<string>} dependencies list of all build dependencies | 
					
						
							| 
									
										
										
										
											2020-07-15 17:14:28 +08:00
										 |  |  | 	 * @param {CallbackCache<void>} callback signals when the dependencies are stored | 
					
						
							| 
									
										
										
										
											2019-08-09 20:46:42 +08:00
										 |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	storeBuildDependencies(dependencies, callback) { | 
					
						
							|  |  |  | 		this.hooks.storeBuildDependencies.callAsync( | 
					
						
							|  |  |  | 			dependencies, | 
					
						
							|  |  |  | 			makeWebpackErrorCallback(callback, "Cache.hooks.storeBuildDependencies") | 
					
						
							|  |  |  | 		); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-18 05:20:58 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-09-27 13:22:19 +08:00
										 |  |  | 	beginIdle() { | 
					
						
							|  |  |  | 		this.hooks.beginIdle.call(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-18 05:20:58 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2020-07-15 17:14:28 +08:00
										 |  |  | 	 * @param {CallbackCache<void>} callback signals when the call finishes | 
					
						
							| 
									
										
										
										
											2018-12-18 05:20:58 +08:00
										 |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-09-27 13:22:19 +08:00
										 |  |  | 	endIdle(callback) { | 
					
						
							| 
									
										
										
										
											2019-08-09 20:49:47 +08:00
										 |  |  | 		this.hooks.endIdle.callAsync( | 
					
						
							|  |  |  | 			makeWebpackErrorCallback(callback, "Cache.hooks.endIdle") | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-09-27 13:22:19 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-18 05:20:58 +08:00
										 |  |  | 	/** | 
					
						
							| 
									
										
										
										
											2020-07-15 17:14:28 +08:00
										 |  |  | 	 * @param {CallbackCache<void>} callback signals when the call finishes | 
					
						
							| 
									
										
										
										
											2018-12-18 05:20:58 +08:00
										 |  |  | 	 * @returns {void} | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2018-09-27 13:22:19 +08:00
										 |  |  | 	shutdown(callback) { | 
					
						
							| 
									
										
										
										
											2019-08-09 20:49:47 +08:00
										 |  |  | 		this.hooks.shutdown.callAsync( | 
					
						
							|  |  |  | 			makeWebpackErrorCallback(callback, "Cache.hooks.shutdown") | 
					
						
							|  |  |  | 		); | 
					
						
							| 
									
										
										
										
											2018-09-27 13:22:19 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-13 17:03:10 +08:00
										 |  |  | Cache.STAGE_MEMORY = -10; | 
					
						
							|  |  |  | Cache.STAGE_DEFAULT = 0; | 
					
						
							|  |  |  | Cache.STAGE_DISK = 10; | 
					
						
							|  |  |  | Cache.STAGE_NETWORK = 20; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-27 13:22:19 +08:00
										 |  |  | module.exports = Cache; |