@modern-js/server 2.0.0-beta.0 → 2.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/js/modern/dev-tools/dev-middleware/dev-server-plugin.js +4 -9
  3. package/dist/js/modern/dev-tools/dev-middleware/hmr-client/createSocketUrl.js +2 -5
  4. package/dist/js/modern/dev-tools/dev-middleware/hmr-client/index.js +43 -50
  5. package/dist/js/modern/dev-tools/dev-middleware/index.js +14 -32
  6. package/dist/js/modern/dev-tools/dev-middleware/socket-server.js +18 -43
  7. package/dist/js/modern/dev-tools/https/index.js +0 -2
  8. package/dist/js/modern/dev-tools/mock/getMockData.js +4 -23
  9. package/dist/js/modern/dev-tools/mock/index.js +0 -8
  10. package/dist/js/modern/dev-tools/register/index.js +2 -18
  11. package/dist/js/modern/dev-tools/watcher/dependency-tree.js +5 -15
  12. package/dist/js/modern/dev-tools/watcher/index.js +0 -18
  13. package/dist/js/modern/dev-tools/watcher/stats-cache.js +0 -16
  14. package/dist/js/modern/index.js +0 -1
  15. package/dist/js/modern/server/dev-server.js +36 -56
  16. package/dist/js/modern/server/index.js +0 -4
  17. package/dist/js/node/constants.js +0 -3
  18. package/dist/js/node/dev-tools/dev-middleware/dev-server-plugin.js +4 -11
  19. package/dist/js/node/dev-tools/dev-middleware/hmr-client/createSocketUrl.js +2 -8
  20. package/dist/js/node/dev-tools/dev-middleware/hmr-client/index.js +41 -53
  21. package/dist/js/node/dev-tools/dev-middleware/index.js +14 -38
  22. package/dist/js/node/dev-tools/dev-middleware/socket-server.js +18 -48
  23. package/dist/js/node/dev-tools/https/index.js +0 -7
  24. package/dist/js/node/dev-tools/mock/getMockData.js +4 -29
  25. package/dist/js/node/dev-tools/mock/index.js +0 -17
  26. package/dist/js/node/dev-tools/register/index.js +2 -27
  27. package/dist/js/node/dev-tools/watcher/dependency-tree.js +5 -19
  28. package/dist/js/node/dev-tools/watcher/index.js +0 -32
  29. package/dist/js/node/dev-tools/watcher/stats-cache.js +0 -23
  30. package/dist/js/node/index.js +0 -4
  31. package/dist/js/node/server/dev-server.js +36 -75
  32. package/dist/js/node/server/index.js +0 -7
  33. package/dist/types/dev-tools/mock/getMockData.d.ts +0 -2
  34. package/dist/types/dev-tools/watcher/dependency-tree.d.ts +0 -2
  35. package/dist/types/index.d.ts +0 -2
  36. package/package.json +11 -11
@@ -1,9 +1,6 @@
1
1
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
-
3
2
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
-
5
3
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
-
7
4
  import { createServer } from 'http';
8
5
  import path from 'path';
9
6
  import { createServer as createHttpsServer } from 'https';
@@ -17,20 +14,19 @@ import Watcher, { mergeWatchOptions } from "../dev-tools/watcher";
17
14
  import DevMiddleware from "../dev-tools/dev-middleware";
18
15
  export class ModernDevServer extends ModernServer {
19
16
  constructor(options) {
20
- super(options); // dev server should work in pwd
17
+ super(options);
21
18
 
19
+ // dev server should work in pwd
22
20
  _defineProperty(this, "mockHandler", null);
23
-
24
21
  _defineProperty(this, "dev", void 0);
25
-
26
22
  _defineProperty(this, "devMiddleware", void 0);
27
-
28
23
  _defineProperty(this, "watcher", void 0);
24
+ this.workDir = this.pwd;
29
25
 
30
- this.workDir = this.pwd; // set dev server options, like webpack-dev-server
31
-
32
- this.dev = this.getDevOptions(options); // create dev middleware instance
26
+ // set dev server options, like webpack-dev-server
27
+ this.dev = this.getDevOptions(options);
33
28
 
29
+ // create dev middleware instance
34
30
  this.devMiddleware = new DevMiddleware({
35
31
  dev: this.dev,
36
32
  compiler: options.compiler,
@@ -38,7 +34,6 @@ export class ModernDevServer extends ModernServer {
38
34
  });
39
35
  enableRegister(this.pwd, this.conf);
40
36
  }
41
-
42
37
  getDevOptions(options) {
43
38
  const devOptions = typeof options.dev === 'boolean' ? {} : options.dev;
44
39
  const defaultOptions = getDefaultDevOptions();
@@ -46,7 +41,6 @@ export class ModernDevServer extends ModernServer {
46
41
  client: _objectSpread(_objectSpread({}, defaultOptions.client), devOptions === null || devOptions === void 0 ? void 0 : devOptions.client)
47
42
  });
48
43
  }
49
-
50
44
  addMiddlewareHandler(handlers) {
51
45
  handlers.forEach(handler => {
52
46
  this.addHandler((ctx, next) => {
@@ -58,7 +52,6 @@ export class ModernDevServer extends ModernServer {
58
52
  });
59
53
  });
60
54
  }
61
-
62
55
  applySetupMiddlewares() {
63
56
  const setupMiddlewares = this.dev.setupMiddlewares || [];
64
57
  const serverOptions = {
@@ -76,38 +69,40 @@ export class ModernDevServer extends ModernServer {
76
69
  befores,
77
70
  afters
78
71
  };
79
- } // Complete the preparation of services
80
-
72
+ }
81
73
 
74
+ // Complete the preparation of services
82
75
  async onInit(runner, app) {
83
76
  this.runner = runner;
84
77
  const {
85
78
  dev
86
- } = this; // Order: devServer.before => setupMiddlewares.unshift => internal middlewares => setupMiddlewares.push => devServer.after
79
+ } = this;
87
80
 
81
+ // Order: devServer.before => setupMiddlewares.unshift => internal middlewares => setupMiddlewares.push => devServer.after
88
82
  const {
89
83
  befores,
90
84
  afters
91
- } = this.applySetupMiddlewares(); // before dev handler
85
+ } = this.applySetupMiddlewares();
92
86
 
87
+ // before dev handler
93
88
  const beforeHandlers = await this.setupBeforeDevMiddleware();
94
89
  this.addMiddlewareHandler([...beforeHandlers, ...befores]);
95
- await this.applyDefaultMiddlewares(app); // after dev handler
90
+ await this.applyDefaultMiddlewares(app);
96
91
 
92
+ // after dev handler
97
93
  const afterHandlers = await this.setupAfterDevMiddleware();
98
94
  this.addMiddlewareHandler([...afters, ...afterHandlers]);
99
- await super.onInit(runner, app); // watch mock/ server/ api/ dir file change
95
+ await super.onInit(runner, app);
100
96
 
97
+ // watch mock/ server/ api/ dir file change
101
98
  if (dev.watch) {
102
99
  this.startWatcher();
103
100
  app.on('close', async () => {
104
101
  var _this$watcher;
105
-
106
102
  await ((_this$watcher = this.watcher) === null || _this$watcher === void 0 ? void 0 : _this$watcher.close());
107
103
  });
108
104
  }
109
105
  }
110
-
111
106
  async applyDefaultMiddlewares(app) {
112
107
  const {
113
108
  pwd,
@@ -116,23 +111,22 @@ export class ModernDevServer extends ModernServer {
116
111
  } = this;
117
112
  this.addHandler((ctx, next) => {
118
113
  // allow hmr request cross-domain, because the user may use global proxy
114
+ ctx.res.setHeader('Access-Control-Allow-Origin', '*');
119
115
  if (ctx.path.includes('hot-update')) {
120
- ctx.res.setHeader('Access-Control-Allow-Origin', '*');
121
116
  ctx.res.setHeader('Access-Control-Allow-Credentials', 'false');
122
- } // 用户在 devServer 上配置的 headers 不会对 html 的请求生效,加入下面代码,使配置的 headers 对所有请求生效
123
-
117
+ }
124
118
 
119
+ // 用户在 devServer 上配置的 headers 不会对 html 的请求生效,加入下面代码,使配置的 headers 对所有请求生效
125
120
  const confHeaders = dev.headers;
126
-
127
121
  if (confHeaders) {
128
122
  for (const [key, value] of Object.entries(confHeaders)) {
129
123
  ctx.res.setHeader(key, value);
130
124
  }
131
125
  }
132
-
133
126
  next();
134
- }); // mock handler
127
+ });
135
128
 
129
+ // mock handler
136
130
  this.mockHandler = createMockHandler({
137
131
  pwd
138
132
  });
@@ -142,17 +136,17 @@ export class ModernDevServer extends ModernServer {
142
136
  } else {
143
137
  next();
144
138
  }
145
- }); // dev proxy handler, each proxy has own handler
139
+ });
146
140
 
141
+ // dev proxy handler, each proxy has own handler
147
142
  const proxyHandlers = createProxyHandler(dev.proxy);
148
-
149
143
  if (proxyHandlers) {
150
144
  proxyHandlers.forEach(handler => {
151
145
  this.addHandler(handler);
152
146
  });
153
- } // do webpack build / plugin apply / socket server when pass compiler instance
154
-
147
+ }
155
148
 
149
+ // do webpack build / plugin apply / socket server when pass compiler instance
156
150
  devMiddleware.init(app);
157
151
  devMiddleware.on('change', stats => {
158
152
  // Reset only when client compile done
@@ -169,14 +163,12 @@ export class ModernDevServer extends ModernServer {
169
163
  req,
170
164
  res
171
165
  } = ctx;
172
-
173
166
  if (devMiddleware.middleware) {
174
167
  devMiddleware.middleware(req, res, next);
175
168
  } else {
176
169
  next();
177
170
  }
178
171
  });
179
-
180
172
  if (dev.historyApiFallback) {
181
173
  const {
182
174
  default: connectHistoryApiFallback
@@ -185,41 +177,37 @@ export class ModernDevServer extends ModernServer {
185
177
  this.addHandler((ctx, next) => historyApiFallbackMiddleware(ctx.req, ctx.res, next));
186
178
  }
187
179
  }
188
-
189
180
  onRepack(options = {}) {
190
181
  // reset the routing management instance every times the service starts
191
182
  if (Array.isArray(options.routes)) {
192
183
  this.router.reset(this.filterRoutes(options.routes));
193
- } // clean ssr bundle cache
194
-
184
+ }
195
185
 
196
- this.cleanSSRCache(); // reset static file
186
+ // clean ssr bundle cache
187
+ this.cleanSSRCache();
197
188
 
189
+ // reset static file
198
190
  this.reader.updateFile();
199
191
  super.onRepack(options);
200
192
  }
201
-
202
193
  async createHTTPServer(handler) {
203
194
  const {
204
195
  dev
205
196
  } = this;
206
197
  const devHttpsOption = typeof dev === 'object' && dev.https;
207
-
208
198
  if (devHttpsOption) {
209
199
  const {
210
200
  genHttpsOptions
211
201
  } = require("../dev-tools/https");
212
-
213
202
  const httpsOptions = await genHttpsOptions(devHttpsOption);
214
203
  return createHttpsServer(httpsOptions, handler);
215
204
  } else {
216
205
  return createServer(handler);
217
206
  }
218
207
  }
219
-
220
- warmupSSRBundle() {// not warmup ssr bundle on development
208
+ warmupSSRBundle() {
209
+ // not warmup ssr bundle on development
221
210
  }
222
-
223
211
  onServerChange({
224
212
  filepath,
225
213
  event
@@ -232,7 +220,6 @@ export class ModernDevServer extends ModernServer {
232
220
  } = AGGRED_DIR;
233
221
  const mockPath = path.normalize(path.join(pwd, mock));
234
222
  this.runner.reset();
235
-
236
223
  if (filepath.startsWith(mockPath)) {
237
224
  this.mockHandler = createMockHandler({
238
225
  pwd
@@ -242,11 +229,12 @@ export class ModernDevServer extends ModernServer {
242
229
  const success = this.runner.onApiChange([{
243
230
  filename: filepath,
244
231
  event
245
- }]); // onApiChange 钩子被调用,且返回 true,则表示无需重新编译
232
+ }]);
233
+
234
+ // onApiChange 钩子被调用,且返回 true,则表示无需重新编译
246
235
  // onApiChange 的类型是 WaterFall,WaterFall 钩子的返回值类型目前有问题
247
236
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
248
237
  // @ts-expect-error
249
-
250
238
  if (success !== true) {
251
239
  super.onServerChange({
252
240
  filepath
@@ -257,13 +245,11 @@ export class ModernDevServer extends ModernServer {
257
245
  }
258
246
  }
259
247
  }
260
-
261
248
  createContext(req, res) {
262
249
  return super.createContext(req, res, {
263
250
  etag: true
264
251
  });
265
252
  }
266
-
267
253
  async setupBeforeDevMiddleware() {
268
254
  const {
269
255
  runner,
@@ -274,7 +260,6 @@ export class ModernDevServer extends ModernServer {
274
260
  const pluginMids = await runner.beforeDevServer(conf);
275
261
  return [...setupMids, ...pluginMids].flat();
276
262
  }
277
-
278
263
  async setupAfterDevMiddleware() {
279
264
  const {
280
265
  runner,
@@ -285,7 +270,6 @@ export class ModernDevServer extends ModernServer {
285
270
  const pluginMids = await runner.afterDevServer(conf);
286
271
  return [...pluginMids, ...setupMids].flat();
287
272
  }
288
-
289
273
  cleanSSRCache() {
290
274
  const {
291
275
  distDir
@@ -293,21 +277,17 @@ export class ModernDevServer extends ModernServer {
293
277
  const bundles = this.router.getBundles();
294
278
  bundles.forEach(bundle => {
295
279
  const filepath = path.join(distDir, bundle);
296
-
297
280
  if (require.cache[filepath]) {
298
281
  delete require.cache[filepath];
299
282
  }
300
283
  });
301
284
  const loadable = path.join(distDir, LOADABLE_STATS_FILE);
302
-
303
285
  if (require.cache[loadable]) {
304
286
  delete require.cache[loadable];
305
287
  }
306
288
  }
307
-
308
289
  startWatcher() {
309
290
  var _this$conf$server;
310
-
311
291
  const {
312
292
  pwd
313
293
  } = this;
@@ -318,8 +298,9 @@ export class ModernDevServer extends ModernServer {
318
298
  const watchOptions = mergeWatchOptions((_this$conf$server = this.conf.server) === null || _this$conf$server === void 0 ? void 0 : _this$conf$server.watchOptions);
319
299
  const defaultWatchedPaths = defaultWatched.map(p => path.normalize(path.join(pwd, p)));
320
300
  const watcher = new Watcher();
321
- watcher.createDepTree(); // 监听文件变动,如果有变动则给 client,也就是 start 启动的插件发消息
301
+ watcher.createDepTree();
322
302
 
303
+ // 监听文件变动,如果有变动则给 client,也就是 start 启动的插件发消息
323
304
  watcher.listen(defaultWatchedPaths, watchOptions, (filepath, event) => {
324
305
  watcher.updateDepTree();
325
306
  watcher.cleanDepCache(filepath);
@@ -330,5 +311,4 @@ export class ModernDevServer extends ModernServer {
330
311
  });
331
312
  this.watcher = watcher;
332
313
  }
333
-
334
314
  }
@@ -1,17 +1,13 @@
1
1
  import { Server } from '@modern-js/prod-server';
2
2
  import { ModernDevServer } from "./dev-server";
3
-
4
3
  const createDevServer = options => {
5
4
  return new ModernDevServer(options);
6
5
  };
7
-
8
6
  export class DevServer extends Server {
9
7
  constructor(options) {
10
8
  super(options);
11
-
12
9
  if (options.dev) {
13
10
  this.serverImpl = createDevServer;
14
11
  }
15
12
  }
16
-
17
13
  }
@@ -4,9 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.getDefaultDevOptions = void 0;
7
-
8
7
  var _utils = require("@modern-js/utils");
9
-
10
8
  const getDefaultDevOptions = () => {
11
9
  const network = (0, _utils.getIpv4Interfaces)().find(item => !item.internal);
12
10
  return {
@@ -24,5 +22,4 @@ const getDefaultDevOptions = () => {
24
22
  liveReload: true
25
23
  };
26
24
  };
27
-
28
25
  exports.getDefaultDevOptions = getDefaultDevOptions;
@@ -4,16 +4,12 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
9
-
10
8
  class DevServerPlugin {
11
9
  constructor(options) {
12
10
  _defineProperty(this, "options", void 0);
13
-
14
11
  this.options = options;
15
12
  }
16
-
17
13
  injectHMRClient(compiler) {
18
14
  const {
19
15
  client
@@ -21,32 +17,29 @@ class DevServerPlugin {
21
17
  const host = client !== null && client !== void 0 && client.host ? `&host=${client.host}` : '';
22
18
  const path = client !== null && client !== void 0 && client.path ? `&path=${client.path}` : '';
23
19
  const port = client !== null && client !== void 0 && client.port ? `&port=${client.port}` : '';
24
- const clientEntry = `${require.resolve("./hmr-client")}?${host}${path}${port}`; // use a hook to add entries if available
20
+ const clientEntry = `${require.resolve("./hmr-client")}?${host}${path}${port}`;
25
21
 
22
+ // use a hook to add entries if available
26
23
  new compiler.webpack.EntryPlugin(compiler.context, clientEntry, {
27
24
  name: undefined
28
25
  }).apply(compiler);
29
26
  }
30
-
31
27
  apply(compiler) {
32
28
  if (this.options.hot || this.options.liveReload) {
33
29
  this.injectHMRClient(compiler);
34
- } // Todo remove, client must inject.
35
-
30
+ }
36
31
 
32
+ // Todo remove, client must inject.
37
33
  const compilerOptions = compiler.options;
38
34
  const {
39
35
  HotModuleReplacementPlugin
40
36
  } = compiler.webpack;
41
37
  compilerOptions.plugins = compilerOptions.plugins || [];
42
-
43
38
  if (!compilerOptions.plugins.find(p => p.constructor === HotModuleReplacementPlugin)) {
44
39
  // apply the HMR plugin, if it didn't exist before.
45
40
  const plugin = new HotModuleReplacementPlugin();
46
41
  plugin.apply(compiler);
47
42
  }
48
43
  }
49
-
50
44
  }
51
-
52
45
  exports.default = DevServerPlugin;
@@ -5,23 +5,18 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.createSocketUrl = createSocketUrl;
7
7
  exports.formatURL = formatURL;
8
-
9
8
  var _constants = require("@modern-js/utils/constants");
10
-
11
9
  function createSocketUrl(resourceQuery) {
12
10
  // ?host=localhost&port=8080&path=modern_js_hmr_ws
13
11
  const searchParams = resourceQuery.substr(1).split('&');
14
12
  const options = {};
15
-
16
13
  for (const pair of searchParams) {
17
14
  const ary = pair.split('=');
18
15
  options[ary[0]] = decodeURIComponent(ary[1]);
19
16
  }
20
-
21
17
  const currentLocation = self.location;
22
18
  return getSocketUrl(options, currentLocation);
23
19
  }
24
-
25
20
  function formatURL({
26
21
  port,
27
22
  protocol,
@@ -36,13 +31,12 @@ function formatURL({
36
31
  url.protocol = protocol;
37
32
  url.pathname = pathname;
38
33
  return url.toString();
39
- } // compatible with IE11
40
-
34
+ }
41
35
 
36
+ // compatible with IE11
42
37
  const colon = protocol.indexOf(':') === -1 ? ':' : '';
43
38
  return `${protocol}${colon}//${hostname}:${port}${pathname}`;
44
39
  }
45
-
46
40
  function getSocketUrl(urlParts, location) {
47
41
  const {
48
42
  host,
@@ -1,19 +1,16 @@
1
1
  "use strict";
2
2
 
3
3
  var _stripAnsi = _interopRequireDefault(require("@modern-js/utils/strip-ansi"));
4
-
5
4
  var _format = require("@modern-js/utils/format");
6
-
7
5
  var _createSocketUrl = require("./createSocketUrl");
8
-
9
6
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
-
11
7
  /**
12
8
  * This has been adapted from `create-react-app`, authored by Facebook, Inc.
13
9
  * see: https://github.com/facebookincubator/create-react-app/tree/master/packages/react-dev-utils
14
10
  *
15
11
  * Tips: this package will be bundled and running in the browser, do not import from the entry of @modern-js/utils.
16
12
  */
13
+
17
14
  // TODO hadRuntimeError should be fixed.
18
15
  // We need to keep track of if there has been a runtime error.
19
16
  // Essentially, we cannot guarantee application state was not corrupted by the
@@ -21,24 +18,25 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
21
18
  // application. This is handled below when we are notified of a compile (code
22
19
  // change).
23
20
  // See https://github.com/facebook/create-react-app/issues/3096
24
- const hadRuntimeError = false; // Connect to Dev Server
21
+ const hadRuntimeError = false;
25
22
 
23
+ // Connect to Dev Server
26
24
  const socketUrl = (0, _createSocketUrl.createSocketUrl)(__resourceQuery);
27
- const connection = new WebSocket(socketUrl); // Unlike WebpackDevServer client, we won't try to reconnect
25
+ const connection = new WebSocket(socketUrl);
26
+
27
+ // Unlike WebpackDevServer client, we won't try to reconnect
28
28
  // to avoid spamming the console. Disconnect usually happens
29
29
  // when developer stops the server.
30
-
31
30
  connection.onclose = function () {
32
31
  if (typeof console !== 'undefined' && typeof console.info === 'function') {
33
32
  console.info('The development server has disconnected.\nRefresh the page if necessary.');
34
33
  }
35
- }; // Remember some state related to hot module replacement.
36
-
34
+ };
37
35
 
36
+ // Remember some state related to hot module replacement.
38
37
  let isFirstCompilation = true;
39
38
  let mostRecentCompilationHash = null;
40
39
  let hasCompileErrors = false;
41
-
42
40
  function clearOutdatedErrors() {
43
41
  // Clean up outdated compile errors, if any.
44
42
  // eslint-disable-next-line node/no-unsupported-features/node-builtins, no-console
@@ -48,154 +46,144 @@ function clearOutdatedErrors() {
48
46
  console.clear();
49
47
  }
50
48
  }
51
- } // Successful compilation.
52
-
49
+ }
53
50
 
51
+ // Successful compilation.
54
52
  function handleSuccess() {
55
53
  clearOutdatedErrors();
56
54
  const isHotUpdate = !isFirstCompilation;
57
55
  isFirstCompilation = false;
58
- hasCompileErrors = false; // Attempt to apply hot updates or reload.
56
+ hasCompileErrors = false;
59
57
 
58
+ // Attempt to apply hot updates or reload.
60
59
  if (isHotUpdate) {
61
60
  tryApplyUpdates();
62
61
  }
63
- } // Compilation with warnings (e.g. ESLint).
64
-
62
+ }
65
63
 
64
+ // Compilation with warnings (e.g. ESLint).
66
65
  function handleWarnings(warnings) {
67
66
  clearOutdatedErrors();
68
67
  const isHotUpdate = !isFirstCompilation;
69
68
  isFirstCompilation = false;
70
69
  hasCompileErrors = false;
71
-
72
70
  function printWarnings() {
73
71
  // Print warnings to the console.
74
72
  const formatted = (0, _format.formatWebpackMessages)({
75
73
  warnings,
76
74
  errors: []
77
75
  });
78
-
79
76
  if (typeof console !== 'undefined' && typeof console.warn === 'function') {
80
77
  for (let i = 0; i < formatted.warnings.length; i++) {
81
78
  if (i === 5) {
82
79
  console.warn('There were more warnings in other files.\n' + 'You can find a complete log in the terminal.');
83
80
  break;
84
81
  }
85
-
86
82
  console.warn((0, _stripAnsi.default)(formatted.warnings[i]));
87
83
  }
88
84
  }
89
85
  }
86
+ printWarnings();
90
87
 
91
- printWarnings(); // Attempt to apply hot updates or reload.
92
-
88
+ // Attempt to apply hot updates or reload.
93
89
  if (isHotUpdate) {
94
90
  tryApplyUpdates();
95
91
  }
96
- } // Compilation with errors (e.g. syntax error or missing modules).
97
-
92
+ }
98
93
 
94
+ // Compilation with errors (e.g. syntax error or missing modules).
99
95
  function handleErrors(errors) {
100
96
  clearOutdatedErrors();
101
97
  isFirstCompilation = false;
102
- hasCompileErrors = true; // "Massage" webpack messages.
98
+ hasCompileErrors = true;
103
99
 
100
+ // "Massage" webpack messages.
104
101
  const formatted = (0, _format.formatWebpackMessages)({
105
102
  errors,
106
103
  warnings: []
107
- }); // Also log them to the console.
104
+ });
108
105
 
106
+ // Also log them to the console.
109
107
  if (typeof console !== 'undefined' && typeof console.error === 'function') {
110
108
  for (const error of formatted.errors) {
111
109
  console.error((0, _stripAnsi.default)(error));
112
110
  }
113
- } // Do not attempt to reload now.
114
- // We will reload on next success instead.
115
-
116
- } // There is a newer version of the code available.
111
+ }
117
112
 
113
+ // Do not attempt to reload now.
114
+ // We will reload on next success instead.
115
+ }
118
116
 
117
+ // There is a newer version of the code available.
119
118
  function handleAvailableHash(hash) {
120
119
  // Update last known compilation hash.
121
120
  mostRecentCompilationHash = hash;
122
- } // Handle messages from the server.
123
-
121
+ }
124
122
 
123
+ // Handle messages from the server.
125
124
  connection.onmessage = function (e) {
126
125
  const message = JSON.parse(e.data);
127
-
128
126
  switch (message.type) {
129
127
  case 'hash':
130
128
  handleAvailableHash(message.data);
131
129
  break;
132
-
133
130
  case 'still-ok':
134
131
  case 'ok':
135
132
  handleSuccess();
136
133
  break;
137
-
138
134
  case 'content-changed':
139
135
  // Triggered when a file from `contentBase` changed.
140
136
  window.location.reload();
141
137
  break;
142
-
143
138
  case 'warnings':
144
139
  handleWarnings(message.data);
145
140
  break;
146
-
147
141
  case 'errors':
148
142
  handleErrors(message.data);
149
143
  break;
150
-
151
- default: // Do nothing.
152
-
144
+ default:
145
+ // Do nothing.
153
146
  }
154
- }; // Is there a newer version of this code available?
155
-
147
+ };
156
148
 
149
+ // Is there a newer version of this code available?
157
150
  function isUpdateAvailable() {
158
151
  // __webpack_hash__ is the hash of the current compilation.
159
152
  // It's a global variable injected by webpack.
160
153
  return mostRecentCompilationHash !== __webpack_hash__;
161
- } // webpack disallows updates in other states.
162
-
154
+ }
163
155
 
156
+ // webpack disallows updates in other states.
164
157
  function canApplyUpdates() {
165
158
  return module.hot.status() === 'idle';
166
- } // Attempt to update code on the fly, fall back to a hard reload.
167
-
159
+ }
168
160
 
161
+ // Attempt to update code on the fly, fall back to a hard reload.
169
162
  function tryApplyUpdates() {
170
163
  if (!module.hot) {
171
164
  // HotModuleReplacementPlugin is not in webpack configuration.
172
165
  window.location.reload();
173
166
  return;
174
167
  }
175
-
176
168
  if (!isUpdateAvailable() || !canApplyUpdates()) {
177
169
  return;
178
170
  }
179
-
180
171
  function handleApplyUpdates(err, updatedModules) {
181
172
  const wantsForcedReload = err || !updatedModules || hadRuntimeError;
182
-
183
173
  if (wantsForcedReload) {
184
174
  window.location.reload();
185
175
  return;
186
176
  }
187
-
188
177
  if (isUpdateAvailable()) {
189
178
  // While we were updating, there was a new update! Do it again.
190
179
  tryApplyUpdates();
191
180
  }
192
- } // https://webpack.github.io/docs/hot-module-replacement.html#check
193
-
181
+ }
194
182
 
195
- const result = module.hot.check(
196
- /* autoApply */
197
- true, handleApplyUpdates); // // webpack 2 returns a Promise instead of invoking a callback
183
+ // https://webpack.github.io/docs/hot-module-replacement.html#check
184
+ const result = module.hot.check( /* autoApply */true, handleApplyUpdates);
198
185
 
186
+ // // webpack 2 returns a Promise instead of invoking a callback
199
187
  if (result !== null && result !== void 0 && result.then) {
200
188
  result.then(updatedModules => {
201
189
  handleApplyUpdates(null, updatedModules);