UNPKG

kitchensink

Version:

Dispatch's awesome components and style guide

167 lines (148 loc) 4.49 kB
/*eslint-env browser*/ /*global __resourceQuery __webpack_public_path__*/ var options = { path: "/__webpack_hmr", timeout: 20 * 1000, overlay: true, reload: false, log: true, warn: true }; if (__resourceQuery) { var querystring = require('querystring'); var overrides = querystring.parse(__resourceQuery.slice(1)); if (overrides.path) options.path = overrides.path; if (overrides.timeout) options.timeout = overrides.timeout; if (overrides.overlay) options.overlay = overrides.overlay !== 'false'; if (overrides.reload) options.reload = overrides.reload !== 'false'; if (overrides.noInfo && overrides.noInfo !== 'false') { options.log = false; } if (overrides.quiet && overrides.quiet !== 'false') { options.log = false; options.warn = false; } if (overrides.dynamicPublicPath) { options.path = __webpack_public_path__ + options.path; } } if (typeof window === 'undefined') { // do nothing } else if (typeof window.EventSource === 'undefined') { console.warn( "webpack-hot-middleware's client requires EventSource to work. " + "You should include a polyfill if you want to support this browser: " + "https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events#Tools" ); } else { connect(window.EventSource); } function connect(EventSource) { var source = new EventSource(options.path); var lastActivity = new Date(); source.onopen = handleOnline; source.onmessage = handleMessage; source.onerror = handleDisconnect; var timer = setInterval(function() { if ((new Date() - lastActivity) > options.timeout) { handleDisconnect(); } }, options.timeout / 2); function handleOnline() { if (options.log) console.log("[HMR] connected"); lastActivity = new Date(); } function handleMessage(event) { lastActivity = new Date(); if (event.data == "\uD83D\uDC93") { return; } try { processMessage(JSON.parse(event.data)); } catch (ex) { if (options.warn) { console.warn("Invalid HMR message: " + event.data + "\n" + ex); } } } function handleDisconnect() { clearInterval(timer); source.close(); setTimeout(function() { connect(EventSource); }, options.timeout); } } var reporter; // the reporter needs to be a singleton on the page // in case the client is being used by mutliple bundles // we only want to report once. // all the errors will go to all clients var singletonKey = '__webpack_hot_middleware_reporter__'; if (typeof window !== 'undefined' && !window[singletonKey]) { reporter = window[singletonKey] = createReporter(); } function createReporter() { var strip = require('strip-ansi'); var overlay; if (typeof document !== 'undefined' && options.overlay) { overlay = require('./client-overlay'); } return { problems: function(type, obj) { if (options.warn) { console.warn("[HMR] bundle has " + type + ":"); obj[type].forEach(function(msg) { console.warn("[HMR] " + strip(msg)); }); } if (overlay && type !== 'warnings') overlay.showProblems(type, obj[type]); }, success: function() { if (overlay) overlay.clear(); }, useCustomOverlay: function(customOverlay) { overlay = customOverlay; } }; } var processUpdate = require('./process-update'); var customHandler; var subscribeAllHandler; function processMessage(obj) { if (obj.action == "building") { if (options.log) console.log("[HMR] bundle rebuilding"); } else if (obj.action == "built") { if (options.log) { console.log( "[HMR] bundle " + (obj.name ? obj.name + " " : "") + "rebuilt in " + obj.time + "ms" ); } if (obj.errors.length > 0) { if (reporter) reporter.problems('errors', obj); } else { if (reporter) { if (obj.warnings.length > 0) reporter.problems('warnings', obj); reporter.success(); } processUpdate(obj.hash, obj.modules, options); } } else if (customHandler) { customHandler(obj); } if (subscribeAllHandler) { subscribeAllHandler(obj); } } if (module) { module.exports = { subscribeAll: function subscribeAll(handler) { subscribeAllHandler = handler; }, subscribe: function subscribe(handler) { customHandler = handler; }, useCustomOverlay: function useCustomOverlay(customOverlay) { if (reporter) reporter.useCustomOverlay(customOverlay); } }; }