@modern-js/prod-server 2.48.6 → 2.49.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 (174) hide show
  1. package/README.md +20 -16
  2. package/dist/cjs/{libs/route/route.js → error.js} +16 -17
  3. package/dist/cjs/index.js +18 -24
  4. package/dist/cjs/init.js +71 -0
  5. package/dist/cjs/{type.js → types.js} +2 -2
  6. package/dist/esm/error.js +15 -0
  7. package/dist/esm/index.js +53 -19
  8. package/dist/esm/init.js +73 -0
  9. package/dist/esm-node/error.js +14 -0
  10. package/dist/esm-node/index.js +16 -17
  11. package/dist/esm-node/init.js +47 -0
  12. package/dist/types/error.d.ts +6 -0
  13. package/dist/types/index.d.ts +8 -11
  14. package/dist/types/init.d.ts +4 -0
  15. package/dist/types/types.d.ts +14 -0
  16. package/package.json +23 -64
  17. package/dist/cjs/constants.js +0 -72
  18. package/dist/cjs/libs/context/context.js +0 -236
  19. package/dist/cjs/libs/context/index.js +0 -31
  20. package/dist/cjs/libs/hook-api/afterRenderForStream.js +0 -34
  21. package/dist/cjs/libs/hook-api/base.js +0 -96
  22. package/dist/cjs/libs/hook-api/index.js +0 -85
  23. package/dist/cjs/libs/hook-api/index.worker.js +0 -116
  24. package/dist/cjs/libs/hook-api/route.js +0 -44
  25. package/dist/cjs/libs/hook-api/template.js +0 -72
  26. package/dist/cjs/libs/hook-api/templateForStream.js +0 -52
  27. package/dist/cjs/libs/loadConfig.js +0 -70
  28. package/dist/cjs/libs/metrics.js +0 -33
  29. package/dist/cjs/libs/preload/flushServerHeader.js +0 -49
  30. package/dist/cjs/libs/preload/index.js +0 -24
  31. package/dist/cjs/libs/preload/parseLinks.js +0 -124
  32. package/dist/cjs/libs/preload/shouldFlushServerHeader.js +0 -52
  33. package/dist/cjs/libs/preload/transformLinks2String.js +0 -150
  34. package/dist/cjs/libs/proxy.js +0 -99
  35. package/dist/cjs/libs/render/index.js +0 -109
  36. package/dist/cjs/libs/render/measure.js +0 -74
  37. package/dist/cjs/libs/render/ssr.js +0 -130
  38. package/dist/cjs/libs/render/ssrCache/cacheMod.js +0 -51
  39. package/dist/cjs/libs/render/ssrCache/index.js +0 -90
  40. package/dist/cjs/libs/render/ssrCache/manager.js +0 -120
  41. package/dist/cjs/libs/render/static.js +0 -72
  42. package/dist/cjs/libs/render/type.js +0 -33
  43. package/dist/cjs/libs/render/utils.js +0 -41
  44. package/dist/cjs/libs/reporter.js +0 -39
  45. package/dist/cjs/libs/route/index.js +0 -83
  46. package/dist/cjs/libs/route/matcher.js +0 -113
  47. package/dist/cjs/libs/serveFile.js +0 -84
  48. package/dist/cjs/libs/serverTiming.js +0 -41
  49. package/dist/cjs/renderHtml.js +0 -65
  50. package/dist/cjs/server/index.js +0 -223
  51. package/dist/cjs/server/modernServer.js +0 -522
  52. package/dist/cjs/server/modernServerSplit.js +0 -67
  53. package/dist/cjs/utils.js +0 -164
  54. package/dist/cjs/workerServer.js +0 -260
  55. package/dist/esm/constants.js +0 -43
  56. package/dist/esm/libs/context/context.js +0 -260
  57. package/dist/esm/libs/context/index.js +0 -8
  58. package/dist/esm/libs/hook-api/afterRenderForStream.js +0 -33
  59. package/dist/esm/libs/hook-api/base.js +0 -73
  60. package/dist/esm/libs/hook-api/index.js +0 -55
  61. package/dist/esm/libs/hook-api/index.worker.js +0 -99
  62. package/dist/esm/libs/hook-api/route.js +0 -26
  63. package/dist/esm/libs/hook-api/template.js +0 -56
  64. package/dist/esm/libs/hook-api/templateForStream.js +0 -35
  65. package/dist/esm/libs/loadConfig.js +0 -36
  66. package/dist/esm/libs/metrics.js +0 -9
  67. package/dist/esm/libs/preload/flushServerHeader.js +0 -50
  68. package/dist/esm/libs/preload/index.js +0 -2
  69. package/dist/esm/libs/preload/parseLinks.js +0 -172
  70. package/dist/esm/libs/preload/shouldFlushServerHeader.js +0 -27
  71. package/dist/esm/libs/preload/transformLinks2String.js +0 -140
  72. package/dist/esm/libs/proxy.js +0 -160
  73. package/dist/esm/libs/render/index.js +0 -175
  74. package/dist/esm/libs/render/measure.js +0 -69
  75. package/dist/esm/libs/render/ssr.js +0 -133
  76. package/dist/esm/libs/render/ssrCache/cacheMod.js +0 -25
  77. package/dist/esm/libs/render/ssrCache/index.js +0 -170
  78. package/dist/esm/libs/render/ssrCache/manager.js +0 -178
  79. package/dist/esm/libs/render/static.js +0 -100
  80. package/dist/esm/libs/render/type.js +0 -9
  81. package/dist/esm/libs/render/utils.js +0 -16
  82. package/dist/esm/libs/reporter.js +0 -15
  83. package/dist/esm/libs/route/index.js +0 -82
  84. package/dist/esm/libs/route/matcher.js +0 -92
  85. package/dist/esm/libs/route/route.js +0 -17
  86. package/dist/esm/libs/serveFile.js +0 -68
  87. package/dist/esm/libs/serverTiming.js +0 -22
  88. package/dist/esm/renderHtml.js +0 -133
  89. package/dist/esm/server/index.js +0 -350
  90. package/dist/esm/server/modernServer.js +0 -884
  91. package/dist/esm/server/modernServerSplit.js +0 -113
  92. package/dist/esm/utils.js +0 -103
  93. package/dist/esm/workerServer.js +0 -352
  94. package/dist/esm-node/constants.js +0 -43
  95. package/dist/esm-node/libs/context/context.js +0 -202
  96. package/dist/esm-node/libs/context/index.js +0 -6
  97. package/dist/esm-node/libs/hook-api/afterRenderForStream.js +0 -10
  98. package/dist/esm-node/libs/hook-api/base.js +0 -61
  99. package/dist/esm-node/libs/hook-api/index.js +0 -57
  100. package/dist/esm-node/libs/hook-api/index.worker.js +0 -89
  101. package/dist/esm-node/libs/hook-api/route.js +0 -20
  102. package/dist/esm-node/libs/hook-api/template.js +0 -47
  103. package/dist/esm-node/libs/hook-api/templateForStream.js +0 -28
  104. package/dist/esm-node/libs/loadConfig.js +0 -34
  105. package/dist/esm-node/libs/metrics.js +0 -9
  106. package/dist/esm-node/libs/preload/flushServerHeader.js +0 -25
  107. package/dist/esm-node/libs/preload/index.js +0 -2
  108. package/dist/esm-node/libs/preload/parseLinks.js +0 -90
  109. package/dist/esm-node/libs/preload/shouldFlushServerHeader.js +0 -27
  110. package/dist/esm-node/libs/preload/transformLinks2String.js +0 -126
  111. package/dist/esm-node/libs/proxy.js +0 -74
  112. package/dist/esm-node/libs/render/index.js +0 -75
  113. package/dist/esm-node/libs/render/measure.js +0 -49
  114. package/dist/esm-node/libs/render/ssr.js +0 -96
  115. package/dist/esm-node/libs/render/ssrCache/cacheMod.js +0 -17
  116. package/dist/esm-node/libs/render/ssrCache/index.js +0 -66
  117. package/dist/esm-node/libs/render/ssrCache/manager.js +0 -96
  118. package/dist/esm-node/libs/render/static.js +0 -38
  119. package/dist/esm-node/libs/render/type.js +0 -9
  120. package/dist/esm-node/libs/render/utils.js +0 -16
  121. package/dist/esm-node/libs/reporter.js +0 -15
  122. package/dist/esm-node/libs/route/index.js +0 -58
  123. package/dist/esm-node/libs/route/matcher.js +0 -89
  124. package/dist/esm-node/libs/route/route.js +0 -16
  125. package/dist/esm-node/libs/serveFile.js +0 -49
  126. package/dist/esm-node/libs/serverTiming.js +0 -17
  127. package/dist/esm-node/renderHtml.js +0 -73
  128. package/dist/esm-node/server/index.js +0 -189
  129. package/dist/esm-node/server/modernServer.js +0 -488
  130. package/dist/esm-node/server/modernServerSplit.js +0 -43
  131. package/dist/esm-node/utils.js +0 -132
  132. package/dist/esm-node/workerServer.js +0 -235
  133. package/dist/types/constants.d.ts +0 -30
  134. package/dist/types/libs/context/context.d.ts +0 -62
  135. package/dist/types/libs/context/index.d.ts +0 -7
  136. package/dist/types/libs/hook-api/afterRenderForStream.d.ts +0 -4
  137. package/dist/types/libs/hook-api/base.d.ts +0 -53
  138. package/dist/types/libs/hook-api/index.d.ts +0 -6
  139. package/dist/types/libs/hook-api/index.worker.d.ts +0 -19
  140. package/dist/types/libs/hook-api/route.d.ts +0 -9
  141. package/dist/types/libs/hook-api/template.d.ts +0 -22
  142. package/dist/types/libs/hook-api/templateForStream.d.ts +0 -8
  143. package/dist/types/libs/loadConfig.d.ts +0 -13
  144. package/dist/types/libs/metrics.d.ts +0 -3
  145. package/dist/types/libs/preload/flushServerHeader.d.ts +0 -14
  146. package/dist/types/libs/preload/index.d.ts +0 -2
  147. package/dist/types/libs/preload/parseLinks.d.ts +0 -13
  148. package/dist/types/libs/preload/shouldFlushServerHeader.d.ts +0 -3
  149. package/dist/types/libs/preload/transformLinks2String.d.ts +0 -3
  150. package/dist/types/libs/proxy.d.ts +0 -13
  151. package/dist/types/libs/render/index.d.ts +0 -21
  152. package/dist/types/libs/render/measure.d.ts +0 -10
  153. package/dist/types/libs/render/ssr.d.ts +0 -12
  154. package/dist/types/libs/render/ssrCache/cacheMod.d.ts +0 -8
  155. package/dist/types/libs/render/ssrCache/index.d.ts +0 -6
  156. package/dist/types/libs/render/ssrCache/manager.d.ts +0 -20
  157. package/dist/types/libs/render/static.d.ts +0 -3
  158. package/dist/types/libs/render/type.d.ts +0 -36
  159. package/dist/types/libs/render/utils.d.ts +0 -5
  160. package/dist/types/libs/reporter.d.ts +0 -2
  161. package/dist/types/libs/route/index.d.ts +0 -15
  162. package/dist/types/libs/route/matcher.d.ts +0 -15
  163. package/dist/types/libs/route/route.d.ts +0 -14
  164. package/dist/types/libs/serveFile.d.ts +0 -9
  165. package/dist/types/libs/serverTiming.d.ts +0 -13
  166. package/dist/types/renderHtml.d.ts +0 -23
  167. package/dist/types/server/index.d.ts +0 -55
  168. package/dist/types/server/modernServer.d.ts +0 -71
  169. package/dist/types/server/modernServerSplit.d.ts +0 -2
  170. package/dist/types/type.d.ts +0 -78
  171. package/dist/types/utils.d.ts +0 -24
  172. package/dist/types/workerServer.d.ts +0 -59
  173. /package/dist/esm/{type.js → types.js} +0 -0
  174. /package/dist/esm-node/{type.js → types.js} +0 -0
@@ -1,202 +0,0 @@
1
- import { _ as _class_private_field_get } from "@swc/helpers/_/_class_private_field_get";
2
- import { _ as _class_private_field_init } from "@swc/helpers/_/_class_private_field_init";
3
- import { _ as _class_private_field_set } from "@swc/helpers/_/_class_private_field_set";
4
- import { URL } from "url";
5
- import qs from "querystring";
6
- import { Buffer } from "buffer";
7
- import createEtag from "etag";
8
- import fresh from "fresh";
9
- import { cutNameByHyphen } from "@modern-js/utils";
10
- import { ServerTiming } from "../serverTiming";
11
- import { defaultReporter } from "../reporter";
12
- import { headersWithoutCookie } from "../../utils";
13
- const MOCK_URL_BASE = "https://modernjs.dev/";
14
- var _urls = /* @__PURE__ */ new WeakMap(), _queries = /* @__PURE__ */ new WeakMap();
15
- class ModernServerContext {
16
- get logger() {
17
- return this.req.logger;
18
- }
19
- get metrics() {
20
- return this.req.metrics;
21
- }
22
- get parsedURL() {
23
- try {
24
- let url = _class_private_field_get(this, _urls).get(this.req.url);
25
- if (!url) {
26
- url = new URL(this.req.url, MOCK_URL_BASE);
27
- _class_private_field_get(this, _urls).set(this.req.url, url);
28
- }
29
- return url;
30
- } catch (e) {
31
- this.logger.error("Parse URL error", e.stack || e.message);
32
- return new URL("/_modern_mock_path", MOCK_URL_BASE);
33
- }
34
- }
35
- bind() {
36
- const { req, res } = this;
37
- req.get = (key) => this.getReqHeader(key);
38
- res.set = (key, value) => {
39
- if (!res.headersSent) {
40
- res.setHeader(key, value);
41
- }
42
- return res;
43
- };
44
- res.send = (body) => {
45
- this.send(body);
46
- };
47
- }
48
- // compat express res.send, only support etag now
49
- send(body) {
50
- try {
51
- const generateETag = !this.res.getHeader("ETag") && this.options.etag;
52
- if (body !== void 0 && generateETag) {
53
- const encoding = typeof body === "string" ? "utf-8" : void 0;
54
- const buf = !Buffer.isBuffer(body) ? Buffer.from(body, encoding) : body;
55
- const etag = createEtag(buf, {
56
- weak: true
57
- });
58
- if (etag) {
59
- this.res.setHeader("ETag", etag);
60
- }
61
- }
62
- if (this.fresh) {
63
- this.status = 304;
64
- }
65
- } catch (e) {
66
- this.logger.error(e.message);
67
- }
68
- this.res.end(body);
69
- }
70
- setParams(params) {
71
- this.params = params;
72
- }
73
- setServerData(key, value) {
74
- this.serverData[key] = value;
75
- }
76
- getReqHeader(key) {
77
- const { req } = this;
78
- const field = key.toLowerCase();
79
- switch (field) {
80
- case "referer":
81
- case "referrer":
82
- return req.headers.referrer || req.headers.referer || "";
83
- default:
84
- return req.headers[field] || "";
85
- }
86
- }
87
- get fresh() {
88
- const { status, res, method } = this;
89
- if ("GET" !== method && "HEAD" !== method) {
90
- return false;
91
- }
92
- if (status >= 200 && status < 300 || 304 === status) {
93
- return fresh(this.headers, {
94
- etag: res.getHeader("ETag"),
95
- "last-modified": res.getHeader("Last-Modified")
96
- });
97
- }
98
- return false;
99
- }
100
- /* request property */
101
- get headers() {
102
- return this.req.headers;
103
- }
104
- get method() {
105
- return this.req.method;
106
- }
107
- get url() {
108
- return this.req.url || "";
109
- }
110
- set url(val) {
111
- this.req.url = val;
112
- }
113
- get host() {
114
- let host = this.getReqHeader("X-Forwarded-Host");
115
- if (!host) {
116
- host = this.getReqHeader("Host");
117
- }
118
- host = host.split(/\s*,\s*/, 1)[0] || "undefined";
119
- return host;
120
- }
121
- get protocol() {
122
- if (this.req.socket.encrypted) {
123
- return "https";
124
- }
125
- const proto = this.getReqHeader("X-Forwarded-Proto");
126
- return proto ? proto.split(/\s*,\s*/, 1)[0] : "http";
127
- }
128
- get origin() {
129
- return `${this.protocol}://${this.host}`;
130
- }
131
- get href() {
132
- return this.origin + this.url;
133
- }
134
- get path() {
135
- return this.parsedURL.pathname;
136
- }
137
- set path(p) {
138
- if (!p) {
139
- return;
140
- }
141
- if (this.path === p) {
142
- return;
143
- }
144
- this.url = p + this.parsedURL.search;
145
- }
146
- get querystring() {
147
- if (!this.req) {
148
- return "";
149
- }
150
- return this.parsedURL.search.replace(/^\?/, "") || "";
151
- }
152
- get query() {
153
- const str = this.querystring;
154
- let query = _class_private_field_get(this, _queries).get(str);
155
- if (!query) {
156
- query = qs.parse(str);
157
- _class_private_field_get(this, _queries).set(str, query);
158
- }
159
- return query;
160
- }
161
- /* response property */
162
- get status() {
163
- return this.res.statusCode;
164
- }
165
- set status(statusCode) {
166
- this.res.statusCode = statusCode;
167
- }
168
- /**
169
- * 判断链接是否已经关闭
170
- */
171
- resHasHandled() {
172
- return this.res.writableEnded;
173
- }
174
- error(dig, e = "") {
175
- this.logger.error(`Web Server Error - ${dig}, error = %s, req.url = %s, req.headers = %o`, e instanceof Error ? e.stack || e.message : e, this.path, headersWithoutCookie(this.headers));
176
- }
177
- constructor(req, res, options) {
178
- _class_private_field_init(this, _urls, {
179
- writable: true,
180
- value: void 0
181
- });
182
- _class_private_field_init(this, _queries, {
183
- writable: true,
184
- value: void 0
185
- });
186
- this.params = {};
187
- this.reporter = defaultReporter;
188
- this.serverData = {};
189
- this.options = {};
190
- this.req = req;
191
- this.res = res;
192
- this.options = options || {};
193
- this.bind();
194
- _class_private_field_set(this, _urls, /* @__PURE__ */ new Map());
195
- _class_private_field_set(this, _queries, /* @__PURE__ */ new Map());
196
- this.serverTiming = new ServerTiming(this.res, cutNameByHyphen((options === null || options === void 0 ? void 0 : options.metaName) || "modern-js"));
197
- req.reporter && (this.reporter = req.reporter);
198
- }
199
- }
200
- export {
201
- ModernServerContext
202
- };
@@ -1,6 +0,0 @@
1
- import { ModernServerContext } from "./context";
2
- const createContext = (req, res, options) => new ModernServerContext(req, res, options);
3
- export {
4
- ModernServerContext,
5
- createContext
6
- };
@@ -1,10 +0,0 @@
1
- import { Transform } from "stream";
2
- const afterRenderInjectableStream = (fn) => new Transform({
3
- async write(chunk, _, callback) {
4
- this.push(await fn(chunk.toString()));
5
- callback();
6
- }
7
- });
8
- export {
9
- afterRenderInjectableStream
10
- };
@@ -1,61 +0,0 @@
1
- import cookie from "cookie";
2
- class BaseResponse {
3
- get(key) {
4
- return this.res.getHeader(key);
5
- }
6
- set(key, value) {
7
- return this.res.setHeader(key, value);
8
- }
9
- status(code) {
10
- this.res.statusCode = code;
11
- }
12
- setCookie(key, value, options) {
13
- const cookieValue = this.res.getHeader("set-cookie") || "";
14
- const fmt = Array.isArray(cookieValue) ? cookieValue : [
15
- cookieValue
16
- ].filter(Boolean);
17
- fmt.push(cookie.serialize(key, value, options));
18
- this.res.setHeader("set-cookie", fmt.length === 1 ? fmt[0] : fmt);
19
- }
20
- clearCookie() {
21
- this.res.removeHeader("set-cookie");
22
- }
23
- raw(body, options) {
24
- const { status, headers = {} } = options || {};
25
- Object.entries(headers).forEach(([key, value]) => {
26
- this.res.setHeader(key, value);
27
- });
28
- if (status) {
29
- this.res.statusCode = status;
30
- }
31
- this.res.end(body);
32
- }
33
- constructor(res) {
34
- this.res = res;
35
- this.cookies = {
36
- set: this.setCookie.bind(this),
37
- clear: this.clearCookie.bind(this)
38
- };
39
- }
40
- }
41
- class BaseRequest {
42
- getCookie(key) {
43
- return this._cookie[key];
44
- }
45
- constructor(request) {
46
- this.url = request.url;
47
- this.host = request.host;
48
- this.pathname = request.path;
49
- this.query = request.query;
50
- this.headers = request.headers;
51
- this.cookie = request.headers.cookie || "";
52
- this._cookie = cookie.parse(this.cookie);
53
- this.cookies = {
54
- get: this.getCookie.bind(this)
55
- };
56
- }
57
- }
58
- export {
59
- BaseRequest,
60
- BaseResponse
61
- };
@@ -1,57 +0,0 @@
1
- import { RouteAPI } from "./route";
2
- import { TemplateAPI } from "./template";
3
- import { BaseRequest, BaseResponse } from "./base";
4
- const base = (context) => {
5
- const { res } = context;
6
- return {
7
- response: new BaseResponse(res),
8
- request: new BaseRequest(context),
9
- logger: context.logger,
10
- metrics: context.metrics
11
- };
12
- };
13
- const createAfterMatchContext = (context, entryName) => {
14
- const baseContext = base(context);
15
- return {
16
- ...baseContext,
17
- router: new RouteAPI(entryName)
18
- };
19
- };
20
- const createAfterRenderContext = (context, route, content) => {
21
- const baseContext = base(context);
22
- return {
23
- ...baseContext,
24
- route,
25
- template: new TemplateAPI(content)
26
- };
27
- };
28
- const createAfterStreamingRenderContext = (context, route) => {
29
- const baseContext = base(context);
30
- return (chunk) => {
31
- return {
32
- ...baseContext,
33
- route,
34
- chunk
35
- };
36
- };
37
- };
38
- const createMiddlewareContext = (context) => {
39
- const baseContext = base(context);
40
- baseContext.response.locals = context.res.locals || {};
41
- return {
42
- ...baseContext,
43
- response: baseContext.response,
44
- reporter: context.reporter,
45
- source: {
46
- req: context.req,
47
- res: context.res
48
- }
49
- };
50
- };
51
- export {
52
- base,
53
- createAfterMatchContext,
54
- createAfterRenderContext,
55
- createAfterStreamingRenderContext,
56
- createMiddlewareContext
57
- };
@@ -1,89 +0,0 @@
1
- import { BaseRequest, BaseResponse } from "./base";
2
- import { RouteAPI } from "./route";
3
- import { TemplateAPI } from "./template";
4
- class ServerResponse {
5
- set statusCode(code) {
6
- this.res.status = code;
7
- }
8
- get statusCode() {
9
- return this.res.status;
10
- }
11
- getHeader(key) {
12
- var _this_res_headers_get;
13
- return (_this_res_headers_get = this.res.headers.get(key)) !== null && _this_res_headers_get !== void 0 ? _this_res_headers_get : void 0;
14
- }
15
- setHeader(key, value) {
16
- this.res.headers.set(key, value);
17
- }
18
- removeHeader(key) {
19
- this.res.headers.delete(key);
20
- }
21
- end(body) {
22
- this.res.body = body;
23
- this.res.isSent = true;
24
- }
25
- constructor(res) {
26
- this.res = res;
27
- this.locals = res.locals;
28
- }
29
- }
30
- const base = (context) => {
31
- const { req, res, logger, metrics } = context;
32
- const serverResponse = new ServerResponse(res);
33
- const { host, pathname, searchParams } = new URL(req.url);
34
- const headers = {};
35
- req.headers.forEach((value, key) => {
36
- headers[key] = value;
37
- });
38
- return {
39
- response: new BaseResponse(serverResponse),
40
- request: new BaseRequest({
41
- url: req.url,
42
- host,
43
- path: pathname,
44
- headers,
45
- // eslint-disable-next-line node/no-unsupported-features/es-builtins
46
- query: Object.fromEntries(searchParams)
47
- }),
48
- logger,
49
- metrics
50
- };
51
- };
52
- const createAfterMatchContext = (context, entryName) => {
53
- const baseContext = base(context);
54
- return {
55
- ...baseContext,
56
- router: new RouteAPI(entryName)
57
- };
58
- };
59
- const createAfterRenderContext = (context, route, content) => {
60
- const baseContext = base(context);
61
- return {
62
- ...baseContext,
63
- route,
64
- template: new TemplateAPI(content)
65
- };
66
- };
67
- const createMiddlewareContext = (context) => {
68
- const baseContext = base(context);
69
- baseContext.response.locals = context.res.locals;
70
- const { url, headers } = context.req;
71
- const rawRequest = new Request(url, {
72
- headers
73
- });
74
- return {
75
- ...baseContext,
76
- reporter: context.reporter,
77
- response: baseContext.response,
78
- source: {
79
- req: rawRequest,
80
- res: baseContext.response
81
- }
82
- };
83
- };
84
- export {
85
- base,
86
- createAfterMatchContext,
87
- createAfterRenderContext,
88
- createMiddlewareContext
89
- };
@@ -1,20 +0,0 @@
1
- class RouteAPI {
2
- redirect(url, status = 302) {
3
- this.url = url;
4
- this.status = status;
5
- }
6
- rewrite(entryName) {
7
- this.current = entryName;
8
- }
9
- use(entryName) {
10
- this.rewrite(entryName);
11
- }
12
- constructor(entryName) {
13
- this.current = entryName;
14
- this.status = 200;
15
- this.url = "";
16
- }
17
- }
18
- export {
19
- RouteAPI
20
- };
@@ -1,47 +0,0 @@
1
- const RegList = {
2
- before: {
3
- head: "<head[^>]*>",
4
- body: "<body[^>]*>"
5
- },
6
- after: {
7
- head: "</head>",
8
- body: "</body>"
9
- }
10
- };
11
- class TemplateAPI {
12
- get() {
13
- return this.content;
14
- }
15
- set(content) {
16
- this.content = content;
17
- }
18
- prependHead(fragment) {
19
- const { head } = RegList.before;
20
- return this.replaceByFunction(new RegExp(head), (beforeHead) => `${beforeHead}${fragment}`);
21
- }
22
- appendHead(fragment) {
23
- const { head } = RegList.after;
24
- return this.replace(head, `${fragment}${head}`);
25
- }
26
- prependBody(fragment) {
27
- const { body } = RegList.before;
28
- return this.replaceByFunction(new RegExp(body), (beforeBody) => `${beforeBody}${fragment}`);
29
- }
30
- appendBody(fragment) {
31
- const { body } = RegList.after;
32
- return this.replace(body, `${fragment}${body}`);
33
- }
34
- replaceByFunction(reg, replacer) {
35
- this.content = this.content.replace(reg, replacer);
36
- }
37
- replace(reg, text) {
38
- this.content = this.content.replace(reg, text);
39
- }
40
- constructor(content) {
41
- this.content = content;
42
- }
43
- }
44
- export {
45
- RegList,
46
- TemplateAPI
47
- };
@@ -1,28 +0,0 @@
1
- import { Transform } from "stream";
2
- import { RegList } from "./template";
3
- const templateInjectableStream = ({ prependHead, appendHead, prependBody, appendBody }) => new Transform({
4
- write(chunk, _, callback) {
5
- let chunk_str = chunk.toString();
6
- if (prependHead) {
7
- const { head } = RegList.before;
8
- chunk_str = chunk_str.replace(new RegExp(head), (beforeHead) => `${beforeHead}${prependHead}`);
9
- }
10
- if (appendHead) {
11
- const { head } = RegList.after;
12
- chunk_str = chunk_str.replace(head, `${appendHead}${head}`);
13
- }
14
- if (prependBody) {
15
- const { body } = RegList.before;
16
- chunk_str = chunk_str.replace(new RegExp(body), (beforeBody) => `${beforeBody}${prependBody}`);
17
- }
18
- if (appendBody) {
19
- const { body } = RegList.after;
20
- chunk_str = chunk_str.replace(body, `${appendBody}${body}`);
21
- }
22
- this.push(chunk_str);
23
- callback();
24
- }
25
- });
26
- export {
27
- templateInjectableStream
28
- };
@@ -1,34 +0,0 @@
1
- import * as path from "path";
2
- import { compatRequire, fs, DEFAULT_SERVER_CONFIG } from "@modern-js/utils";
3
- import mergeDeep from "merge-deep";
4
- const getServerConfigPath = (distDirectory, serverConfigFile = DEFAULT_SERVER_CONFIG) => {
5
- const serverConfigPath = path.join(distDirectory, serverConfigFile);
6
- return `${serverConfigPath}.js`;
7
- };
8
- const requireConfig = (serverConfigPath) => {
9
- if (fs.pathExistsSync(serverConfigPath)) {
10
- return compatRequire(serverConfigPath);
11
- }
12
- return {};
13
- };
14
- const loadConfig = ({ cliConfig, serverConfig, resolvedConfigPath }) => {
15
- let config = null;
16
- if (process.env.NODE_ENV === "production") {
17
- const resolvedConfig = requireConfig(resolvedConfigPath);
18
- config = mergeDeep({
19
- ...resolvedConfig,
20
- plugins: []
21
- }, serverConfig, cliConfig);
22
- } else {
23
- config = mergeDeep({
24
- ...cliConfig,
25
- plugins: []
26
- }, serverConfig);
27
- }
28
- return config;
29
- };
30
- export {
31
- getServerConfigPath,
32
- loadConfig,
33
- requireConfig
34
- };
@@ -1,9 +0,0 @@
1
- const metrics = {
2
- emitCounter() {
3
- },
4
- emitTimer() {
5
- }
6
- };
7
- export {
8
- metrics
9
- };
@@ -1,25 +0,0 @@
1
- import { parseLinks } from "./parseLinks";
2
- import { transformLinks2String } from "./transformLinks2String";
3
- async function flushServerHeader({ serverConf, ctx, distDir, template, headers }) {
4
- const { ssr: ssrConf } = serverConf || {};
5
- if (typeof ssrConf !== "object") {
6
- return;
7
- }
8
- const { res } = ctx;
9
- const links = await parseLinks({
10
- template,
11
- distDir,
12
- pathname: ctx.path
13
- });
14
- const link = transformLinks2String(links, ssrConf.preload);
15
- res.set("link", link);
16
- for (const key in headers || {}) {
17
- const value = headers === null || headers === void 0 ? void 0 : headers[key];
18
- value && res.set(key, value);
19
- }
20
- res.flushHeaders();
21
- res.modernFlushedHeaders = true;
22
- }
23
- export {
24
- flushServerHeader
25
- };
@@ -1,2 +0,0 @@
1
- export * from "./parseLinks";
2
- export * from "./flushServerHeader";
@@ -1,90 +0,0 @@
1
- import path from "path";
2
- import { NESTED_ROUTE_SPEC_FILE, ROUTE_MANIFEST_FILE, ROUTE_SPEC_FILE, fs } from "@modern-js/utils";
3
- import { parse as htmlParse } from "node-html-parser";
4
- import { matchRoutes } from "@modern-js/runtime-utils/remix-router";
5
- import { matchEntry } from "@modern-js/runtime-utils/node";
6
- async function parseLinks({ pathname, distDir, template }) {
7
- const links = await parseLinksFromRoutes(pathname, distDir);
8
- return links.concat(parseLinksFromHtml(template));
9
- }
10
- function parseLinksFromHtml(html) {
11
- const root = htmlParse(html);
12
- const scripts = root.querySelectorAll("script").filter((elem) => Boolean(elem.getAttribute("src")));
13
- const css = root.querySelectorAll("link").filter((elem) => {
14
- const href = elem.getAttribute("href");
15
- const rel = elem.getAttribute("rel");
16
- return href && rel === "stylesheet";
17
- });
18
- const images = root.querySelectorAll("img").filter((elem) => Boolean(elem.getAttribute("src")));
19
- return scripts.map((elem) => {
20
- const src = elem.getAttribute("src");
21
- return {
22
- uri: src,
23
- as: "script"
24
- };
25
- }).concat(css.map((elem) => {
26
- const href = elem.getAttribute("href");
27
- return {
28
- uri: href,
29
- as: "style"
30
- };
31
- })).concat(images.map((elem) => {
32
- const src = elem.getAttribute("src");
33
- return {
34
- uri: src,
35
- as: "image"
36
- };
37
- }));
38
- }
39
- async function parseLinksFromRoutes(pathname, distDir) {
40
- const noopLinks = [];
41
- const nestedRoutesSpec = path.join(distDir, NESTED_ROUTE_SPEC_FILE);
42
- const routesJsonPath = path.join(distDir, ROUTE_SPEC_FILE);
43
- const routeManifestPath = path.join(distDir, ROUTE_MANIFEST_FILE);
44
- if (!fs.existsSync(nestedRoutesSpec) || !fs.existsSync(routesJsonPath) || !fs.existsSync(routeManifestPath)) {
45
- return noopLinks;
46
- }
47
- const routesJson = await import(routesJsonPath);
48
- const serverRoutes = routesJson.routes;
49
- const entry = matchEntry(pathname, serverRoutes);
50
- if (entry) {
51
- var _routeAssets_entryName, _assets_filter, _assets_filter1;
52
- const routes = await import(nestedRoutesSpec);
53
- const { entryName } = entry;
54
- if (!entryName) {
55
- return noopLinks;
56
- }
57
- const entryRoutes = routes[entryName];
58
- if (!entryRoutes) {
59
- return noopLinks;
60
- }
61
- const routesManifest = await import(routeManifestPath);
62
- const { routeAssets } = routesManifest;
63
- const matches = matchRoutes(entryRoutes, pathname, entry.urlPath);
64
- const entryAssets = (_routeAssets_entryName = routeAssets[entryName]) === null || _routeAssets_entryName === void 0 ? void 0 : _routeAssets_entryName.assets;
65
- const assets = matches === null || matches === void 0 ? void 0 : matches.reduce((acc, match) => {
66
- const routeId = match.route.id;
67
- if (routeId) {
68
- const matchedManifest = routeAssets[routeId];
69
- const assets2 = matchedManifest === null || matchedManifest === void 0 ? void 0 : matchedManifest.assets;
70
- if (Array.isArray(assets2)) {
71
- acc.push(...assets2);
72
- }
73
- }
74
- return acc;
75
- }, []).concat(entryAssets || []);
76
- const cssLinks = assets === null || assets === void 0 ? void 0 : (_assets_filter = assets.filter((asset) => asset.endsWith(".css"))) === null || _assets_filter === void 0 ? void 0 : _assets_filter.map((uri) => ({
77
- uri,
78
- as: "style"
79
- }));
80
- const scriptLinks = assets === null || assets === void 0 ? void 0 : (_assets_filter1 = assets.filter((asset) => asset.endsWith(".js"))) === null || _assets_filter1 === void 0 ? void 0 : _assets_filter1.map((uri) => ({
81
- uri,
82
- as: "script"
83
- }));
84
- return (cssLinks || []).concat(scriptLinks || []);
85
- }
86
- return noopLinks;
87
- }
88
- export {
89
- parseLinks
90
- };