@modern-js/server-core 2.49.2 → 2.49.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 (38) hide show
  1. package/dist/cjs/base/adapters/node/bff.js +1 -1
  2. package/dist/cjs/base/adapters/node/middlewares/serverManifest.js +26 -25
  3. package/dist/cjs/base/adapters/node/middlewares/serverPublic.js +3 -0
  4. package/dist/cjs/base/index.js +4 -0
  5. package/dist/cjs/base/middlewares/customServer/context.js +3 -4
  6. package/dist/cjs/base/middlewares/renderHandler/index.js +11 -3
  7. package/dist/cjs/base/middlewares/renderHandler/render.js +61 -18
  8. package/dist/cjs/base/middlewares/renderHandler/ssrRender.js +2 -2
  9. package/dist/cjs/base/utils/error.js +17 -2
  10. package/dist/cjs/core/plugin.js +2 -0
  11. package/dist/esm/base/adapters/node/bff.js +1 -1
  12. package/dist/esm/base/adapters/node/middlewares/serverManifest.js +60 -30
  13. package/dist/esm/base/adapters/node/middlewares/serverPublic.js +5 -0
  14. package/dist/esm/base/index.js +3 -1
  15. package/dist/esm/base/middlewares/customServer/context.js +3 -3
  16. package/dist/esm/base/middlewares/renderHandler/index.js +31 -5
  17. package/dist/esm/base/middlewares/renderHandler/render.js +229 -68
  18. package/dist/esm/base/middlewares/renderHandler/ssrRender.js +3 -3
  19. package/dist/esm/base/utils/error.js +15 -1
  20. package/dist/esm/core/plugin.js +2 -0
  21. package/dist/esm-node/base/adapters/node/bff.js +1 -1
  22. package/dist/esm-node/base/adapters/node/middlewares/serverManifest.js +27 -26
  23. package/dist/esm-node/base/adapters/node/middlewares/serverPublic.js +3 -0
  24. package/dist/esm-node/base/index.js +3 -1
  25. package/dist/esm-node/base/middlewares/customServer/context.js +3 -4
  26. package/dist/esm-node/base/middlewares/renderHandler/index.js +11 -3
  27. package/dist/esm-node/base/middlewares/renderHandler/render.js +62 -19
  28. package/dist/esm-node/base/middlewares/renderHandler/ssrRender.js +2 -2
  29. package/dist/esm-node/base/utils/error.js +14 -1
  30. package/dist/esm-node/core/plugin.js +2 -0
  31. package/dist/types/base/adapters/node/middlewares/serverManifest.d.ts +2 -2
  32. package/dist/types/base/index.d.ts +1 -1
  33. package/dist/types/base/middlewares/renderHandler/index.d.ts +1 -1
  34. package/dist/types/base/middlewares/renderHandler/render.d.ts +9 -2
  35. package/dist/types/base/middlewares/renderHandler/ssrRender.d.ts +3 -1
  36. package/dist/types/base/utils/error.d.ts +7 -0
  37. package/dist/types/core/plugin.d.ts +51 -2
  38. package/package.json +7 -7
@@ -1,28 +1,81 @@
1
1
  import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
+ import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
2
3
  import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
3
4
  import { cutNameByHyphen } from "@modern-js/utils/universal";
5
+ import { TrieRouter } from "hono/router/trie-router";
4
6
  import { REPLACE_REG } from "../../../base/constants";
5
- import { createErrorHtml, sortRoutes, parseQuery, transformResponse, getPathname } from "../../utils";
7
+ import { createErrorHtml, sortRoutes, parseQuery, transformResponse, getPathname, onError as onErrorFn, ErrorDigest } from "../../utils";
6
8
  import { dataHandler } from "./dataHandler";
7
9
  import { ssrRender } from "./ssrRender";
10
+ function getRouter(routes) {
11
+ var sorted = routes.sort(sortRoutes);
12
+ var router = new TrieRouter();
13
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
14
+ try {
15
+ for (var _iterator = sorted[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
16
+ var route = _step.value;
17
+ var originUrlPath = route.urlPath;
18
+ var urlPath = originUrlPath.endsWith("/") ? "".concat(originUrlPath, "*") : "".concat(originUrlPath, "/*");
19
+ router.add("*", urlPath, route);
20
+ }
21
+ } catch (err) {
22
+ _didIteratorError = true;
23
+ _iteratorError = err;
24
+ } finally {
25
+ try {
26
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
27
+ _iterator.return();
28
+ }
29
+ } finally {
30
+ if (_didIteratorError) {
31
+ throw _iteratorError;
32
+ }
33
+ }
34
+ }
35
+ return router;
36
+ }
37
+ function matchRoute(router, request) {
38
+ var pathname = getPathname(request);
39
+ var matched = router.match("*", pathname);
40
+ var result = matched[0][0];
41
+ return result || [];
42
+ }
8
43
  function createRender(_) {
9
44
  return _createRender.apply(this, arguments);
10
45
  }
11
46
  function _createRender() {
12
47
  _createRender = _async_to_generator(function(param) {
13
- var routes, pwd, metaName, staticGenerate, forceCSR, nonce;
48
+ var routes, pwd, metaName, staticGenerate, forceCSR, nonce, onFallbackFn, router;
14
49
  return _ts_generator(this, function(_state) {
15
- routes = param.routes, pwd = param.pwd, metaName = param.metaName, staticGenerate = param.staticGenerate, forceCSR = param.forceCSR, nonce = param.nonce;
50
+ routes = param.routes, pwd = param.pwd, metaName = param.metaName, staticGenerate = param.staticGenerate, forceCSR = param.forceCSR, nonce = param.nonce, onFallbackFn = param.onFallback;
51
+ router = getRouter(routes);
16
52
  return [
17
53
  2,
18
54
  function() {
19
55
  var _ref = _async_to_generator(function(req, param2) {
20
- var logger, nodeReq, reporter, templates, serverManifest, locals, metrics, routeInfo, html, renderMode, renderOptions, response;
56
+ var logger, nodeReq, reporter, templates, serverManifest, locals, metrics, _matchRoute, routeInfo, params, onFallback, html, renderMode, onError, renderOptions, response;
21
57
  return _ts_generator(this, function(_state2) {
22
58
  switch (_state2.label) {
23
59
  case 0:
24
60
  logger = param2.logger, nodeReq = param2.nodeReq, reporter = param2.reporter, templates = param2.templates, serverManifest = param2.serverManifest, locals = param2.locals, metrics = param2.metrics;
25
- routeInfo = matchRoute(req, routes);
61
+ _matchRoute = _sliced_to_array(matchRoute(router, req), 2), routeInfo = _matchRoute[0], params = _matchRoute[1];
62
+ onFallback = function() {
63
+ var _ref2 = _async_to_generator(function(reason, error) {
64
+ return _ts_generator(this, function(_state3) {
65
+ return [
66
+ 2,
67
+ onFallbackFn === null || onFallbackFn === void 0 ? void 0 : onFallbackFn(reason, {
68
+ logger,
69
+ reporter,
70
+ metrics
71
+ }, error)
72
+ ];
73
+ });
74
+ });
75
+ return function onFallback2(reason, error) {
76
+ return _ref2.apply(this, arguments);
77
+ };
78
+ }();
26
79
  if (!routeInfo) {
27
80
  return [
28
81
  2,
@@ -46,7 +99,34 @@ function _createRender() {
46
99
  })
47
100
  ];
48
101
  }
49
- renderMode = getRenderMode(req, metaName || "modern-js", routeInfo.isSSR, forceCSR, nodeReq);
102
+ return [
103
+ 4,
104
+ getRenderMode(req, metaName || "modern-js", routeInfo.isSSR, forceCSR, nodeReq, onFallback)
105
+ ];
106
+ case 1:
107
+ renderMode = _state2.sent();
108
+ onError = function() {
109
+ var _ref2 = _async_to_generator(function(e) {
110
+ return _ts_generator(this, function(_state3) {
111
+ switch (_state3.label) {
112
+ case 0:
113
+ onErrorFn(logger, ErrorDigest.ERENDER, e, req);
114
+ return [
115
+ 4,
116
+ onFallback === null || onFallback === void 0 ? void 0 : onFallback("error", e)
117
+ ];
118
+ case 1:
119
+ _state3.sent();
120
+ return [
121
+ 2
122
+ ];
123
+ }
124
+ });
125
+ });
126
+ return function onError2(e) {
127
+ return _ref2.apply(this, arguments);
128
+ };
129
+ }();
50
130
  renderOptions = {
51
131
  pwd,
52
132
  html,
@@ -58,6 +138,7 @@ function _createRender() {
58
138
  nodeReq,
59
139
  reporter,
60
140
  serverRoutes: routes,
141
+ params,
61
142
  locals,
62
143
  serverManifest,
63
144
  metrics
@@ -66,55 +147,55 @@ function _createRender() {
66
147
  case "data":
67
148
  return [
68
149
  3,
69
- 1
150
+ 2
70
151
  ];
71
152
  case "ssr":
72
153
  return [
73
154
  3,
74
- 5
155
+ 6
75
156
  ];
76
157
  case "csr":
77
158
  return [
78
159
  3,
79
- 5
160
+ 6
80
161
  ];
81
162
  }
82
163
  return [
83
164
  3,
84
- 6
165
+ 7
85
166
  ];
86
- case 1:
167
+ case 2:
87
168
  return [
88
169
  4,
89
170
  dataHandler(req, renderOptions)
90
171
  ];
91
- case 2:
172
+ case 3:
92
173
  response = _state2.sent();
93
174
  if (!!response)
94
175
  return [
95
176
  3,
96
- 4
177
+ 5
97
178
  ];
98
179
  return [
99
180
  4,
100
- renderHandler(req, renderOptions, "ssr")
181
+ renderHandler(req, renderOptions, "ssr", onError)
101
182
  ];
102
- case 3:
103
- response = _state2.sent();
104
- _state2.label = 4;
105
183
  case 4:
184
+ response = _state2.sent();
185
+ _state2.label = 5;
186
+ case 5:
106
187
  return [
107
188
  2,
108
189
  response
109
190
  ];
110
- case 5:
191
+ case 6:
111
192
  return [
112
193
  2,
113
- renderHandler(req, renderOptions, renderMode)
194
+ renderHandler(req, renderOptions, renderMode, onError)
114
195
  ];
115
- case 6:
116
- throw new Error("Unknown render mode: ".concat(renderMode));
117
196
  case 7:
197
+ throw new Error("Unknown render mode: ".concat(renderMode));
198
+ case 8:
118
199
  return [
119
200
  2
120
201
  ];
@@ -130,77 +211,157 @@ function _createRender() {
130
211
  });
131
212
  return _createRender.apply(this, arguments);
132
213
  }
133
- function renderHandler(request, options, mode) {
214
+ function renderHandler(request, options, mode, onError) {
134
215
  return _renderHandler.apply(this, arguments);
135
216
  }
136
217
  function _renderHandler() {
137
- _renderHandler = _async_to_generator(function(request, options, mode) {
138
- var serverData, response;
218
+ _renderHandler = _async_to_generator(function(request, options, mode, onError) {
219
+ var serverData, response, e, newRes, routeInfo;
220
+ function applyExtendHeaders(r, route) {
221
+ Object.entries(route.responseHeaders || {}).forEach(function(param) {
222
+ var _param = _sliced_to_array(param, 2), k = _param[0], v = _param[1];
223
+ r.headers.set(k, v);
224
+ });
225
+ }
139
226
  return _ts_generator(this, function(_state) {
140
227
  switch (_state.label) {
141
228
  case 0:
142
229
  serverData = {
143
230
  router: {
144
231
  baseUrl: options.routeInfo.urlPath,
145
- params: {}
232
+ params: options.params
146
233
  }
147
234
  };
235
+ if (!(mode === "ssr"))
236
+ return [
237
+ 3,
238
+ 6
239
+ ];
240
+ _state.label = 1;
241
+ case 1:
242
+ _state.trys.push([
243
+ 1,
244
+ 3,
245
+ ,
246
+ 5
247
+ ]);
148
248
  return [
149
249
  4,
150
- mode === "ssr" ? ssrRender(request, options) : csrRender(options.html)
250
+ ssrRender(request, options)
151
251
  ];
152
- case 1:
252
+ case 2:
153
253
  response = _state.sent();
254
+ return [
255
+ 3,
256
+ 5
257
+ ];
258
+ case 3:
259
+ e = _state.sent();
260
+ return [
261
+ 4,
262
+ onError(e)
263
+ ];
264
+ case 4:
265
+ _state.sent();
266
+ response = csrRender(options.html);
267
+ return [
268
+ 3,
269
+ 5
270
+ ];
271
+ case 5:
272
+ return [
273
+ 3,
274
+ 7
275
+ ];
276
+ case 6:
277
+ response = csrRender(options.html);
278
+ _state.label = 7;
279
+ case 7:
280
+ newRes = transformResponse(response, injectServerData(serverData));
281
+ routeInfo = options.routeInfo;
282
+ applyExtendHeaders(newRes, routeInfo);
154
283
  return [
155
284
  2,
156
- transformResponse(response, injectServerData(serverData))
285
+ newRes
157
286
  ];
158
287
  }
159
288
  });
160
289
  });
161
290
  return _renderHandler.apply(this, arguments);
162
291
  }
163
- function matchRoute(req, routes) {
164
- var sorted = routes.sort(sortRoutes);
165
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
166
- try {
167
- for (var _iterator = sorted[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
168
- var route = _step.value;
169
- var pathname = getPathname(req);
170
- if (pathname.startsWith(route.urlPath)) {
171
- return route;
172
- }
173
- }
174
- } catch (err) {
175
- _didIteratorError = true;
176
- _iteratorError = err;
177
- } finally {
178
- try {
179
- if (!_iteratorNormalCompletion && _iterator.return != null) {
180
- _iterator.return();
181
- }
182
- } finally {
183
- if (_didIteratorError) {
184
- throw _iteratorError;
185
- }
186
- }
187
- }
188
- return void 0;
292
+ function getRenderMode(req, framework, isSSR, forceCSR, nodeReq, onFallback) {
293
+ return _getRenderMode.apply(this, arguments);
189
294
  }
190
- function getRenderMode(req, framework, isSSR, forceCSR, nodeReq) {
191
- var query = parseQuery(req);
192
- var fallbackHeader = "x-".concat(cutNameByHyphen(framework), "-ssr-fallback");
193
- if (isSSR) {
194
- if (query.__loader) {
195
- return "data";
196
- }
197
- if (forceCSR && (query.csr || req.headers.get(fallbackHeader) || (nodeReq === null || nodeReq === void 0 ? void 0 : nodeReq.headers[fallbackHeader]))) {
198
- return "csr";
199
- }
200
- return "ssr";
201
- } else {
202
- return "csr";
203
- }
295
+ function _getRenderMode() {
296
+ _getRenderMode = _async_to_generator(function(req, framework, isSSR, forceCSR, nodeReq, onFallback) {
297
+ var query, fallbackHeader;
298
+ return _ts_generator(this, function(_state) {
299
+ switch (_state.label) {
300
+ case 0:
301
+ query = parseQuery(req);
302
+ fallbackHeader = "x-".concat(cutNameByHyphen(framework), "-ssr-fallback");
303
+ if (!isSSR)
304
+ return [
305
+ 3,
306
+ 6
307
+ ];
308
+ if (query.__loader) {
309
+ return [
310
+ 2,
311
+ "data"
312
+ ];
313
+ }
314
+ if (!(forceCSR && (query.csr || req.headers.get(fallbackHeader) || (nodeReq === null || nodeReq === void 0 ? void 0 : nodeReq.headers[fallbackHeader]))))
315
+ return [
316
+ 3,
317
+ 5
318
+ ];
319
+ if (!query.csr)
320
+ return [
321
+ 3,
322
+ 2
323
+ ];
324
+ return [
325
+ 4,
326
+ onFallback === null || onFallback === void 0 ? void 0 : onFallback("query")
327
+ ];
328
+ case 1:
329
+ _state.sent();
330
+ return [
331
+ 3,
332
+ 4
333
+ ];
334
+ case 2:
335
+ return [
336
+ 4,
337
+ onFallback === null || onFallback === void 0 ? void 0 : onFallback("header")
338
+ ];
339
+ case 3:
340
+ _state.sent();
341
+ _state.label = 4;
342
+ case 4:
343
+ return [
344
+ 2,
345
+ "csr"
346
+ ];
347
+ case 5:
348
+ return [
349
+ 2,
350
+ "ssr"
351
+ ];
352
+ case 6:
353
+ return [
354
+ 2,
355
+ "csr"
356
+ ];
357
+ case 7:
358
+ return [
359
+ 2
360
+ ];
361
+ }
362
+ });
363
+ });
364
+ return _getRenderMode.apply(this, arguments);
204
365
  }
205
366
  function csrRender(html) {
206
367
  return new Response(html, {
@@ -24,11 +24,11 @@ function ssrRender(request, _) {
24
24
  }
25
25
  function _ssrRender() {
26
26
  _ssrRender = _async_to_generator(function(request, param) {
27
- var routeInfo, html, staticGenerate, nonce, metaName, reporter, logger, nodeReq, serverManifest, locals, metrics, _serverManifest_renderBundles, entryName, loadableStats, routeManifest, host, isSpider, responseProxy, query, headers, key, ssrContext, renderBundle, runtimeEnv, ssrResult, cacheStatus, render, cacheModuleName, ssrCache, incomingMessage, cacheControl, _ref, data, status, redirection, headers1, Readable, streamModule, createReadableStreamFromReadable, _tmp, data1;
27
+ var routeInfo, html, staticGenerate, nonce, metaName, reporter, logger, nodeReq, serverManifest, locals, params, metrics, _serverManifest_renderBundles, entryName, loadableStats, routeManifest, host, isSpider, responseProxy, query, headers, key, ssrContext, renderBundle, runtimeEnv, ssrResult, cacheStatus, render, cacheModuleName, ssrCache, incomingMessage, cacheControl, _ref, data, status, redirection, headers1, Readable, streamModule, createReadableStreamFromReadable, _tmp, data1;
28
28
  return _ts_generator(this, function(_state) {
29
29
  switch (_state.label) {
30
30
  case 0:
31
- routeInfo = param.routeInfo, html = param.html, staticGenerate = param.staticGenerate, nonce = param.nonce, metaName = param.metaName, reporter = param.reporter, logger = param.logger, nodeReq = param.nodeReq, serverManifest = param.serverManifest, locals = param.locals, metrics = param.metrics;
31
+ routeInfo = param.routeInfo, html = param.html, staticGenerate = param.staticGenerate, nonce = param.nonce, metaName = param.metaName, reporter = param.reporter, logger = param.logger, nodeReq = param.nodeReq, serverManifest = param.serverManifest, locals = param.locals, params = param.params, metrics = param.metrics;
32
32
  entryName = routeInfo.entryName;
33
33
  loadableStats = serverManifest.loadableStats || {};
34
34
  routeManifest = serverManifest.routeManifest || {};
@@ -47,7 +47,7 @@ function _ssrRender() {
47
47
  ssrContext = {
48
48
  request: {
49
49
  baseUrl: routeInfo.urlPath,
50
- params: {},
50
+ params,
51
51
  pathname: nodeReq ? getPathnameFromNodeReq(nodeReq) : getPathname(request),
52
52
  host,
53
53
  query,
@@ -1,3 +1,4 @@
1
+ import { _ as _instanceof } from "@swc/helpers/_/_instanceof";
1
2
  var ERROR_PAGE_TEXT = {
2
3
  404: "This page could not be found.",
3
4
  500: "Internal Server Error."
@@ -7,6 +8,19 @@ var createErrorHtml = function(status) {
7
8
  var title = "".concat(status, ": ").concat(text);
8
9
  return '<!DOCTYPE html>\n <html lang="en">\n <head>\n <meta charset="utf-8">\n <meta name="viewport" content="width=device-width">\n <title>'.concat(title, '</title>\n <style>\n html,body {\n margin: 0;\n }\n\n .page-container {\n color: #000;\n background: #fff;\n height: 100vh;\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n }\n </style>\n </head>\n <body>\n <div class="page-container">\n <h1>').concat(status, "</h1>\n <div>").concat(text, "</div>\n </body>\n </html>\n ");
9
10
  };
11
+ var ErrorDigest;
12
+ (function(ErrorDigest2) {
13
+ ErrorDigest2["ENOTF"] = "Page could not be found";
14
+ ErrorDigest2["EINTER"] = "Internal server error";
15
+ ErrorDigest2["ERENDER"] = "SSR render failed";
16
+ })(ErrorDigest || (ErrorDigest = {}));
17
+ function onError(logger, digest, error, req) {
18
+ var headers = req === null || req === void 0 ? void 0 : req.headers;
19
+ headers === null || headers === void 0 ? void 0 : headers.delete("cookie");
20
+ logger.error(req ? "Server Error - ".concat(digest, ", error = %s, req.url = %s, req.headers = %o") : "Server Error - ".concat(digest, ", error = %s"), _instanceof(error, Error) ? error.stack || error.message : error, req === null || req === void 0 ? void 0 : req.url, headers);
21
+ }
10
22
  export {
11
- createErrorHtml
23
+ ErrorDigest,
24
+ createErrorHtml,
25
+ onError
12
26
  };
@@ -3,6 +3,7 @@ var gather = createParallelWorkflow();
3
3
  var config = createWaterfall();
4
4
  var prepare = createWaterfall();
5
5
  var prepareWebServer = createAsyncPipeline();
6
+ var fallback = createParallelWorkflow();
6
7
  var prepareApiServer = createAsyncPipeline();
7
8
  var onApiChange = createAsyncWaterfall();
8
9
  var repack = createWaterfall();
@@ -32,6 +33,7 @@ var serverHooks = {
32
33
  gather,
33
34
  config,
34
35
  prepare,
36
+ fallback,
35
37
  prepareWebServer,
36
38
  prepareApiServer,
37
39
  repack,
@@ -21,7 +21,7 @@ const bindBFFHandler = async (server, options) => {
21
21
  await next();
22
22
  };
23
23
  } else {
24
- const renderHandler = enableHandleWeb ? await getRenderHandler(options) : null;
24
+ const renderHandler = enableHandleWeb ? await getRenderHandler(options, server) : null;
25
25
  handler = await server.runner.prepareApiServer({
26
26
  pwd: options.pwd,
27
27
  prefix,
@@ -1,33 +1,33 @@
1
1
  import path from "path";
2
- import { LOADABLE_STATS_FILE, MAIN_ENTRY_NAME, ROUTE_MANIFEST_FILE, SERVER_BUNDLE_DIRECTORY } from "@modern-js/utils";
3
- async function getServerManifest(pwd, routes) {
2
+ import { LOADABLE_STATS_FILE, MAIN_ENTRY_NAME, ROUTE_MANIFEST_FILE, SERVER_BUNDLE_DIRECTORY, fs } from "@modern-js/utils";
3
+ const dynamicImport = (filePath) => {
4
+ try {
5
+ const module = require(filePath);
6
+ return Promise.resolve(module);
7
+ } catch (e) {
8
+ return Promise.reject(e);
9
+ }
10
+ };
11
+ const loadBundle = async (filepath, logger) => {
12
+ if (!await fs.pathExists(filepath)) {
13
+ return void 0;
14
+ }
15
+ return dynamicImport(filepath).catch((e) => {
16
+ logger.error(`Load ${filepath} bundle failed, error = %s`, e instanceof Error ? e.stack || e.message : e);
17
+ return void 0;
18
+ });
19
+ };
20
+ async function getServerManifest(pwd, routes, logger) {
4
21
  const loaderBundles = {};
5
22
  const renderBundles = {};
6
- await Promise.all(routes.map(async (route) => {
23
+ await Promise.all(routes.filter((route) => Boolean(route.bundle)).map(async (route) => {
7
24
  const entryName = route.entryName || MAIN_ENTRY_NAME;
8
- const loaderBundlePath = path.join(pwd, SERVER_BUNDLE_DIRECTORY, `${entryName}-server-loaders.js`);
9
25
  const renderBundlePath = path.join(pwd, route.bundle || "");
10
- const dynamicImport = (filePath) => {
11
- try {
12
- const module = require(filePath);
13
- return Promise.resolve(module);
14
- } catch (e) {
15
- return Promise.reject(e);
16
- }
17
- };
18
- await Promise.allSettled([
19
- dynamicImport(loaderBundlePath),
20
- dynamicImport(renderBundlePath)
21
- ]).then((results) => {
22
- const { status: loaderStatus } = results[0];
23
- if (loaderStatus === "fulfilled") {
24
- loaderBundles[entryName] = results[0].value;
25
- }
26
- const { status: renderStatus } = results[1];
27
- if (renderStatus === "fulfilled") {
28
- renderBundles[entryName] = results[1].value;
29
- }
30
- });
26
+ const loaderBundlePath = path.join(pwd, SERVER_BUNDLE_DIRECTORY, `${entryName}-server-loaders.js`);
27
+ const renderBundle = await loadBundle(renderBundlePath, logger);
28
+ const loaderBundle = await loadBundle(loaderBundlePath, logger);
29
+ renderBundle && (renderBundles[entryName] = renderBundle);
30
+ loaderBundle && (loaderBundles[entryName] = loaderBundle);
31
31
  }));
32
32
  const loadableUri = path.join(pwd, LOADABLE_STATS_FILE);
33
33
  const loadableStats = await import(loadableUri).catch((_) => ({}));
@@ -43,7 +43,8 @@ async function getServerManifest(pwd, routes) {
43
43
  function injectServerManifest(pwd, routes) {
44
44
  return async (c, next) => {
45
45
  if (routes && !c.get("serverManifest")) {
46
- const serverManifest = await getServerManifest(pwd, routes);
46
+ const logger = c.get("logger");
47
+ const serverManifest = await getServerManifest(pwd, routes, logger);
47
48
  c.set("serverManifest", serverManifest);
48
49
  }
49
50
  await next();
@@ -14,6 +14,9 @@ function createPublicMiddleware({ pwd, routes }) {
14
14
  if (mimeType) {
15
15
  c.header("Content-Type", mimeType);
16
16
  }
17
+ Object.entries(route.responseHeaders || {}).forEach(([k, v]) => {
18
+ c.header(k, v);
19
+ });
17
20
  return c.body(data, 200);
18
21
  }
19
22
  }
@@ -1,9 +1,10 @@
1
- import { createErrorHtml } from "./utils";
1
+ import { createErrorHtml, onError, ErrorDigest } from "./utils";
2
2
  import { AGGRED_DIR } from "./constants";
3
3
  import { favionFallbackMiddleware, injectReporter, injectLogger, getRenderHandler, bindRenderHandler, logHandler, processedBy } from "./middlewares";
4
4
  import { createServerBase } from "./serverBase";
5
5
  export {
6
6
  AGGRED_DIR,
7
+ ErrorDigest,
7
8
  bindRenderHandler,
8
9
  createErrorHtml,
9
10
  createServerBase,
@@ -12,5 +13,6 @@ export {
12
13
  injectLogger,
13
14
  injectReporter,
14
15
  logHandler,
16
+ onError,
15
17
  processedBy
16
18
  };
@@ -17,13 +17,12 @@ function createCustomMiddlewaresCtx(c, locals) {
17
17
  var _c_env_node, _c_env_node1;
18
18
  const baseContext = createBaseHookContext(c);
19
19
  const reporter = c.get("reporter");
20
+ const response = baseContext.response;
21
+ response.locals = locals;
20
22
  return {
21
23
  ...baseContext,
22
24
  reporter,
23
- response: {
24
- ...baseContext.response,
25
- locals
26
- },
25
+ response,
27
26
  source: {
28
27
  req: (_c_env_node = c.env.node) === null || _c_env_node === void 0 ? void 0 : _c_env_node.req,
29
28
  res: (_c_env_node1 = c.env.node) === null || _c_env_node1 === void 0 ? void 0 : _c_env_node1.res
@@ -25,8 +25,15 @@ function createRenderHandler(render) {
25
25
  return res;
26
26
  };
27
27
  }
28
- async function getRenderHandler(options) {
28
+ async function getRenderHandler(options, serverBase) {
29
29
  const { routes, pwd, config } = options;
30
+ const onFallback = async (reason, utils, error) => {
31
+ await (serverBase === null || serverBase === void 0 ? void 0 : serverBase.runner.fallback({
32
+ reason,
33
+ error,
34
+ ...utils
35
+ }));
36
+ };
30
37
  if (routes && routes.length > 0) {
31
38
  var _config_server, _options_config_security;
32
39
  const ssrConfig = (_config_server = config.server) === null || _config_server === void 0 ? void 0 : _config_server.ssr;
@@ -37,7 +44,8 @@ async function getRenderHandler(options) {
37
44
  staticGenerate: options.staticGenerate,
38
45
  metaName: options.metaName || "modern-js",
39
46
  forceCSR,
40
- nonce: (_options_config_security = options.config.security) === null || _options_config_security === void 0 ? void 0 : _options_config_security.nonce
47
+ nonce: (_options_config_security = options.config.security) === null || _options_config_security === void 0 ? void 0 : _options_config_security.nonce,
48
+ onFallback
41
49
  });
42
50
  return render;
43
51
  }
@@ -54,7 +62,7 @@ async function bindRenderHandler(server, options) {
54
62
  await ssrCache.loadCacheMod(checkIsProd() ? pwd : void 0);
55
63
  }
56
64
  const pageRoutes = routes.filter((route) => !route.isApi).sort(sortRoutes);
57
- const render = await getRenderHandler(options);
65
+ const render = await getRenderHandler(options, server);
58
66
  for (const route of pageRoutes) {
59
67
  const { urlPath: originUrlPath, entryName } = route;
60
68
  const urlPath = originUrlPath.endsWith("/") ? `${originUrlPath}*` : `${originUrlPath}/*`;