@modern-js/server 1.19.0 → 1.20.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,46 @@
1
1
  # @modern-js/server
2
2
 
3
+ ## 1.20.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [49515c5]
8
+ - @modern-js/utils@1.20.1
9
+ - @modern-js/prod-server@1.20.1
10
+ - @modern-js/server-utils@1.20.1
11
+ - @modern-js/types@1.20.1
12
+
13
+ ## 1.20.0
14
+
15
+ ### Patch Changes
16
+
17
+ - 35c0959: feat(devServer): support devServer.setupMiddlewares config
18
+
19
+ feat(devServer): 支持 devServer.setupMiddlewares 配置项
20
+
21
+ - 4ddc185: chore(builder): bump webpack to 5.74.0
22
+
23
+ chore(builder): 升级 webpack 到 5.74.0 版本
24
+
25
+ - 66e4817: feat: support devServer.historyApiFallback
26
+
27
+ feat: 支持 devServer.historyApiFallback 配置项
28
+
29
+ - face165: chore(devServer): get devServer config from this.dev
30
+
31
+ chore(devServer): 从 this.dev 上获取 devServer 配置
32
+
33
+ - Updated dependencies [d5d570b]
34
+ - Updated dependencies [4ddc185]
35
+ - Updated dependencies [66e4817]
36
+ - Updated dependencies [df8ee7e]
37
+ - Updated dependencies [8c05089]
38
+ - Updated dependencies [baf7337]
39
+ - @modern-js/utils@1.20.0
40
+ - @modern-js/types@1.20.0
41
+ - @modern-js/prod-server@1.20.0
42
+ - @modern-js/server-utils@1.20.0
43
+
3
44
  ## 1.19.0
4
45
 
5
46
  ### Patch Changes
@@ -4,8 +4,6 @@ export const getDefaultDevOptions = () => {
4
4
  return {
5
5
  client: {
6
6
  port: '8080',
7
- overlay: false,
8
- logging: 'none',
9
7
  path: HMR_SOCK_PATH,
10
8
  host: (network === null || network === void 0 ? void 0 : network.address) || 'localhost'
11
9
  },
@@ -16,7 +16,7 @@ export default class DevMiddleware extends EventEmitter {
16
16
  constructor({
17
17
  compiler,
18
18
  dev,
19
- config
19
+ devMiddleware
20
20
  }) {
21
21
  super();
22
22
 
@@ -28,11 +28,8 @@ export default class DevMiddleware extends EventEmitter {
28
28
 
29
29
  _defineProperty(this, "socketServer", void 0);
30
30
 
31
- _defineProperty(this, "config", void 0);
32
-
33
31
  this.compiler = compiler;
34
- this.devOptions = dev;
35
- this.config = config; // init socket server
32
+ this.devOptions = dev; // init socket server
36
33
 
37
34
  this.socketServer = new SocketServer(dev); // Todo: should remove after abstract dev middleware
38
35
 
@@ -43,7 +40,7 @@ export default class DevMiddleware extends EventEmitter {
43
40
 
44
41
  this.setupHooks(); // start dev middleware
45
42
 
46
- this.middleware = this.setupDevMiddleware();
43
+ this.middleware = this.setupDevMiddleware(devMiddleware);
47
44
  }
48
45
  }
49
46
 
@@ -75,6 +72,10 @@ export default class DevMiddleware extends EventEmitter {
75
72
  }
76
73
  }
77
74
 
75
+ sockWrite(type, data) {
76
+ this.socketServer.sockWrite(type, data);
77
+ }
78
+
78
79
  setupHooks() {
79
80
  const invalidPlugin = () => {
80
81
  this.socketServer.sockWrite('invalid');
@@ -105,15 +106,12 @@ export default class DevMiddleware extends EventEmitter {
105
106
  }
106
107
  }
107
108
 
108
- setupDevMiddleware() {
109
- var _config$tools, _config$tools$devServ;
110
-
109
+ setupDevMiddleware(devMiddleware = webpackDevMiddleware) {
111
110
  const {
112
- config,
113
111
  devOptions
114
112
  } = 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,
113
+ const middleware = devMiddleware(this.compiler, _objectSpread({
114
+ headers: devOptions.headers,
117
115
  stats: false
118
116
  }, devOptions.devMiddleware));
119
117
  return middleware;
@@ -94,8 +94,6 @@ export default class SocketServer {
94
94
  }
95
95
 
96
96
  onConnect(socket) {
97
- var _this$options$client2, _this$options$client3, _this$options$client4;
98
-
99
97
  const connection = socket;
100
98
  connection.isAlive = true;
101
99
  connection.on('pong', () => {
@@ -115,24 +113,12 @@ export default class SocketServer {
115
113
  }
116
114
  });
117
115
 
118
- if ((_this$options$client2 = this.options.client) !== null && _this$options$client2 !== void 0 && _this$options$client2.logging) {
119
- this.singleWrite(connection, 'logging', this.options.client.logging);
120
- }
121
-
122
116
  if (this.options.hot || this.options.hot === 'only') {
123
117
  this.singleWrite(connection, 'hot');
124
118
  }
125
119
 
126
120
  if (this.options.liveReload) {
127
121
  this.singleWrite(connection, 'liveReload');
128
- }
129
-
130
- if ((_this$options$client3 = this.options.client) !== null && _this$options$client3 !== void 0 && _this$options$client3.progress) {
131
- this.singleWrite(connection, 'progress', this.options.client.progress);
132
- }
133
-
134
- if ((_this$options$client4 = this.options.client) !== null && _this$options$client4 !== void 0 && _this$options$client4.overlay) {
135
- this.singleWrite(connection, 'overlay', this.options.client.overlay);
136
122
  } // send first stats to active client sock if stats exist
137
123
 
138
124
 
@@ -33,7 +33,7 @@ export class ModernDevServer extends ModernServer {
33
33
  this.devMiddleware = new DevMiddleware({
34
34
  dev: this.dev,
35
35
  compiler: options.compiler,
36
- config: this.conf
36
+ devMiddleware: options.devMiddleware
37
37
  });
38
38
  enableRegister(this.pwd, this.conf);
39
39
  }
@@ -44,22 +44,10 @@ export class ModernDevServer extends ModernServer {
44
44
  return _objectSpread(_objectSpread(_objectSpread({}, defaultOptions), devOptions), {}, {
45
45
  client: _objectSpread(_objectSpread({}, defaultOptions.client), devOptions === null || devOptions === void 0 ? void 0 : devOptions.client)
46
46
  });
47
- } // Complete the preparation of services
48
-
49
-
50
- async onInit(runner, app) {
51
- var _conf$tools, _conf$tools$devServer;
52
-
53
- this.runner = runner;
54
- const {
55
- conf,
56
- pwd,
57
- dev,
58
- devMiddleware
59
- } = this; // before dev handler
47
+ }
60
48
 
61
- const beforeHandlers = await this.setupBeforeDevMiddleware();
62
- beforeHandlers.forEach(handler => {
49
+ addMiddlewareHandler(handlers) {
50
+ handlers.forEach(handler => {
63
51
  this.addHandler((ctx, next) => {
64
52
  const {
65
53
  req,
@@ -68,9 +56,64 @@ export class ModernDevServer extends ModernServer {
68
56
  return handler(req, res, next);
69
57
  });
70
58
  });
71
- this.addHandler((ctx, next) => {
72
- var _this$conf$tools$devS;
59
+ }
60
+
61
+ applySetupMiddlewares() {
62
+ const setupMiddlewares = this.dev.setupMiddlewares || [];
63
+ const serverOptions = {
64
+ sockWrite: (type, data) => this.devMiddleware.sockWrite(type, data)
65
+ };
66
+ const befores = [];
67
+ const afters = [];
68
+ setupMiddlewares.forEach(handler => {
69
+ handler({
70
+ unshift: (...handlers) => befores.unshift(...handlers),
71
+ push: (...handlers) => afters.push(...handlers)
72
+ }, serverOptions);
73
+ });
74
+ return {
75
+ befores,
76
+ afters
77
+ };
78
+ } // Complete the preparation of services
79
+
80
+
81
+ async onInit(runner, app) {
82
+ this.runner = runner;
83
+ const {
84
+ dev
85
+ } = this; // Order: devServer.before => setupMiddlewares.unshift => internal middlewares => setupMiddlewares.push => devServer.after
86
+
87
+ const {
88
+ befores,
89
+ afters
90
+ } = this.applySetupMiddlewares(); // before dev handler
91
+
92
+ const beforeHandlers = await this.setupBeforeDevMiddleware();
93
+ this.addMiddlewareHandler([...beforeHandlers, ...befores]);
94
+ await this.applyDefaultMiddlewares(app); // after dev handler
95
+
96
+ const afterHandlers = await this.setupAfterDevMiddleware();
97
+ this.addMiddlewareHandler([...afters, ...afterHandlers]);
98
+ await super.onInit(runner, app); // watch mock/ server/ api/ dir file change
99
+
100
+ if (dev.watch) {
101
+ this.startWatcher();
102
+ app.on('close', async () => {
103
+ var _this$watcher;
73
104
 
105
+ await ((_this$watcher = this.watcher) === null || _this$watcher === void 0 ? void 0 : _this$watcher.close());
106
+ });
107
+ }
108
+ }
109
+
110
+ async applyDefaultMiddlewares(app) {
111
+ const {
112
+ pwd,
113
+ dev,
114
+ devMiddleware
115
+ } = this;
116
+ this.addHandler((ctx, next) => {
74
117
  // allow hmr request cross-domain, because the user may use global proxy
75
118
  if (ctx.path.includes('hot-update')) {
76
119
  ctx.res.setHeader('Access-Control-Allow-Origin', '*');
@@ -78,7 +121,7 @@ export class ModernDevServer extends ModernServer {
78
121
  } // 用户在 devServer 上配置的 headers 不会对 html 的请求生效,加入下面代码,使配置的 headers 对所有请求生效
79
122
 
80
123
 
81
- const confHeaders = (_this$conf$tools$devS = this.conf.tools.devServer) === null || _this$conf$tools$devS === void 0 ? void 0 : _this$conf$tools$devS.headers;
124
+ const confHeaders = dev.headers;
82
125
 
83
126
  if (confHeaders) {
84
127
  for (const [key, value] of Object.entries(confHeaders)) {
@@ -100,7 +143,7 @@ export class ModernDevServer extends ModernServer {
100
143
  }
101
144
  }); // dev proxy handler, each proxy has own handler
102
145
 
103
- const proxyHandlers = createProxyHandler((_conf$tools = conf.tools) === null || _conf$tools === void 0 ? void 0 : (_conf$tools$devServer = _conf$tools.devServer) === null || _conf$tools$devServer === void 0 ? void 0 : _conf$tools$devServer.proxy);
146
+ const proxyHandlers = createProxyHandler(dev.proxy);
104
147
 
105
148
  if (proxyHandlers) {
106
149
  proxyHandlers.forEach(handler => {
@@ -131,27 +174,14 @@ export class ModernDevServer extends ModernServer {
131
174
  } else {
132
175
  next();
133
176
  }
134
- }); // after dev handler
135
-
136
- const afterHandlers = await this.setupAfterDevMiddleware();
137
- afterHandlers.forEach(handler => {
138
- this.addHandler((ctx, next) => {
139
- const {
140
- req,
141
- res
142
- } = ctx;
143
- return handler(req, res, next);
144
- });
145
177
  });
146
- await super.onInit(runner, app); // watch mock/ server/ api/ dir file change
147
178
 
148
- if (dev.watch) {
149
- this.startWatcher();
150
- app.on('close', async () => {
151
- var _this$watcher;
152
-
153
- await ((_this$watcher = this.watcher) === null || _this$watcher === void 0 ? void 0 : _this$watcher.close());
154
- });
179
+ if (dev.historyApiFallback) {
180
+ const {
181
+ default: connectHistoryApiFallback
182
+ } = await import('connect-history-api-fallback');
183
+ const historyApiFallbackMiddleware = connectHistoryApiFallback(typeof dev.historyApiFallback === 'boolean' ? {} : dev.historyApiFallback);
184
+ this.addHandler((ctx, next) => historyApiFallbackMiddleware(ctx.req, ctx.res, next));
155
185
  }
156
186
  }
157
187
 
@@ -234,25 +264,23 @@ export class ModernDevServer extends ModernServer {
234
264
  }
235
265
 
236
266
  async setupBeforeDevMiddleware() {
237
- var _conf$tools$devServer2;
238
-
239
267
  const {
240
268
  runner,
241
- conf
269
+ conf,
270
+ dev
242
271
  } = this;
243
- const setupMids = ((_conf$tools$devServer2 = conf.tools.devServer) === null || _conf$tools$devServer2 === void 0 ? void 0 : _conf$tools$devServer2.before) || [];
272
+ const setupMids = dev.before || [];
244
273
  const pluginMids = await runner.beforeDevServer(conf);
245
274
  return [...setupMids, ...pluginMids].flat();
246
275
  }
247
276
 
248
277
  async setupAfterDevMiddleware() {
249
- var _conf$tools$devServer3;
250
-
251
278
  const {
252
279
  runner,
253
- conf
280
+ conf,
281
+ dev
254
282
  } = this;
255
- const setupMids = ((_conf$tools$devServer3 = conf.tools.devServer) === null || _conf$tools$devServer3 === void 0 ? void 0 : _conf$tools$devServer3.after) || [];
283
+ const setupMids = dev.after || [];
256
284
  const pluginMids = await runner.afterDevServer(conf);
257
285
  return [...pluginMids, ...setupMids].flat();
258
286
  }
@@ -12,8 +12,6 @@ const getDefaultDevOptions = () => {
12
12
  return {
13
13
  client: {
14
14
  port: '8080',
15
- overlay: false,
16
- logging: 'none',
17
15
  path: _utils.HMR_SOCK_PATH,
18
16
  host: (network === null || network === void 0 ? void 0 : network.address) || 'localhost'
19
17
  },
@@ -28,7 +28,7 @@ class DevMiddleware extends _events.EventEmitter {
28
28
  constructor({
29
29
  compiler,
30
30
  dev,
31
- config
31
+ devMiddleware
32
32
  }) {
33
33
  super();
34
34
 
@@ -40,11 +40,8 @@ class DevMiddleware extends _events.EventEmitter {
40
40
 
41
41
  _defineProperty(this, "socketServer", void 0);
42
42
 
43
- _defineProperty(this, "config", void 0);
44
-
45
43
  this.compiler = compiler;
46
- this.devOptions = dev;
47
- this.config = config; // init socket server
44
+ this.devOptions = dev; // init socket server
48
45
 
49
46
  this.socketServer = new _socketServer.default(dev); // Todo: should remove after abstract dev middleware
50
47
 
@@ -55,7 +52,7 @@ class DevMiddleware extends _events.EventEmitter {
55
52
 
56
53
  this.setupHooks(); // start dev middleware
57
54
 
58
- this.middleware = this.setupDevMiddleware();
55
+ this.middleware = this.setupDevMiddleware(devMiddleware);
59
56
  }
60
57
  }
61
58
 
@@ -87,6 +84,10 @@ class DevMiddleware extends _events.EventEmitter {
87
84
  }
88
85
  }
89
86
 
87
+ sockWrite(type, data) {
88
+ this.socketServer.sockWrite(type, data);
89
+ }
90
+
90
91
  setupHooks() {
91
92
  const invalidPlugin = () => {
92
93
  this.socketServer.sockWrite('invalid');
@@ -117,15 +118,12 @@ class DevMiddleware extends _events.EventEmitter {
117
118
  }
118
119
  }
119
120
 
120
- setupDevMiddleware() {
121
- var _config$tools, _config$tools$devServ;
122
-
121
+ setupDevMiddleware(devMiddleware = _webpackDevMiddleware.default) {
123
122
  const {
124
- config,
125
123
  devOptions
126
124
  } = this;
127
- const middleware = (0, _webpackDevMiddleware.default)(this.compiler, _objectSpread({
128
- 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,
125
+ const middleware = devMiddleware(this.compiler, _objectSpread({
126
+ headers: devOptions.headers,
129
127
  stats: false
130
128
  }, devOptions.devMiddleware));
131
129
  return middleware;
@@ -105,8 +105,6 @@ class SocketServer {
105
105
  }
106
106
 
107
107
  onConnect(socket) {
108
- var _this$options$client2, _this$options$client3, _this$options$client4;
109
-
110
108
  const connection = socket;
111
109
  connection.isAlive = true;
112
110
  connection.on('pong', () => {
@@ -126,24 +124,12 @@ class SocketServer {
126
124
  }
127
125
  });
128
126
 
129
- if ((_this$options$client2 = this.options.client) !== null && _this$options$client2 !== void 0 && _this$options$client2.logging) {
130
- this.singleWrite(connection, 'logging', this.options.client.logging);
131
- }
132
-
133
127
  if (this.options.hot || this.options.hot === 'only') {
134
128
  this.singleWrite(connection, 'hot');
135
129
  }
136
130
 
137
131
  if (this.options.liveReload) {
138
132
  this.singleWrite(connection, 'liveReload');
139
- }
140
-
141
- if ((_this$options$client3 = this.options.client) !== null && _this$options$client3 !== void 0 && _this$options$client3.progress) {
142
- this.singleWrite(connection, 'progress', this.options.client.progress);
143
- }
144
-
145
- if ((_this$options$client4 = this.options.client) !== null && _this$options$client4 !== void 0 && _this$options$client4.overlay) {
146
- this.singleWrite(connection, 'overlay', this.options.client.overlay);
147
133
  } // send first stats to active client sock if stats exist
148
134
 
149
135
 
@@ -25,12 +25,12 @@ var _watcher = _interopRequireWildcard(require("../dev-tools/watcher"));
25
25
 
26
26
  var _devMiddleware = _interopRequireDefault(require("../dev-tools/dev-middleware"));
27
27
 
28
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
+
28
30
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
29
31
 
30
32
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
31
33
 
32
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
33
-
34
34
  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; }
35
35
 
36
36
  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; }
@@ -56,7 +56,7 @@ class ModernDevServer extends _prodServer.ModernServer {
56
56
  this.devMiddleware = new _devMiddleware.default({
57
57
  dev: this.dev,
58
58
  compiler: options.compiler,
59
- config: this.conf
59
+ devMiddleware: options.devMiddleware
60
60
  });
61
61
  (0, _register.enableRegister)(this.pwd, this.conf);
62
62
  }
@@ -67,22 +67,10 @@ class ModernDevServer extends _prodServer.ModernServer {
67
67
  return _objectSpread(_objectSpread(_objectSpread({}, defaultOptions), devOptions), {}, {
68
68
  client: _objectSpread(_objectSpread({}, defaultOptions.client), devOptions === null || devOptions === void 0 ? void 0 : devOptions.client)
69
69
  });
70
- } // Complete the preparation of services
71
-
72
-
73
- async onInit(runner, app) {
74
- var _conf$tools, _conf$tools$devServer;
75
-
76
- this.runner = runner;
77
- const {
78
- conf,
79
- pwd,
80
- dev,
81
- devMiddleware
82
- } = this; // before dev handler
70
+ }
83
71
 
84
- const beforeHandlers = await this.setupBeforeDevMiddleware();
85
- beforeHandlers.forEach(handler => {
72
+ addMiddlewareHandler(handlers) {
73
+ handlers.forEach(handler => {
86
74
  this.addHandler((ctx, next) => {
87
75
  const {
88
76
  req,
@@ -91,9 +79,64 @@ class ModernDevServer extends _prodServer.ModernServer {
91
79
  return handler(req, res, next);
92
80
  });
93
81
  });
94
- this.addHandler((ctx, next) => {
95
- var _this$conf$tools$devS;
82
+ }
96
83
 
84
+ applySetupMiddlewares() {
85
+ const setupMiddlewares = this.dev.setupMiddlewares || [];
86
+ const serverOptions = {
87
+ sockWrite: (type, data) => this.devMiddleware.sockWrite(type, data)
88
+ };
89
+ const befores = [];
90
+ const afters = [];
91
+ setupMiddlewares.forEach(handler => {
92
+ handler({
93
+ unshift: (...handlers) => befores.unshift(...handlers),
94
+ push: (...handlers) => afters.push(...handlers)
95
+ }, serverOptions);
96
+ });
97
+ return {
98
+ befores,
99
+ afters
100
+ };
101
+ } // Complete the preparation of services
102
+
103
+
104
+ async onInit(runner, app) {
105
+ this.runner = runner;
106
+ const {
107
+ dev
108
+ } = this; // Order: devServer.before => setupMiddlewares.unshift => internal middlewares => setupMiddlewares.push => devServer.after
109
+
110
+ const {
111
+ befores,
112
+ afters
113
+ } = this.applySetupMiddlewares(); // before dev handler
114
+
115
+ const beforeHandlers = await this.setupBeforeDevMiddleware();
116
+ this.addMiddlewareHandler([...beforeHandlers, ...befores]);
117
+ await this.applyDefaultMiddlewares(app); // after dev handler
118
+
119
+ const afterHandlers = await this.setupAfterDevMiddleware();
120
+ this.addMiddlewareHandler([...afters, ...afterHandlers]);
121
+ await super.onInit(runner, app); // watch mock/ server/ api/ dir file change
122
+
123
+ if (dev.watch) {
124
+ this.startWatcher();
125
+ app.on('close', async () => {
126
+ var _this$watcher;
127
+
128
+ await ((_this$watcher = this.watcher) === null || _this$watcher === void 0 ? void 0 : _this$watcher.close());
129
+ });
130
+ }
131
+ }
132
+
133
+ async applyDefaultMiddlewares(app) {
134
+ const {
135
+ pwd,
136
+ dev,
137
+ devMiddleware
138
+ } = this;
139
+ this.addHandler((ctx, next) => {
97
140
  // allow hmr request cross-domain, because the user may use global proxy
98
141
  if (ctx.path.includes('hot-update')) {
99
142
  ctx.res.setHeader('Access-Control-Allow-Origin', '*');
@@ -101,7 +144,7 @@ class ModernDevServer extends _prodServer.ModernServer {
101
144
  } // 用户在 devServer 上配置的 headers 不会对 html 的请求生效,加入下面代码,使配置的 headers 对所有请求生效
102
145
 
103
146
 
104
- const confHeaders = (_this$conf$tools$devS = this.conf.tools.devServer) === null || _this$conf$tools$devS === void 0 ? void 0 : _this$conf$tools$devS.headers;
147
+ const confHeaders = dev.headers;
105
148
 
106
149
  if (confHeaders) {
107
150
  for (const [key, value] of Object.entries(confHeaders)) {
@@ -123,7 +166,7 @@ class ModernDevServer extends _prodServer.ModernServer {
123
166
  }
124
167
  }); // dev proxy handler, each proxy has own handler
125
168
 
126
- const proxyHandlers = (0, _prodServer.createProxyHandler)((_conf$tools = conf.tools) === null || _conf$tools === void 0 ? void 0 : (_conf$tools$devServer = _conf$tools.devServer) === null || _conf$tools$devServer === void 0 ? void 0 : _conf$tools$devServer.proxy);
169
+ const proxyHandlers = (0, _prodServer.createProxyHandler)(dev.proxy);
127
170
 
128
171
  if (proxyHandlers) {
129
172
  proxyHandlers.forEach(handler => {
@@ -154,27 +197,14 @@ class ModernDevServer extends _prodServer.ModernServer {
154
197
  } else {
155
198
  next();
156
199
  }
157
- }); // after dev handler
158
-
159
- const afterHandlers = await this.setupAfterDevMiddleware();
160
- afterHandlers.forEach(handler => {
161
- this.addHandler((ctx, next) => {
162
- const {
163
- req,
164
- res
165
- } = ctx;
166
- return handler(req, res, next);
167
- });
168
200
  });
169
- await super.onInit(runner, app); // watch mock/ server/ api/ dir file change
170
-
171
- if (dev.watch) {
172
- this.startWatcher();
173
- app.on('close', async () => {
174
- var _this$watcher;
175
201
 
176
- await ((_this$watcher = this.watcher) === null || _this$watcher === void 0 ? void 0 : _this$watcher.close());
177
- });
202
+ if (dev.historyApiFallback) {
203
+ const {
204
+ default: connectHistoryApiFallback
205
+ } = await Promise.resolve().then(() => _interopRequireWildcard(require('connect-history-api-fallback')));
206
+ const historyApiFallbackMiddleware = connectHistoryApiFallback(typeof dev.historyApiFallback === 'boolean' ? {} : dev.historyApiFallback);
207
+ this.addHandler((ctx, next) => historyApiFallbackMiddleware(ctx.req, ctx.res, next));
178
208
  }
179
209
  }
180
210
 
@@ -259,25 +289,23 @@ class ModernDevServer extends _prodServer.ModernServer {
259
289
  }
260
290
 
261
291
  async setupBeforeDevMiddleware() {
262
- var _conf$tools$devServer2;
263
-
264
292
  const {
265
293
  runner,
266
- conf
294
+ conf,
295
+ dev
267
296
  } = this;
268
- const setupMids = ((_conf$tools$devServer2 = conf.tools.devServer) === null || _conf$tools$devServer2 === void 0 ? void 0 : _conf$tools$devServer2.before) || [];
297
+ const setupMids = dev.before || [];
269
298
  const pluginMids = await runner.beforeDevServer(conf);
270
299
  return [...setupMids, ...pluginMids].flat();
271
300
  }
272
301
 
273
302
  async setupAfterDevMiddleware() {
274
- var _conf$tools$devServer3;
275
-
276
303
  const {
277
304
  runner,
278
- conf
305
+ conf,
306
+ dev
279
307
  } = this;
280
- const setupMids = ((_conf$tools$devServer3 = conf.tools.devServer) === null || _conf$tools$devServer3 === void 0 ? void 0 : _conf$tools$devServer3.after) || [];
308
+ const setupMids = dev.after || [];
281
309
  const pluginMids = await runner.afterDevServer(conf);
282
310
  return [...pluginMids, ...setupMids].flat();
283
311
  }
@@ -1,29 +1,27 @@
1
1
  /// <reference types="node" />
2
2
  /// <reference types="node" />
3
- import { Server, IncomingMessage, ServerResponse } from 'http';
3
+ import { Server } from 'http';
4
4
  import { EventEmitter } from 'events';
5
5
  import { Compiler, MultiCompiler } from 'webpack';
6
- import webpackDevMiddleware from '@modern-js/utils/webpack-dev-middleware';
7
- import type { NormalizedConfig } from '@modern-js/core';
8
- import { DevServerOptions } from '../../types';
6
+ import { DevServerOptions, DevMiddlewareAPI, CustomDevMiddleware } from '../../types';
9
7
  declare type Options = {
10
8
  compiler: MultiCompiler | Compiler | null;
11
9
  dev: DevServerOptions;
12
- config: NormalizedConfig;
10
+ devMiddleware?: CustomDevMiddleware;
13
11
  };
14
12
  export default class DevMiddleware extends EventEmitter {
15
- middleware?: webpackDevMiddleware.API<IncomingMessage, ServerResponse>;
13
+ middleware?: DevMiddlewareAPI;
16
14
  private compiler;
17
15
  private devOptions;
18
16
  private socketServer;
19
- private config;
20
17
  constructor({
21
18
  compiler,
22
19
  dev,
23
- config
20
+ devMiddleware
24
21
  }: Options);
25
22
  init(app: Server): void;
26
23
  private setupDevServerPlugin;
24
+ sockWrite(type: string, data?: Record<string, any> | string | boolean): void;
27
25
  private setupHooks;
28
26
  private setupDevMiddleware;
29
27
  private isClientCompiler;
@@ -11,7 +11,10 @@ export declare class ModernDevServer extends ModernServer {
11
11
  private watcher?;
12
12
  constructor(options: ModernDevServerOptions);
13
13
  private getDevOptions;
14
+ private addMiddlewareHandler;
15
+ private applySetupMiddlewares;
14
16
  onInit(runner: ServerHookRunner, app: Server): Promise<void>;
17
+ private applyDefaultMiddlewares;
15
18
  onRepack(options?: BuildOptions): void;
16
19
  createHTTPServer(handler: (req: IncomingMessage, res: ServerResponse, next?: () => void) => void): Promise<Server | import("https").Server>;
17
20
  protected warmupSSRBundle(): void;
@@ -1,9 +1,21 @@
1
+ /// <reference types="node" />
2
+ import type { IncomingMessage, ServerResponse } from 'http';
1
3
  import type webpack from 'webpack';
2
- import type { DevServerOptions, DevServerHttpsOptions } from '@modern-js/types';
4
+ import type { DevServerOptions, DevServerHttpsOptions, NextFunction } from '@modern-js/types';
3
5
  import type { ModernServerOptions } from '@modern-js/prod-server';
4
6
  export type { DevServerOptions, DevServerHttpsOptions };
7
+ declare type Middleware = (req: IncomingMessage, res: ServerResponse, next: NextFunction) => Promise<void>;
8
+ export declare type DevMiddlewareAPI = Middleware & {
9
+ close: (callback: (err: Error | null | undefined) => void) => any;
10
+ };
11
+ export declare type CustomDevMiddleware = (compiler: webpack.MultiCompiler | webpack.Compiler, options: {
12
+ headers?: Record<string, string>;
13
+ writeToDisk?: boolean | ((filename: string) => boolean);
14
+ stats?: boolean;
15
+ }) => DevMiddlewareAPI;
5
16
  export declare type ExtraOptions = {
6
17
  dev: boolean | Partial<DevServerOptions>;
7
18
  compiler: webpack.MultiCompiler | webpack.Compiler | null;
19
+ devMiddleware?: CustomDevMiddleware;
8
20
  };
9
21
  export declare type ModernDevServerOptions = ModernServerOptions & ExtraOptions;
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "modern",
12
12
  "modern.js"
13
13
  ],
14
- "version": "1.19.0",
14
+ "version": "1.20.1",
15
15
  "jsnext:source": "./src/index.ts",
16
16
  "types": "./dist/types/index.d.ts",
17
17
  "main": "./dist/js/node/index.js",
@@ -30,29 +30,32 @@
30
30
  "dependencies": {
31
31
  "@babel/core": "^7.18.0",
32
32
  "@babel/register": "^7.17.7",
33
- "@modern-js/prod-server": "1.19.0",
34
- "@modern-js/server-utils": "1.19.0",
35
- "@modern-js/types": "1.19.0",
36
- "@modern-js/utils": "1.19.0",
33
+ "@modern-js/prod-server": "1.20.1",
34
+ "@modern-js/server-utils": "1.20.1",
35
+ "@modern-js/types": "1.20.1",
36
+ "@modern-js/utils": "1.20.1",
37
+ "connect-history-api-fallback": "^2.0.0",
37
38
  "devcert": "^1.2.2",
38
39
  "minimatch": "^3.0.4",
39
40
  "path-to-regexp": "^6.2.0",
40
41
  "ws": "^8.2.0"
41
42
  },
42
43
  "devDependencies": {
43
- "@modern-js/core": "1.19.0",
44
- "@modern-js/server-core": "1.19.0",
45
- "@scripts/build": "1.19.0",
46
- "@scripts/jest-config": "1.19.0",
44
+ "@modern-js/core": "1.20.1",
45
+ "@modern-js/server-core": "1.20.1",
46
+ "@scripts/build": "1.20.1",
47
+ "@scripts/jest-config": "1.20.1",
48
+ "@types/connect-history-api-fallback": "^1.3.5",
47
49
  "@types/jest": "^27",
48
50
  "@types/minimatch": "^3.0.5",
49
51
  "@types/node": "^14",
50
52
  "@types/ws": "^7.4.7",
51
53
  "jest": "^27",
54
+ "node-mocks-http": "^1.11.0",
52
55
  "ts-node": "^10.1.0",
53
56
  "tsconfig-paths": "3.14.1",
54
57
  "typescript": "^4",
55
- "webpack": "^5.71.0",
58
+ "webpack": "^5.74.0",
56
59
  "websocket": "^1"
57
60
  },
58
61
  "peerDependencies": {