mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			365 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			365 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
/*
 | 
						|
	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
						|
	Author Tobias Koppers @sokra
 | 
						|
*/
 | 
						|
 | 
						|
"use strict";
 | 
						|
 | 
						|
/*global $options$ $updateModuleFactories$ $updateRuntimeModules$ $moduleCache$ $moduleFactories$ $hmrModuleData$ __webpack_require__ */
 | 
						|
 | 
						|
module.exports = function() {
 | 
						|
	function getAffectedModuleEffects(updateModuleId) {
 | 
						|
		var outdatedModules = [updateModuleId];
 | 
						|
		var outdatedDependencies = {};
 | 
						|
 | 
						|
		var queue = outdatedModules.slice().map(function(id) {
 | 
						|
			return {
 | 
						|
				chain: [id],
 | 
						|
				id: id
 | 
						|
			};
 | 
						|
		});
 | 
						|
		while (queue.length > 0) {
 | 
						|
			var queueItem = queue.pop();
 | 
						|
			var moduleId = queueItem.id;
 | 
						|
			var chain = queueItem.chain;
 | 
						|
			var module = $moduleCache$[moduleId];
 | 
						|
			if (!module || module.hot._selfAccepted) continue;
 | 
						|
			if (module.hot._selfDeclined) {
 | 
						|
				return {
 | 
						|
					type: "self-declined",
 | 
						|
					chain: chain,
 | 
						|
					moduleId: moduleId
 | 
						|
				};
 | 
						|
			}
 | 
						|
			if (module.hot._main) {
 | 
						|
				return {
 | 
						|
					type: "unaccepted",
 | 
						|
					chain: chain,
 | 
						|
					moduleId: moduleId
 | 
						|
				};
 | 
						|
			}
 | 
						|
			for (var i = 0; i < module.parents.length; i++) {
 | 
						|
				var parentId = module.parents[i];
 | 
						|
				var parent = $moduleCache$[parentId];
 | 
						|
				if (!parent) continue;
 | 
						|
				if (parent.hot._declinedDependencies[moduleId]) {
 | 
						|
					return {
 | 
						|
						type: "declined",
 | 
						|
						chain: chain.concat([parentId]),
 | 
						|
						moduleId: moduleId,
 | 
						|
						parentId: parentId
 | 
						|
					};
 | 
						|
				}
 | 
						|
				if (outdatedModules.indexOf(parentId) !== -1) continue;
 | 
						|
				if (parent.hot._acceptedDependencies[moduleId]) {
 | 
						|
					if (!outdatedDependencies[parentId])
 | 
						|
						outdatedDependencies[parentId] = [];
 | 
						|
					addAllToSet(outdatedDependencies[parentId], [moduleId]);
 | 
						|
					continue;
 | 
						|
				}
 | 
						|
				delete outdatedDependencies[parentId];
 | 
						|
				outdatedModules.push(parentId);
 | 
						|
				queue.push({
 | 
						|
					chain: chain.concat([parentId]),
 | 
						|
					id: parentId
 | 
						|
				});
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		return {
 | 
						|
			type: "accepted",
 | 
						|
			moduleId: updateModuleId,
 | 
						|
			outdatedModules: outdatedModules,
 | 
						|
			outdatedDependencies: outdatedDependencies
 | 
						|
		};
 | 
						|
	}
 | 
						|
 | 
						|
	function addAllToSet(a, b) {
 | 
						|
		for (var i = 0; i < b.length; i++) {
 | 
						|
			var item = b[i];
 | 
						|
			if (a.indexOf(item) === -1) a.push(item);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	// at begin all updates modules are outdated
 | 
						|
	// the "outdated" status can propagate to parents if they don't accept the children
 | 
						|
	var outdatedDependencies = {};
 | 
						|
	var outdatedModules = [];
 | 
						|
	var appliedUpdate = {};
 | 
						|
 | 
						|
	var warnUnexpectedRequire = function warnUnexpectedRequire() {
 | 
						|
		console.warn(
 | 
						|
			"[HMR] unexpected require(" + result.moduleId + ") to disposed module"
 | 
						|
		);
 | 
						|
	};
 | 
						|
 | 
						|
	for (var moduleId in $updateModuleFactories$) {
 | 
						|
		if (
 | 
						|
			Object.prototype.hasOwnProperty.call($updateModuleFactories$, moduleId)
 | 
						|
		) {
 | 
						|
			var newModuleFactory = $updateModuleFactories$[moduleId];
 | 
						|
			/** @type {TODO} */
 | 
						|
			var result;
 | 
						|
			if (newModuleFactory) {
 | 
						|
				result = getAffectedModuleEffects(moduleId);
 | 
						|
			} else {
 | 
						|
				result = {
 | 
						|
					type: "disposed",
 | 
						|
					moduleId: moduleId
 | 
						|
				};
 | 
						|
			}
 | 
						|
			/** @type {Error|false} */
 | 
						|
			var abortError = false;
 | 
						|
			var doApply = false;
 | 
						|
			var doDispose = false;
 | 
						|
			var chainInfo = "";
 | 
						|
			if (result.chain) {
 | 
						|
				chainInfo = "\nUpdate propagation: " + result.chain.join(" -> ");
 | 
						|
			}
 | 
						|
			switch (result.type) {
 | 
						|
				case "self-declined":
 | 
						|
					if ($options$.onDeclined) $options$.onDeclined(result);
 | 
						|
					if (!$options$.ignoreDeclined)
 | 
						|
						abortError = new Error(
 | 
						|
							"Aborted because of self decline: " + result.moduleId + chainInfo
 | 
						|
						);
 | 
						|
					break;
 | 
						|
				case "declined":
 | 
						|
					if ($options$.onDeclined) $options$.onDeclined(result);
 | 
						|
					if (!$options$.ignoreDeclined)
 | 
						|
						abortError = new Error(
 | 
						|
							"Aborted because of declined dependency: " +
 | 
						|
								result.moduleId +
 | 
						|
								" in " +
 | 
						|
								result.parentId +
 | 
						|
								chainInfo
 | 
						|
						);
 | 
						|
					break;
 | 
						|
				case "unaccepted":
 | 
						|
					if ($options$.onUnaccepted) $options$.onUnaccepted(result);
 | 
						|
					if (!$options$.ignoreUnaccepted)
 | 
						|
						abortError = new Error(
 | 
						|
							"Aborted because " + moduleId + " is not accepted" + chainInfo
 | 
						|
						);
 | 
						|
					break;
 | 
						|
				case "accepted":
 | 
						|
					if ($options$.onAccepted) $options$.onAccepted(result);
 | 
						|
					doApply = true;
 | 
						|
					break;
 | 
						|
				case "disposed":
 | 
						|
					if ($options$.onDisposed) $options$.onDisposed(result);
 | 
						|
					doDispose = true;
 | 
						|
					break;
 | 
						|
				default:
 | 
						|
					throw new Error("Unexception type " + result.type);
 | 
						|
			}
 | 
						|
			if (abortError) {
 | 
						|
				return {
 | 
						|
					error: abortError
 | 
						|
				};
 | 
						|
			}
 | 
						|
			if (doApply) {
 | 
						|
				appliedUpdate[moduleId] = newModuleFactory;
 | 
						|
				addAllToSet(outdatedModules, result.outdatedModules);
 | 
						|
				for (moduleId in result.outdatedDependencies) {
 | 
						|
					if (
 | 
						|
						Object.prototype.hasOwnProperty.call(
 | 
						|
							result.outdatedDependencies,
 | 
						|
							moduleId
 | 
						|
						)
 | 
						|
					) {
 | 
						|
						if (!outdatedDependencies[moduleId])
 | 
						|
							outdatedDependencies[moduleId] = [];
 | 
						|
						addAllToSet(
 | 
						|
							outdatedDependencies[moduleId],
 | 
						|
							result.outdatedDependencies[moduleId]
 | 
						|
						);
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
			if (doDispose) {
 | 
						|
				addAllToSet(outdatedModules, [result.moduleId]);
 | 
						|
				appliedUpdate[moduleId] = warnUnexpectedRequire;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	// Store self accepted outdated modules to require them later by the module system
 | 
						|
	var outdatedSelfAcceptedModules = [];
 | 
						|
	for (var j = 0; j < outdatedModules.length; j++) {
 | 
						|
		var outdatedModuleId = outdatedModules[j];
 | 
						|
		if (
 | 
						|
			$moduleCache$[outdatedModuleId] &&
 | 
						|
			$moduleCache$[outdatedModuleId].hot._selfAccepted
 | 
						|
		)
 | 
						|
			outdatedSelfAcceptedModules.push({
 | 
						|
				module: outdatedModuleId,
 | 
						|
				require: $moduleCache$[outdatedModuleId].hot._requireSelf,
 | 
						|
				errorHandler: $moduleCache$[outdatedModuleId].hot._selfAccepted
 | 
						|
			});
 | 
						|
	}
 | 
						|
 | 
						|
	var moduleOutdatedDependencies;
 | 
						|
 | 
						|
	return {
 | 
						|
		dispose: function() {
 | 
						|
			// $dispose$
 | 
						|
 | 
						|
			var idx;
 | 
						|
			var queue = outdatedModules.slice();
 | 
						|
			while (queue.length > 0) {
 | 
						|
				var moduleId = queue.pop();
 | 
						|
				var module = $moduleCache$[moduleId];
 | 
						|
				if (!module) continue;
 | 
						|
 | 
						|
				var data = {};
 | 
						|
 | 
						|
				// Call dispose handlers
 | 
						|
				var disposeHandlers = module.hot._disposeHandlers;
 | 
						|
				for (j = 0; j < disposeHandlers.length; j++) {
 | 
						|
					disposeHandlers[j].call(null, data);
 | 
						|
				}
 | 
						|
				$hmrModuleData$[moduleId] = data;
 | 
						|
 | 
						|
				// disable module (this disables requires from this module)
 | 
						|
				module.hot.active = false;
 | 
						|
 | 
						|
				// remove module from cache
 | 
						|
				delete $moduleCache$[moduleId];
 | 
						|
 | 
						|
				// when disposing there is no need to call dispose handler
 | 
						|
				delete outdatedDependencies[moduleId];
 | 
						|
 | 
						|
				// remove "parents" references from all children
 | 
						|
				for (j = 0; j < module.children.length; j++) {
 | 
						|
					var child = $moduleCache$[module.children[j]];
 | 
						|
					if (!child) continue;
 | 
						|
					idx = child.parents.indexOf(moduleId);
 | 
						|
					if (idx >= 0) {
 | 
						|
						child.parents.splice(idx, 1);
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			// remove outdated dependency from module children
 | 
						|
			var dependency;
 | 
						|
			for (var outdatedModuleId in outdatedDependencies) {
 | 
						|
				if (
 | 
						|
					Object.prototype.hasOwnProperty.call(
 | 
						|
						outdatedDependencies,
 | 
						|
						outdatedModuleId
 | 
						|
					)
 | 
						|
				) {
 | 
						|
					module = $moduleCache$[outdatedModuleId];
 | 
						|
					if (module) {
 | 
						|
						moduleOutdatedDependencies = outdatedDependencies[outdatedModuleId];
 | 
						|
						for (j = 0; j < moduleOutdatedDependencies.length; j++) {
 | 
						|
							dependency = moduleOutdatedDependencies[j];
 | 
						|
							idx = module.children.indexOf(dependency);
 | 
						|
							if (idx >= 0) module.children.splice(idx, 1);
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
		},
 | 
						|
		apply: function(reportError) {
 | 
						|
			// insert new code
 | 
						|
			for (var updateModuleId in appliedUpdate) {
 | 
						|
				if (
 | 
						|
					Object.prototype.hasOwnProperty.call(appliedUpdate, updateModuleId)
 | 
						|
				) {
 | 
						|
					$moduleFactories$[updateModuleId] = appliedUpdate[updateModuleId];
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			// run new runtime modules
 | 
						|
			for (var i = 0; i < $updateRuntimeModules$.length; i++) {
 | 
						|
				$updateRuntimeModules$[i](__webpack_require__);
 | 
						|
			}
 | 
						|
 | 
						|
			// call accept handlers
 | 
						|
			var error = null;
 | 
						|
			for (var outdatedModuleId in outdatedDependencies) {
 | 
						|
				if (
 | 
						|
					Object.prototype.hasOwnProperty.call(
 | 
						|
						outdatedDependencies,
 | 
						|
						outdatedModuleId
 | 
						|
					)
 | 
						|
				) {
 | 
						|
					var module = $moduleCache$[outdatedModuleId];
 | 
						|
					if (module) {
 | 
						|
						moduleOutdatedDependencies = outdatedDependencies[outdatedModuleId];
 | 
						|
						var callbacks = [];
 | 
						|
						for (var j = 0; j < moduleOutdatedDependencies.length; j++) {
 | 
						|
							var dependency = moduleOutdatedDependencies[j];
 | 
						|
							var acceptCallback = module.hot._acceptedDependencies[dependency];
 | 
						|
							if (acceptCallback) {
 | 
						|
								if (callbacks.indexOf(acceptCallback) !== -1) continue;
 | 
						|
								callbacks.push(acceptCallback);
 | 
						|
							}
 | 
						|
						}
 | 
						|
						for (var k = 0; k < callbacks.length; k++) {
 | 
						|
							try {
 | 
						|
								callbacks[k].call(null, moduleOutdatedDependencies);
 | 
						|
							} catch (err) {
 | 
						|
								if ($options$.onErrored) {
 | 
						|
									$options$.onErrored({
 | 
						|
										type: "accept-errored",
 | 
						|
										moduleId: outdatedModuleId,
 | 
						|
										dependencyId: moduleOutdatedDependencies[i],
 | 
						|
										error: err
 | 
						|
									});
 | 
						|
								}
 | 
						|
								if (!$options$.ignoreErrored) {
 | 
						|
									if (!error) error = err;
 | 
						|
								}
 | 
						|
							}
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			// Load self accepted modules
 | 
						|
			for (var o = 0; o < outdatedSelfAcceptedModules.length; o++) {
 | 
						|
				var item = outdatedSelfAcceptedModules[o];
 | 
						|
				var moduleId = item.module;
 | 
						|
				try {
 | 
						|
					item.require(moduleId);
 | 
						|
				} catch (err) {
 | 
						|
					if (typeof item.errorHandler === "function") {
 | 
						|
						try {
 | 
						|
							item.errorHandler(err);
 | 
						|
						} catch (err2) {
 | 
						|
							if ($options$.onErrored) {
 | 
						|
								$options$.onErrored({
 | 
						|
									type: "self-accept-error-handler-errored",
 | 
						|
									moduleId: moduleId,
 | 
						|
									error: err2,
 | 
						|
									originalError: err
 | 
						|
								});
 | 
						|
							}
 | 
						|
							if (!$options$.ignoreErrored) {
 | 
						|
								reportError(err2);
 | 
						|
							}
 | 
						|
							reportError(err);
 | 
						|
						}
 | 
						|
					} else {
 | 
						|
						if ($options$.onErrored) {
 | 
						|
							$options$.onErrored({
 | 
						|
								type: "self-accept-errored",
 | 
						|
								moduleId: moduleId,
 | 
						|
								error: err
 | 
						|
							});
 | 
						|
						}
 | 
						|
						if (!$options$.ignoreErrored) {
 | 
						|
							reportError(err);
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			return outdatedModules;
 | 
						|
		}
 | 
						|
	};
 | 
						|
};
 |