@modern-js/server 1.18.0 → 1.18.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 (32) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/js/modern/dev-tools/{dev-server-plugin.js → dev-middleware/dev-server-plugin.js} +4 -4
  3. package/dist/js/modern/{hmr-client → dev-tools/dev-middleware/hmr-client}/createSocketUrl.js +0 -0
  4. package/dist/js/modern/{hmr-client → dev-tools/dev-middleware/hmr-client}/index.js +0 -0
  5. package/dist/js/modern/dev-tools/dev-middleware/index.js +138 -0
  6. package/dist/js/modern/dev-tools/{socket-server.js → dev-middleware/socket-server.js} +8 -4
  7. package/dist/js/modern/dev-tools/register/index.js +5 -1
  8. package/dist/js/modern/server/dev-server.js +44 -141
  9. package/dist/js/modern/server/index.js +1 -8
  10. package/dist/js/node/dev-tools/{dev-server-plugin.js → dev-middleware/dev-server-plugin.js} +4 -4
  11. package/dist/js/node/{hmr-client → dev-tools/dev-middleware/hmr-client}/createSocketUrl.js +0 -0
  12. package/dist/js/node/{hmr-client → dev-tools/dev-middleware/hmr-client}/index.js +0 -0
  13. package/dist/js/node/dev-tools/dev-middleware/index.js +152 -0
  14. package/dist/js/node/dev-tools/{socket-server.js → dev-middleware/socket-server.js} +8 -4
  15. package/dist/js/node/dev-tools/register/index.js +5 -1
  16. package/dist/js/node/server/dev-server.js +45 -144
  17. package/dist/js/node/server/index.js +1 -9
  18. package/dist/types/dev-tools/{dev-server-plugin.d.ts → dev-middleware/dev-server-plugin.d.ts} +1 -1
  19. package/dist/types/{hmr-client → dev-tools/dev-middleware/hmr-client}/createSocketUrl.d.ts +0 -0
  20. package/dist/types/{hmr-client → dev-tools/dev-middleware/hmr-client}/index.d.ts +0 -0
  21. package/dist/types/dev-tools/dev-middleware/index.d.ts +31 -0
  22. package/dist/types/dev-tools/{socket-server.d.ts → dev-middleware/socket-server.d.ts} +1 -1
  23. package/dist/types/dev-tools/mock/getMockData.d.ts +1 -1
  24. package/dist/types/dev-tools/mock/index.d.ts +1 -1
  25. package/dist/types/index.d.ts +2 -2
  26. package/dist/types/server/dev-server.d.ts +6 -14
  27. package/dist/types/server/index.d.ts +1 -1
  28. package/dist/types/types.d.ts +4 -24
  29. package/package.json +9 -9
  30. package/dist/js/modern/server/dev-server-split.js +0 -43
  31. package/dist/js/node/server/dev-server-split.js +0 -57
  32. package/dist/types/server/dev-server-split.d.ts +0 -16
package/CHANGELOG.md CHANGED
@@ -1,5 +1,42 @@
1
1
  # @modern-js/server
2
2
 
3
+ ## 1.18.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 318e149: fix: tools.devServer type missing some properties
8
+
9
+ fix: 修复 tools.devServer 类型定义不完整的问题
10
+
11
+ - 60d95ad: fix: dev server config should be optional
12
+ fix: devServer 配置项应该是可选配置的
13
+ - 8016a8a: fix: invoke next() in dev-middleware directly if only api
14
+ fix: 在 api 服务的情况下,直接调用 next(),不执行 dev-middleware
15
+ - f6a3aa1: feat: support etag in dev server by default
16
+ feat: 开发环境默认支持 etag 功能
17
+ - 23fa468: fix: ssr bundle should not be compiled by ts-node
18
+
19
+ fix: ts-node 不应该编译 ssr bundle
20
+
21
+ - 55988fa: fix: fix dev server type error
22
+ fix: 修复 dev server 中的类型错误
23
+ - bc3bbd8: fix: use output.publicPath(default) as webpack-dev-middleware publicPath
24
+
25
+ fix: 使用 output.publicPath 作为 webpack-dev-middleware publicPath
26
+
27
+ - Updated dependencies [3586707]
28
+ - Updated dependencies [318e149]
29
+ - Updated dependencies [60d95ad]
30
+ - Updated dependencies [f6a3aa1]
31
+ - Updated dependencies [fb02c81]
32
+ - Updated dependencies [9f7bfa6]
33
+ - Updated dependencies [9fcfbd4]
34
+ - Updated dependencies [6c2c745]
35
+ - @modern-js/prod-server@1.18.1
36
+ - @modern-js/types@1.18.1
37
+ - @modern-js/server-utils@1.18.1
38
+ - @modern-js/utils@1.18.1
39
+
3
40
  ## 1.18.0
4
41
 
5
42
  ### Patch Changes
@@ -11,10 +11,10 @@ export default class DevServerPlugin {
11
11
  const {
12
12
  client
13
13
  } = this.options;
14
- const host = client.host ? `&host=${client.host}` : '';
15
- const path = client.path ? `&path=${client.path}` : '';
16
- const port = client.port ? `&port=${client.port}` : '';
17
- const clientEntry = `${require.resolve("../hmr-client")}?${host}${path}${port}`; // use a hook to add entries if available
14
+ const host = client !== null && client !== void 0 && client.host ? `&host=${client.host}` : '';
15
+ const path = client !== null && client !== void 0 && client.path ? `&path=${client.path}` : '';
16
+ const port = client !== null && client !== void 0 && client.port ? `&port=${client.port}` : '';
17
+ const clientEntry = `${require.resolve("./hmr-client")}?${host}${path}${port}`; // use a hook to add entries if available
18
18
 
19
19
  new compiler.webpack.EntryPlugin(compiler.context, clientEntry, {
20
20
  name: undefined
@@ -0,0 +1,138 @@
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
+ 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
+ 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
+ import { EventEmitter } from 'events';
8
+ import webpackDevMiddleware from '@modern-js/utils/webpack-dev-middleware';
9
+ import DevServerPlugin from "./dev-server-plugin";
10
+ import SocketServer from "./socket-server";
11
+
12
+ const noop = () => {// noop
13
+ };
14
+
15
+ export default class DevMiddleware extends EventEmitter {
16
+ constructor({
17
+ compiler,
18
+ dev,
19
+ config
20
+ }) {
21
+ super();
22
+
23
+ _defineProperty(this, "middleware", void 0);
24
+
25
+ _defineProperty(this, "compiler", void 0);
26
+
27
+ _defineProperty(this, "devOptions", void 0);
28
+
29
+ _defineProperty(this, "socketServer", void 0);
30
+
31
+ _defineProperty(this, "config", void 0);
32
+
33
+ this.compiler = compiler;
34
+ this.devOptions = dev;
35
+ this.config = config; // init socket server
36
+
37
+ this.socketServer = new SocketServer(dev); // Todo: should remove after abstract dev middleware
38
+
39
+ if (this.compiler) {
40
+ // setup compiler in server, also add dev-middleware to handler static file in memory
41
+ // set up plugin to each compiler
42
+ this.setupDevServerPlugin(); // register hooks for each compilation, update socket stats if recompiled
43
+
44
+ this.setupHooks(); // start dev middleware
45
+
46
+ this.middleware = this.setupDevMiddleware();
47
+ }
48
+ }
49
+
50
+ init(app) {
51
+ app.on('listening', () => {
52
+ this.socketServer.prepare(app);
53
+ });
54
+ app.on('close', async () => {
55
+ var _this$middleware;
56
+
57
+ (_this$middleware = this.middleware) === null || _this$middleware === void 0 ? void 0 : _this$middleware.close(noop);
58
+ this.socketServer.close();
59
+ });
60
+ }
61
+
62
+ setupDevServerPlugin() {
63
+ const {
64
+ devOptions
65
+ } = this; // apply dev server to client compiler, add hmr client to entry.
66
+
67
+ if (this.compiler.compilers) {
68
+ this.compiler.compilers.forEach(target => {
69
+ if (this.isClientCompiler(target)) {
70
+ new DevServerPlugin(devOptions).apply(target);
71
+ }
72
+ });
73
+ } else {
74
+ new DevServerPlugin(devOptions).apply(this.compiler);
75
+ }
76
+ }
77
+
78
+ setupHooks() {
79
+ const invalidPlugin = () => {
80
+ this.socketServer.sockWrite('invalid');
81
+ };
82
+
83
+ const addHooks = compiler => {
84
+ if (compiler.name === 'server') {
85
+ return;
86
+ }
87
+
88
+ const {
89
+ compile,
90
+ invalid,
91
+ done
92
+ } = compiler.hooks;
93
+ compile.tap('modern-dev-server', invalidPlugin);
94
+ invalid.tap('modern-dev-server', invalidPlugin);
95
+ done.tap('modern-dev-server', stats => {
96
+ this.socketServer.updateStats(stats);
97
+ this.emit('change', stats);
98
+ });
99
+ };
100
+
101
+ if (this.compiler.compilers) {
102
+ this.compiler.compilers.forEach(addHooks);
103
+ } else {
104
+ addHooks(this.compiler);
105
+ }
106
+ }
107
+
108
+ setupDevMiddleware() {
109
+ var _config$tools, _config$tools$devServ;
110
+
111
+ const {
112
+ config,
113
+ devOptions
114
+ } = this;
115
+ const middleware = webpackDevMiddleware(this.compiler, _objectSpread({
116
+ headers: (_config$tools = config.tools) === null || _config$tools === void 0 ? void 0 : (_config$tools$devServ = _config$tools.devServer) === null || _config$tools$devServ === void 0 ? void 0 : _config$tools$devServ.headers,
117
+ stats: false
118
+ }, devOptions.devMiddleware));
119
+ return middleware;
120
+ }
121
+
122
+ isClientCompiler(compiler) {
123
+ const {
124
+ target
125
+ } = compiler.options; // if target not contains `node`, it's a client compiler
126
+
127
+ if (target) {
128
+ if (Array.isArray(target)) {
129
+ return !target.includes('node');
130
+ }
131
+
132
+ return target !== 'node';
133
+ }
134
+
135
+ return compiler.name === 'client';
136
+ }
137
+
138
+ }
@@ -21,10 +21,12 @@ export default class SocketServer {
21
21
 
22
22
 
23
23
  prepare(app) {
24
+ var _this$options$client;
25
+
24
26
  this.app = app;
25
27
  this.wsServer = new ws.Server({
26
28
  noServer: true,
27
- path: this.options.client.path
29
+ path: (_this$options$client = this.options.client) === null || _this$options$client === void 0 ? void 0 : _this$options$client.path
28
30
  }); // listen upgrade event to handle socket
29
31
 
30
32
  this.app.on('upgrade', (req, sock, head) => {
@@ -92,6 +94,8 @@ export default class SocketServer {
92
94
  }
93
95
 
94
96
  onConnect(socket) {
97
+ var _this$options$client2, _this$options$client3, _this$options$client4;
98
+
95
99
  const connection = socket;
96
100
  connection.isAlive = true;
97
101
  connection.on('pong', () => {
@@ -111,7 +115,7 @@ export default class SocketServer {
111
115
  }
112
116
  });
113
117
 
114
- if (this.options.client.logging) {
118
+ if ((_this$options$client2 = this.options.client) !== null && _this$options$client2 !== void 0 && _this$options$client2.logging) {
115
119
  this.singleWrite(connection, 'logging', this.options.client.logging);
116
120
  }
117
121
 
@@ -123,11 +127,11 @@ export default class SocketServer {
123
127
  this.singleWrite(connection, 'liveReload');
124
128
  }
125
129
 
126
- if (this.options.client.progress) {
130
+ if ((_this$options$client3 = this.options.client) !== null && _this$options$client3 !== void 0 && _this$options$client3.progress) {
127
131
  this.singleWrite(connection, 'progress', this.options.client.progress);
128
132
  }
129
133
 
130
- if (this.options.client.overlay) {
134
+ if ((_this$options$client4 = this.options.client) !== null && _this$options$client4 !== void 0 && _this$options$client4.overlay) {
131
135
  this.singleWrite(connection, 'overlay', this.options.client.overlay);
132
136
  } // send first stats to active client sock if stats exist
133
137
 
@@ -31,7 +31,10 @@ export const enableRegister = (projectRoot, config // eslint-disable-next-line c
31
31
  const existTsConfigPaths = checkDep('tsconfig-paths', [projectRoot]);
32
32
 
33
33
  if (isTsProject && existTsNode && existTsConfigPaths) {
34
+ var _config$output;
35
+
34
36
  debug('use ts-node');
37
+ const distPath = (config === null || config === void 0 ? void 0 : (_config$output = config.output) === null || _config$output === void 0 ? void 0 : _config$output.path) || 'dist';
35
38
 
36
39
  const tsNode = require('ts-node');
37
40
 
@@ -71,7 +74,8 @@ export const enableRegister = (projectRoot, config // eslint-disable-next-line c
71
74
  project: tsconfigPath,
72
75
  // for env.d.ts, https://www.npmjs.com/package/ts-node#missing-types
73
76
  files: true,
74
- transpileOnly: true
77
+ transpileOnly: true,
78
+ ignore: ['(?:^|/)node_modules/', `(?:^|/)${distPath}/bundles/`]
75
79
  });
76
80
  } else {
77
81
  debug('use @babel/register');
@@ -8,14 +8,12 @@ import { createServer } from 'http';
8
8
  import path from 'path';
9
9
  import { createServer as createHttpsServer } from 'https';
10
10
  import { API_DIR, SERVER_DIR, SHARED_DIR } from '@modern-js/utils';
11
- import webpackDevMiddleware from '@modern-js/utils/webpack-dev-middleware';
12
11
  import { createProxyHandler, ModernServer, AGGRED_DIR } from '@modern-js/prod-server';
13
12
  import { getDefaultDevOptions } from "../constants";
14
13
  import { createMockHandler } from "../dev-tools/mock";
15
- import SocketServer from "../dev-tools/socket-server";
16
- import DevServerPlugin from "../dev-tools/dev-server-plugin";
17
14
  import { enableRegister } from "../dev-tools/register";
18
15
  import Watcher, { mergeWatchOptions } from "../dev-tools/watcher";
16
+ import DevMiddleware from "../dev-tools/dev-middleware";
19
17
  export class ModernDevServer extends ModernServer {
20
18
  constructor(options) {
21
19
  super(options); // dev server should work in pwd
@@ -24,19 +22,19 @@ export class ModernDevServer extends ModernServer {
24
22
 
25
23
  _defineProperty(this, "dev", void 0);
26
24
 
27
- _defineProperty(this, "compiler", void 0);
28
-
29
- _defineProperty(this, "socketServer", void 0);
25
+ _defineProperty(this, "devMiddleware", void 0);
30
26
 
31
27
  _defineProperty(this, "watcher", void 0);
32
28
 
33
- _defineProperty(this, "devMiddleware", void 0);
29
+ this.workDir = this.pwd; // set dev server options, like webpack-dev-server
34
30
 
35
- this.workDir = this.pwd; // set webpack compiler
31
+ this.dev = this.getDevOptions(options); // create dev middleware instance
36
32
 
37
- this.compiler = options.compiler; // set dev server options, like webpack-dev-server
38
-
39
- this.dev = this.getDevOptions(options);
33
+ this.devMiddleware = new DevMiddleware({
34
+ dev: this.dev,
35
+ compiler: options.compiler,
36
+ config: this.conf
37
+ });
40
38
  enableRegister(this.pwd, this.conf);
41
39
  }
42
40
 
@@ -49,15 +47,15 @@ export class ModernDevServer extends ModernServer {
49
47
  } // Complete the preparation of services
50
48
 
51
49
 
52
- async onInit(runner) {
50
+ async onInit(runner, app) {
53
51
  var _conf$tools, _conf$tools$devServer;
54
52
 
55
53
  this.runner = runner;
56
54
  const {
57
55
  conf,
58
56
  pwd,
59
- compiler,
60
- dev
57
+ dev,
58
+ devMiddleware
61
59
  } = this; // before dev handler
62
60
 
63
61
  const beforeHandlers = await this.setupBeforeDevMiddleware();
@@ -111,14 +109,29 @@ export class ModernDevServer extends ModernServer {
111
109
  } // do webpack build / plugin apply / socket server when pass compiler instance
112
110
 
113
111
 
114
- if (compiler) {
115
- // init socket server
116
- this.socketServer = new SocketServer(dev); // setup compiler in server, also add dev-middleware to handler static file in memory
117
-
118
- const devMiddlewareHandler = this.setupCompiler(compiler);
119
- this.addHandler(devMiddlewareHandler);
120
- } // after dev handler
112
+ devMiddleware.init(app);
113
+ devMiddleware.on('change', stats => {
114
+ // Reset only when client compile done
115
+ if (stats.toJson({
116
+ all: false
117
+ }).name === 'client') {
118
+ this.onRepack({
119
+ routes: this.getRoutes()
120
+ });
121
+ }
122
+ });
123
+ this.addHandler((ctx, next) => {
124
+ const {
125
+ req,
126
+ res
127
+ } = ctx;
121
128
 
129
+ if (devMiddleware.middleware) {
130
+ devMiddleware.middleware(req, res, next);
131
+ } else {
132
+ next();
133
+ }
134
+ }); // after dev handler
122
135
 
123
136
  const afterHandlers = await this.setupAfterDevMiddleware();
124
137
  afterHandlers.forEach(handler => {
@@ -130,28 +143,16 @@ export class ModernDevServer extends ModernServer {
130
143
  return handler(req, res, next);
131
144
  });
132
145
  });
133
- await super.onInit(runner); // watch mock/ server/ api/ dir file change
146
+ await super.onInit(runner, app); // watch mock/ server/ api/ dir file change
134
147
 
135
148
  if (dev.watch) {
136
149
  this.startWatcher();
137
- }
138
- }
139
-
140
- async onClose() {
141
- var _this$watcher, _this$socketServer;
150
+ app.on('close', async () => {
151
+ var _this$watcher;
142
152
 
143
- await super.onClose();
144
- await ((_this$watcher = this.watcher) === null || _this$watcher === void 0 ? void 0 : _this$watcher.close());
145
- await new Promise(resolve => {
146
- if (this.devMiddleware) {
147
- this.devMiddleware.close(() => {
148
- resolve();
149
- });
150
- } else {
151
- resolve();
152
- }
153
- });
154
- (_this$socketServer = this.socketServer) === null || _this$socketServer === void 0 ? void 0 : _this$socketServer.close();
153
+ await ((_this$watcher = this.watcher) === null || _this$watcher === void 0 ? void 0 : _this$watcher.close());
154
+ });
155
+ }
155
156
  }
156
157
 
157
158
  onRepack(options = {}) {
@@ -167,12 +168,6 @@ export class ModernDevServer extends ModernServer {
167
168
  super.onRepack(options);
168
169
  }
169
170
 
170
- onListening(app) {
171
- var _this$socketServer2;
172
-
173
- (_this$socketServer2 = this.socketServer) === null || _this$socketServer2 === void 0 ? void 0 : _this$socketServer2.prepare(app);
174
- }
175
-
176
171
  async createHTTPServer(handler) {
177
172
  const {
178
173
  dev
@@ -230,104 +225,12 @@ export class ModernDevServer extends ModernServer {
230
225
  this.logger.error(e);
231
226
  }
232
227
  }
233
- } // set up plugin to each compiler
234
- // register hooks for each compilation, update socket stats if recompiled
235
- // start dev middleware
236
-
237
-
238
- setupCompiler(compiler) {
239
- this.setupDevServerPlugin(compiler);
240
- this.setupHooks();
241
- return this.setupDevMiddleware(compiler);
242
228
  }
243
229
 
244
- isClientCompiler(compiler) {
245
- const {
246
- target
247
- } = compiler.options; // if target not contains `node`, it's a client compiler
248
-
249
- if (target) {
250
- if (Array.isArray(target)) {
251
- return !target.includes('node');
252
- }
253
-
254
- return target !== 'node';
255
- }
256
-
257
- return compiler.name === 'client';
258
- }
259
-
260
- setupDevServerPlugin(compiler) {
261
- const {
262
- dev: devConf
263
- } = this; // apply dev server to client compiler, add hmr client to entry.
264
-
265
- if (compiler.compilers) {
266
- compiler.compilers.forEach(target => {
267
- if (this.isClientCompiler(target)) {
268
- new DevServerPlugin(devConf).apply(target);
269
- }
270
- });
271
- } else {
272
- new DevServerPlugin(devConf).apply(compiler);
273
- }
274
- }
275
-
276
- setupHooks() {
277
- const invalidPlugin = () => {
278
- this.socketServer.sockWrite('invalid');
279
- };
280
-
281
- const addHooks = compiler => {
282
- if (compiler.name === 'server') {
283
- return;
284
- }
285
-
286
- const {
287
- compile,
288
- invalid,
289
- done
290
- } = compiler.hooks;
291
- compile.tap('modern-dev-server', invalidPlugin);
292
- invalid.tap('modern-dev-server', invalidPlugin);
293
- done.tap('modern-dev-server', stats => {
294
- this.socketServer.updateStats(stats); // Reset only when client compile done
295
-
296
- if (stats.toJson({
297
- all: false
298
- }).name === 'client') {
299
- this.onRepack({
300
- routes: this.getRoutes()
301
- });
302
- }
303
- });
304
- };
305
-
306
- if (this.compiler.compilers) {
307
- this.compiler.compilers.forEach(addHooks);
308
- } else {
309
- addHooks(this.compiler);
310
- }
311
- }
312
-
313
- setupDevMiddleware(compiler) {
314
- var _conf$tools2, _conf$tools2$devServe;
315
-
316
- const {
317
- conf
318
- } = this;
319
- this.devMiddleware = webpackDevMiddleware(compiler, _objectSpread({
320
- headers: (_conf$tools2 = conf.tools) === null || _conf$tools2 === void 0 ? void 0 : (_conf$tools2$devServe = _conf$tools2.devServer) === null || _conf$tools2$devServe === void 0 ? void 0 : _conf$tools2$devServe.headers,
321
- publicPath: '/',
322
- stats: false
323
- }, this.dev.devMiddleware));
324
- return (ctx, next) => {
325
- const {
326
- req,
327
- res
328
- } = ctx;
329
- this.devMiddleware(req, res, next);
330
- };
230
+ createContext(req, res) {
231
+ return super.createContext(req, res, {
232
+ etag: true
233
+ });
331
234
  }
332
235
 
333
236
  async setupBeforeDevMiddleware() {
@@ -1,15 +1,8 @@
1
1
  import { Server } from '@modern-js/prod-server';
2
2
  import { ModernDevServer } from "./dev-server";
3
- import { ModernAPIDevServer, ModernSSRDevServer } from "./dev-server-split";
4
3
 
5
4
  const createDevServer = options => {
6
- if (options.apiOnly) {
7
- return new ModernAPIDevServer(options);
8
- } else if (options.ssrOnly) {
9
- return new ModernSSRDevServer(options);
10
- } else {
11
- return new ModernDevServer(options);
12
- }
5
+ return new ModernDevServer(options);
13
6
  };
14
7
 
15
8
  export class DevServer extends Server {
@@ -18,10 +18,10 @@ class DevServerPlugin {
18
18
  const {
19
19
  client
20
20
  } = this.options;
21
- const host = client.host ? `&host=${client.host}` : '';
22
- const path = client.path ? `&path=${client.path}` : '';
23
- const port = client.port ? `&port=${client.port}` : '';
24
- const clientEntry = `${require.resolve("../hmr-client")}?${host}${path}${port}`; // use a hook to add entries if available
21
+ const host = client !== null && client !== void 0 && client.host ? `&host=${client.host}` : '';
22
+ const path = client !== null && client !== void 0 && client.path ? `&path=${client.path}` : '';
23
+ 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
25
25
 
26
26
  new compiler.webpack.EntryPlugin(compiler.context, clientEntry, {
27
27
  name: undefined