@modern-js/server 1.1.2 → 1.1.3-beta.0

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 (45) hide show
  1. package/dist/js/modern/libs/hook-api/route.js +37 -0
  2. package/dist/js/modern/libs/{hook-api.js → hook-api/template.js} +0 -0
  3. package/dist/js/modern/libs/route/index.js +4 -0
  4. package/dist/js/modern/libs/route/matcher.js +4 -0
  5. package/dist/js/modern/server/{web-server.js → dev-server/dev-server-split.js} +9 -7
  6. package/dist/js/modern/server/{dev-server.js → dev-server/dev-server.js} +41 -22
  7. package/dist/js/modern/server/dev-server/index.js +2 -0
  8. package/dist/js/modern/server/index.js +61 -62
  9. package/dist/js/modern/server/{api-server.js → modern-server-split.js} +6 -10
  10. package/dist/js/modern/server/modern-server.js +48 -20
  11. package/dist/js/modern/utils.js +2 -2
  12. package/dist/js/node/libs/hook-api/route.js +46 -0
  13. package/dist/js/node/libs/{hook-api.js → hook-api/template.js} +0 -0
  14. package/dist/js/node/libs/route/index.js +4 -0
  15. package/dist/js/node/libs/route/matcher.js +4 -0
  16. package/dist/js/node/server/{api-server.js → dev-server/dev-server-split.js} +7 -12
  17. package/dist/js/node/server/{dev-server.js → dev-server/dev-server.js} +42 -21
  18. package/dist/js/node/server/dev-server/index.js +27 -0
  19. package/dist/js/node/server/index.js +67 -63
  20. package/dist/js/node/server/{web-server.js → modern-server-split.js} +10 -9
  21. package/dist/js/node/server/modern-server.js +50 -20
  22. package/dist/js/node/utils.js +2 -2
  23. package/dist/types/libs/hook-api/route.d.ts +13 -0
  24. package/dist/types/libs/{hook-api.d.ts → hook-api/template.d.ts} +0 -0
  25. package/dist/types/libs/route/index.d.ts +1 -0
  26. package/dist/types/libs/route/matcher.d.ts +1 -0
  27. package/dist/types/server/{api-server.d.ts → dev-server/dev-server-split.d.ts} +7 -8
  28. package/dist/types/server/{dev-server.d.ts → dev-server/dev-server.d.ts} +6 -5
  29. package/dist/types/server/dev-server/index.d.ts +2 -0
  30. package/dist/types/server/index.d.ts +3 -1
  31. package/dist/types/server/{web-server.d.ts → modern-server-split.d.ts} +5 -4
  32. package/dist/types/server/modern-server.d.ts +6 -5
  33. package/dist/types/utils.d.ts +1 -1
  34. package/package.json +19 -17
  35. package/src/libs/hook-api/route.ts +38 -0
  36. package/src/libs/{hook-api.ts → hook-api/template.ts} +0 -0
  37. package/src/libs/route/index.ts +4 -0
  38. package/src/libs/route/matcher.ts +4 -0
  39. package/src/server/{api-server.ts → dev-server/dev-server-split.ts} +9 -11
  40. package/src/server/{dev-server.ts → dev-server/dev-server.ts} +56 -23
  41. package/src/server/dev-server/index.ts +2 -0
  42. package/src/server/index.ts +69 -46
  43. package/src/server/{web-server.ts → modern-server-split.ts} +12 -10
  44. package/src/server/modern-server.ts +54 -34
  45. package/src/utils.ts +2 -2
@@ -68,6 +68,10 @@ class RouteMatcher {
68
68
 
69
69
  return false;
70
70
  }
71
+ }
72
+
73
+ matchEntry(entryName) {
74
+ return this.spec.entryName === entryName;
71
75
  } // compiler urlPath to regexp if necessary
72
76
 
73
77
 
@@ -3,31 +3,26 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.APIModernServer = exports.APIModernDevServer = void 0;
6
+ exports.WebModernDevServer = exports.APIModernDevServer = void 0;
7
7
 
8
8
  var _devServer = require("./dev-server");
9
9
 
10
- var _modernServer = require("./modern-server");
11
-
12
- class APIModernServer extends _modernServer.ModernServer {
13
- prepareWebHandler(_) {
10
+ class WebModernDevServer extends _devServer.ModernDevServer {
11
+ prepareAPIHandler(_m, _) {
14
12
  return null;
15
13
  }
16
14
 
17
- async prepareAPIHandler(mode, extension) {
18
- return super.prepareAPIHandler(mode, extension);
15
+ async prepareWebHandler(extension) {
16
+ return super.prepareWebHandler(extension);
19
17
  }
20
18
 
21
19
  filterRoutes(routes) {
22
- return routes.filter(route => route.isApi);
23
- }
24
-
25
- async preServerInit() {// noop
20
+ return routes.filter(route => route.entryName);
26
21
  }
27
22
 
28
23
  }
29
24
 
30
- exports.APIModernServer = APIModernServer;
25
+ exports.WebModernDevServer = WebModernDevServer;
31
26
 
32
27
  class APIModernDevServer extends _devServer.ModernDevServer {
33
28
  prepareWebHandler(_) {
@@ -5,31 +5,35 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.ModernDevServer = void 0;
7
7
 
8
+ var _http = require("http");
9
+
8
10
  var _path = _interopRequireDefault(require("path"));
9
11
 
12
+ var _https = require("https");
13
+
10
14
  var _utils = require("@modern-js/utils");
11
15
 
12
16
  var _webpackDevMiddleware = _interopRequireDefault(require("webpack-dev-middleware"));
13
17
 
14
- var _mock = require("../dev-tools/mock");
18
+ var _modernServer = require("../modern-server");
15
19
 
16
- var _proxy = require("../libs/proxy");
20
+ var _mock = require("../../dev-tools/mock");
17
21
 
18
- var _socketServer = _interopRequireDefault(require("../dev-tools/socket-server"));
22
+ var _proxy = require("../../libs/proxy");
19
23
 
20
- var _devServerPlugin = _interopRequireDefault(require("../dev-tools/dev-server-plugin"));
24
+ var _socketServer = _interopRequireDefault(require("../../dev-tools/socket-server"));
21
25
 
22
- var _launchEditor = require("../dev-tools/launch-editor");
26
+ var _devServerPlugin = _interopRequireDefault(require("../../dev-tools/dev-server-plugin"));
23
27
 
24
- var _register = require("../dev-tools/babel/register");
28
+ var _launchEditor = require("../../dev-tools/launch-editor");
25
29
 
26
- var reader = _interopRequireWildcard(require("../libs/render/reader"));
30
+ var _register = require("../../dev-tools/babel/register");
27
31
 
28
- var _watcher = _interopRequireDefault(require("../dev-tools/watcher"));
32
+ var reader = _interopRequireWildcard(require("../../libs/render/reader"));
29
33
 
30
- var _modernServer = require("./modern-server");
34
+ var _watcher = _interopRequireDefault(require("../../dev-tools/watcher"));
31
35
 
32
- var _constants = require("../constants");
36
+ var _constants = require("../../constants");
33
37
 
34
38
  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); }
35
39
 
@@ -54,8 +58,8 @@ const DEFAULT_DEV_OPTIONS = {
54
58
  };
55
59
 
56
60
  class ModernDevServer extends _modernServer.ModernServer {
57
- constructor(options, runner) {
58
- super(options, runner); // set webpack compiler
61
+ constructor(options) {
62
+ super(options); // set webpack compiler
59
63
 
60
64
  this.devProxyHandler = null;
61
65
  this.mockHandler = null;
@@ -67,18 +71,18 @@ class ModernDevServer extends _modernServer.ModernServer {
67
71
  this.compiler = options.compiler; // set dev server options, like webpack-dev-server
68
72
 
69
73
  this.dev = typeof options.dev === 'boolean' ? DEFAULT_DEV_OPTIONS : options.dev;
74
+ (0, _register.enableRegister)(this.pwd, this.conf);
70
75
  } // Complete the preparation of services
71
76
 
72
77
 
73
- async init() {
78
+ async init(runner) {
74
79
  var _conf$tools, _conf$tools$devServer;
75
80
 
76
81
  const {
77
82
  conf,
78
83
  pwd,
79
84
  compiler
80
- } = this;
81
- (0, _register.enableRegister)(pwd, conf); // mock handler
85
+ } = this; // mock handler
82
86
 
83
87
  this.mockHandler = (0, _mock.createMockHandler)({
84
88
  pwd
@@ -113,7 +117,7 @@ class ModernDevServer extends _modernServer.ModernServer {
113
117
  this.addHandler(devMiddlewareHandler);
114
118
  }
115
119
 
116
- await super.init(); // watch mock/ server/ api/ dir file change
120
+ await super.init(runner); // watch mock/ server/ api/ dir file change
117
121
 
118
122
  this.startWatcher();
119
123
  }
@@ -124,6 +128,7 @@ class ModernDevServer extends _modernServer.ModernServer {
124
128
  this.cleanSSRCache(); // reset static file
125
129
 
126
130
  reader.updateFile();
131
+ this.runner.reset();
127
132
  }
128
133
 
129
134
  onListening(app) {
@@ -140,6 +145,24 @@ class ModernDevServer extends _modernServer.ModernServer {
140
145
  resolve();
141
146
  });
142
147
  });
148
+ }
149
+
150
+ async createHTTPServer(handler) {
151
+ const {
152
+ dev
153
+ } = this;
154
+ const devHttpsOption = typeof dev === 'object' && dev.https;
155
+
156
+ if (devHttpsOption) {
157
+ const {
158
+ genHttpsOptions
159
+ } = require("../../dev-tools/https");
160
+
161
+ const httpsOptions = await genHttpsOptions(devHttpsOption);
162
+ return (0, _https.createServer)(httpsOptions, handler);
163
+ } else {
164
+ return (0, _http.createServer)(handler);
165
+ }
143
166
  } // set up plugin to each compiler
144
167
  // register hooks for each compilation, update socket stats if recompiled
145
168
  // start dev middleware
@@ -234,18 +257,16 @@ class ModernDevServer extends _modernServer.ModernServer {
234
257
  pwd
235
258
  } = this;
236
259
  const {
237
- mock,
238
- server,
239
- api,
240
- shared
260
+ mock
241
261
  } = _constants.AGGRED_DIR;
242
- const defaultWatched = [`${pwd}/${mock}/**/*`, `${pwd}/${server}/**/*`, `${pwd}/${api}/**/*`, `${pwd}/${shared}/**/*`];
262
+ const defaultWatched = [`${pwd}/${mock}/**/*`, `${pwd}/${_utils.SERVER_DIR}/**/*`, `${pwd}/${_utils.API_DIR}/**/*`, `${pwd}/${_utils.SHARED_DIR}/**/*`];
243
263
  const watcher = new _watcher.default();
244
264
  watcher.createDepTree(); // 监听文件变动,如果有变动则给 client,也就是 start 启动的插件发消息
245
265
 
246
266
  watcher.listen(defaultWatched, filepath => {
247
267
  watcher.updateDepTree();
248
268
  watcher.cleanDepCache(filepath);
269
+ this.runner.reset();
249
270
 
250
271
  if (filepath.startsWith(`${pwd}/${mock}`)) {
251
272
  this.mockHandler = (0, _mock.createMockHandler)({
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "APIModernDevServer", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _devServerSplit.APIModernDevServer;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "ModernDevServer", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _devServer.ModernDevServer;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "WebModernDevServer", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _devServerSplit.WebModernDevServer;
22
+ }
23
+ });
24
+
25
+ var _devServerSplit = require("./dev-server-split");
26
+
27
+ var _devServer = require("./dev-server");
@@ -5,30 +5,35 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.Server = void 0;
7
7
 
8
- var _http = require("http");
9
-
10
- var _https = require("https");
8
+ var _path = _interopRequireDefault(require("path"));
11
9
 
12
10
  var _serverPlugin = require("@modern-js/server-plugin");
13
11
 
14
12
  var _utils = require("@modern-js/utils");
15
13
 
14
+ var _core = require("@modern-js/core");
15
+
16
16
  var _modernServer = require("./modern-server");
17
17
 
18
+ var _modernServerSplit = require("./modern-server-split");
19
+
18
20
  var _measure = require("../libs/measure");
19
21
 
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
+
24
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
25
+
26
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
27
+
28
+ 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; }
29
+
20
30
  class Server {
21
31
  constructor(options) {
22
- var _options$plugins;
23
-
24
32
  this.options = void 0;
25
33
  this.server = void 0;
26
34
  this.app = void 0;
27
35
  this.runner = void 0;
28
36
  this.options = options;
29
- (_options$plugins = options.plugins) === null || _options$plugins === void 0 ? void 0 : _options$plugins.forEach(p => {
30
- _serverPlugin.serverManager.usePlugin(p);
31
- });
32
37
  }
33
38
 
34
39
  getRequestHandler() {
@@ -46,40 +51,20 @@ class Server {
46
51
  const {
47
52
  options
48
53
  } = this;
49
- this.runner = await _serverPlugin.serverManager.init({});
50
- const {
51
- logger,
52
- measure
53
- } = await this.runner.create({
54
- loggerOptions: options.logger,
55
- measureOptions: options.measure
56
- }, {
57
- onLast: () => ({})
58
- });
59
- options.logger = options.logger || logger || _utils.logger;
60
- options.measure = options.measure || measure || _measure.measure;
54
+ options.logger = options.logger || _utils.logger;
55
+ options.measure = options.measure || _measure.measure; // initialize server
61
56
 
62
57
  if (options.dev) {
63
- this.server = this.createDevServer(); // check if https is configured when start dev server
64
-
65
- const devHttpsOption = typeof options.dev === 'object' && options.dev.https;
66
-
67
- if (devHttpsOption) {
68
- const {
69
- genHttpsOptions
70
- } = require("../dev-tools/https");
71
-
72
- const httpsOptions = await genHttpsOptions(devHttpsOption);
73
- this.app = (0, _https.createServer)(httpsOptions, this.getRequestHandler());
74
- } else {
75
- this.app = (0, _http.createServer)(this.getRequestHandler());
76
- }
58
+ this.server = this.createDevServer();
77
59
  } else {
78
60
  this.server = this.createProdServer();
79
- this.app = (0, _http.createServer)(this.getRequestHandler());
80
- }
61
+ } // check if https is configured when start dev server
62
+
63
+
64
+ this.app = await this.server.createHTTPServer(this.getRequestHandler());
65
+ this.runner = await this.createHookRunner(); // runner can only be used after server init
81
66
 
82
- await this.server.init();
67
+ await this.server.init(this.runner);
83
68
  return this;
84
69
  }
85
70
 
@@ -110,19 +95,11 @@ class Server {
110
95
  } = this;
111
96
 
112
97
  if (options.apiOnly) {
113
- const {
114
- APIModernServer
115
- } = require("./api-server");
116
-
117
- return new APIModernServer(options, this.runner);
98
+ return new _modernServerSplit.APIModernServer(options);
118
99
  } else if (options.webOnly) {
119
- const {
120
- WebModernServer
121
- } = require("./web-server");
122
-
123
- return new WebModernServer(options, this.runner);
100
+ return new _modernServerSplit.WebModernServer(options);
124
101
  } else {
125
- return new _modernServer.ModernServer(options, this.runner);
102
+ return new _modernServer.ModernServer(options);
126
103
  }
127
104
  }
128
105
 
@@ -131,27 +108,54 @@ class Server {
131
108
  options
132
109
  } = this;
133
110
 
134
- if (options.apiOnly) {
135
- const {
136
- APIModernDevServer
137
- } = require("./api-server");
111
+ const {
112
+ APIModernDevServer,
113
+ WebModernDevServer,
114
+ ModernDevServer
115
+ } = require("./dev-server");
138
116
 
139
- return new APIModernDevServer(options, this.runner);
117
+ if (options.apiOnly) {
118
+ return new APIModernDevServer(options);
140
119
  } else if (options.webOnly) {
141
- const {
142
- WebModernDevServer
143
- } = require("./web-server");
144
-
145
- return new WebModernDevServer(options, this.runner);
120
+ return new WebModernDevServer(options);
146
121
  } else {
147
- const {
148
- ModernDevServer
149
- } = require("./dev-server");
150
-
151
- return new ModernDevServer(options, this.runner);
122
+ return new ModernDevServer(options);
152
123
  }
153
124
  }
154
125
 
126
+ async createHookRunner() {
127
+ var _options$plugins;
128
+
129
+ const {
130
+ options
131
+ } = this;
132
+ const appContext = await this.initAppContext();
133
+
134
+ _serverPlugin.serverManager.run(() => {
135
+ _core.AppContext.set(_objectSpread(_objectSpread({}, appContext), {}, {
136
+ distDirectory: _path.default.join(options.pwd, options.config.output.path || 'dist')
137
+ }));
138
+ });
139
+
140
+ (_options$plugins = options.plugins) === null || _options$plugins === void 0 ? void 0 : _options$plugins.forEach(p => {
141
+ _serverPlugin.serverManager.usePlugin(p);
142
+ });
143
+ return _serverPlugin.serverManager.init({});
144
+ }
145
+
146
+ async initAppContext() {
147
+ var _this$options$plugins;
148
+
149
+ const appDirectory = await (0, _core.initAppDir)();
150
+ const loaded = await (0, _core.loadUserConfig)(appDirectory);
151
+ const plugins = (_this$options$plugins = this.options.plugins) === null || _this$options$plugins === void 0 ? void 0 : _this$options$plugins.map(p => ({
152
+ server: p,
153
+ cli: undefined
154
+ }));
155
+ const appContext = (0, _core.initAppContext)(appDirectory, plugins || [], loaded.filePath);
156
+ return appContext;
157
+ }
158
+
155
159
  }
156
160
 
157
161
  exports.Server = Server;
@@ -3,9 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.WebModernServer = exports.WebModernDevServer = void 0;
7
-
8
- var _devServer = require("./dev-server");
6
+ exports.WebModernServer = exports.APIModernServer = void 0;
9
7
 
10
8
  var _modernServer = require("./modern-server");
11
9
 
@@ -26,19 +24,22 @@ class WebModernServer extends _modernServer.ModernServer {
26
24
 
27
25
  exports.WebModernServer = WebModernServer;
28
26
 
29
- class WebModernDevServer extends _devServer.ModernDevServer {
30
- prepareAPIHandler(_m, _) {
27
+ class APIModernServer extends _modernServer.ModernServer {
28
+ prepareWebHandler(_) {
31
29
  return null;
32
30
  }
33
31
 
34
- async prepareWebHandler(extension) {
35
- return super.prepareWebHandler(extension);
32
+ async prepareAPIHandler(mode, extension) {
33
+ return super.prepareAPIHandler(mode, extension);
36
34
  }
37
35
 
38
36
  filterRoutes(routes) {
39
- return routes.filter(route => route.entryName);
37
+ return routes.filter(route => route.isApi);
38
+ }
39
+
40
+ async preServerInit() {// noop
40
41
  }
41
42
 
42
43
  }
43
44
 
44
- exports.WebModernDevServer = WebModernDevServer;
45
+ exports.APIModernServer = APIModernServer;
@@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.ModernServer = void 0;
7
7
 
8
+ var _http = require("http");
9
+
8
10
  var _util = _interopRequireDefault(require("util"));
9
11
 
10
12
  var _path = _interopRequireDefault(require("path"));
@@ -33,7 +35,9 @@ var _context = require("../libs/context");
33
35
 
34
36
  var _constants = require("../constants");
35
37
 
36
- var _hookApi = require("../libs/hook-api");
38
+ var _template = require("../libs/hook-api/template");
39
+
40
+ var _route2 = require("../libs/hook-api/route");
37
41
 
38
42
  const _excluded = ["getMiddlewares"];
39
43
 
@@ -68,7 +72,7 @@ class ModernServer {
68
72
  staticGenerate,
69
73
  logger,
70
74
  measure
71
- }, runner) {
75
+ }) {
72
76
  this.pwd = void 0;
73
77
  this.distDir = void 0;
74
78
  this.workDir = void 0;
@@ -76,9 +80,9 @@ class ModernServer {
76
80
  this.conf = void 0;
77
81
  this.handlers = [];
78
82
  this.presetRoutes = void 0;
83
+ this.runner = void 0;
79
84
  this.logger = void 0;
80
85
  this.measure = void 0;
81
- this.runner = void 0;
82
86
  this.isDev = false;
83
87
  this.staticFileHandler = void 0;
84
88
  this.routeRenderHandler = void 0;
@@ -95,7 +99,6 @@ class ModernServer {
95
99
  this.distDir = _path.default.join(pwd, config.output.path || '');
96
100
  this.workDir = this.isDev ? pwd : this.distDir;
97
101
  this.conf = config;
98
- this.runner = runner;
99
102
  this.logger = logger;
100
103
  this.measure = measure;
101
104
  this.router = new _route.RouteMatchManager();
@@ -114,9 +117,10 @@ class ModernServer {
114
117
  } // server prepare
115
118
 
116
119
 
117
- async init() {
120
+ async init(runner) {
118
121
  var _conf$bff;
119
122
 
123
+ this.runner = runner;
120
124
  const {
121
125
  distDir,
122
126
  isDev,
@@ -181,6 +185,10 @@ class ModernServer {
181
185
 
182
186
  close() {
183
187
  reader.close();
188
+ }
189
+
190
+ async createHTTPServer(handler) {
191
+ return (0, _http.createServer)(handler);
184
192
  } // warmup ssr function
185
193
 
186
194
 
@@ -230,12 +238,7 @@ class ModernServer {
230
238
  const {
231
239
  workDir,
232
240
  runner
233
- } = this; // inner tool, gather user inject
234
-
235
- const {
236
- api: userAPIExt,
237
- web: userWebExt
238
- } = (0, _serverUtils.gather)(workDir); // server hook, gather plugin inject
241
+ } = this; // server hook, gather plugin inject
239
242
 
240
243
  const _createMiddlewareColl = (0, _serverUtils.createMiddlewareCollecter)(),
241
244
  {
@@ -255,15 +258,17 @@ class ModernServer {
255
258
 
256
259
 
257
260
  if (await _utils.fs.pathExists(_path.default.join(serverDir))) {
258
- const webExtension = (0, _utils2.mergeExtension)(pluginWebExt, userWebExt);
261
+ const webExtension = (0, _utils2.mergeExtension)(pluginWebExt);
259
262
  this.frameWebHandler = await this.prepareWebHandler(webExtension);
260
263
  }
261
264
 
262
265
  if (_utils.fs.existsSync(apiDir)) {
263
266
  const mode = _utils.fs.existsSync(_path.default.join(apiDir, _constants.AGGRED_DIR.lambda)) ? _constants.ApiServerMode.frame : _constants.ApiServerMode.func; // if use lambda/, mean framework style of writing, then discard user extension
264
267
 
265
- const apiExtension = (0, _utils2.mergeExtension)(pluginAPIExt, mode === _constants.ApiServerMode.frame ? [] : userAPIExt);
266
- this.frameAPIHandler = await this.prepareAPIHandler(mode, apiExtension);
268
+ const apiExtension = (0, _utils2.mergeExtension)(pluginAPIExt);
269
+ this.frameAPIHandler = await this.prepareAPIHandler(mode, _objectSpread(_objectSpread({}, apiExtension), {}, {
270
+ modernJsConfig: this.conf
271
+ }));
267
272
  }
268
273
  }
269
274
  /* —————————————————————— function will be overwrite —————————————————————— */
@@ -296,7 +301,7 @@ class ModernServer {
296
301
  pwd: workDir,
297
302
  mode,
298
303
  config: extension,
299
- prefix
304
+ prefix: Array.isArray(prefix) ? prefix[0] : prefix
300
305
  }, {
301
306
  onLast: () => null
302
307
  });
@@ -311,7 +316,7 @@ class ModernServer {
311
316
  conf
312
317
  } = this;
313
318
  const preMiddleware = await this.runner.preServerInit(conf);
314
- preMiddleware.forEach(mid => {
319
+ preMiddleware.flat().forEach(mid => {
315
320
  this.addHandler(mid);
316
321
  });
317
322
  }
@@ -344,7 +349,12 @@ class ModernServer {
344
349
  const {
345
350
  req,
346
351
  res
347
- } = context; // match routes in the route spec
352
+ } = context;
353
+ await this.runner.beforeMatch({
354
+ context
355
+ }, {
356
+ onLast: _utils2.noop
357
+ }); // match routes in the route spec
348
358
 
349
359
  const matched = this.router.match(context.url);
350
360
 
@@ -353,8 +363,23 @@ class ModernServer {
353
363
  return;
354
364
  }
355
365
 
356
- const route = matched.generate();
357
- const params = matched.parseURLParams(context.url);
366
+ const routeAPI = (0, _route2.createRouteAPI)(matched, this.router);
367
+ await this.runner.afterMatch({
368
+ context,
369
+ routeAPI
370
+ }, {
371
+ onLast: _utils2.noop
372
+ });
373
+
374
+ if (res.headersSent) {
375
+ return;
376
+ }
377
+
378
+ const {
379
+ current
380
+ } = routeAPI;
381
+ const route = current.generate();
382
+ const params = current.parseURLParams(context.url);
358
383
  context.setParams(params); // route is api service
359
384
 
360
385
  if (route.isApi) {
@@ -375,6 +400,11 @@ class ModernServer {
375
400
  return;
376
401
  }
377
402
 
403
+ await this.runner.beforeRender({
404
+ context
405
+ }, {
406
+ onLast: _utils2.noop
407
+ });
378
408
  const file = await this.routeRenderHandler(context, route);
379
409
 
380
410
  if (!file) {
@@ -392,7 +422,7 @@ class ModernServer {
392
422
  let response = file.content;
393
423
 
394
424
  if (route.entryName) {
395
- const templateAPI = (0, _hookApi.createTemplateAPI)(file.content.toString());
425
+ const templateAPI = (0, _template.createTemplateAPI)(file.content.toString());
396
426
  await this.runner.afterRender({
397
427
  context,
398
428
  templateAPI
@@ -5,10 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.toMessage = exports.noop = exports.mergeExtension = exports.createErrorDocument = void 0;
7
7
 
8
- const mergeExtension = (users, plugins) => {
8
+ const mergeExtension = users => {
9
9
  const output = [];
10
10
  return {
11
- middleware: output.concat(users).concat(plugins)
11
+ middleware: output.concat(users)
12
12
  };
13
13
  };
14
14
 
@@ -0,0 +1,13 @@
1
+ import { RouteMatchManager, RouteMatcher } from '../route';
2
+
3
+ declare class RouteAPI {
4
+ private readonly router;
5
+ private current;
6
+ constructor(matched: RouteMatcher, router: RouteMatchManager);
7
+ cur(): import("../route").ModernRoute;
8
+ get(entryName: string): import("../route").ModernRoute | null;
9
+ use(entryName: string): boolean;
10
+ }
11
+
12
+ export declare const createRouteAPI: (matched: RouteMatcher, router: RouteMatchManager) => RouteAPI;
13
+ export {};
@@ -8,6 +8,7 @@ export declare class RouteMatchManager {
8
8
  private best;
9
9
  reset(specs: ModernRouteInterface[]): void;
10
10
  match(pathname: string): RouteMatcher | undefined;
11
+ matchEntry(entryname: string): RouteMatcher | undefined;
11
12
  getBundles(): (string | undefined)[];
12
13
  }
13
14
  export type { ModernRouteInterface, RouteMatcher, ModernRoute };
@@ -10,5 +10,6 @@ export declare class RouteMatcher {
10
10
  parseURLParams(pathname: string): Record<string, string>;
11
11
  matchLength(pathname: string): number | null;
12
12
  matchUrlPath(requestUrl: string): boolean;
13
+ matchEntry(entryName: string): boolean;
13
14
  private setupUrlPath;
14
15
  }