@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
@@ -1,10 +1,10 @@
1
1
  /* eslint-disable max-lines */
2
- import { IncomingMessage, ServerResponse, Server } from 'http';
2
+ import { IncomingMessage, ServerResponse, Server, createServer } from 'http';
3
3
  import util from 'util';
4
4
  import path from 'path';
5
5
  import { fs, ROUTE_SPEC_FILE } from '@modern-js/utils';
6
- import { Adapter } from '@modern-js/server-plugin';
7
- import { gather, createMiddlewareCollecter } from '@modern-js/server-utils';
6
+ import { Adapter, APIServerStartInput } from '@modern-js/server-plugin';
7
+ import { createMiddlewareCollecter } from '@modern-js/server-utils';
8
8
  import type { NormalizedConfig } from '@modern-js/core';
9
9
  import mime from 'mime-types';
10
10
  import axios from 'axios';
@@ -30,7 +30,8 @@ import {
30
30
  ERROR_DIGEST,
31
31
  ERROR_PAGE_TEXT,
32
32
  } from '@/constants';
33
- import { createTemplateAPI } from '@/libs/hook-api';
33
+ import { createTemplateAPI } from '@/libs/hook-api/template';
34
+ import { createRouteAPI } from '@/libs/hook-api/route';
34
35
 
35
36
  type ModernServerHandler = (
36
37
  context: ModernServerContext,
@@ -63,12 +64,12 @@ export class ModernServer {
63
64
 
64
65
  protected presetRoutes?: ModernRouteInterface[];
65
66
 
67
+ protected runner!: ServerHookRunner;
68
+
66
69
  protected readonly logger: Logger;
67
70
 
68
71
  protected readonly measure: Measure;
69
72
 
70
- private readonly runner: ServerHookRunner;
71
-
72
73
  private readonly isDev: boolean = false;
73
74
 
74
75
  private staticFileHandler!: ReturnType<typeof createStaticFileHandler>;
@@ -85,18 +86,15 @@ export class ModernServer {
85
86
 
86
87
  private proxyHandler: ReturnType<typeof createProxyHandler> = null;
87
88
 
88
- constructor(
89
- {
90
- pwd,
91
- config,
92
- dev,
93
- routes,
94
- staticGenerate,
95
- logger,
96
- measure,
97
- }: ModernServerOptions,
98
- runner: ServerHookRunner,
99
- ) {
89
+ constructor({
90
+ pwd,
91
+ config,
92
+ dev,
93
+ routes,
94
+ staticGenerate,
95
+ logger,
96
+ measure,
97
+ }: ModernServerOptions) {
100
98
  require('ignore-styles');
101
99
  this.isDev = Boolean(dev);
102
100
 
@@ -104,7 +102,6 @@ export class ModernServer {
104
102
  this.distDir = path.join(pwd, config.output.path || '');
105
103
  this.workDir = this.isDev ? pwd : this.distDir;
106
104
  this.conf = config;
107
- this.runner = runner;
108
105
  this.logger = logger!;
109
106
  this.measure = measure!;
110
107
  this.router = new RouteMatchManager();
@@ -122,7 +119,9 @@ export class ModernServer {
122
119
  }
123
120
 
124
121
  // server prepare
125
- public async init() {
122
+ public async init(runner: ServerHookRunner) {
123
+ this.runner = runner;
124
+
126
125
  const { distDir, isDev, staticGenerate, conf } = this;
127
126
 
128
127
  this.addHandler((ctx: ModernServerContext, next: NextFunction) => {
@@ -198,6 +197,16 @@ export class ModernServer {
198
197
  reader.close();
199
198
  }
200
199
 
200
+ public async createHTTPServer(
201
+ handler: (
202
+ req: IncomingMessage,
203
+ res: ServerResponse,
204
+ next?: () => void,
205
+ ) => void,
206
+ ) {
207
+ return createServer(handler);
208
+ }
209
+
201
210
  // warmup ssr function
202
211
  protected warmupSSRBundle() {
203
212
  const { distDir } = this;
@@ -241,9 +250,6 @@ export class ModernServer {
241
250
  protected async prepareFrameHandler() {
242
251
  const { workDir, runner } = this;
243
252
 
244
- // inner tool, gather user inject
245
- const { api: userAPIExt, web: userWebExt } = gather(workDir);
246
-
247
253
  // server hook, gather plugin inject
248
254
  const { getMiddlewares, ...collector } = createMiddlewareCollecter();
249
255
 
@@ -255,7 +261,7 @@ export class ModernServer {
255
261
 
256
262
  // get api or web server handler from server-framework plugin
257
263
  if (await fs.pathExists(path.join(serverDir))) {
258
- const webExtension = mergeExtension(pluginWebExt, userWebExt);
264
+ const webExtension = mergeExtension(pluginWebExt);
259
265
  this.frameWebHandler = await this.prepareWebHandler(webExtension);
260
266
  }
261
267
 
@@ -265,11 +271,11 @@ export class ModernServer {
265
271
  : ApiServerMode.func;
266
272
 
267
273
  // if use lambda/, mean framework style of writing, then discard user extension
268
- const apiExtension = mergeExtension(
269
- pluginAPIExt,
270
- mode === ApiServerMode.frame ? [] : userAPIExt,
271
- );
272
- this.frameAPIHandler = await this.prepareAPIHandler(mode, apiExtension);
274
+ const apiExtension = mergeExtension(pluginAPIExt);
275
+ this.frameAPIHandler = await this.prepareAPIHandler(mode, {
276
+ ...apiExtension,
277
+ modernJsConfig: this.conf,
278
+ });
273
279
  }
274
280
  }
275
281
 
@@ -290,7 +296,7 @@ export class ModernServer {
290
296
 
291
297
  protected async prepareAPIHandler(
292
298
  mode: ApiServerMode,
293
- extension: ReturnType<typeof mergeExtension>,
299
+ extension: APIServerStartInput['config'],
294
300
  ) {
295
301
  const { workDir, runner, conf } = this;
296
302
  const { bff } = conf as ConfWithBFF;
@@ -301,7 +307,7 @@ export class ModernServer {
301
307
  pwd: workDir,
302
308
  mode,
303
309
  config: extension,
304
- prefix,
310
+ prefix: Array.isArray(prefix) ? prefix[0] : prefix,
305
311
  },
306
312
  { onLast: () => null as any },
307
313
  );
@@ -316,7 +322,7 @@ export class ModernServer {
316
322
  const preMiddleware: ModernServerAsyncHandler[] =
317
323
  await this.runner.preServerInit(conf);
318
324
 
319
- preMiddleware.forEach(mid => {
325
+ preMiddleware.flat().forEach(mid => {
320
326
  this.addHandler(mid);
321
327
  });
322
328
  }
@@ -349,6 +355,8 @@ export class ModernServer {
349
355
  private async routeHandler(context: ModernServerContext) {
350
356
  const { req, res } = context;
351
357
 
358
+ await this.runner.beforeMatch({ context }, { onLast: noop as any });
359
+
352
360
  // match routes in the route spec
353
361
  const matched = this.router.match(context.url);
354
362
  if (!matched) {
@@ -356,8 +364,19 @@ export class ModernServer {
356
364
  return;
357
365
  }
358
366
 
359
- const route = matched.generate();
360
- const params = matched.parseURLParams(context.url);
367
+ const routeAPI = createRouteAPI(matched, this.router);
368
+ await this.runner.afterMatch(
369
+ { context, routeAPI },
370
+ { onLast: noop as any },
371
+ );
372
+
373
+ if (res.headersSent) {
374
+ return;
375
+ }
376
+
377
+ const { current } = routeAPI as any;
378
+ const route = current.generate();
379
+ const params = current.parseURLParams(context.url);
361
380
  context.setParams(params);
362
381
 
363
382
  // route is api service
@@ -379,6 +398,7 @@ export class ModernServer {
379
398
  return;
380
399
  }
381
400
 
401
+ await this.runner.beforeRender({ context }, { onLast: noop as any });
382
402
  const file = await this.routeRenderHandler(context, route);
383
403
  if (!file) {
384
404
  this.render404(context);
package/src/utils.ts CHANGED
@@ -1,6 +1,6 @@
1
- export const mergeExtension = (users: any[], plugins: any[]) => {
1
+ export const mergeExtension = (users: any[]) => {
2
2
  const output: any[] = [];
3
- return { middleware: output.concat(users).concat(plugins) };
3
+ return { middleware: output.concat(users) };
4
4
  };
5
5
 
6
6
  export const toMessage = (dig: string, e: Error | string): string => {