aboutsummaryrefslogtreecommitdiff
path: root/node_modules/webpack-hot-client
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/webpack-hot-client')
-rw-r--r--node_modules/webpack-hot-client/LICENSE21
-rw-r--r--node_modules/webpack-hot-client/README.md269
-rw-r--r--node_modules/webpack-hot-client/client/.gitkeep0
-rw-r--r--node_modules/webpack-hot-client/client/hot.js184
-rw-r--r--node_modules/webpack-hot-client/client/index.js101
-rw-r--r--node_modules/webpack-hot-client/client/log.js59
-rw-r--r--node_modules/webpack-hot-client/client/socket.js51
-rw-r--r--node_modules/webpack-hot-client/index.js210
-rw-r--r--node_modules/webpack-hot-client/lib/HotClientError.js7
-rw-r--r--node_modules/webpack-hot-client/lib/util.js151
l---------node_modules/webpack-hot-client/node_modules/.bin/uuid1
l---------node_modules/webpack-hot-client/node_modules/.bin/webpack1
-rw-r--r--node_modules/webpack-hot-client/node_modules/ansi-regex/index.js10
-rw-r--r--node_modules/webpack-hot-client/node_modules/ansi-regex/license9
-rw-r--r--node_modules/webpack-hot-client/node_modules/ansi-regex/package.json53
-rw-r--r--node_modules/webpack-hot-client/node_modules/ansi-regex/readme.md46
-rw-r--r--node_modules/webpack-hot-client/node_modules/strip-ansi/index.js4
-rw-r--r--node_modules/webpack-hot-client/node_modules/strip-ansi/license9
-rw-r--r--node_modules/webpack-hot-client/node_modules/strip-ansi/package.json52
-rw-r--r--node_modules/webpack-hot-client/node_modules/strip-ansi/readme.md39
-rw-r--r--node_modules/webpack-hot-client/package.json63
21 files changed, 1340 insertions, 0 deletions
diff --git a/node_modules/webpack-hot-client/LICENSE b/node_modules/webpack-hot-client/LICENSE
new file mode 100644
index 00000000..d4026d08
--- /dev/null
+++ b/node_modules/webpack-hot-client/LICENSE
@@ -0,0 +1,21 @@
+Copyright © 2018 Andrew Powell
+Portions Copyright © Tobias Koppers @sokra
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/webpack-hot-client/README.md b/node_modules/webpack-hot-client/README.md
new file mode 100644
index 00000000..a6ee7d76
--- /dev/null
+++ b/node_modules/webpack-hot-client/README.md
@@ -0,0 +1,269 @@
+<div align="center">
+ <a href="https://github.com/webpack/webpack">
+ <img width="200" height="200" src="https://webpack.js.org/assets/icon-square-big.svg">
+ </a>
+</div>
+
+[![npm][npm]][npm-url]
+[![node][node]][node-url]
+[![deps][deps]][deps-url]
+[![tests][tests]][tests-url]
+[![coverage][cover]][cover-url]
+[![chat][chat]][chat-url]
+
+# webpack-hot-client
+
+A client for enabling, and interacting with, webpack [Hot Module Replacement][hmr-docs].
+
+This is intended to work in concert with [`webpack-dev-middleware`][dev-middleware]
+and allows for adding Hot Module Replacement to an existing server, without a
+dependency upon [`webpack-dev-server`][dev-server]. This comes in handy for testing
+in projects that already use server frameworks such as `Express` or `Koa`.
+
+`webpack-hot-client` accomplishes this by creating a `WebSocket` server, providing
+the necessary client (browser) scripts that communicate via `WebSocket`s, and
+automagically adding the necessary webpack plugins and config entries. All of
+that allows for a seamless integration of Hot Module Support.
+
+Curious about the differences between this module and `webpack-hot-middleware`?
+[Read more here](https://github.com/webpack-contrib/webpack-hot-client/issues/18).
+
+## Getting Started
+
+To begin, you'll need to install `webpack-hot-client`:
+
+```console
+$ npm install webpack-hot-client --save-dev
+```
+
+## Gotchas
+
+In order to use `webpack-hot-client`, your `webpack` config should include an
+`entry` option that is set to an `Array` of `String`, or an `Object` who's keys
+are set to an `Array` of `String`. You may also use a `Function`, but that
+function should return a value in one of the two valid formats.
+
+This is primarily due to restrictions in
+`webpack` itself and the way that it processes options and entries. For users of
+webpack v4+ that go the zero-config route, you must specify an `entry` option.
+
+It's also worth noting that `webpack-hot-client` adds `HotModuleReplacementPlugin`
+and the necessary entries to your `webpack` config for you at runtime. Including
+the plugin in your config manually while using this module may produce unexpected
+or wonky results.
+
+### Express
+
+For setting up the module for use with an `Express` server, try the following:
+
+```js
+const client = require('webpack-hot-client');
+const middleware = require('webpack-dev-middleware');
+const webpack = require('webpack');
+const config = require('./webpack.config');
+
+const compiler = webpack(config);
+const { publicPath } = config.output;
+const options = { ... }; // webpack-hot-client options
+
+// we recommend calling the client _before_ adding the dev middleware
+client(compiler, options);
+
+app.use(middleware(compiler, { publicPath }));
+```
+
+### Koa
+
+Since `Koa`@2.0.0 was released, the patterns and requirements for using
+`webpack-dev-middleware` have changed somewhat, due to use of `async/await` in
+Koa. As such, one potential solution is to use [`koa-webpack`][koa-webpack],
+which wires up the dev middleware properly for Koa, and also implements this
+module. If you'd like to use both modules without `koa-webpack`, you may examine
+that module's code for implementation details.
+
+## Browser Support
+
+Because this module leverages _native_ `WebSockets`, the browser support for this
+module is limited to only those browsers which support native `WebSocket`. That
+typically means the last two major versions of a particular browser.
+
+_Note: We won't be accepting requests for changes to this facet of the module._
+
+## API
+
+### client(compiler, [options])
+
+Returns an `Object` containing:
+
+- `close()` *(Function)* - Closes the WebSocketServer started by the module.
+- `wss` *(WebSocketServer)* - A WebSocketServer instance.
+
+#### options
+
+Type: `Object`
+
+##### autoConfigure
+
+Type: `Boolean`
+Default: `true`
+
+If true, automatically configures the `entry` for the webpack compiler, and adds
+the `HotModuleReplacementPlugin` to the compiler.
+
+##### host
+
+Type: `String|Object`
+Default: `'localhost'`
+
+Sets the host that the `WebSocket` server will listen on. If this doesn't match
+the host of the server the module is used with, the module may not function
+properly. If the `server` option is defined, this option is ignored.
+
+If using the module in a specialized environment, you may choose to specify an
+`object` to define `client` and `server` host separately. The `object` value
+should match `{ client: <String>, server: <String> }`. Be aware that the `client`
+host will be used _in the browser_ by `WebSockets`. You should not use this
+option in this way unless _you know what you're doing._ Using a mismatched
+`client` and `server` host will be **unsupported by the project** as the behavior
+in the browser can be unpredictable and is specific to a particular environment.
+
+##### hot
+
+Type: `Boolean`
+Default: `true`
+
+If true, instructs the client script to attempt hot patching of modules.
+
+##### https
+
+Type: `Boolean`
+Default: `false`
+
+If true, instructs the client script to use `wss://` as the `WebSocket` protocol.
+If you're using a server setup with `HTTPS`, you must set this to `true` or the
+sockets cannot communicate and this module won't function properly.
+
+##### logLevel
+
+Type: `String`
+Default: `'info'`
+
+Sets the minimum level of logs that will be displayed in the console. Please see
+[webpack-log/#levels][levels] for valid values.
+
+##### logTime
+
+Type: `Boolean`
+Default: `false`
+
+If true, instructs the internal logger to prepend log output with a timestamp.
+
+##### port
+
+Type: `Number`
+Default: `8081`
+
+The port the `WebSocket` server should listen on. It's recommended that a
+[`server`](#server) instance is passed to assure there aren't any port conflicts.
+
+##### reload
+
+Type: `Boolean`
+Default: `true`
+
+If true, instructs the browser to physically refresh the entire page if / when
+webpack indicates that a hot patch cannot be applied and a full refresh is needed.
+
+This option also instructs the browser whether or not to refresh the entire page
+when `hot: false` is used.
+
+_Note: If both `hot` and `reload` are false, and these are permanent settings,
+it makes this module fairly useless._
+
+##### server
+
+Type: `Object`
+Default: `null`
+
+If a server instance (eg. Express or Koa) is provided, the `WebSocket` server
+will attempt to attach to the server instance instead of using a separate port.
+
+##### stats
+
+Type: `Object`
+Default: `{ context: process.cwd() }`
+
+An object specifying the webpack [stats][stats] configuration. This does not
+typically need to be modified.
+
+## Webpack Build Targets
+
+By default, `webpack-hot-client` is meant to, and expects to function on the
+[`'web'` build target](https://webpack.js.org/configuration/target). However,
+you can manipulate this by setting the `WHC_TARGET` environment variable. eg.
+
+```console
+$ export WHC_TARGET=electon-renderer; webpack-serve ...
+```
+
+Or by setting `process.env.WHC_TARGET` before executing the API.
+
+_Note: Changing this value is allowed but is **unsupported**._
+
+## Communicating with Client WebSockets
+
+In some rare situations, you may have the need to communicate with the attached
+`WebSockets` in the browser. To accomplish this, open a new `WebSocket` to the
+server, and send a `broadcast` message. eg.
+
+```js
+const stringify = require('json-stringify-safe');
+const { WebSocket } = require('ws');
+
+const socket = new WebSocket('ws://localhost:8081'); // this should match the server settings
+const data = {
+ type: 'broadcast',
+ data: { // the message you want to broadcast
+ type: '<something fun>', // the message type you want to broadcast
+ data: { ... } // the message data you want to broadcast
+ }
+};
+
+socket.send(stringify(data));
+```
+
+_Note: The `data` property of the message should contain the enveloped message
+you wish to broadcast to all other client `WebSockets`._
+
+## Contributing
+
+We welcome your contributions! Please have a read of [CONTRIBUTING.md](CONTRIBUTING.md) for more information on how to get involved.
+
+## License
+
+#### [MIT](./LICENSE)
+
+[npm]: https://img.shields.io/npm/v/webpack-hot-client.svg
+[npm-url]: https://npmjs.com/package/webpack-hot-client
+
+[node]: https://img.shields.io/node/v/webpack-hot-client.svg
+[node-url]: https://nodejs.org
+
+[deps]: https://david-dm.org/webpack-contrib/webpack-hot-client.svg
+[deps-url]: https://david-dm.org/webpack-contrib/webpack-hot-client
+
+[tests]: https://img.shields.io/circleci/project/github/webpack-contrib/webpack-hot-client.svg
+[tests-url]: https://circleci.com/gh/webpack-contrib/webpack-hot-client/tree/master
+
+[cover]: https://codecov.io/gh/webpack-contrib/webpack-hot-client/branch/master/graph/badge.svg
+[cover-url]: https://codecov.io/gh/webpack-contrib/webpack-hot-client
+
+[chat]: https://badges.gitter.im/webpack/webpack.svg
+[chat-url]: https://gitter.im/webpack/webpack
+
+[koa-webpack]: https://github.com/shellscape/koa-webpack
+[dev-middleware]: https://github.com/webpack/webpack-dev-middleware
+[dev-server]: https://github.com/webpack/webpack-dev-server
+[hmr-docs]: https://webpack.js.org/concepts/hot-module-replacement/
+[stats]: https://webpack.js.org/configuration/stats/#stats
+[levels]: https://github.com/webpack-contrib/webpack-log#level \ No newline at end of file
diff --git a/node_modules/webpack-hot-client/client/.gitkeep b/node_modules/webpack-hot-client/client/.gitkeep
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/node_modules/webpack-hot-client/client/.gitkeep
diff --git a/node_modules/webpack-hot-client/client/hot.js b/node_modules/webpack-hot-client/client/hot.js
new file mode 100644
index 00000000..5408d196
--- /dev/null
+++ b/node_modules/webpack-hot-client/client/hot.js
@@ -0,0 +1,184 @@
+'use strict';
+
+var log = require('./log');
+
+var refresh = 'Please refresh the page.';
+var hotOptions = {
+ ignoreUnaccepted: true,
+ ignoreDeclined: true,
+ ignoreErrored: true,
+ onUnaccepted: function onUnaccepted(data) {
+ var chain = [].concat(data.chain);
+ var last = chain[chain.length - 1];
+
+ if (last === 0) {
+ chain.pop();
+ }
+
+ log.warn("Ignored an update to unaccepted module ".concat(chain.join(' ➭ ')));
+ },
+ onDeclined: function onDeclined(data) {
+ log.warn("Ignored an update to declined module ".concat(data.chain.join(' ➭ ')));
+ },
+ onErrored: function onErrored(data) {
+ log.warn("Ignored an error while updating module ".concat(data.moduleId, " <").concat(data.type, ">"));
+ log.warn(data.error);
+ }
+};
+var lastHash;
+
+function upToDate() {
+ return lastHash.indexOf(__webpack_hash__) >= 0;
+}
+
+function result(modules, appliedModules) {
+ var unaccepted = modules.filter(function (moduleId) {
+ return appliedModules && appliedModules.indexOf(moduleId) < 0;
+ });
+
+ if (unaccepted.length > 0) {
+ var message = 'The following modules could not be updated:';
+ var _iteratorNormalCompletion = true;
+ var _didIteratorError = false;
+ var _iteratorError = undefined;
+
+ try {
+ for (var _iterator = unaccepted[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+ var _moduleId = _step.value;
+ message += "\n \u29BB ".concat(_moduleId);
+ }
+ } catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+ } finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
+ _iterator.return();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+ }
+
+ log.warn(message);
+ }
+
+ if (!(appliedModules || []).length) {
+ log.info('No Modules Updated.');
+ } else {
+ var _message = ['The following modules were updated:'];
+ var _iteratorNormalCompletion2 = true;
+ var _didIteratorError2 = false;
+ var _iteratorError2 = undefined;
+
+ try {
+ for (var _iterator2 = appliedModules[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
+ var _moduleId3 = _step2.value;
+
+ _message.push(" \u21BB ".concat(_moduleId3));
+ }
+ } catch (err) {
+ _didIteratorError2 = true;
+ _iteratorError2 = err;
+ } finally {
+ try {
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
+ _iterator2.return();
+ }
+ } finally {
+ if (_didIteratorError2) {
+ throw _iteratorError2;
+ }
+ }
+ }
+
+ log.info(_message.join('\n'));
+ var numberIds = appliedModules.every(function (moduleId) {
+ return typeof moduleId === 'number';
+ });
+
+ if (numberIds) {
+ log.info('Please consider using the NamedModulesPlugin for module names.');
+ }
+ }
+}
+
+function check(options) {
+ module.hot.check().then(function (modules) {
+ if (!modules) {
+ log.warn("Cannot find update. The server may have been restarted. ".concat(refresh));
+
+ if (options.reload) {
+ window.location.reload();
+ }
+
+ return;
+ }
+
+ var hotOpts = options.reload ? {} : hotOptions;
+ return module.hot.apply(hotOpts).then(function (appliedModules) {
+ if (!upToDate()) {
+ check(options);
+ }
+
+ result(modules, appliedModules);
+
+ if (upToDate()) {
+ log.info('App is up to date.');
+ }
+ }).catch(function (err) {
+ var status = module.hot.status();
+
+ if (['abort', 'fail'].indexOf(status) >= 0) {
+ log.warn("Cannot apply update. ".concat(refresh));
+ log.warn(err.stack || err.message);
+
+ if (options.reload) {
+ window.location.reload();
+ }
+ } else {
+ log.warn("Update failed: ".concat(err.stack) || err.message);
+ }
+ });
+ }).catch(function (err) {
+ var status = module.hot.status();
+
+ if (['abort', 'fail'].indexOf(status) >= 0) {
+ log.warn("Cannot check for update. ".concat(refresh));
+ log.warn(err.stack || err.message);
+
+ if (options.reload) {
+ window.location.reload();
+ }
+ } else {
+ log.warn("Update check failed: ".concat(err.stack) || err.message);
+ }
+ });
+}
+
+if (module.hot) {
+ log.info('Hot Module Replacement Enabled. Waiting for signal.');
+} else {
+ log.error('Hot Module Replacement is disabled.');
+}
+
+module.exports = function update(currentHash, options) {
+ lastHash = currentHash;
+
+ if (!upToDate()) {
+ var status = module.hot.status();
+
+ if (status === 'idle') {
+ log.info('Checking for updates to the bundle.');
+ check(options);
+ } else if (['abort', 'fail'].indexOf(status) >= 0) {
+ log.warn("Cannot apply update. A previous update ".concat(status, "ed. ").concat(refresh));
+
+ if (options.reload) {
+ window.location.reload();
+ }
+ }
+ }
+}; \ No newline at end of file
diff --git a/node_modules/webpack-hot-client/client/index.js b/node_modules/webpack-hot-client/client/index.js
new file mode 100644
index 00000000..2dca618d
--- /dev/null
+++ b/node_modules/webpack-hot-client/client/index.js
@@ -0,0 +1,101 @@
+'use strict';
+/* eslint-disable global-require */
+
+(function hotClientEntry() {
+ // eslint-disable-next-line no-underscore-dangle
+ if (window.__webpackHotClient__) {
+ return;
+ } // eslint-disable-next-line no-underscore-dangle
+
+
+ window.__webpackHotClient__ = {}; // this is piped in at runtime build via DefinePlugin in /lib/plugins.js
+ // eslint-disable-next-line no-unused-vars, no-undef
+
+ var options = __hotClientOptions__;
+
+ var log = require('./log'); // eslint-disable-line import/order
+
+
+ log.level = options.logLevel;
+
+ var update = require('./hot');
+
+ var socket = require('./socket');
+
+ if (!options) {
+ throw new Error('Something went awry and __hotClientOptions__ is undefined. Possible bad build. HMR cannot be enabled.');
+ }
+
+ var currentHash;
+ var initial = true;
+ var isUnloading;
+ window.addEventListener('beforeunload', function () {
+ isUnloading = true;
+ });
+
+ function reload() {
+ if (isUnloading) {
+ return;
+ }
+
+ if (options.hot) {
+ log.info('App Updated, Reloading Modules');
+ update(currentHash, options);
+ } else if (options.reload) {
+ log.info('Refreshing Page');
+ window.location.reload();
+ } else {
+ log.warn('Please refresh the page manually.');
+ log.info('The `hot` and `reload` options are set to false.');
+ }
+ }
+
+ socket(options, {
+ compile: function compile(_ref) {
+ var compilerName = _ref.compilerName;
+ log.info("webpack: Compiling (".concat(compilerName, ")"));
+ },
+ errors: function errors(_ref2) {
+ var errors = _ref2.errors;
+ log.error('webpack: Encountered errors while compiling. Reload prevented.');
+
+ for (var i = 0; i < errors.length; i++) {
+ log.error(errors[i]);
+ }
+ },
+ hash: function hash(_ref3) {
+ var hash = _ref3.hash;
+ currentHash = hash;
+ },
+ invalid: function invalid(_ref4) {
+ var fileName = _ref4.fileName;
+ log.info("App updated. Recompiling ".concat(fileName));
+ },
+ ok: function ok() {
+ if (initial) {
+ initial = false;
+ return initial;
+ }
+
+ reload();
+ },
+ 'window-reload': function windowReload() {
+ window.location.reload();
+ },
+ warnings: function warnings(_ref5) {
+ var warnings = _ref5.warnings;
+ log.warn('Warnings while compiling.');
+
+ for (var i = 0; i < warnings.length; i++) {
+ log.warn(warnings[i]);
+ }
+
+ if (initial) {
+ initial = false;
+ return initial;
+ }
+
+ reload();
+ }
+ });
+})(); \ No newline at end of file
diff --git a/node_modules/webpack-hot-client/client/log.js b/node_modules/webpack-hot-client/client/log.js
new file mode 100644
index 00000000..50e2d02b
--- /dev/null
+++ b/node_modules/webpack-hot-client/client/log.js
@@ -0,0 +1,59 @@
+'use strict'; // eslint-disable-next-line import/no-extraneous-dependencies
+
+function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+
+function _sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
+
+function _slicedToArray(arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return _sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }
+
+var loglevel = require('loglevelnext/dist/loglevelnext');
+
+var MethodFactory = loglevel.factories.MethodFactory;
+var css = {
+ prefix: 'color: #999; padding: 0 0 0 20px; line-height: 16px; background: url(https://webpack.js.org/6bc5d8cf78d442a984e70195db059b69.svg) no-repeat; background-size: 16px 16px; background-position: 0 -2px;',
+ reset: 'color: #444'
+};
+var log = loglevel.getLogger({
+ name: 'hot',
+ id: 'hot-middleware/client'
+});
+
+function IconFactory(logger) {
+ MethodFactory.call(this, logger);
+}
+
+IconFactory.prototype = Object.create(MethodFactory.prototype);
+IconFactory.prototype.constructor = IconFactory;
+
+IconFactory.prototype.make = function make(methodName) {
+ var og = MethodFactory.prototype.make.call(this, methodName);
+ return function _() {
+ for (var _len = arguments.length, params = new Array(_len), _key = 0; _key < _len; _key++) {
+ params[_key] = arguments[_key];
+ }
+
+ var args = [].concat(params);
+ var prefix = '%c「hot」 %c';
+
+ var _args = _slicedToArray(args, 1),
+ first = _args[0];
+
+ if (typeof first === 'string') {
+ args[0] = prefix + first;
+ } else {
+ args.unshift(prefix);
+ }
+
+ args.splice(1, 0, css.prefix, css.reset);
+ og.apply(void 0, _toConsumableArray(args));
+ };
+};
+
+log.factory = new IconFactory(log, {});
+log.group = console.group; // eslint-disable-line no-console
+
+log.groupCollapsed = console.groupCollapsed; // eslint-disable-line no-console
+
+log.groupEnd = console.groupEnd; // eslint-disable-line no-console
+
+module.exports = log; \ No newline at end of file
diff --git a/node_modules/webpack-hot-client/client/socket.js b/node_modules/webpack-hot-client/client/socket.js
new file mode 100644
index 00000000..31847255
--- /dev/null
+++ b/node_modules/webpack-hot-client/client/socket.js
@@ -0,0 +1,51 @@
+'use strict';
+
+var url = require('url');
+
+var log = require('./log');
+
+var maxRetries = 10;
+var retry = maxRetries;
+
+module.exports = function connect(options, handler) {
+ var socketUrl = url.format({
+ protocol: options.https ? 'wss' : 'ws',
+ hostname: options.webSocket.host,
+ port: options.webSocket.port,
+ slashes: true
+ });
+ var open = false;
+ var socket = new WebSocket(socketUrl);
+ socket.addEventListener('open', function () {
+ open = true;
+ retry = maxRetries;
+ log.info('WebSocket connected');
+ });
+ socket.addEventListener('close', function () {
+ log.warn('WebSocket closed');
+ open = false;
+ socket = null; // exponentation operator ** isn't supported by IE at all
+ // eslint-disable-next-line no-restricted-properties
+
+ var timeout = 1000 * Math.pow(maxRetries - retry, 2) + Math.random() * 100;
+
+ if (open || retry <= 0) {
+ log.warn("WebSocket: ending reconnect after ".concat(maxRetries, " attempts"));
+ return;
+ }
+
+ log.info("WebSocket: attempting reconnect in ".concat(parseInt(timeout / 1000, 10), "s"));
+ setTimeout(function () {
+ retry -= 1;
+ connect(options, handler);
+ }, timeout);
+ });
+ socket.addEventListener('message', function (event) {
+ log.debug('WebSocket: message:', event.data);
+ var message = JSON.parse(event.data);
+
+ if (handler[message.type]) {
+ handler[message.type](message.data);
+ }
+ });
+}; \ No newline at end of file
diff --git a/node_modules/webpack-hot-client/index.js b/node_modules/webpack-hot-client/index.js
new file mode 100644
index 00000000..25055a6c
--- /dev/null
+++ b/node_modules/webpack-hot-client/index.js
@@ -0,0 +1,210 @@
+'use strict';
+
+const stringify = require('json-stringify-safe');
+const weblog = require('webpack-log');
+const WebSocket = require('ws');
+const HotClientError = require('./lib/HotClientError');
+const { modifyCompiler, payload, sendData, validateCompiler } = require('./lib/util');
+
+const defaults = {
+ autoConfigure: true,
+ host: 'localhost',
+ hot: true,
+ https: false,
+ logLevel: 'info',
+ logTime: false,
+ port: 8081,
+ reload: true,
+ send: {
+ errors: true,
+ warnings: true
+ },
+ server: null,
+ stats: {
+ context: process.cwd()
+ },
+ test: false
+};
+const timefix = 11000;
+
+module.exports = (compiler, opts) => {
+ const options = Object.assign({}, defaults, opts);
+ const log = weblog({
+ name: 'hot',
+ id: 'webpack-hot-client',
+ level: options.logLevel,
+ timestamp: options.logTime
+ });
+ const envTarget = process.env.WHC_TARGET;
+
+ // issue #36. some alternative compiler targets still run in a server, but we
+ // don't want to be in the business of supporting them all.
+ if (!envTarget) {
+ process.env.WHC_TARGET = 'web';
+ } else if (envTarget !== 'web') {
+ log.warn(`WHC_TARGET changed to '${envTarget}'. Changing this value is allowed but is unsupported.`);
+ }
+
+ if (typeof options.host === 'string') {
+ options.host = {
+ server: options.host,
+ client: options.host
+ };
+ } else if (!options.host.server) {
+ throw new HotClientError('`options.server` must be defined when setting host to an Object');
+ } else if (!options.host.client) {
+ throw new HotClientError('`options.client` must be defined when setting host to an Object');
+ }
+
+ /* istanbul ignore if */
+ if (options.host.client !== options.host.server) {
+ log.warn('`options.host.client` does not match `options.host.server`. This can cause unpredictable behavior in the browser.');
+ }
+
+ if (options.autoConfigure) {
+ validateCompiler(compiler);
+ }
+
+ const { host, port, server } = options;
+ const wssOptions = options.server ? { server } : { host: host.server, port };
+ const wss = new WebSocket.Server(wssOptions);
+ let stats;
+
+ options.log = log;
+
+ if (options.server) {
+ const addr = options.server.address();
+ log.info(`WebSocket Server Attached to ${addr.address}:${addr.port}`);
+ }
+
+ function broadcast(data) {
+ wss.clients.forEach((client) => {
+ if (client.readyState === WebSocket.OPEN) {
+ client.send(data);
+ }
+ });
+ }
+
+ wss.broadcast = broadcast;
+
+ if (options.server) {
+ options.webSocket = {
+ host: wss._server.address().address, // eslint-disable-line no-underscore-dangle
+ port: wss._server.address().port // eslint-disable-line no-underscore-dangle
+ };
+ } else {
+ options.webSocket = { host: host.client, port };
+ }
+
+ if (options.autoConfigure) {
+ modifyCompiler(compiler, options);
+ }
+
+ const compile = (comp) => {
+ const compilerName = comp.name || '<unnamed compiler>';
+ stats = null;
+ log.info('webpack: Compiling...');
+ broadcast(payload('compile', { compilerName }));
+ };
+
+ const done = (result) => {
+ log.info('webpack: Compiling Done');
+ // apply a fix for compiler.watch as outline here: ff0000-ad-tech/wp-plugin-watch-offset
+ result.startTime -= timefix; // eslint-disable-line no-param-reassign
+ stats = result;
+
+ const jsonStats = stats.toJson(options.stats);
+
+ /* istanbul ignore if */
+ if (!jsonStats) {
+ options.log.error('compiler done: `stats` is undefined');
+ }
+
+ sendData(broadcast, jsonStats, options);
+ };
+
+ const invalid = (filePath, comp) => {
+ const context = comp.context || comp.options.context || process.cwd();
+ const fileName = (filePath || '<unknown>')
+ .replace(context, '')
+ .substring(1);
+ log.info('webpack: Bundle Invalidated');
+ broadcast(payload('invalid', { fileName }));
+ };
+
+ // as of webpack@4 MultiCompiler no longer exports the compile hook
+ const compilers = compiler.compilers || [compiler];
+ for (const comp of compilers) {
+ comp.hooks.compile.tap('WebpackHotClient', () => {
+ compile(comp);
+ });
+
+ // we need the compiler object reference here, otherwise we'd let the
+ // MultiHook do it's thing in a MultiCompiler situation.
+ comp.hooks.invalid.tap('WebpackHotClient', (filePath) => {
+ invalid(filePath, comp);
+ });
+ }
+
+ compiler.hooks.done.tap('WebpackHotClient', done);
+
+ wss.on('error', (err) => {
+ /* istanbul ignore next */
+ log.error('WebSocket Server Error', err);
+ });
+
+ wss.on('listening', () => {
+ // eslint-disable-next-line no-shadow
+ const { host, port } = options;
+ log.info(`WebSocket Server Listening at ${host.server}:${port}`);
+ });
+
+ wss.on('connection', (socket) => {
+ log.info('WebSocket Client Connected');
+
+ socket.on('error', (err) => {
+ /* istanbul ignore if */
+ if (err.errno !== 'ECONNRESET') {
+ log.warn('client socket error', JSON.stringify(err));
+ }
+ });
+
+ socket.on('message', (data) => {
+ const message = JSON.parse(data);
+
+ if (message.type === 'broadcast') {
+ for (const client of wss.clients) {
+ if (client.readyState === WebSocket.OPEN) {
+ client.send(stringify(message.data));
+ }
+ }
+ }
+ });
+
+ // only send stats to newly connected clients if no previous clients have
+ // connected
+ if (stats && !wss.clients.length) {
+ const jsonStats = stats.toJson(options.stats);
+
+ /* istanbul ignore if */
+ if (!jsonStats) {
+ options.log.error('Client Connection: `stats` is undefined');
+ }
+
+ sendData(broadcast, jsonStats, options);
+ }
+ });
+
+ return {
+ close(callback) {
+ try {
+ wss.close(callback);
+ } catch (err) {
+ /* istanbul ignore next */
+ log.error(err);
+ }
+ },
+ options: Object.freeze(Object.assign({}, options)),
+ wss
+ };
+};
diff --git a/node_modules/webpack-hot-client/lib/HotClientError.js b/node_modules/webpack-hot-client/lib/HotClientError.js
new file mode 100644
index 00000000..4885e528
--- /dev/null
+++ b/node_modules/webpack-hot-client/lib/HotClientError.js
@@ -0,0 +1,7 @@
+'use strict';
+
+module.exports = class HotClientError extends Error {
+ constructor(message) {
+ super(`webpack-hot-client: ${message}`);
+ }
+};
diff --git a/node_modules/webpack-hot-client/lib/util.js b/node_modules/webpack-hot-client/lib/util.js
new file mode 100644
index 00000000..482f1862
--- /dev/null
+++ b/node_modules/webpack-hot-client/lib/util.js
@@ -0,0 +1,151 @@
+'use strict';
+
+const ParserHelpers = require('webpack/lib/ParserHelpers');
+const stringify = require('json-stringify-safe');
+const strip = require('strip-ansi');
+const uuid = require('uuid/v4');
+const webpack = require('webpack');
+
+function addEntry(entry, compilerName) {
+ const clientEntry = [`webpack-hot-client/client?${compilerName || uuid()}`];
+ let newEntry = {};
+
+ if (!Array.isArray(entry) && typeof entry === 'object') {
+ const [first] = Object.keys(entry);
+ newEntry[first] = clientEntry.concat(entry[first]);
+ } else {
+ newEntry = clientEntry.concat(entry);
+ }
+
+ return newEntry;
+}
+
+function hotEntry(compiler) {
+ if (compiler.options.target !== process.env.WHC_TARGET) {
+ return;
+ }
+
+ const { entry } = compiler.options;
+ const { name } = compiler;
+ let newEntry;
+
+ if (typeof entry === 'function') {
+ newEntry = function enter(...args) {
+ // the entry result from the original entry function in the config
+ let result = entry(...args);
+
+ validateEntry(result);
+
+ result = addEntry(result, name);
+
+ return result;
+ };
+ } else {
+ newEntry = addEntry(entry, name);
+ }
+
+ compiler.hooks.entryOption.call(compiler.options.context, newEntry);
+}
+
+function hotPlugin(compiler) {
+ const hmrPlugin = new webpack.HotModuleReplacementPlugin();
+
+ /* istanbul ignore next */
+ compiler.hooks.compilation.tap('HotModuleReplacementPlugin', (compilation, {
+ normalModuleFactory
+ }) => {
+ const handler = (parser) => {
+ parser.hooks.evaluateIdentifier.for('module.hot').tap({
+ name: 'HotModuleReplacementPlugin',
+ before: 'NodeStuffPlugin'
+ }, expr => ParserHelpers.evaluateToIdentifier('module.hot', !!parser.state.compilation.hotUpdateChunkTemplate)(expr));
+ };
+
+ normalModuleFactory.hooks.parser.for('javascript/auto').tap('HotModuleReplacementPlugin', handler);
+ normalModuleFactory.hooks.parser.for('javascript/dynamic').tap('HotModuleReplacementPlugin', handler);
+ });
+
+ hmrPlugin.apply(compiler);
+}
+
+function validateEntry(entry) {
+ const type = typeof entry;
+ const isArray = Array.isArray(entry);
+
+ if (type !== 'function') {
+ if (!isArray && type !== 'object') {
+ throw new TypeError('webpack-hot-client: The value of `entry` must be an Array, Object, or Function. Please check your webpack config.');
+ }
+
+ if (!isArray && type === 'object') {
+ for (const key of Object.keys(entry)) {
+ const value = entry[key];
+ if (!Array.isArray(value)) {
+ throw new TypeError('webpack-hot-client: `entry` Object values must be an Array or Function. Please check your webpack config.');
+ }
+ }
+ }
+ }
+}
+
+module.exports = {
+
+ modifyCompiler(compiler, options) {
+ // this is how we pass the options at runtime to the client script
+ const definePlugin = new webpack.DefinePlugin({
+ __hotClientOptions__: stringify(options)
+ });
+
+ for (const comp of [].concat(compiler.compilers || compiler)) {
+ hotEntry(comp);
+
+ options.log.debug('Applying DefinePlugin:__hotClientOptions__');
+ definePlugin.apply(comp);
+
+ hotPlugin(comp);
+ }
+ },
+
+ payload(type, data) {
+ return stringify({ type, data });
+ },
+
+ sendData(broadcast, stats, options) {
+ const send = (type, data) => {
+ broadcast(module.exports.payload(type, data));
+ };
+
+ if (stats.errors && stats.errors.length > 0) {
+ if (options.send.errors) {
+ const errors = [].concat(stats.errors).map(error => strip(error));
+ send('errors', { errors });
+ }
+ return;
+ }
+
+ /* istanbul ignore if */
+ if (stats.assets && stats.assets.every(asset => !asset.emitted)) {
+ send('no-change');
+ return;
+ }
+
+ const { hash, warnings } = stats;
+
+ send('hash', { hash });
+
+ if (warnings.length > 0) {
+ if (options.send.warnings) {
+ send('warnings', { warnings });
+ }
+ } else {
+ send('ok');
+ }
+ },
+
+ validateCompiler(compiler) {
+ for (const comp of [].concat(compiler.compilers || compiler)) {
+ const { entry } = comp.options;
+ validateEntry(entry);
+ }
+ }
+};
diff --git a/node_modules/webpack-hot-client/node_modules/.bin/uuid b/node_modules/webpack-hot-client/node_modules/.bin/uuid
new file mode 120000
index 00000000..740f800c
--- /dev/null
+++ b/node_modules/webpack-hot-client/node_modules/.bin/uuid
@@ -0,0 +1 @@
+../../../uuid/bin/uuid \ No newline at end of file
diff --git a/node_modules/webpack-hot-client/node_modules/.bin/webpack b/node_modules/webpack-hot-client/node_modules/.bin/webpack
new file mode 120000
index 00000000..8a1900f6
--- /dev/null
+++ b/node_modules/webpack-hot-client/node_modules/.bin/webpack
@@ -0,0 +1 @@
+../../../webpack/bin/webpack.js \ No newline at end of file
diff --git a/node_modules/webpack-hot-client/node_modules/ansi-regex/index.js b/node_modules/webpack-hot-client/node_modules/ansi-regex/index.js
new file mode 100644
index 00000000..c4aaecf5
--- /dev/null
+++ b/node_modules/webpack-hot-client/node_modules/ansi-regex/index.js
@@ -0,0 +1,10 @@
+'use strict';
+
+module.exports = () => {
+ const pattern = [
+ '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)',
+ '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))'
+ ].join('|');
+
+ return new RegExp(pattern, 'g');
+};
diff --git a/node_modules/webpack-hot-client/node_modules/ansi-regex/license b/node_modules/webpack-hot-client/node_modules/ansi-regex/license
new file mode 100644
index 00000000..e7af2f77
--- /dev/null
+++ b/node_modules/webpack-hot-client/node_modules/ansi-regex/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/webpack-hot-client/node_modules/ansi-regex/package.json b/node_modules/webpack-hot-client/node_modules/ansi-regex/package.json
new file mode 100644
index 00000000..e94852fd
--- /dev/null
+++ b/node_modules/webpack-hot-client/node_modules/ansi-regex/package.json
@@ -0,0 +1,53 @@
+{
+ "name": "ansi-regex",
+ "version": "3.0.0",
+ "description": "Regular expression for matching ANSI escape codes",
+ "license": "MIT",
+ "repository": "chalk/ansi-regex",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "scripts": {
+ "test": "xo && ava",
+ "view-supported": "node fixtures/view-codes.js"
+ },
+ "files": [
+ "index.js"
+ ],
+ "keywords": [
+ "ansi",
+ "styles",
+ "color",
+ "colour",
+ "colors",
+ "terminal",
+ "console",
+ "cli",
+ "string",
+ "tty",
+ "escape",
+ "formatting",
+ "rgb",
+ "256",
+ "shell",
+ "xterm",
+ "command-line",
+ "text",
+ "regex",
+ "regexp",
+ "re",
+ "match",
+ "test",
+ "find",
+ "pattern"
+ ],
+ "devDependencies": {
+ "ava": "*",
+ "xo": "*"
+ }
+}
diff --git a/node_modules/webpack-hot-client/node_modules/ansi-regex/readme.md b/node_modules/webpack-hot-client/node_modules/ansi-regex/readme.md
new file mode 100644
index 00000000..22db1c34
--- /dev/null
+++ b/node_modules/webpack-hot-client/node_modules/ansi-regex/readme.md
@@ -0,0 +1,46 @@
+# ansi-regex [![Build Status](https://travis-ci.org/chalk/ansi-regex.svg?branch=master)](https://travis-ci.org/chalk/ansi-regex)
+
+> Regular expression for matching [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code)
+
+
+## Install
+
+```
+$ npm install ansi-regex
+```
+
+
+## Usage
+
+```js
+const ansiRegex = require('ansi-regex');
+
+ansiRegex().test('\u001B[4mcake\u001B[0m');
+//=> true
+
+ansiRegex().test('cake');
+//=> false
+
+'\u001B[4mcake\u001B[0m'.match(ansiRegex());
+//=> ['\u001B[4m', '\u001B[0m']
+```
+
+
+## FAQ
+
+### Why do you test for codes not in the ECMA 48 standard?
+
+Some of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. We test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them.
+
+On the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of "interrupts" that can mean different things on certain brands of processors, most of which have been phased out.
+
+
+## Maintainers
+
+- [Sindre Sorhus](https://github.com/sindresorhus)
+- [Josh Junon](https://github.com/qix-)
+
+
+## License
+
+MIT
diff --git a/node_modules/webpack-hot-client/node_modules/strip-ansi/index.js b/node_modules/webpack-hot-client/node_modules/strip-ansi/index.js
new file mode 100644
index 00000000..96e0292c
--- /dev/null
+++ b/node_modules/webpack-hot-client/node_modules/strip-ansi/index.js
@@ -0,0 +1,4 @@
+'use strict';
+const ansiRegex = require('ansi-regex');
+
+module.exports = input => typeof input === 'string' ? input.replace(ansiRegex(), '') : input;
diff --git a/node_modules/webpack-hot-client/node_modules/strip-ansi/license b/node_modules/webpack-hot-client/node_modules/strip-ansi/license
new file mode 100644
index 00000000..e7af2f77
--- /dev/null
+++ b/node_modules/webpack-hot-client/node_modules/strip-ansi/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/webpack-hot-client/node_modules/strip-ansi/package.json b/node_modules/webpack-hot-client/node_modules/strip-ansi/package.json
new file mode 100644
index 00000000..555f1946
--- /dev/null
+++ b/node_modules/webpack-hot-client/node_modules/strip-ansi/package.json
@@ -0,0 +1,52 @@
+{
+ "name": "strip-ansi",
+ "version": "4.0.0",
+ "description": "Strip ANSI escape codes",
+ "license": "MIT",
+ "repository": "chalk/strip-ansi",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "scripts": {
+ "test": "xo && ava"
+ },
+ "files": [
+ "index.js"
+ ],
+ "keywords": [
+ "strip",
+ "trim",
+ "remove",
+ "ansi",
+ "styles",
+ "color",
+ "colour",
+ "colors",
+ "terminal",
+ "console",
+ "string",
+ "tty",
+ "escape",
+ "formatting",
+ "rgb",
+ "256",
+ "shell",
+ "xterm",
+ "log",
+ "logging",
+ "command-line",
+ "text"
+ ],
+ "dependencies": {
+ "ansi-regex": "^3.0.0"
+ },
+ "devDependencies": {
+ "ava": "*",
+ "xo": "*"
+ }
+}
diff --git a/node_modules/webpack-hot-client/node_modules/strip-ansi/readme.md b/node_modules/webpack-hot-client/node_modules/strip-ansi/readme.md
new file mode 100644
index 00000000..dc76f0cb
--- /dev/null
+++ b/node_modules/webpack-hot-client/node_modules/strip-ansi/readme.md
@@ -0,0 +1,39 @@
+# strip-ansi [![Build Status](https://travis-ci.org/chalk/strip-ansi.svg?branch=master)](https://travis-ci.org/chalk/strip-ansi)
+
+> Strip [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code)
+
+
+## Install
+
+```
+$ npm install strip-ansi
+```
+
+
+## Usage
+
+```js
+const stripAnsi = require('strip-ansi');
+
+stripAnsi('\u001B[4mUnicorn\u001B[0m');
+//=> 'Unicorn'
+```
+
+
+## Related
+
+- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module
+- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes
+- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes
+- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right
+
+
+## Maintainers
+
+- [Sindre Sorhus](https://github.com/sindresorhus)
+- [Josh Junon](https://github.com/qix-)
+
+
+## License
+
+MIT
diff --git a/node_modules/webpack-hot-client/package.json b/node_modules/webpack-hot-client/package.json
new file mode 100644
index 00000000..0f4b0f07
--- /dev/null
+++ b/node_modules/webpack-hot-client/package.json
@@ -0,0 +1,63 @@
+{
+ "name": "webpack-hot-client",
+ "version": "3.0.0",
+ "description": "A client for enabling, and interacting with, webpack Hot Module Replacement",
+ "license": "MIT",
+ "repository": "webpack-contrib/webpack-hot-client",
+ "author": "Andrew Powell <andrew@shellscape.org>",
+ "homepage": "http://github.com/webpack-contrib/webpack-hot-client",
+ "main": "index.js",
+ "engines": {
+ "node": ">=6"
+ },
+ "scripts": {
+ "beautify": "npm run lint -- --fix",
+ "ci": "npm run lint && npm run test",
+ "cover": "nyc report --reporter=text-lcov > coverage.lcov && codecov --token=$WHC_CODECOV_TOKEN",
+ "compile:client": "babel lib/client --out-dir client",
+ "lint": "eslint index.js lib test",
+ "mocha": "mocha test/test.js --full-trace --exit",
+ "prepublishOnly": "npm run compile:client",
+ "test": "npm run compile:client && nyc npm run mocha"
+ },
+ "files": [
+ "client/",
+ "index.js",
+ "lib/HotClientError.js",
+ "lib/util.js",
+ "LICENSE",
+ "README.md"
+ ],
+ "peerDependencies": {
+ "webpack": "^4.0.0"
+ },
+ "dependencies": {
+ "json-stringify-safe": "^5.0.1",
+ "loglevelnext": "^1.0.2",
+ "strip-ansi": "^4.0.0",
+ "uuid": "^3.1.0",
+ "webpack-log": "^1.1.1",
+ "ws": "^4.0.0"
+ },
+ "devDependencies": {
+ "@babel/cli": "^7.0.0-beta.37",
+ "@babel/core": "^7.0.0-beta.37",
+ "@babel/polyfill": "^7.0.0-beta.37",
+ "@babel/preset-env": "^7.0.0-beta.37",
+ "@babel/register": "^7.0.0-beta.37",
+ "ansi-regex": "^3.0.0",
+ "babel-loader": "^8.0.0-beta.0",
+ "codecov": "^3.0.0",
+ "eslint": "^4.6.1",
+ "eslint-config-webpack": "^1.2.5",
+ "eslint-plugin-import": "^2.8.0",
+ "expect": "^22.4.3",
+ "loud-rejection": "^1.6.0",
+ "memory-fs": "^0.4.1",
+ "mocha": "^5.0.0",
+ "nyc": "^11.4.1",
+ "time-fix-plugin": "^2.0.0",
+ "touch": "^3.1.0",
+ "webpack": "^4.0.1"
+ }
+}