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

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 (52) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/dist/js/modern/libs/hook-api/route.js +37 -0
  3. package/dist/js/modern/libs/{hook-api.js → hook-api/template.js} +0 -0
  4. package/dist/js/modern/libs/render/cache/type.js +0 -1
  5. package/dist/js/modern/libs/route/index.js +4 -0
  6. package/dist/js/modern/libs/route/matcher.js +5 -1
  7. package/dist/js/modern/libs/serve-file.js +23 -25
  8. package/dist/js/modern/server/{web-server.js → dev-server/dev-server-split.js} +9 -7
  9. package/dist/js/modern/server/{dev-server.js → dev-server/dev-server.js} +41 -22
  10. package/dist/js/modern/server/dev-server/index.js +2 -0
  11. package/dist/js/modern/server/index.js +62 -62
  12. package/dist/js/modern/server/{api-server.js → modern-server-split.js} +6 -10
  13. package/dist/js/modern/server/modern-server.js +76 -27
  14. package/dist/js/modern/type.js +0 -1
  15. package/dist/js/modern/utils.js +2 -2
  16. package/dist/js/node/libs/hook-api/route.js +46 -0
  17. package/dist/js/node/libs/{hook-api.js → hook-api/template.js} +0 -0
  18. package/dist/js/node/libs/route/index.js +4 -0
  19. package/dist/js/node/libs/route/matcher.js +5 -1
  20. package/dist/js/node/libs/serve-file.js +25 -26
  21. package/dist/js/node/server/{api-server.js → dev-server/dev-server-split.js} +7 -12
  22. package/dist/js/node/server/{dev-server.js → dev-server/dev-server.js} +42 -21
  23. package/dist/js/node/server/dev-server/index.js +27 -0
  24. package/dist/js/node/server/index.js +69 -63
  25. package/dist/js/node/server/{web-server.js → modern-server-split.js} +10 -9
  26. package/dist/js/node/server/modern-server.js +78 -27
  27. package/dist/js/node/utils.js +2 -2
  28. package/dist/types/libs/hook-api/route.d.ts +13 -0
  29. package/dist/types/libs/{hook-api.d.ts → hook-api/template.d.ts} +0 -0
  30. package/dist/types/libs/route/index.d.ts +1 -0
  31. package/dist/types/libs/route/matcher.d.ts +1 -0
  32. package/dist/types/libs/serve-file.d.ts +1 -1
  33. package/dist/types/server/{web-server.d.ts → dev-server/dev-server-split.d.ts} +8 -8
  34. package/dist/types/server/{dev-server.d.ts → dev-server/dev-server.d.ts} +6 -5
  35. package/dist/types/server/dev-server/index.d.ts +2 -0
  36. package/dist/types/server/index.d.ts +3 -1
  37. package/dist/types/server/{api-server.d.ts → modern-server-split.d.ts} +4 -6
  38. package/dist/types/server/modern-server.d.ts +5 -3
  39. package/dist/types/utils.d.ts +1 -1
  40. package/package.json +17 -19
  41. package/src/libs/hook-api/route.ts +38 -0
  42. package/src/libs/{hook-api.ts → hook-api/template.ts} +0 -0
  43. package/src/libs/route/index.ts +4 -0
  44. package/src/libs/route/matcher.ts +5 -1
  45. package/src/libs/serve-file.ts +16 -20
  46. package/src/server/{web-server.ts → dev-server/dev-server-split.ts} +11 -10
  47. package/src/server/{dev-server.ts → dev-server/dev-server.ts} +56 -23
  48. package/src/server/dev-server/index.ts +2 -0
  49. package/src/server/index.ts +72 -46
  50. package/src/server/{api-server.ts → modern-server-split.ts} +10 -13
  51. package/src/server/modern-server.ts +82 -41
  52. 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
6
  import { Adapter, APIServerStartInput } from '@modern-js/server-plugin';
7
- import { gather, createMiddlewareCollecter } from '@modern-js/server-utils';
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) => {
@@ -154,14 +153,20 @@ export class ModernServer {
154
153
 
155
154
  await this.prepareFrameHandler();
156
155
 
156
+ const { favicon, faviconByEntries } = this.conf.output;
157
+ const favicons = this.prepareFavicons(favicon, faviconByEntries);
158
+ // Only work when without setting `assetPrefix`.
159
+ // Setting `assetPrefix` means these resources should be uploaded to CDN.
160
+ const staticPathRegExp = new RegExp(
161
+ `^/(static/|upload/|favicon.ico|icon.png${
162
+ favicons.length > 0 ? `|${favicons.join('|')}` : ''
163
+ })`,
164
+ );
165
+
157
166
  this.staticFileHandler = createStaticFileHandler([
158
167
  {
159
- path: '/static/',
160
- target: path.join(distDir, 'static'),
161
- },
162
- {
163
- path: '/upload/',
164
- target: path.join(distDir, 'upload'),
168
+ path: staticPathRegExp,
169
+ target: distDir,
165
170
  },
166
171
  ]);
167
172
 
@@ -192,6 +197,16 @@ export class ModernServer {
192
197
  reader.close();
193
198
  }
194
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
+
195
210
  // warmup ssr function
196
211
  protected warmupSSRBundle() {
197
212
  const { distDir } = this;
@@ -235,9 +250,6 @@ export class ModernServer {
235
250
  protected async prepareFrameHandler() {
236
251
  const { workDir, runner } = this;
237
252
 
238
- // inner tool, gather user inject
239
- const { api: userAPIExt, web: userWebExt } = gather(workDir);
240
-
241
253
  // server hook, gather plugin inject
242
254
  const { getMiddlewares, ...collector } = createMiddlewareCollecter();
243
255
 
@@ -249,7 +261,7 @@ export class ModernServer {
249
261
 
250
262
  // get api or web server handler from server-framework plugin
251
263
  if (await fs.pathExists(path.join(serverDir))) {
252
- const webExtension = mergeExtension(pluginWebExt, userWebExt);
264
+ const webExtension = mergeExtension(pluginWebExt);
253
265
  this.frameWebHandler = await this.prepareWebHandler(webExtension);
254
266
  }
255
267
 
@@ -259,14 +271,8 @@ export class ModernServer {
259
271
  : ApiServerMode.func;
260
272
 
261
273
  // if use lambda/, mean framework style of writing, then discard user extension
262
- const apiExtension = mergeExtension(
263
- pluginAPIExt,
264
- mode === ApiServerMode.frame ? [] : userAPIExt,
265
- );
266
- this.frameAPIHandler = await this.prepareAPIHandler(mode, {
267
- ...apiExtension,
268
- modernJsConfig: this.conf,
269
- });
274
+ const apiExtension = mergeExtension(pluginAPIExt);
275
+ this.frameAPIHandler = await this.prepareAPIHandler(mode, apiExtension);
270
276
  }
271
277
  }
272
278
 
@@ -298,7 +304,7 @@ export class ModernServer {
298
304
  pwd: workDir,
299
305
  mode,
300
306
  config: extension,
301
- prefix,
307
+ prefix: Array.isArray(prefix) ? prefix[0] : prefix,
302
308
  },
303
309
  { onLast: () => null as any },
304
310
  );
@@ -313,11 +319,32 @@ export class ModernServer {
313
319
  const preMiddleware: ModernServerAsyncHandler[] =
314
320
  await this.runner.preServerInit(conf);
315
321
 
316
- preMiddleware.forEach(mid => {
322
+ preMiddleware.flat().forEach(mid => {
317
323
  this.addHandler(mid);
318
324
  });
319
325
  }
320
326
 
327
+ private prepareFavicons(
328
+ favicon: string | undefined,
329
+ faviconByEntries?: Record<string, string | undefined>,
330
+ ) {
331
+ const faviconNames = [];
332
+ if (favicon) {
333
+ faviconNames.push(favicon.substring(favicon.lastIndexOf('/') + 1));
334
+ }
335
+ if (faviconByEntries) {
336
+ Object.keys(faviconByEntries).forEach(f => {
337
+ const curFavicon = faviconByEntries[f];
338
+ if (curFavicon) {
339
+ faviconNames.push(
340
+ curFavicon.substring(curFavicon.lastIndexOf('/') + 1),
341
+ );
342
+ }
343
+ });
344
+ }
345
+ return faviconNames;
346
+ }
347
+
321
348
  /* —————————————————————— private function —————————————————————— */
322
349
 
323
350
  // handler route.json, include api / csr / ssr
@@ -325,6 +352,8 @@ export class ModernServer {
325
352
  private async routeHandler(context: ModernServerContext) {
326
353
  const { req, res } = context;
327
354
 
355
+ await this.runner.beforeMatch({ context }, { onLast: noop as any });
356
+
328
357
  // match routes in the route spec
329
358
  const matched = this.router.match(context.url);
330
359
  if (!matched) {
@@ -332,8 +361,19 @@ export class ModernServer {
332
361
  return;
333
362
  }
334
363
 
335
- const route = matched.generate();
336
- const params = matched.parseURLParams(context.url);
364
+ const routeAPI = createRouteAPI(matched, this.router);
365
+ await this.runner.afterMatch(
366
+ { context, routeAPI },
367
+ { onLast: noop as any },
368
+ );
369
+
370
+ if (res.headersSent) {
371
+ return;
372
+ }
373
+
374
+ const { current } = routeAPI as any;
375
+ const route = current.generate();
376
+ const params = current.parseURLParams(context.url);
337
377
  context.setParams(params);
338
378
 
339
379
  // route is api service
@@ -355,6 +395,7 @@ export class ModernServer {
355
395
  return;
356
396
  }
357
397
 
398
+ await this.runner.beforeRender({ context }, { onLast: noop as any });
358
399
  const file = await this.routeRenderHandler(context, route);
359
400
  if (!file) {
360
401
  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 => {