123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310 |
- /*eslint-env browser*/
- /*global __resourceQuery __webpack_public_path__*/
- var options = {
- path: '/__webpack_hmr',
- timeout: 20 * 1000,
- overlay: true,
- reload: false,
- log: true,
- warn: true,
- name: '',
- autoConnect: true,
- overlayStyles: {},
- overlayWarnings: false,
- ansiColors: {},
- };
- if (__resourceQuery) {
- var params = Array.from(new URLSearchParams(__resourceQuery.slice(1)));
- var overrides = params.reduce(function (memo, param) {
- memo[param[0]] = param[1];
- return memo;
- }, {});
- setOverrides(overrides);
- }
- 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 {
- if (options.autoConnect) {
- connect();
- }
- }
- /* istanbul ignore next */
- function setOptionsAndConnect(overrides) {
- setOverrides(overrides);
- connect();
- }
- function setOverrides(overrides) {
- if (overrides.autoConnect)
- options.autoConnect = overrides.autoConnect == 'true';
- 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.name) {
- options.name = overrides.name;
- }
- if (overrides.quiet && overrides.quiet !== 'false') {
- options.log = false;
- options.warn = false;
- }
- if (overrides.dynamicPublicPath) {
- options.path = __webpack_public_path__ + options.path;
- }
- if (overrides.ansiColors)
- options.ansiColors = JSON.parse(overrides.ansiColors);
- if (overrides.overlayStyles)
- options.overlayStyles = JSON.parse(overrides.overlayStyles);
- if (overrides.overlayWarnings) {
- options.overlayWarnings = overrides.overlayWarnings == 'true';
- }
- }
- function EventSourceWrapper() {
- var source;
- var lastActivity = new Date();
- var listeners = [];
- init();
- var timer = setInterval(function () {
- if (new Date() - lastActivity > options.timeout) {
- handleDisconnect();
- }
- }, options.timeout / 2);
- function init() {
- source = new window.EventSource(options.path);
- source.onopen = handleOnline;
- source.onerror = handleDisconnect;
- source.onmessage = handleMessage;
- }
- function handleOnline() {
- if (options.log) console.log('[HMR] connected');
- lastActivity = new Date();
- }
- function handleMessage(event) {
- lastActivity = new Date();
- for (var i = 0; i < listeners.length; i++) {
- listeners[i](event);
- }
- }
- function handleDisconnect() {
- clearInterval(timer);
- source.close();
- setTimeout(init, options.timeout);
- }
- return {
- addMessageListener: function (fn) {
- listeners.push(fn);
- },
- };
- }
- function getEventSourceWrapper() {
- if (!window.__whmEventSourceWrapper) {
- window.__whmEventSourceWrapper = {};
- }
- if (!window.__whmEventSourceWrapper[options.path]) {
- // cache the wrapper for other entries loaded on
- // the same page with the same options.path
- window.__whmEventSourceWrapper[options.path] = EventSourceWrapper();
- }
- return window.__whmEventSourceWrapper[options.path];
- }
- function connect() {
- getEventSourceWrapper().addMessageListener(handleMessage);
- function handleMessage(event) {
- 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);
- }
- }
- }
- }
- // the reporter needs to be a singleton on the page
- // in case the client is being used by multiple bundles
- // we only want to report once.
- // all the errors will go to all clients
- var singletonKey = '__webpack_hot_middleware_reporter__';
- var reporter;
- if (typeof window !== 'undefined') {
- if (!window[singletonKey]) {
- window[singletonKey] = createReporter();
- }
- reporter = window[singletonKey];
- }
- function createReporter() {
- var strip = require('strip-ansi');
- var overlay;
- if (typeof document !== 'undefined' && options.overlay) {
- overlay = require('./client-overlay')({
- ansiColors: options.ansiColors,
- overlayStyles: options.overlayStyles,
- });
- }
- var styles = {
- errors: 'color: #ff0000;',
- warnings: 'color: #999933;',
- };
- var previousProblems = null;
- function log(type, obj) {
- var newProblems = obj[type]
- .map(function (msg) {
- return strip(msg);
- })
- .join('\n');
- if (previousProblems == newProblems) {
- return;
- } else {
- previousProblems = newProblems;
- }
- var style = styles[type];
- var name = obj.name ? "'" + obj.name + "' " : '';
- var title = '[HMR] bundle ' + name + 'has ' + obj[type].length + ' ' + type;
- // NOTE: console.warn or console.error will print the stack trace
- // which isn't helpful here, so using console.log to escape it.
- if (console.group && console.groupEnd) {
- console.group('%c' + title, style);
- console.log('%c' + newProblems, style);
- console.groupEnd();
- } else {
- console.log(
- '%c' + title + '\n\t%c' + newProblems.replace(/\n/g, '\n\t'),
- style + 'font-weight: bold;',
- style + 'font-weight: normal;'
- );
- }
- }
- return {
- cleanProblemsCache: function () {
- previousProblems = null;
- },
- problems: function (type, obj) {
- if (options.warn) {
- log(type, obj);
- }
- if (overlay) {
- if (options.overlayWarnings || type === 'errors') {
- overlay.showProblems(type, obj[type]);
- return false;
- }
- overlay.clear();
- }
- return true;
- },
- success: function () {
- if (overlay) overlay.clear();
- },
- useCustomOverlay: function (customOverlay) {
- overlay = customOverlay;
- },
- };
- }
- var processUpdate = require('./process-update');
- var customHandler;
- var subscribeAllHandler;
- function processMessage(obj) {
- switch (obj.action) {
- case 'building':
- if (options.log) {
- console.log(
- '[HMR] bundle ' +
- (obj.name ? "'" + obj.name + "' " : '') +
- 'rebuilding'
- );
- }
- break;
- case 'built':
- if (options.log) {
- console.log(
- '[HMR] bundle ' +
- (obj.name ? "'" + obj.name + "' " : '') +
- 'rebuilt in ' +
- obj.time +
- 'ms'
- );
- }
- // fall through
- case 'sync':
- if (obj.name && options.name && obj.name !== options.name) {
- return;
- }
- var applyUpdate = true;
- if (obj.errors.length > 0) {
- if (reporter) reporter.problems('errors', obj);
- applyUpdate = false;
- } else if (obj.warnings.length > 0) {
- if (reporter) {
- var overlayShown = reporter.problems('warnings', obj);
- applyUpdate = overlayShown;
- }
- } else {
- if (reporter) {
- reporter.cleanProblemsCache();
- reporter.success();
- }
- }
- if (applyUpdate) {
- processUpdate(obj.hash, obj.modules, options);
- }
- break;
- default:
- 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);
- },
- setOptionsAndConnect: setOptionsAndConnect,
- };
- }
|