@modern-js/prod-server 2.31.2 → 2.32.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 (44) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/LICENSE +1 -1
  3. package/dist/cjs/constants.js +10 -0
  4. package/dist/cjs/libs/context/context.js +7 -2
  5. package/dist/cjs/libs/preload/flushServerHeader.js +67 -0
  6. package/dist/cjs/libs/preload/index.js +7 -0
  7. package/dist/cjs/libs/preload/parseLinks.js +100 -0
  8. package/dist/cjs/libs/preload/transformLinks2String.js +113 -0
  9. package/dist/cjs/libs/proxy.js +44 -41
  10. package/dist/cjs/libs/render/index.js +16 -2
  11. package/dist/cjs/libs/serverTiming.js +1 -1
  12. package/dist/cjs/server/modernServer.js +21 -16
  13. package/dist/esm/constants.js +7 -0
  14. package/dist/esm/libs/context/context.js +5 -2
  15. package/dist/esm/libs/preload/flushServerHeader.js +70 -0
  16. package/dist/esm/libs/preload/index.js +2 -0
  17. package/dist/esm/libs/preload/parseLinks.js +170 -0
  18. package/dist/esm/libs/preload/transformLinks2String.js +118 -0
  19. package/dist/esm/libs/proxy.js +88 -50
  20. package/dist/esm/libs/render/index.js +17 -3
  21. package/dist/esm/libs/serverTiming.js +1 -1
  22. package/dist/esm/server/modernServer.js +22 -17
  23. package/dist/esm-node/constants.js +7 -0
  24. package/dist/esm-node/libs/context/context.js +7 -2
  25. package/dist/esm-node/libs/preload/flushServerHeader.js +45 -0
  26. package/dist/esm-node/libs/preload/index.js +2 -0
  27. package/dist/esm-node/libs/preload/parseLinks.js +88 -0
  28. package/dist/esm-node/libs/preload/transformLinks2String.js +103 -0
  29. package/dist/esm-node/libs/proxy.js +44 -41
  30. package/dist/esm-node/libs/render/index.js +16 -2
  31. package/dist/esm-node/libs/serverTiming.js +1 -1
  32. package/dist/esm-node/server/modernServer.js +22 -17
  33. package/dist/types/constants.d.ts +7 -1
  34. package/dist/types/libs/context/context.d.ts +1 -1
  35. package/dist/types/libs/preload/flushServerHeader.d.ts +20 -0
  36. package/dist/types/libs/preload/index.d.ts +2 -0
  37. package/dist/types/libs/preload/parseLinks.d.ts +14 -0
  38. package/dist/types/libs/preload/transformLinks2String.d.ts +3 -0
  39. package/dist/types/libs/proxy.d.ts +3 -3
  40. package/dist/types/libs/render/index.d.ts +2 -0
  41. package/dist/types/libs/serverTiming.d.ts +1 -0
  42. package/dist/types/type.d.ts +3 -0
  43. package/dist/types/utils.d.ts +1 -1
  44. package/package.json +18 -17
@@ -10,23 +10,25 @@ import { createErrorDocument, createMiddlewareCollecter, getStaticReg, mergeExte
10
10
  import * as reader from "../libs/render/reader";
11
11
  import { createProxyHandler } from "../libs/proxy";
12
12
  import { createContext } from "../libs/context";
13
- import { AGGRED_DIR, ERROR_DIGEST, ERROR_PAGE_TEXT, RUN_MODE } from "../constants";
13
+ import { AGGRED_DIR, ERROR_DIGEST, ERROR_PAGE_TEXT, RUN_MODE, ServerReportTimings } from "../constants";
14
14
  import { createAfterMatchContext, createAfterRenderContext, createMiddlewareContext } from "../libs/hook-api";
15
15
  const SERVER_DIR = "./server";
16
16
  export class ModernServer {
17
17
  // server prepare
18
18
  async onInit(runner, app) {
19
- var _conf_bff, _app, _app1, _this_conf_output;
19
+ var _conf_bff, _app, _this_conf_output;
20
20
  this.runner = runner;
21
21
  const { distDir, conf } = this;
22
22
  this.initReader();
23
23
  debug("final server conf", this.conf);
24
- const proxyHandlers = createProxyHandler((_conf_bff = conf.bff) === null || _conf_bff === void 0 ? void 0 : _conf_bff.proxy);
25
- (_app = app) === null || _app === void 0 ? void 0 : _app.on("upgrade", proxyHandlers.handleUpgrade);
26
- proxyHandlers.handlers.forEach((handler) => {
27
- this.addHandler(handler);
28
- });
29
- (_app1 = app) === null || _app1 === void 0 ? void 0 : _app1.on("close", () => {
24
+ if ((_conf_bff = conf.bff) === null || _conf_bff === void 0 ? void 0 : _conf_bff.proxy) {
25
+ const { handlers, handleUpgrade } = createProxyHandler(conf.bff.proxy);
26
+ app && handleUpgrade(app);
27
+ handlers.forEach((handler) => {
28
+ this.addHandler(handler);
29
+ });
30
+ }
31
+ (_app = app) === null || _app === void 0 ? void 0 : _app.on("close", () => {
30
32
  this.reader.close();
31
33
  });
32
34
  const usageRoutes = this.filterRoutes(this.getRoutes());
@@ -50,6 +52,7 @@ export class ModernServer {
50
52
  distDir,
51
53
  staticGenerate,
52
54
  forceCSR,
55
+ conf: this.conf,
53
56
  nonce: (_conf_security = conf.security) === null || _conf_security === void 0 ? void 0 : _conf_security.nonce,
54
57
  metaName
55
58
  });
@@ -244,7 +247,7 @@ export class ModernServer {
244
247
  if (this.isSend(res)) {
245
248
  return null;
246
249
  }
247
- res.setHeader("content-type", renderResult.contentType);
250
+ res.set("content-type", renderResult.contentType);
248
251
  return renderResult;
249
252
  }
250
253
  async proxy() {
@@ -279,7 +282,7 @@ export class ModernServer {
279
282
  const end = time();
280
283
  res.on("finish", () => {
281
284
  const cost = end();
282
- reporter.reportTiming("server_handle_request", cost);
285
+ reporter.reportTiming(ServerReportTimings.SERVER_HANDLE_REQUEST, cost);
283
286
  });
284
287
  let route = matched.generate(context.url);
285
288
  if (route.isApi) {
@@ -294,7 +297,7 @@ export class ModernServer {
294
297
  onLast: noop
295
298
  });
296
299
  const cost = end2();
297
- reporter.reportTiming("server_hook_after_render", cost);
300
+ cost && reporter.reportTiming(ServerReportTimings.SERVER_HOOK_AFTER_MATCH, cost);
298
301
  }
299
302
  if (this.isSend(res)) {
300
303
  return;
@@ -319,7 +322,7 @@ export class ModernServer {
319
322
  const end2 = time();
320
323
  await this.frameWebHandler(middlewareContext);
321
324
  const cost = end2();
322
- reporter.reportTiming("server_middleware", cost);
325
+ cost && reporter.reportTiming(ServerReportTimings.SERVER_MIDDLEWARE, cost);
323
326
  res.locals = {
324
327
  ...res.locals,
325
328
  ...middlewareContext.response.locals
@@ -346,7 +349,7 @@ export class ModernServer {
346
349
  onLast: noop
347
350
  });
348
351
  const cost = end2();
349
- reporter.reportTiming("server_hook_after_render", cost);
352
+ cost && reporter.reportTiming(ServerReportTimings.SERVER_HOOK_AFTER_RENDER, cost);
350
353
  }
351
354
  if (this.isSend(res)) {
352
355
  return;
@@ -356,7 +359,7 @@ export class ModernServer {
356
359
  res.end(response);
357
360
  }
358
361
  isSend(res) {
359
- if (res.headersSent) {
362
+ if (res.writableEnded) {
360
363
  return true;
361
364
  }
362
365
  if (res.getHeader("Location") && isRedirect(res.statusCode)) {
@@ -408,7 +411,9 @@ export class ModernServer {
408
411
  req.metrics = req.metrics || this.metrics;
409
412
  let context;
410
413
  try {
411
- context = this.createContext(req, res);
414
+ context = this.createContext(req, res, {
415
+ metaName: this.metaName
416
+ });
412
417
  } catch (e) {
413
418
  this.logger.error(e);
414
419
  res.statusCode = 500;
@@ -422,7 +427,7 @@ export class ModernServer {
422
427
  }
423
428
  }
424
429
  redirect(res, url, status = 302) {
425
- res.setHeader("Location", url);
430
+ res.set("Location", url);
426
431
  res.statusCode = status;
427
432
  res.end();
428
433
  }
@@ -433,7 +438,7 @@ export class ModernServer {
433
438
  async renderErrorPage(context, status) {
434
439
  const { res } = context;
435
440
  context.status = status;
436
- res.setHeader("content-type", mime.contentType("html"));
441
+ res.set("content-type", mime.contentType("html"));
437
442
  const statusPage = `/${status}`;
438
443
  const customErrorPage = `/_error`;
439
444
  const matched = this.router.match(statusPage) || this.router.match(customErrorPage);
@@ -21,4 +21,10 @@ export declare const ERROR_PAGE_TEXT: Record<number, string>;
21
21
  export declare const RUN_MODE: {
22
22
  FULL: string;
23
23
  TYPE: string;
24
- };
24
+ };
25
+ export declare enum ServerReportTimings {
26
+ SERVER_HANDLE_REQUEST = "server-handle-request",
27
+ SERVER_MIDDLEWARE = "server-middleware",
28
+ SERVER_HOOK_AFTER_RENDER = "server-hook-after-render",
29
+ SERVER_HOOK_AFTER_MATCH = "server-hook-after-match",
30
+ }
@@ -2,7 +2,7 @@
2
2
  /// <reference types="node" />
3
3
  /// <reference types="node" />
4
4
  /// <reference types="node/http" />
5
- /// <reference types=".dts-temp/Uq51sICZQ6QIQByOhN-rH/src/type" />
5
+ /// <reference types=".dts-temp/h7cQDPEdPmsas3bCMYw2w/src/type" />
6
6
  import { IncomingMessage, ServerResponse } from 'http';
7
7
  import qs from 'querystring';
8
8
  import type { ModernServerContext as ModernServerContextInterface, Reporter as ModernServerReporter, ServerTiming as ModernServerTiming } from '@modern-js/types';
@@ -0,0 +1,20 @@
1
+ /// <reference types="node" />
2
+ import { OutgoingHttpHeaders } from 'http';
3
+ import { ServerOptions } from '@modern-js/server-core';
4
+ import { ModernServerContext } from '@modern-js/types';
5
+ export declare function transformToRegExp(input: string | RegExp): RegExp;
6
+ export declare function shouldFlushServerHeader(serverConf: ServerOptions['server'], userAgent?: string, disablePreload?: boolean): boolean;
7
+ export interface FlushServerHeaderOptions {
8
+ ctx: ModernServerContext;
9
+ distDir: string;
10
+ template: string;
11
+ serverConf: ServerOptions['server'];
12
+ headers?: OutgoingHttpHeaders;
13
+ }
14
+ export declare function flushServerHeader({
15
+ serverConf,
16
+ ctx,
17
+ distDir,
18
+ template,
19
+ headers
20
+ }: FlushServerHeaderOptions): Promise<void>;
@@ -0,0 +1,2 @@
1
+ export * from './parseLinks';
2
+ export * from './flushServerHeader';
@@ -0,0 +1,14 @@
1
+ export interface Link {
2
+ uri: string;
3
+ as?: 'script' | 'style' | 'image' | 'video' | 'font' | string;
4
+ }
5
+ export interface ParseLinksOptions {
6
+ distDir: string;
7
+ pathname: string;
8
+ template: string;
9
+ }
10
+ export declare function parseLinks({
11
+ pathname,
12
+ distDir,
13
+ template
14
+ }: ParseLinksOptions): Promise<Link[]>;
@@ -0,0 +1,3 @@
1
+ import { SSRPreload } from '@modern-js/server-core';
2
+ import { Link } from './parseLinks';
3
+ export declare function transformLinks2String(links: Link[], preload: SSRPreload | boolean): string;
@@ -1,11 +1,11 @@
1
- /// <reference types="node" />
1
+ import http from 'http';
2
2
  import { RequestHandler } from 'http-proxy-middleware';
3
3
  import { ProxyDetail, BffProxyOptions } from '@modern-js/types';
4
4
  import type { ModernServerHandler } from '../type';
5
5
  export type { BffProxyOptions };
6
6
  export declare function formatProxyOptions(proxyOptions: BffProxyOptions): ProxyDetail[];
7
7
  export type HttpUpgradeHandler = NonNullable<RequestHandler['upgrade']>;
8
- export declare const createProxyHandler: (proxyOptions?: BffProxyOptions) => {
8
+ export declare const createProxyHandler: (proxyOptions: BffProxyOptions) => {
9
9
  handlers: ModernServerHandler[];
10
- handleUpgrade: (req: import("http-proxy-middleware/dist/types").Request, socket: import("net").Socket, head: any) => void;
10
+ handleUpgrade: (server: http.Server) => void;
11
11
  };
@@ -1,4 +1,5 @@
1
1
  import type { ModernServerContext } from '@modern-js/types';
2
+ import { ServerOptions } from '@modern-js/server-core';
2
3
  import { RenderResult, ServerHookRunner } from '../../type';
3
4
  import { ModernRoute } from '../route';
4
5
  import * as ssr from './ssr';
@@ -10,6 +11,7 @@ export type RenderHandler = (options: {
10
11
  type CreateRenderHandler = (ctx: {
11
12
  distDir: string;
12
13
  staticGenerate: boolean;
14
+ conf: ServerOptions;
13
15
  ssrRender?: typeof ssr.render;
14
16
  forceCSR?: boolean;
15
17
  nonce?: string;
@@ -2,6 +2,7 @@ import { ServerTiming as IServerTiming } from '@modern-js/types';
2
2
  interface Res {
3
3
  getHeader: (name: string) => number | string | string[] | undefined;
4
4
  setHeader: (name: string, value: string) => void;
5
+ set: (name: string, value: any) => this;
5
6
  }
6
7
  export declare class ServerTiming implements IServerTiming {
7
8
  meta: string;
@@ -13,6 +13,9 @@ declare module 'http' {
13
13
  metrics: Metrics;
14
14
  body?: any;
15
15
  }
16
+ interface OutgoingMessage {
17
+ set: (key: string, value: any) => this;
18
+ }
16
19
  }
17
20
  export type ModernServerOptions = {
18
21
  pwd: string;
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  /// <reference types="node/http" />
3
- /// <reference types=".dts-temp/Uq51sICZQ6QIQByOhN-rH/src/type" />
3
+ /// <reference types=".dts-temp/h7cQDPEdPmsas3bCMYw2w/src/type" />
4
4
  import { IncomingMessage } from 'http';
5
5
  import type { OutputNormalizedConfig, HtmlNormalizedConfig } from '@modern-js/server-core';
6
6
  export declare const debug: any;
package/package.json CHANGED
@@ -15,37 +15,37 @@
15
15
  "modern",
16
16
  "modern.js"
17
17
  ],
18
- "version": "2.31.2",
18
+ "version": "2.32.0",
19
19
  "jsnext:source": "./src/index.ts",
20
20
  "types": "./dist/types/index.d.ts",
21
21
  "main": "./dist/cjs/index.js",
22
22
  "module": "./dist/esm/index.js",
23
23
  "exports": {
24
24
  ".": {
25
+ "types": "./dist/types/index.d.ts",
25
26
  "node": {
26
27
  "jsnext:source": "./src/index.ts",
27
28
  "import": "./dist/esm-node/index.js",
28
29
  "require": "./dist/cjs/index.js"
29
30
  },
30
- "types": "./dist/types/index.d.ts",
31
31
  "default": "./dist/esm/index.js"
32
32
  },
33
33
  "./worker": {
34
+ "types": "./dist/types/workerServer.d.ts",
34
35
  "node": {
35
36
  "jsnext:source": "./src/workerServer.ts",
36
37
  "import": "./dist/esm-node/workerServer.js",
37
38
  "require": "./dist/cjs/workerServer.js"
38
39
  },
39
- "types": "./dist/types/workerServer.d.ts",
40
40
  "default": "./dist/esm/workerServer.js"
41
41
  },
42
42
  "./renderHtml": {
43
+ "types": "./dist/types/renderHtml.d.ts",
43
44
  "node": {
44
45
  "jsnext:source": "./src/renderHtml.ts",
45
46
  "import": "./dist/esm-node/renderHtml.js",
46
47
  "require": "./dist/cjs/renderHtml.js"
47
48
  },
48
- "types": "./dist/types/renderHtml.d.ts",
49
49
  "default": "./dist/esm/renderHtml.js"
50
50
  }
51
51
  },
@@ -63,41 +63,42 @@
63
63
  }
64
64
  },
65
65
  "dependencies": {
66
+ "@swc/helpers": "0.5.1",
67
+ "cookie": "^0.4.2",
66
68
  "etag": "^1.8.1",
67
69
  "fresh": "^0.5.2",
68
- "cookie": "^0.4.2",
69
70
  "http-proxy-middleware": "^2.0.1",
70
71
  "ignore-styles": "^5.0.1",
71
72
  "lru-cache": "^6.0.0",
72
73
  "merge-deep": "^3.0.3",
74
+ "node-html-parser": "^6.1.5",
73
75
  "path-to-regexp": "^6.2.0",
74
76
  "serve-static": "^1.14.1",
75
- "@swc/helpers": "0.5.1",
76
- "@modern-js/utils": "2.31.2",
77
- "@modern-js/server-core": "2.31.2",
78
- "@modern-js/plugin": "2.31.2"
77
+ "@modern-js/plugin": "2.32.0",
78
+ "@modern-js/server-core": "2.32.0",
79
+ "@modern-js/utils": "2.32.0"
79
80
  },
80
81
  "devDependencies": {
81
82
  "@types/cookie": "^0.4.1",
83
+ "@types/etag": "^1.8.1",
84
+ "@types/fresh": "^0.5.0",
82
85
  "@types/jest": "^29",
83
86
  "@types/lru-cache": "^5.1.1",
84
87
  "@types/merge-deep": "^3.0.0",
85
88
  "@types/node": "^14",
86
- "@types/etag": "^1.8.1",
87
- "@types/fresh": "^0.5.0",
88
89
  "@types/serve-static": "^1.13.10",
90
+ "@types/ws": "^8.5.5",
89
91
  "axios": "^1.2.1",
90
92
  "jest": "^29",
93
+ "memfs": "^3.5.1",
91
94
  "node-mocks-http": "^1.11.0",
92
95
  "portfinder": "^1.0.28",
93
96
  "typescript": "^5",
94
- "memfs": "^3.5.1",
95
97
  "ws": "^8.13.0",
96
- "@types/ws": "^8.5.5",
97
- "@modern-js/types": "2.31.2",
98
- "@modern-js/server-core": "2.31.2",
99
- "@scripts/jest-config": "2.31.1",
100
- "@scripts/build": "2.31.1"
98
+ "@modern-js/server-core": "2.32.0",
99
+ "@modern-js/types": "2.32.0",
100
+ "@scripts/build": "2.32.0",
101
+ "@scripts/jest-config": "2.32.0"
101
102
  },
102
103
  "sideEffects": false,
103
104
  "publishConfig": {