@modern-js/server 1.1.2 → 1.1.4-rc.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 (67) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/dist/js/modern/dev-tools/babel/register.js +2 -2
  3. package/dist/js/modern/dev-tools/mock/getMockData.js +2 -2
  4. package/dist/js/modern/libs/hook-api/route.js +37 -0
  5. package/dist/js/modern/libs/{hook-api.js → hook-api/template.js} +0 -0
  6. package/dist/js/modern/libs/proxy.js +2 -2
  7. package/dist/js/modern/libs/render/cache/__tests__/cache.test.js +2 -2
  8. package/dist/js/modern/libs/render/cache/index.js +2 -2
  9. package/dist/js/modern/libs/render/cache/type.js +0 -1
  10. package/dist/js/modern/libs/route/index.js +4 -0
  11. package/dist/js/modern/libs/route/matcher.js +4 -0
  12. package/dist/js/modern/server/dev-server/dev-server-split.js +28 -0
  13. package/dist/js/modern/server/{dev-server.js → dev-server/dev-server.js} +41 -22
  14. package/dist/js/modern/server/dev-server/index.js +2 -0
  15. package/dist/js/modern/server/index.js +64 -62
  16. package/dist/js/modern/server/modern-server-split.js +81 -0
  17. package/dist/js/modern/server/modern-server.js +117 -59
  18. package/dist/js/modern/type.js +0 -1
  19. package/dist/js/modern/utils.js +11 -3
  20. package/dist/js/node/dev-tools/babel/register.js +2 -2
  21. package/dist/js/node/dev-tools/mock/getMockData.js +2 -2
  22. package/dist/js/node/libs/hook-api/route.js +46 -0
  23. package/dist/js/node/libs/{hook-api.js → hook-api/template.js} +0 -0
  24. package/dist/js/node/libs/proxy.js +2 -2
  25. package/dist/js/node/libs/render/cache/__tests__/cache.test.js +2 -2
  26. package/dist/js/node/libs/render/cache/index.js +2 -2
  27. package/dist/js/node/libs/route/index.js +4 -0
  28. package/dist/js/node/libs/route/matcher.js +4 -0
  29. package/dist/js/node/server/dev-server/dev-server-split.js +41 -0
  30. package/dist/js/node/server/{dev-server.js → dev-server/dev-server.js} +42 -21
  31. package/dist/js/node/server/dev-server/index.js +27 -0
  32. package/dist/js/node/server/index.js +71 -63
  33. package/dist/js/node/server/modern-server-split.js +97 -0
  34. package/dist/js/node/server/modern-server.js +120 -60
  35. package/dist/js/node/utils.js +14 -4
  36. package/dist/types/libs/hook-api/route.d.ts +13 -0
  37. package/dist/types/libs/{hook-api.d.ts → hook-api/template.d.ts} +0 -0
  38. package/dist/types/libs/route/index.d.ts +1 -0
  39. package/dist/types/libs/route/matcher.d.ts +1 -0
  40. package/dist/types/server/dev-server/dev-server-split.d.ts +15 -0
  41. package/dist/types/server/{dev-server.d.ts → dev-server/dev-server.d.ts} +6 -5
  42. package/dist/types/server/dev-server/index.d.ts +2 -0
  43. package/dist/types/server/index.d.ts +3 -1
  44. package/dist/types/server/modern-server-split.d.ts +26 -0
  45. package/dist/types/server/modern-server.d.ts +19 -11
  46. package/dist/types/type.d.ts +5 -0
  47. package/dist/types/utils.d.ts +3 -2
  48. package/package.json +12 -11
  49. package/src/libs/hook-api/route.ts +38 -0
  50. package/src/libs/{hook-api.ts → hook-api/template.ts} +0 -0
  51. package/src/libs/route/index.ts +4 -0
  52. package/src/libs/route/matcher.ts +4 -0
  53. package/src/server/{web-server.ts → dev-server/dev-server-split.ts} +12 -14
  54. package/src/server/{dev-server.ts → dev-server/dev-server.ts} +62 -33
  55. package/src/server/dev-server/index.ts +2 -0
  56. package/src/server/index.ts +80 -47
  57. package/src/server/modern-server-split.ts +97 -0
  58. package/src/server/modern-server.ts +135 -81
  59. package/src/type.ts +5 -0
  60. package/src/utils.ts +16 -2
  61. package/dist/js/modern/server/api-server.js +0 -36
  62. package/dist/js/modern/server/web-server.js +0 -30
  63. package/dist/js/node/server/api-server.js +0 -50
  64. package/dist/js/node/server/web-server.js +0 -44
  65. package/dist/types/server/api-server.d.ts +0 -17
  66. package/dist/types/server/web-server.d.ts +0 -15
  67. package/src/server/api-server.ts +0 -47
@@ -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
 
@@ -43,9 +47,9 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
43
47
 
44
48
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
45
49
 
46
- 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; }
50
+ 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; }
47
51
 
48
- 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; }
52
+ 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; }
49
53
 
50
54
  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; }
51
55
 
@@ -67,8 +71,9 @@ class ModernServer {
67
71
  routes,
68
72
  staticGenerate,
69
73
  logger,
70
- measure
71
- }, runner) {
74
+ measure,
75
+ proxyTarget
76
+ }) {
72
77
  this.pwd = void 0;
73
78
  this.distDir = void 0;
74
79
  this.workDir = void 0;
@@ -76,9 +81,10 @@ class ModernServer {
76
81
  this.conf = void 0;
77
82
  this.handlers = [];
78
83
  this.presetRoutes = void 0;
84
+ this.runner = void 0;
79
85
  this.logger = void 0;
80
86
  this.measure = void 0;
81
- this.runner = void 0;
87
+ this.proxyTarget = void 0;
82
88
  this.isDev = false;
83
89
  this.staticFileHandler = void 0;
84
90
  this.routeRenderHandler = void 0;
@@ -92,14 +98,14 @@ class ModernServer {
92
98
 
93
99
  this.isDev = Boolean(dev);
94
100
  this.pwd = pwd;
95
- this.distDir = _path.default.join(pwd, config.output.path || '');
101
+ this.distDir = _path.default.join(pwd, config.output.path || 'dist');
96
102
  this.workDir = this.isDev ? pwd : this.distDir;
97
103
  this.conf = config;
98
- this.runner = runner;
99
104
  this.logger = logger;
100
105
  this.measure = measure;
101
106
  this.router = new _route.RouteMatchManager();
102
107
  this.presetRoutes = routes;
108
+ this.proxyTarget = proxyTarget;
103
109
 
104
110
  if (staticGenerate) {
105
111
  this.staticGenerate = staticGenerate;
@@ -114,9 +120,10 @@ class ModernServer {
114
120
  } // server prepare
115
121
 
116
122
 
117
- async init() {
123
+ async init(runner) {
118
124
  var _conf$bff;
119
125
 
126
+ this.runner = runner;
120
127
  const {
121
128
  distDir,
122
129
  isDev,
@@ -181,20 +188,10 @@ class ModernServer {
181
188
 
182
189
  close() {
183
190
  reader.close();
184
- } // warmup ssr function
185
-
186
-
187
- warmupSSRBundle() {
188
- const {
189
- distDir
190
- } = this;
191
- const bundles = this.router.getBundles();
192
- bundles.forEach(bundle => {
193
- const filepath = _path.default.join(distDir, bundle); // if error, just throw and let process die
194
-
191
+ }
195
192
 
196
- require(filepath);
197
- });
193
+ async createHTTPServer(handler) {
194
+ return (0, _http.createServer)(handler);
198
195
  } // read route spec from route.json
199
196
 
200
197
 
@@ -230,12 +227,7 @@ class ModernServer {
230
227
  const {
231
228
  workDir,
232
229
  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
230
+ } = this; // server hook, gather plugin inject
239
231
 
240
232
  const _createMiddlewareColl = (0, _serverUtils.createMiddlewareCollecter)(),
241
233
  {
@@ -255,16 +247,21 @@ class ModernServer {
255
247
 
256
248
 
257
249
  if (await _utils.fs.pathExists(_path.default.join(serverDir))) {
258
- const webExtension = (0, _utils2.mergeExtension)(pluginWebExt, userWebExt);
250
+ const webExtension = (0, _utils2.mergeExtension)(pluginWebExt);
259
251
  this.frameWebHandler = await this.prepareWebHandler(webExtension);
260
252
  }
261
253
 
262
254
  if (_utils.fs.existsSync(apiDir)) {
263
255
  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
256
 
265
- const apiExtension = (0, _utils2.mergeExtension)(pluginAPIExt, mode === _constants.ApiServerMode.frame ? [] : userAPIExt);
257
+ const apiExtension = (0, _utils2.mergeExtension)(pluginAPIExt);
266
258
  this.frameAPIHandler = await this.prepareAPIHandler(mode, apiExtension);
267
259
  }
260
+ } // Todo
261
+
262
+
263
+ async proxy() {
264
+ return null;
268
265
  }
269
266
  /* —————————————————————— function will be overwrite —————————————————————— */
270
267
 
@@ -296,7 +293,7 @@ class ModernServer {
296
293
  pwd: workDir,
297
294
  mode,
298
295
  config: extension,
299
- prefix
296
+ prefix: Array.isArray(prefix) ? prefix[0] : prefix
300
297
  }, {
301
298
  onLast: () => null
302
299
  });
@@ -306,34 +303,55 @@ class ModernServer {
306
303
  return routes;
307
304
  }
308
305
 
306
+ async emitRouteHook(eventName, input) {
307
+ return this.runner[eventName](input, {
308
+ onLast: _utils2.noop
309
+ });
310
+ } // warmup ssr function
311
+
312
+
313
+ warmupSSRBundle() {
314
+ const {
315
+ distDir
316
+ } = this;
317
+ const bundles = this.router.getBundles();
318
+ bundles.forEach(bundle => {
319
+ const filepath = _path.default.join(distDir, bundle); // if error, just throw and let process die
320
+
321
+
322
+ require(filepath);
323
+ });
324
+ }
325
+
309
326
  async preServerInit() {
310
327
  const {
311
- conf
328
+ conf,
329
+ runner
312
330
  } = this;
313
- const preMiddleware = await this.runner.preServerInit(conf);
314
- preMiddleware.forEach(mid => {
331
+ const preMiddleware = await runner.preServerInit(conf);
332
+ preMiddleware.flat().forEach(mid => {
315
333
  this.addHandler(mid);
316
334
  });
317
335
  }
318
336
 
319
- prepareFavicons(favicon, faviconByEntries) {
320
- const faviconNames = [];
337
+ async handleAPI(context) {
338
+ const {
339
+ req,
340
+ res
341
+ } = context;
321
342
 
322
- if (favicon) {
323
- faviconNames.push(favicon.substring(favicon.lastIndexOf('/') + 1));
343
+ if (!this.frameAPIHandler) {
344
+ throw new Error('can not found api hanlder');
324
345
  }
325
346
 
326
- if (faviconByEntries) {
327
- Object.keys(faviconByEntries).forEach(f => {
328
- const curFavicon = faviconByEntries[f];
347
+ await this.frameAPIHandler(req, res);
348
+ }
329
349
 
330
- if (curFavicon) {
331
- faviconNames.push(curFavicon.substring(curFavicon.lastIndexOf('/') + 1));
332
- }
333
- });
334
- }
350
+ async handleWeb(context, route) {
351
+ return this.routeRenderHandler(context, route);
352
+ }
335
353
 
336
- return faviconNames;
354
+ verifyMatch(_c, _m) {// empty
337
355
  }
338
356
  /* —————————————————————— private function —————————————————————— */
339
357
  // handler route.json, include api / csr / ssr
@@ -344,25 +362,43 @@ class ModernServer {
344
362
  const {
345
363
  req,
346
364
  res
347
- } = context; // match routes in the route spec
365
+ } = context;
366
+ await this.emitRouteHook('beforeMatch', {
367
+ context
368
+ }); // match routes in the route spec
348
369
 
349
370
  const matched = this.router.match(context.url);
350
371
 
351
372
  if (!matched) {
352
373
  this.render404(context);
353
374
  return;
375
+ } else {
376
+ this.verifyMatch(context, matched);
354
377
  }
355
378
 
356
- const route = matched.generate();
357
- const params = matched.parseURLParams(context.url);
379
+ if (res.headersSent) {
380
+ return;
381
+ }
382
+
383
+ const routeAPI = (0, _route2.createRouteAPI)(matched, this.router);
384
+ await this.emitRouteHook('afterMatch', {
385
+ context,
386
+ routeAPI
387
+ });
388
+
389
+ if (res.headersSent) {
390
+ return;
391
+ }
392
+
393
+ const {
394
+ current
395
+ } = routeAPI;
396
+ const route = current.generate();
397
+ const params = current.parseURLParams(context.url);
358
398
  context.setParams(params); // route is api service
359
399
 
360
400
  if (route.isApi) {
361
- if (!this.frameAPIHandler) {
362
- throw new Error('can not found api hanlder');
363
- }
364
-
365
- await this.frameAPIHandler(req, res);
401
+ this.handleAPI(context);
366
402
  return;
367
403
  }
368
404
 
@@ -375,7 +411,13 @@ class ModernServer {
375
411
  return;
376
412
  }
377
413
 
378
- const file = await this.routeRenderHandler(context, route);
414
+ if (route.entryName) {
415
+ await this.emitRouteHook('beforeRender', {
416
+ context
417
+ });
418
+ }
419
+
420
+ const file = await this.handleWeb(context, route);
379
421
 
380
422
  if (!file) {
381
423
  this.render404(context);
@@ -392,12 +434,10 @@ class ModernServer {
392
434
  let response = file.content;
393
435
 
394
436
  if (route.entryName) {
395
- const templateAPI = (0, _hookApi.createTemplateAPI)(file.content.toString());
396
- await this.runner.afterRender({
437
+ const templateAPI = (0, _template.createTemplateAPI)(file.content.toString());
438
+ await this.emitRouteHook('afterRender', {
397
439
  context,
398
440
  templateAPI
399
- }, {
400
- onLast: _utils2.noop
401
441
  });
402
442
  await this.injectMicroFE(context, templateAPI);
403
443
  response = templateAPI.get();
@@ -565,6 +605,26 @@ class ModernServer {
565
605
  res.end((0, _utils2.createErrorDocument)(status, text));
566
606
  }
567
607
 
608
+ prepareFavicons(favicon, faviconByEntries) {
609
+ const faviconNames = [];
610
+
611
+ if (favicon) {
612
+ faviconNames.push(favicon.substring(favicon.lastIndexOf('/') + 1));
613
+ }
614
+
615
+ if (faviconByEntries) {
616
+ Object.keys(faviconByEntries).forEach(f => {
617
+ const curFavicon = faviconByEntries[f];
618
+
619
+ if (curFavicon) {
620
+ faviconNames.push(curFavicon.substring(curFavicon.lastIndexOf('/') + 1));
621
+ }
622
+ });
623
+ }
624
+
625
+ return faviconNames;
626
+ }
627
+
568
628
  }
569
629
  /* eslint-enable max-lines */
570
630
 
@@ -3,12 +3,13 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.applyMixins = applyMixins;
6
7
  exports.toMessage = exports.noop = exports.mergeExtension = exports.createErrorDocument = void 0;
7
8
 
8
- const mergeExtension = (users, plugins) => {
9
+ const mergeExtension = users => {
9
10
  const output = [];
10
11
  return {
11
- middleware: output.concat(users).concat(plugins)
12
+ middleware: output.concat(users)
12
13
  };
13
14
  };
14
15
 
@@ -63,6 +64,15 @@ const createErrorDocument = (status, text) => {
63
64
  </body>
64
65
  </html>
65
66
  `;
66
- };
67
+ }; // This can live anywhere in your codebase:
68
+
69
+
70
+ exports.createErrorDocument = createErrorDocument;
67
71
 
68
- exports.createErrorDocument = createErrorDocument;
72
+ function applyMixins(derivedCtor, constructors) {
73
+ constructors.forEach(baseCtor => {
74
+ Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {
75
+ Object.defineProperty(derivedCtor.prototype, name, Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null));
76
+ });
77
+ });
78
+ }
@@ -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
  }
@@ -0,0 +1,15 @@
1
+ import type { APIServerStartInput } from '@modern-js/server-plugin';
2
+ import { ModernDevServer } from './dev-server';
3
+ import { mergeExtension } from "../../utils.d";
4
+ import { ModernRouteInterface } from "../../libs/route";
5
+ import { ApiServerMode } from "../../constants.d";
6
+ export declare class ModernSSRDevServer extends ModernDevServer {
7
+ protected prepareAPIHandler(_m: ApiServerMode, _: APIServerStartInput['config']): any;
8
+ protected prepareWebHandler(extension: ReturnType<typeof mergeExtension>): Promise<import("@modern-js/server-plugin").Adapter>;
9
+ protected filterRoutes(routes: ModernRouteInterface[]): ModernRouteInterface[];
10
+ }
11
+ export declare class ModernAPIDevServer extends ModernDevServer {
12
+ protected prepareAPIHandler(mode: ApiServerMode, extension: APIServerStartInput['config']): Promise<import("@modern-js/server-plugin").Adapter>;
13
+ protected filterRoutes(routes: ModernRouteInterface[]): ModernRouteInterface[];
14
+ protected preServerInit(): Promise<void>;
15
+ }
@@ -1,7 +1,7 @@
1
1
  /// <reference types="node" />
2
- import { Server } from 'http';
3
- import { ModernServerOptions, ServerHookRunner, ReadyOptions } from '../type';
4
- import { ModernServer } from './modern-server';
2
+ import http, { Server, IncomingMessage, ServerResponse } from 'http';
3
+ import { ModernServer } from '../modern-server';
4
+ import { ModernServerOptions, ServerHookRunner, ReadyOptions } from "../../type.d";
5
5
  export declare class ModernDevServer extends ModernServer {
6
6
  private devProxyHandler;
7
7
  private mockHandler;
@@ -10,11 +10,12 @@ export declare class ModernDevServer extends ModernServer {
10
10
  private socketServer;
11
11
  private watcher;
12
12
  private devMiddleware;
13
- constructor(options: ModernServerOptions, runner: ServerHookRunner);
14
- init(): Promise<void>;
13
+ constructor(options: ModernServerOptions);
14
+ init(runner: ServerHookRunner): Promise<void>;
15
15
  ready(options?: ReadyOptions): void;
16
16
  onListening(app: Server): void;
17
17
  close(): Promise<void>;
18
+ createHTTPServer(handler: (req: IncomingMessage, res: ServerResponse, next?: () => void) => void): Promise<http.Server | import("https").Server>;
18
19
  private setupCompiler;
19
20
  private setupDevServerPlugin;
20
21
  private setupHooks;
@@ -0,0 +1,2 @@
1
+ export { ModernAPIDevServer, ModernSSRDevServer } from './dev-server-split';
2
+ export { ModernDevServer } from './dev-server';
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  import { IncomingMessage, ServerResponse, Server as httpServer } from 'http';
3
- import { ModernServerOptions, ReadyOptions } from '../type';
3
+ import { ModernServerOptions, ReadyOptions } from "../type.d";
4
4
  export declare class Server {
5
5
  options: ModernServerOptions;
6
6
  private server;
@@ -15,4 +15,6 @@ export declare class Server {
15
15
  close(): Promise<void>;
16
16
  private createProdServer;
17
17
  private createDevServer;
18
+ private createHookRunner;
19
+ private initAppContext;
18
20
  }
@@ -0,0 +1,26 @@
1
+ import { APIServerStartInput } from '@modern-js/server-plugin';
2
+ import { ModernServer } from './modern-server';
3
+ import { mergeExtension } from "../utils.d";
4
+ import { ModernRoute, ModernRouteInterface, RouteMatcher } from "../libs/route";
5
+ import { ApiServerMode } from "../constants.d";
6
+ import { ModernServerContext } from "../libs/context";
7
+ export declare class ModernSSRServer extends ModernServer {
8
+ protected warmupSSRBundle(): Promise<void>;
9
+ protected verifyMatch(context: ModernServerContext, matched: RouteMatcher): void;
10
+ protected prepareAPIHandler(_m: ApiServerMode, _: APIServerStartInput['config']): any;
11
+ protected prepareWebHandler(extension: ReturnType<typeof mergeExtension>): Promise<import("@modern-js/server-plugin").Adapter>;
12
+ protected preServerInit(): Promise<void>;
13
+ }
14
+ export declare class ModernAPIServer extends ModernServer {
15
+ protected emitRouteHook(_: string, _input: any): Promise<void>;
16
+ protected warmupSSRBundle(): Promise<void>;
17
+ protected prepareWebHandler(_: ReturnType<typeof mergeExtension>): any;
18
+ protected prepareAPIHandler(mode: ApiServerMode, extension: APIServerStartInput['config']): Promise<import("@modern-js/server-plugin").Adapter>;
19
+ protected filterRoutes(routes: ModernRouteInterface[]): ModernRouteInterface[];
20
+ protected preServerInit(): Promise<void>;
21
+ }
22
+ export declare class ModernWebServer extends ModernServer {
23
+ protected warmupSSRBundle(): Promise<void>;
24
+ protected handleAPI(context: ModernServerContext): Promise<void>;
25
+ protected handleWeb(context: ModernServerContext, route: ModernRoute): Promise<any>;
26
+ }
@@ -1,10 +1,10 @@
1
1
  /// <reference types="node" />
2
2
  import { IncomingMessage, ServerResponse, Server } from 'http';
3
- import { Adapter } from '@modern-js/server-plugin';
3
+ import { Adapter, APIServerStartInput } from '@modern-js/server-plugin';
4
4
  import type { NormalizedConfig } from '@modern-js/core';
5
- import { ModernServerOptions, NextFunction, ServerHookRunner, Measure, Logger, ReadyOptions } from '../type';
6
- import { RouteMatchManager, ModernRouteInterface } from '../libs/route';
7
- import { mergeExtension } from '../utils';
5
+ import { ModernServerOptions, NextFunction, ServerHookRunner, Measure, Logger, ReadyOptions } from "../type.d";
6
+ import { RouteMatchManager, ModernRouteInterface, ModernRoute, RouteMatcher } from "../libs/route";
7
+ import { mergeExtension } from "../utils.d";
8
8
  import { ModernServerContext } from "../libs/context";
9
9
  import { ApiServerMode } from "../constants.d";
10
10
  declare type ModernServerHandler = (context: ModernServerContext, next: NextFunction) => Promise<void> | void;
@@ -17,9 +17,10 @@ export declare class ModernServer {
17
17
  protected conf: NormalizedConfig;
18
18
  protected handlers: ModernServerAsyncHandler[];
19
19
  protected presetRoutes?: ModernRouteInterface[];
20
+ protected runner: ServerHookRunner;
20
21
  protected readonly logger: Logger;
21
22
  protected readonly measure: Measure;
22
- private readonly runner;
23
+ protected readonly proxyTarget: ModernServerOptions['proxyTarget'];
23
24
  private readonly isDev;
24
25
  private staticFileHandler;
25
26
  private routeRenderHandler;
@@ -35,28 +36,35 @@ export declare class ModernServer {
35
36
  routes,
36
37
  staticGenerate,
37
38
  logger,
38
- measure
39
- }: ModernServerOptions, runner: ServerHookRunner);
39
+ measure,
40
+ proxyTarget
41
+ }: ModernServerOptions);
40
42
  getRequestHandler(): (req: IncomingMessage, res: ServerResponse, next?: () => void) => void;
41
- init(): Promise<void>;
43
+ init(runner: ServerHookRunner): Promise<void>;
42
44
  ready(_: ReadyOptions): void;
43
45
  onListening(_: Server): void;
44
46
  close(): void;
45
- protected warmupSSRBundle(): void;
47
+ createHTTPServer(handler: (req: IncomingMessage, res: ServerResponse, next?: () => void) => void): Promise<Server>;
46
48
  protected readRouteSpec(): ModernRouteInterface[];
47
49
  protected addHandler(handler: ModernServerHandler): void;
48
50
  protected render404(context: ModernServerContext): void;
49
51
  protected prepareFrameHandler(): Promise<void>;
52
+ protected proxy(): Promise<any>;
50
53
  protected prepareWebHandler(extension: ReturnType<typeof mergeExtension>): Promise<Adapter>;
51
- protected prepareAPIHandler(mode: ApiServerMode, extension: ReturnType<typeof mergeExtension>): Promise<Adapter>;
54
+ protected prepareAPIHandler(mode: ApiServerMode, extension: APIServerStartInput['config']): Promise<Adapter>;
52
55
  protected filterRoutes(routes: ModernRouteInterface[]): ModernRouteInterface[];
56
+ protected emitRouteHook(eventName: 'beforeMatch' | 'afterMatch' | 'beforeRender' | 'afterRender', input: any): Promise<any>;
57
+ protected warmupSSRBundle(): void;
53
58
  protected preServerInit(): Promise<void>;
54
- private prepareFavicons;
59
+ protected handleAPI(context: ModernServerContext): Promise<void>;
60
+ protected handleWeb(context: ModernServerContext, route: ModernRoute): Promise<import("@/type").RenderResult | null>;
61
+ protected verifyMatch(_c: ModernServerContext, _m: RouteMatcher): void;
55
62
  private routeHandler;
56
63
  private injectMicroFE;
57
64
  private compose;
58
65
  private requestHandler;
59
66
  private onError;
60
67
  private renderErrorPage;
68
+ private prepareFavicons;
61
69
  }
62
70
  export {};
@@ -45,7 +45,12 @@ export declare type ModernServerOptions = {
45
45
  logger?: Logger;
46
46
  measure?: Measure;
47
47
  apiOnly?: boolean;
48
+ ssrOnly?: boolean;
48
49
  webOnly?: boolean;
50
+ proxyTarget?: {
51
+ ssr?: string;
52
+ api?: string;
53
+ };
49
54
  };
50
55
  export declare type RenderResult = {
51
56
  content: string | Buffer;
@@ -1,6 +1,7 @@
1
- export declare const mergeExtension: (users: any[], plugins: any[]) => {
1
+ export declare const mergeExtension: (users: any[]) => {
2
2
  middleware: any[];
3
3
  };
4
4
  export declare const toMessage: (dig: string, e: Error | string) => string;
5
5
  export declare const noop: () => void;
6
- export declare const createErrorDocument: (status: number, text: string) => string;
6
+ export declare const createErrorDocument: (status: number, text: string) => string;
7
+ export declare function applyMixins(derivedCtor: any, constructors: any[]): void;
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "modern",
12
12
  "modern.js"
13
13
  ],
14
- "version": "1.1.2",
14
+ "version": "1.1.4-rc.0",
15
15
  "jsnext:source": "./src/index.ts",
16
16
  "types": "./dist/types/index.d.ts",
17
17
  "main": "./dist/js/node/index.js",
@@ -33,12 +33,12 @@
33
33
  "@babel/preset-typescript": "^7.15.0",
34
34
  "@babel/register": "^7.15.3",
35
35
  "@babel/runtime": "^7",
36
- "@modern-js/core": "^1.1.2",
37
- "@modern-js/hmr-client": "^1.1.1",
38
- "@modern-js/server-plugin": "^1.1.1",
39
- "@modern-js/server-utils": "^1.1.1",
40
- "@modern-js/bff-utils": "^1.1.1",
41
- "@modern-js/utils": "^1.1.2",
36
+ "@modern-js/core": "^1.1.4-rc.0",
37
+ "@modern-js/hmr-client": "^1.1.2-rc.0",
38
+ "@modern-js/server-plugin": "^1.1.2",
39
+ "@modern-js/server-utils": "^1.1.3-rc.0",
40
+ "@modern-js/bff-utils": "^1.1.2-rc.0",
41
+ "@modern-js/utils": "^1.1.4-rc.0",
42
42
  "axios": "^0.21.4",
43
43
  "babel-plugin-module-resolver": "^4.1.0",
44
44
  "chokidar": "^3.5.2",
@@ -61,9 +61,9 @@
61
61
  "ws": "^8.2.0"
62
62
  },
63
63
  "devDependencies": {
64
- "@modern-js/module-tools": "^1.1.0",
65
- "@modern-js/plugin-testing": "^1.1.0",
66
- "@modern-js/types": "^1.1.2",
64
+ "@modern-js/module-tools": "^1.1.1",
65
+ "@modern-js/plugin-testing": "^1.1.1",
66
+ "@modern-js/types": "^1.1.3-rc.0",
67
67
  "@types/jest": "^26",
68
68
  "@types/lru-cache": "^5.1.1",
69
69
  "@types/mime-types": "^2.1.0",
@@ -98,5 +98,6 @@
98
98
  "build": "modern build",
99
99
  "dev": "modern build --watch",
100
100
  "test": "modern test --passWithNoTests"
101
- }
101
+ },
102
+ "readme": "\n<p align=\"center\">\n <a href=\"https://modernjs.dev\" target=\"blank\"><img src=\"https://lf3-static.bytednsdoc.com/obj/eden-cn/ylaelkeh7nuhfnuhf/modernjs-cover.png\" width=\"300\" alt=\"Modern.js Logo\" /></a>\n</p>\n<p align=\"center\">\n现代 Web 工程体系\n <br/>\n <a href=\"https://modernjs.dev\" target=\"blank\">\n modernjs.dev\n </a>\n</p>\n<p align=\"center\">\n The meta-framework suite designed from scratch for frontend-focused modern web development\n</p>\n\n# Introduction\n\n> The doc site ([modernjs.dev](https://modernjs.dev)) and articles are only available in Chinese for now, we are planning to add English versions soon.\n\n- [Modern.js: Hello, World!](https://zhuanlan.zhihu.com/p/426707646)\n\n## Getting Started\n\n- [Quick Start](https://modernjs.dev/docs/start)\n- [Guides](https://modernjs.dev/docs/guides)\n- [API References](https://modernjs.dev/docs/apis)\n\n## Contributing\n\n- [Contributing Guide](https://github.com/modern-js-dev/modern.js/blob/main/CONTRIBUTING.md)\n"
102
103
  }