158 lines
4.3 KiB
JavaScript
158 lines
4.3 KiB
JavaScript
|
/**
|
||
|
* Based heavily on https://github.com/webpack/webpack/blob/
|
||
|
* c0afdf9c6abc1dd70707c594e473802a566f7b6e/hot/only-dev-server.js
|
||
|
* Original copyright Tobias Koppers @sokra (MIT license)
|
||
|
*/
|
||
|
|
||
|
/* global window __webpack_hash__ */
|
||
|
|
||
|
if (!module.hot) {
|
||
|
throw new Error('[HMR] Hot Module Replacement is disabled.');
|
||
|
}
|
||
|
|
||
|
var hmrDocsUrl = 'https://webpack.js.org/concepts/hot-module-replacement/'; // eslint-disable-line max-len
|
||
|
|
||
|
var lastHash;
|
||
|
var failureStatuses = { abort: 1, fail: 1 };
|
||
|
var applyOptions = {
|
||
|
ignoreUnaccepted: true,
|
||
|
ignoreDeclined: true,
|
||
|
ignoreErrored: true,
|
||
|
onUnaccepted: function(data) {
|
||
|
console.warn(
|
||
|
'Ignored an update to unaccepted module ' + data.chain.join(' -> ')
|
||
|
);
|
||
|
},
|
||
|
onDeclined: function(data) {
|
||
|
console.warn(
|
||
|
'Ignored an update to declined module ' + data.chain.join(' -> ')
|
||
|
);
|
||
|
},
|
||
|
onErrored: function(data) {
|
||
|
console.error(data.error);
|
||
|
console.warn(
|
||
|
'Ignored an error while updating module ' +
|
||
|
data.moduleId +
|
||
|
' (' +
|
||
|
data.type +
|
||
|
')'
|
||
|
);
|
||
|
},
|
||
|
};
|
||
|
|
||
|
function upToDate(hash) {
|
||
|
if (hash) lastHash = hash;
|
||
|
return lastHash == __webpack_hash__;
|
||
|
}
|
||
|
|
||
|
module.exports = function(hash, moduleMap, options) {
|
||
|
var reload = options.reload;
|
||
|
if (!upToDate(hash) && module.hot.status() == 'idle') {
|
||
|
if (options.log) console.log('[HMR] Checking for updates on the server...');
|
||
|
check();
|
||
|
}
|
||
|
|
||
|
function check() {
|
||
|
var cb = function(err, updatedModules) {
|
||
|
if (err) return handleError(err);
|
||
|
|
||
|
if (!updatedModules) {
|
||
|
if (options.warn) {
|
||
|
console.warn('[HMR] Cannot find update (Full reload needed)');
|
||
|
console.warn('[HMR] (Probably because of restarting the server)');
|
||
|
}
|
||
|
performReload();
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
var applyCallback = function(applyErr, renewedModules) {
|
||
|
if (applyErr) return handleError(applyErr);
|
||
|
|
||
|
if (!upToDate()) check();
|
||
|
|
||
|
logUpdates(updatedModules, renewedModules);
|
||
|
};
|
||
|
|
||
|
var applyResult = module.hot.apply(applyOptions, applyCallback);
|
||
|
// webpack 2 promise
|
||
|
if (applyResult && applyResult.then) {
|
||
|
// HotModuleReplacement.runtime.js refers to the result as `outdatedModules`
|
||
|
applyResult.then(function(outdatedModules) {
|
||
|
applyCallback(null, outdatedModules);
|
||
|
});
|
||
|
applyResult.catch(applyCallback);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var result = module.hot.check(false, cb);
|
||
|
// webpack 2 promise
|
||
|
if (result && result.then) {
|
||
|
result.then(function(updatedModules) {
|
||
|
cb(null, updatedModules);
|
||
|
});
|
||
|
result.catch(cb);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function logUpdates(updatedModules, renewedModules) {
|
||
|
var unacceptedModules = updatedModules.filter(function(moduleId) {
|
||
|
return renewedModules && renewedModules.indexOf(moduleId) < 0;
|
||
|
});
|
||
|
|
||
|
if (unacceptedModules.length > 0) {
|
||
|
if (options.warn) {
|
||
|
console.warn(
|
||
|
"[HMR] The following modules couldn't be hot updated: " +
|
||
|
'(Full reload needed)\n' +
|
||
|
'This is usually because the modules which have changed ' +
|
||
|
'(and their parents) do not know how to hot reload themselves. ' +
|
||
|
'See ' +
|
||
|
hmrDocsUrl +
|
||
|
' for more details.'
|
||
|
);
|
||
|
unacceptedModules.forEach(function(moduleId) {
|
||
|
console.warn('[HMR] - ' + (moduleMap[moduleId] || moduleId));
|
||
|
});
|
||
|
}
|
||
|
performReload();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (options.log) {
|
||
|
if (!renewedModules || renewedModules.length === 0) {
|
||
|
console.log('[HMR] Nothing hot updated.');
|
||
|
} else {
|
||
|
console.log('[HMR] Updated modules:');
|
||
|
renewedModules.forEach(function(moduleId) {
|
||
|
console.log('[HMR] - ' + (moduleMap[moduleId] || moduleId));
|
||
|
});
|
||
|
}
|
||
|
|
||
|
if (upToDate()) {
|
||
|
console.log('[HMR] App is up to date.');
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function handleError(err) {
|
||
|
if (module.hot.status() in failureStatuses) {
|
||
|
if (options.warn) {
|
||
|
console.warn('[HMR] Cannot check for update (Full reload needed)');
|
||
|
console.warn('[HMR] ' + (err.stack || err.message));
|
||
|
}
|
||
|
performReload();
|
||
|
return;
|
||
|
}
|
||
|
if (options.warn) {
|
||
|
console.warn('[HMR] Update check failed: ' + (err.stack || err.message));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function performReload() {
|
||
|
if (reload) {
|
||
|
if (options.warn) console.warn('[HMR] Reloading page');
|
||
|
window.location.reload();
|
||
|
}
|
||
|
}
|
||
|
};
|