@modern-js/prod-server 2.19.1 → 2.21.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 (79) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/cjs/index.js +3 -15
  3. package/dist/cjs/libs/context/context.js +10 -26
  4. package/dist/cjs/libs/hook-api/index.js +13 -29
  5. package/dist/cjs/libs/hook-api/route.js +4 -16
  6. package/dist/cjs/libs/hook-api/template.js +2 -14
  7. package/dist/cjs/libs/loadConfig.js +4 -47
  8. package/dist/cjs/libs/logger.js +5 -17
  9. package/dist/cjs/libs/render/cache/__tests__/cache.fun.test.js +2 -6
  10. package/dist/cjs/libs/render/cache/page-caches/lru.js +5 -21
  11. package/dist/cjs/libs/render/cache/spr.js +7 -23
  12. package/dist/cjs/libs/render/cache/util.js +2 -6
  13. package/dist/cjs/libs/render/index.js +7 -49
  14. package/dist/cjs/libs/render/reader.js +4 -20
  15. package/dist/cjs/libs/render/ssr.js +8 -10
  16. package/dist/cjs/libs/render/static.js +2 -6
  17. package/dist/cjs/libs/route/index.js +3 -15
  18. package/dist/cjs/libs/route/matcher.js +5 -17
  19. package/dist/cjs/libs/route/route.js +10 -22
  20. package/dist/cjs/libs/serveFile.js +2 -6
  21. package/dist/cjs/server/index.js +9 -25
  22. package/dist/cjs/server/modernServer.js +28 -82
  23. package/dist/cjs/workerServer.js +103 -48
  24. package/dist/esm/libs/context/context.js +4 -42
  25. package/dist/esm/libs/hook-api/index.js +6 -132
  26. package/dist/esm/libs/hook-api/route.js +3 -35
  27. package/dist/esm/libs/hook-api/template.js +3 -35
  28. package/dist/esm/libs/loadConfig.js +2 -52
  29. package/dist/esm/libs/logger.js +7 -101
  30. package/dist/esm/libs/proxy.js +5 -194
  31. package/dist/esm/libs/render/cache/__tests__/cache.fun.test.js +6 -192
  32. package/dist/esm/libs/render/cache/__tests__/cache.test.js +13 -202
  33. package/dist/esm/libs/render/cache/index.js +8 -164
  34. package/dist/esm/libs/render/cache/page-caches/index.js +3 -132
  35. package/dist/esm/libs/render/cache/page-caches/lru.js +3 -35
  36. package/dist/esm/libs/render/cache/spr.js +10 -171
  37. package/dist/esm/libs/render/cache/util.js +6 -211
  38. package/dist/esm/libs/render/index.js +6 -134
  39. package/dist/esm/libs/render/measure.js +4 -93
  40. package/dist/esm/libs/render/reader.js +8 -169
  41. package/dist/esm/libs/render/ssr.js +15 -137
  42. package/dist/esm/libs/render/static.js +3 -132
  43. package/dist/esm/libs/route/index.js +3 -35
  44. package/dist/esm/libs/route/matcher.js +3 -35
  45. package/dist/esm/libs/route/route.js +2 -18
  46. package/dist/esm/libs/serveFile.js +3 -132
  47. package/dist/esm/server/index.js +16 -247
  48. package/dist/esm/server/modernServer.js +24 -229
  49. package/dist/esm/server/modernServerSplit.js +12 -253
  50. package/dist/esm/utils.js +2 -62
  51. package/dist/esm/workerServer.js +134 -190
  52. package/dist/esm-node/libs/context/context.js +1 -13
  53. package/dist/esm-node/libs/hook-api/index.js +1 -13
  54. package/dist/esm-node/libs/hook-api/route.js +1 -13
  55. package/dist/esm-node/libs/hook-api/template.js +1 -13
  56. package/dist/esm-node/libs/logger.js +1 -13
  57. package/dist/esm-node/libs/render/cache/page-caches/lru.js +1 -13
  58. package/dist/esm-node/libs/render/cache/spr.js +1 -13
  59. package/dist/esm-node/libs/render/index.js +3 -2
  60. package/dist/esm-node/libs/render/reader.js +1 -13
  61. package/dist/esm-node/libs/render/ssr.js +5 -3
  62. package/dist/esm-node/libs/route/index.js +1 -13
  63. package/dist/esm-node/libs/route/matcher.js +1 -13
  64. package/dist/esm-node/libs/route/route.js +1 -13
  65. package/dist/esm-node/server/index.js +1 -13
  66. package/dist/esm-node/server/modernServer.js +4 -15
  67. package/dist/esm-node/workerServer.js +102 -47
  68. package/dist/types/index.d.ts +0 -2
  69. package/dist/types/libs/context/context.d.ts +1 -4
  70. package/dist/types/libs/loadConfig.d.ts +0 -1
  71. package/dist/types/libs/logger.d.ts +0 -2
  72. package/dist/types/libs/render/cache/index.d.ts +0 -2
  73. package/dist/types/libs/render/cache/spr.d.ts +0 -2
  74. package/dist/types/libs/render/index.d.ts +3 -1
  75. package/dist/types/libs/render/ssr.d.ts +1 -0
  76. package/dist/types/server/index.d.ts +0 -3
  77. package/dist/types/utils.d.ts +1 -1
  78. package/dist/types/workerServer.d.ts +33 -5
  79. package/package.json +9 -8
@@ -1,68 +1,123 @@
1
+ import { _ as _define_property } from "@swc/helpers/_/_define_property";
1
2
  import { Logger } from "./libs/logger";
2
3
  import { RouteMatchManager } from "./libs/route";
3
4
  import { metrics as defaultMetrics } from "./libs/metrics";
4
- export const handleUrl = (url) => {
5
- return url.replace(/^https?:\/\/.*?\//gi, "/");
6
- };
5
+ export class ReturnResponse {
6
+ /**
7
+ * Iterate a Object
8
+ * 1. adds the value if the key does not already exist.
9
+ * 2. append the value if the key does already exist.
10
+ *
11
+ * more detail follow: https://developer.mozilla.org/en-US/docs/Web/API/Headers/append
12
+ * @param headers
13
+ * @returns
14
+ */
15
+ appendHeaders(headers) {
16
+ Object.entries(headers).forEach(([key, value]) => {
17
+ this.headers.append(key, value.toString());
18
+ });
19
+ return this;
20
+ }
21
+ /**
22
+ * Iterate a Object
23
+ * 1. adds the value if the key does not already exist.
24
+ * 2. modify the value if the key does already exist.
25
+ *
26
+ * more detail follow: https://developer.mozilla.org/en-US/docs/Web/API/Headers/set
27
+ * @param headers
28
+ * @returns
29
+ */
30
+ setHeaders(headers) {
31
+ Object.entries(headers).forEach(([key, value]) => {
32
+ this.headers.set(key, value.toString());
33
+ });
34
+ return this;
35
+ }
36
+ constructor(body, status, headers = {}) {
37
+ _define_property(this, "body", void 0);
38
+ _define_property(this, "status", void 0);
39
+ _define_property(this, "headers", void 0);
40
+ this.body = body;
41
+ this.status = status;
42
+ this.headers = new Headers(headers);
43
+ this.headers.set("content-type", "text/html;charset=UTF-8");
44
+ }
45
+ }
46
+ const RESPONSE_NOTFOUND = new ReturnResponse("404: Page not found", 404);
7
47
  export const createHandler = (manifest) => {
8
48
  const routeMgr = new RouteMatchManager();
9
49
  const { pages, routes } = manifest;
10
50
  routeMgr.reset(routes);
11
- return async (ctx) => {
12
- var _ctx_request, _ctx_request1, _ctx_request2;
13
- const pageMatch = routeMgr.match(ctx.url);
51
+ return async (options) => {
52
+ const { request, loadableStats, routeManifest } = options;
53
+ const url = new URL(request.url);
54
+ const pageMatch = routeMgr.match(url.pathname);
14
55
  if (!pageMatch) {
15
- ctx.body = "404: Page not found";
16
- ctx.status = 404;
17
- return;
56
+ return RESPONSE_NOTFOUND;
18
57
  }
19
58
  const page = pages[pageMatch.spec.urlPath];
20
- var _query;
21
- (_query = (_ctx_request = ctx.request).query) !== null && _query !== void 0 ? _query : _ctx_request.query = ctx.query;
22
- var _pathname;
23
- (_pathname = (_ctx_request1 = ctx.request).pathname) !== null && _pathname !== void 0 ? _pathname : _ctx_request1.pathname = ctx.pathname;
24
- var _params;
25
- (_params = (_ctx_request2 = ctx.request).params) !== null && _params !== void 0 ? _params : _ctx_request2.params = ctx.params;
26
- const params = pageMatch.parseURLParams(ctx.url);
27
59
  if (page.serverRender) {
28
60
  try {
29
- ctx.body = await page.serverRender({
30
- entryName: page.entryName,
61
+ const responseLike = {
62
+ headers: {},
63
+ statusCode: 200,
64
+ locals: {},
65
+ setHeader(key, value) {
66
+ this.headers[key] = value;
67
+ },
68
+ status(code) {
69
+ this.statusCode = code;
70
+ }
71
+ };
72
+ const params = pageMatch.parseURLParams(url.pathname) || {};
73
+ const serverRenderContext = {
74
+ request: createServerRequest(url, request, params),
75
+ response: responseLike,
76
+ loadableStats,
77
+ routeManifest,
78
+ redirection: {},
31
79
  template: page.template,
32
- query: ctx.query,
33
- request: ctx.request,
34
- response: ctx.response,
35
- pathname: ctx.pathname,
36
- req: ctx.request,
37
- res: ctx.response,
38
- params: ctx.params || params || {},
39
- logger: ctx.logger || new Logger({
80
+ entryName: page.entryName,
81
+ logger: new Logger({
40
82
  level: "warn"
41
83
  }),
42
- metrics: ctx.metrics || defaultMetrics,
43
- loadableStats: ctx.loadableStats,
44
- routeManifest: ctx.routeManifest
45
- });
46
- ctx.status = 200;
47
- return;
84
+ metrics: defaultMetrics,
85
+ // FIXME: pass correctly req & res
86
+ req: request,
87
+ res: responseLike
88
+ };
89
+ const body = await page.serverRender(serverRenderContext);
90
+ return new ReturnResponse(body, responseLike.statusCode, responseLike.headers);
48
91
  } catch (e) {
49
- if (page.template) {
50
- ctx.body = page.template;
51
- ctx.status = 200;
52
- return;
53
- } else {
54
- ctx.body = "404: not found";
55
- ctx.status = 404;
56
- return;
57
- }
92
+ console.warn(`page(${pageMatch.spec.urlPath}) serverRender occur error: `);
93
+ console.warn(e);
94
+ return createResponse(page.template);
58
95
  }
59
96
  }
60
- if (page.template) {
61
- ctx.body = page.template;
62
- ctx.status = 200;
63
- return;
97
+ console.warn(`Can't not page(${pageMatch.spec.urlPath}) serverRender`);
98
+ return createResponse(page.template);
99
+ function createServerRequest(url2, request2, params) {
100
+ const { pathname, host, searchParams } = url2;
101
+ const { headers: rawHeaders } = request2;
102
+ const headers = {};
103
+ rawHeaders.forEach((value, key) => {
104
+ headers[key] = value;
105
+ });
106
+ const query = Object.fromEntries(searchParams);
107
+ return {
108
+ pathname,
109
+ host,
110
+ headers,
111
+ params,
112
+ query
113
+ };
64
114
  }
65
- ctx.body = "404: not found";
66
- ctx.status = 404;
67
115
  };
68
116
  };
117
+ function createResponse(template) {
118
+ if (template) {
119
+ return new ReturnResponse(template, 200);
120
+ } else {
121
+ return RESPONSE_NOTFOUND;
122
+ }
123
+ }
@@ -6,7 +6,5 @@ export { ModernServer } from './server/modernServer';
6
6
  export { createProxyHandler } from './libs/proxy';
7
7
  export * from './type';
8
8
  export * from './constants';
9
-
10
9
  declare const _default: (options: ModernServerOptions) => Promise<Server>;
11
-
12
10
  export default _default;
@@ -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/fqLsTrQHy_76SvC3yCBK3/src/type" />
5
+ /// <reference types=".dts-temp/dQl0PkddbjYymDTKBgvwm/src/type" />
6
6
  import { IncomingMessage, ServerResponse } from 'http';
7
7
  import qs from 'querystring';
8
8
  import type { ModernServerContext as ModernServerContextInterface } from '@modern-js/types';
@@ -18,12 +18,10 @@ export declare class ModernServerContext implements ModernServerContextInterface
18
18
  /**
19
19
  * http response
20
20
  */
21
-
22
21
  res: ServerResponse;
23
22
  /**
24
23
  * url params
25
24
  */
26
-
27
25
  params: Record<string, string>;
28
26
  get logger(): import("@modern-js/types").Logger;
29
27
  get metrics(): import("@modern-js/types").Metrics;
@@ -54,7 +52,6 @@ export declare class ModernServerContext implements ModernServerContextInterface
54
52
  /**
55
53
  * 判断链接是否已经关闭
56
54
  */
57
-
58
55
  resHasHandled(): boolean;
59
56
  error(dig: string, e?: Error | string): void;
60
57
  }
@@ -6,7 +6,6 @@ export declare const requireConfig: (serverConfigPath: string) => any;
6
6
  * 生产环境下,resolvedConfig 与 serverConfig 进行深合并
7
7
  * resolvedConfigPath: 构建序列化后的 modern.config.js 文件路径
8
8
  */
9
-
10
9
  export declare const loadConfig: ({
11
10
  cliConfig,
12
11
  serverConfig,
@@ -44,7 +44,6 @@ declare const LOG_TYPES: {
44
44
  level: string;
45
45
  };
46
46
  };
47
-
48
47
  declare class Logger {
49
48
  private readonly level;
50
49
  private readonly config;
@@ -55,7 +54,6 @@ declare class Logger {
55
54
  private _log;
56
55
  private getLongestLabel;
57
56
  }
58
-
59
57
  type LoggerInterface = { [key in keyof typeof LOG_TYPES]: LoggerFunction };
60
58
  declare const logger: Logger & LoggerInterface;
61
59
  export { Logger };
@@ -2,7 +2,5 @@
2
2
  import { Readable } from 'stream';
3
3
  import type { ModernServerContext } from '@modern-js/types';
4
4
  import { RenderFunction, SSRServerContext } from '../type';
5
-
6
5
  declare const _default: (renderFn: RenderFunction, ctx: ModernServerContext) => (context: SSRServerContext) => Promise<string | Readable>;
7
-
8
6
  export default _default;
@@ -1,6 +1,5 @@
1
1
  import LRUCache from 'lru-cache';
2
2
  import { CacheContent, CacheManagerOptions, CacheResult, CacheContext, CacheConfig } from './type';
3
-
4
3
  declare class CacheManager {
5
4
  cache: LRUCache<string, CacheContent>;
6
5
  cacheOptions: CacheManagerOptions;
@@ -18,7 +17,6 @@ declare class CacheManager {
18
17
  set(context: CacheContext, html: string, cacheConfig: CacheConfig, sync?: boolean): Promise<any>;
19
18
  del(context: CacheContext, cacheHash: string): Promise<void>;
20
19
  }
21
-
22
20
  export declare function createCache(): CacheManager;
23
21
  export declare function destroyCache(): void;
24
22
  export {};
@@ -4,11 +4,13 @@ import { ModernRoute } from '../route';
4
4
  export declare const createRenderHandler: ({
5
5
  distDir,
6
6
  staticGenerate,
7
- forceCSR
7
+ forceCSR,
8
+ nonce
8
9
  }: {
9
10
  distDir: string;
10
11
  staticGenerate: boolean;
11
12
  forceCSR?: boolean | undefined;
13
+ nonce?: string | undefined;
12
14
  }) => ({
13
15
  ctx,
14
16
  route,
@@ -8,4 +8,5 @@ export declare const render: (ctx: ModernServerContext, renderOptions: {
8
8
  entryName: string;
9
9
  staticGenerate: boolean;
10
10
  enableUnsafeCtx?: boolean;
11
+ nonce?: string;
11
12
  }, runner: ServerHookRunner) => Promise<RenderResult>;
@@ -26,14 +26,12 @@ export declare class Server {
26
26
  * - 执行 prepare hook
27
27
  * - 执行 server init
28
28
  */
29
-
30
29
  init(): Promise<this>;
31
30
  /**
32
31
  * Execute config hooks
33
32
  * @param runner
34
33
  * @param options
35
34
  */
36
-
37
35
  private runConfigHook;
38
36
  private runPrepareHook;
39
37
  private initServerConfig;
@@ -41,7 +39,6 @@ export declare class Server {
41
39
  *
42
40
  * merge cliConfig and serverConfig
43
41
  */
44
-
45
42
  private initConfig;
46
43
  close(): Promise<void>;
47
44
  listen<T extends number | ListenOptions | undefined>(options: T, listener: any): void;
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  /// <reference types="node/http" />
3
- /// <reference types=".dts-temp/fqLsTrQHy_76SvC3yCBK3/src/type" />
3
+ /// <reference types=".dts-temp/dQl0PkddbjYymDTKBgvwm/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;
@@ -1,10 +1,39 @@
1
1
  import { ModernRouteInterface } from './libs/route';
2
2
  export type Context = Record<string, any>;
3
- export interface UrlQuery {
4
- [key: string]: string;
3
+ export interface HandlerOptions {
4
+ request: Request;
5
+ loadableStats: Record<string, any>;
6
+ routeManifest: Record<string, any>;
7
+ }
8
+ export declare class ReturnResponse {
9
+ body: string;
10
+ status: number;
11
+ headers: Headers;
12
+ constructor(body: string, status: number, headers?: Record<string, any>);
13
+ /**
14
+ * Iterate a Object
15
+ * 1. adds the value if the key does not already exist.
16
+ * 2. append the value if the key does already exist.
17
+ *
18
+ * more detail follow: https://developer.mozilla.org/en-US/docs/Web/API/Headers/append
19
+ * @param headers
20
+ * @returns
21
+ */
22
+ appendHeaders(headers: Record<string, any>): this;
23
+ /**
24
+ * Iterate a Object
25
+ * 1. adds the value if the key does not already exist.
26
+ * 2. modify the value if the key does already exist.
27
+ *
28
+ * more detail follow: https://developer.mozilla.org/en-US/docs/Web/API/Headers/set
29
+ * @param headers
30
+ * @returns
31
+ */
32
+ setHeaders(headers: Record<string, any>): this;
5
33
  }
6
34
  export type Manifest = {
7
- pages: Record<string, // path
35
+ pages: Record<string,
36
+ // path
8
37
  {
9
38
  entryName: string;
10
39
  template: string;
@@ -12,5 +41,4 @@ export type Manifest = {
12
41
  }>;
13
42
  routes: ModernRouteInterface[];
14
43
  };
15
- export declare const handleUrl: (url: string) => string;
16
- export declare const createHandler: (manifest: Manifest) => (ctx: Context) => Promise<void>;
44
+ export declare const createHandler: (manifest: Manifest) => (options: HandlerOptions) => Promise<ReturnResponse>;
package/package.json CHANGED
@@ -15,7 +15,7 @@
15
15
  "modern",
16
16
  "modern.js"
17
17
  ],
18
- "version": "2.19.1",
18
+ "version": "2.21.0",
19
19
  "jsnext:source": "./src/index.ts",
20
20
  "types": "./dist/types/index.d.ts",
21
21
  "main": "./dist/cjs/index.js",
@@ -60,8 +60,9 @@
60
60
  "merge-deep": "^3.0.3",
61
61
  "path-to-regexp": "^6.2.0",
62
62
  "serve-static": "^1.14.1",
63
- "@modern-js/utils": "2.19.1",
64
- "@modern-js/server-core": "2.19.1"
63
+ "@swc/helpers": "0.5.1",
64
+ "@modern-js/utils": "2.21.0",
65
+ "@modern-js/server-core": "2.21.0"
65
66
  },
66
67
  "devDependencies": {
67
68
  "@types/cookie": "^0.4.1",
@@ -76,11 +77,11 @@
76
77
  "jest": "^29",
77
78
  "node-mocks-http": "^1.11.0",
78
79
  "portfinder": "^1.0.28",
79
- "typescript": "^4",
80
- "@modern-js/types": "2.19.1",
81
- "@modern-js/server-core": "2.19.1",
82
- "@scripts/build": "2.19.1",
83
- "@scripts/jest-config": "2.19.1"
80
+ "typescript": "^5",
81
+ "@modern-js/types": "2.21.0",
82
+ "@modern-js/server-core": "2.21.0",
83
+ "@scripts/jest-config": "2.21.0",
84
+ "@scripts/build": "2.21.0"
84
85
  },
85
86
  "sideEffects": false,
86
87
  "publishConfig": {