@modern-js/prod-server 2.19.0 → 2.20.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 (69) hide show
  1. package/CHANGELOG.md +20 -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 +4 -47
  14. package/dist/cjs/libs/render/reader.js +4 -20
  15. package/dist/cjs/libs/render/ssr.js +3 -7
  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 +25 -80
  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 +3 -132
  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 +3 -132
  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 +21 -227
  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/reader.js +1 -13
  60. package/dist/esm-node/libs/route/index.js +1 -13
  61. package/dist/esm-node/libs/route/matcher.js +1 -13
  62. package/dist/esm-node/libs/route/route.js +1 -13
  63. package/dist/esm-node/server/index.js +1 -13
  64. package/dist/esm-node/server/modernServer.js +1 -13
  65. package/dist/esm-node/workerServer.js +102 -47
  66. package/dist/types/libs/context/context.d.ts +1 -1
  67. package/dist/types/utils.d.ts +1 -1
  68. package/dist/types/workerServer.d.ts +33 -4
  69. package/package.json +8 -7
@@ -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
+ }
@@ -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/JX5QjYJGey3ep5JEjysI3/src/type" />
5
+ /// <reference types=".dts-temp/fH4DiwP0xq-KSokd2lFla/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';
@@ -1,6 +1,6 @@
1
1
  /// <reference types="node" />
2
2
  /// <reference types="node/http" />
3
- /// <reference types=".dts-temp/JX5QjYJGey3ep5JEjysI3/src/type" />
3
+ /// <reference types=".dts-temp/fH4DiwP0xq-KSokd2lFla/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,7 +1,37 @@
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
+
23
+ appendHeaders(headers: Record<string, any>): this;
24
+ /**
25
+ * Iterate a Object
26
+ * 1. adds the value if the key does not already exist.
27
+ * 2. modify the value if the key does already exist.
28
+ *
29
+ * more detail follow: https://developer.mozilla.org/en-US/docs/Web/API/Headers/set
30
+ * @param headers
31
+ * @returns
32
+ */
33
+
34
+ setHeaders(headers: Record<string, any>): this;
5
35
  }
6
36
  export type Manifest = {
7
37
  pages: Record<string, // path
@@ -12,5 +42,4 @@ export type Manifest = {
12
42
  }>;
13
43
  routes: ModernRouteInterface[];
14
44
  };
15
- export declare const handleUrl: (url: string) => string;
16
- export declare const createHandler: (manifest: Manifest) => (ctx: Context) => Promise<void>;
45
+ 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.0",
18
+ "version": "2.20.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.0",
64
- "@modern-js/server-core": "2.19.0"
63
+ "@swc/helpers": "0.5.1",
64
+ "@modern-js/utils": "2.20.0",
65
+ "@modern-js/server-core": "2.20.0"
65
66
  },
66
67
  "devDependencies": {
67
68
  "@types/cookie": "^0.4.1",
@@ -77,10 +78,10 @@
77
78
  "node-mocks-http": "^1.11.0",
78
79
  "portfinder": "^1.0.28",
79
80
  "typescript": "^4",
80
- "@modern-js/types": "2.19.0",
81
- "@modern-js/server-core": "2.19.0",
82
- "@scripts/jest-config": "2.19.0",
83
- "@scripts/build": "2.19.0"
81
+ "@modern-js/types": "2.20.0",
82
+ "@modern-js/server-core": "2.20.0",
83
+ "@scripts/jest-config": "2.20.0",
84
+ "@scripts/build": "2.20.0"
84
85
  },
85
86
  "sideEffects": false,
86
87
  "publishConfig": {