212 lines
5.3 KiB
JavaScript
212 lines
5.3 KiB
JavaScript
var OVERLAY_ID = '__parcel__error__overlay__';
|
|
|
|
var OldModule = module.bundle.Module;
|
|
|
|
function Module(moduleName) {
|
|
OldModule.call(this, moduleName);
|
|
this.hot = {
|
|
data: module.bundle.hotData,
|
|
_acceptCallbacks: [],
|
|
_disposeCallbacks: [],
|
|
accept: function (fn) {
|
|
this._acceptCallbacks.push(fn || function () {});
|
|
},
|
|
dispose: function (fn) {
|
|
this._disposeCallbacks.push(fn);
|
|
}
|
|
};
|
|
|
|
module.bundle.hotData = null;
|
|
}
|
|
|
|
module.bundle.Module = Module;
|
|
var checkedAssets, assetsToAccept;
|
|
|
|
var parent = module.bundle.parent;
|
|
if ((!parent || !parent.isParcelRequire) && typeof WebSocket !== 'undefined') {
|
|
var hostname = process.env.HMR_HOSTNAME || location.hostname;
|
|
var protocol = location.protocol === 'https:' ? 'wss' : 'ws';
|
|
var ws = new WebSocket(protocol + '://' + hostname + ':' + process.env.HMR_PORT + '/');
|
|
ws.onmessage = function(event) {
|
|
checkedAssets = {};
|
|
assetsToAccept = [];
|
|
|
|
var data = JSON.parse(event.data);
|
|
|
|
if (data.type === 'update') {
|
|
var handled = false;
|
|
data.assets.forEach(function(asset) {
|
|
if (!asset.isNew) {
|
|
var didAccept = hmrAcceptCheck(global.parcelRequire, asset.id);
|
|
if (didAccept) {
|
|
handled = true;
|
|
}
|
|
}
|
|
});
|
|
|
|
// Enable HMR for CSS by default.
|
|
handled = handled || data.assets.every(function(asset) {
|
|
return asset.type === 'css' && asset.generated.js;
|
|
});
|
|
|
|
if (handled) {
|
|
console.clear();
|
|
|
|
data.assets.forEach(function (asset) {
|
|
hmrApply(global.parcelRequire, asset);
|
|
});
|
|
|
|
assetsToAccept.forEach(function (v) {
|
|
hmrAcceptRun(v[0], v[1]);
|
|
});
|
|
} else if (location.reload) { // `location` global exists in a web worker context but lacks `.reload()` function.
|
|
location.reload();
|
|
}
|
|
}
|
|
|
|
if (data.type === 'reload') {
|
|
ws.close();
|
|
ws.onclose = function () {
|
|
location.reload();
|
|
}
|
|
}
|
|
|
|
if (data.type === 'error-resolved') {
|
|
console.log('[parcel] ✨ Error resolved');
|
|
|
|
removeErrorOverlay();
|
|
}
|
|
|
|
if (data.type === 'error') {
|
|
console.error('[parcel] 🚨 ' + data.error.message + '\n' + data.error.stack);
|
|
|
|
removeErrorOverlay();
|
|
|
|
var overlay = createErrorOverlay(data);
|
|
document.body.appendChild(overlay);
|
|
}
|
|
};
|
|
}
|
|
|
|
function removeErrorOverlay() {
|
|
var overlay = document.getElementById(OVERLAY_ID);
|
|
if (overlay) {
|
|
overlay.remove();
|
|
}
|
|
}
|
|
|
|
function createErrorOverlay(data) {
|
|
var overlay = document.createElement('div');
|
|
overlay.id = OVERLAY_ID;
|
|
|
|
// html encode message and stack trace
|
|
var message = document.createElement('div');
|
|
var stackTrace = document.createElement('pre');
|
|
message.innerText = data.error.message;
|
|
stackTrace.innerText = data.error.stack;
|
|
|
|
overlay.innerHTML = (
|
|
'<div style="background: black; font-size: 16px; color: white; position: fixed; height: 100%; width: 100%; top: 0px; left: 0px; padding: 30px; opacity: 0.85; font-family: Menlo, Consolas, monospace; z-index: 9999;">' +
|
|
'<span style="background: red; padding: 2px 4px; border-radius: 2px;">ERROR</span>' +
|
|
'<span style="top: 2px; margin-left: 5px; position: relative;">🚨</span>' +
|
|
'<div style="font-size: 18px; font-weight: bold; margin-top: 20px;">' + message.innerHTML + '</div>' +
|
|
'<pre>' + stackTrace.innerHTML + '</pre>' +
|
|
'</div>'
|
|
);
|
|
|
|
return overlay;
|
|
|
|
}
|
|
|
|
function getParents(bundle, id) {
|
|
var modules = bundle.modules;
|
|
if (!modules) {
|
|
return [];
|
|
}
|
|
|
|
var parents = [];
|
|
var k, d, dep;
|
|
|
|
for (k in modules) {
|
|
for (d in modules[k][1]) {
|
|
dep = modules[k][1][d];
|
|
if (dep === id || (Array.isArray(dep) && dep[dep.length - 1] === id)) {
|
|
parents.push(k);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (bundle.parent) {
|
|
parents = parents.concat(getParents(bundle.parent, id));
|
|
}
|
|
|
|
return parents;
|
|
}
|
|
|
|
function hmrApply(bundle, asset) {
|
|
var modules = bundle.modules;
|
|
if (!modules) {
|
|
return;
|
|
}
|
|
|
|
if (modules[asset.id] || !bundle.parent) {
|
|
var fn = new Function('require', 'module', 'exports', asset.generated.js);
|
|
asset.isNew = !modules[asset.id];
|
|
modules[asset.id] = [fn, asset.deps];
|
|
} else if (bundle.parent) {
|
|
hmrApply(bundle.parent, asset);
|
|
}
|
|
}
|
|
|
|
function hmrAcceptCheck(bundle, id) {
|
|
var modules = bundle.modules;
|
|
if (!modules) {
|
|
return;
|
|
}
|
|
|
|
if (!modules[id] && bundle.parent) {
|
|
return hmrAcceptCheck(bundle.parent, id);
|
|
}
|
|
|
|
if (checkedAssets[id]) {
|
|
return;
|
|
}
|
|
checkedAssets[id] = true;
|
|
|
|
var cached = bundle.cache[id];
|
|
|
|
assetsToAccept.push([bundle, id]);
|
|
|
|
if (cached && cached.hot && cached.hot._acceptCallbacks.length) {
|
|
return true;
|
|
}
|
|
|
|
return getParents(global.parcelRequire, id).some(function (id) {
|
|
return hmrAcceptCheck(global.parcelRequire, id)
|
|
});
|
|
}
|
|
|
|
function hmrAcceptRun(bundle, id) {
|
|
var cached = bundle.cache[id];
|
|
bundle.hotData = {};
|
|
if (cached) {
|
|
cached.hot.data = bundle.hotData;
|
|
}
|
|
|
|
if (cached && cached.hot && cached.hot._disposeCallbacks.length) {
|
|
cached.hot._disposeCallbacks.forEach(function (cb) {
|
|
cb(bundle.hotData);
|
|
});
|
|
}
|
|
|
|
delete bundle.cache[id];
|
|
bundle(id);
|
|
|
|
cached = bundle.cache[id];
|
|
if (cached && cached.hot && cached.hot._acceptCallbacks.length) {
|
|
cached.hot._acceptCallbacks.forEach(function (cb) {
|
|
cb();
|
|
});
|
|
return true;
|
|
}
|
|
}
|