@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
@@ -44,7 +44,7 @@ const bindBFFHandler = async (server, options) => {
44
44
  await next();
45
45
  };
46
46
  } else {
47
- const renderHandler = enableHandleWeb ? await (0, import_middlewares.getRenderHandler)(options) : null;
47
+ const renderHandler = enableHandleWeb ? await (0, import_middlewares.getRenderHandler)(options, server) : null;
48
48
  handler = await server.runner.prepareApiServer({
49
49
  pwd: options.pwd,
50
50
  prefix,
@@ -34,34 +34,34 @@ __export(serverManifest_exports, {
34
34
  module.exports = __toCommonJS(serverManifest_exports);
35
35
  var import_path = __toESM(require("path"));
36
36
  var import_utils = require("@modern-js/utils");
37
- async function getServerManifest(pwd, routes) {
37
+ const dynamicImport = (filePath) => {
38
+ try {
39
+ const module2 = require(filePath);
40
+ return Promise.resolve(module2);
41
+ } catch (e) {
42
+ return Promise.reject(e);
43
+ }
44
+ };
45
+ const loadBundle = async (filepath, logger) => {
46
+ if (!await import_utils.fs.pathExists(filepath)) {
47
+ return void 0;
48
+ }
49
+ return dynamicImport(filepath).catch((e) => {
50
+ logger.error(`Load ${filepath} bundle failed, error = %s`, e instanceof Error ? e.stack || e.message : e);
51
+ return void 0;
52
+ });
53
+ };
54
+ async function getServerManifest(pwd, routes, logger) {
38
55
  const loaderBundles = {};
39
56
  const renderBundles = {};
40
- await Promise.all(routes.map(async (route) => {
57
+ await Promise.all(routes.filter((route) => Boolean(route.bundle)).map(async (route) => {
41
58
  const entryName = route.entryName || import_utils.MAIN_ENTRY_NAME;
42
- const loaderBundlePath = import_path.default.join(pwd, import_utils.SERVER_BUNDLE_DIRECTORY, `${entryName}-server-loaders.js`);
43
59
  const renderBundlePath = import_path.default.join(pwd, route.bundle || "");
44
- const dynamicImport = (filePath) => {
45
- try {
46
- const module2 = require(filePath);
47
- return Promise.resolve(module2);
48
- } catch (e) {
49
- return Promise.reject(e);
50
- }
51
- };
52
- await Promise.allSettled([
53
- dynamicImport(loaderBundlePath),
54
- dynamicImport(renderBundlePath)
55
- ]).then((results) => {
56
- const { status: loaderStatus } = results[0];
57
- if (loaderStatus === "fulfilled") {
58
- loaderBundles[entryName] = results[0].value;
59
- }
60
- const { status: renderStatus } = results[1];
61
- if (renderStatus === "fulfilled") {
62
- renderBundles[entryName] = results[1].value;
63
- }
64
- });
60
+ const loaderBundlePath = import_path.default.join(pwd, import_utils.SERVER_BUNDLE_DIRECTORY, `${entryName}-server-loaders.js`);
61
+ const renderBundle = await loadBundle(renderBundlePath, logger);
62
+ const loaderBundle = await loadBundle(loaderBundlePath, logger);
63
+ renderBundle && (renderBundles[entryName] = renderBundle);
64
+ loaderBundle && (loaderBundles[entryName] = loaderBundle);
65
65
  }));
66
66
  const loadableUri = import_path.default.join(pwd, import_utils.LOADABLE_STATS_FILE);
67
67
  const loadableStats = await Promise.resolve().then(() => __toESM(require(loadableUri))).catch((_) => ({}));
@@ -77,7 +77,8 @@ async function getServerManifest(pwd, routes) {
77
77
  function injectServerManifest(pwd, routes) {
78
78
  return async (c, next) => {
79
79
  if (routes && !c.get("serverManifest")) {
80
- const serverManifest = await getServerManifest(pwd, routes);
80
+ const logger = c.get("logger");
81
+ const serverManifest = await getServerManifest(pwd, routes, logger);
81
82
  c.set("serverManifest", serverManifest);
82
83
  }
83
84
  await next();
@@ -47,6 +47,9 @@ function createPublicMiddleware({ pwd, routes }) {
47
47
  if (mimeType) {
48
48
  c.header("Content-Type", mimeType);
49
49
  }
50
+ Object.entries(route.responseHeaders || {}).forEach(([k, v]) => {
51
+ c.header(k, v);
52
+ });
50
53
  return c.body(data, 200);
51
54
  }
52
55
  }
@@ -19,6 +19,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  var base_exports = {};
20
20
  __export(base_exports, {
21
21
  AGGRED_DIR: () => import_constants.AGGRED_DIR,
22
+ ErrorDigest: () => import_utils.ErrorDigest,
22
23
  bindRenderHandler: () => import_middlewares.bindRenderHandler,
23
24
  createErrorHtml: () => import_utils.createErrorHtml,
24
25
  createServerBase: () => import_serverBase.createServerBase,
@@ -27,6 +28,7 @@ __export(base_exports, {
27
28
  injectLogger: () => import_middlewares.injectLogger,
28
29
  injectReporter: () => import_middlewares.injectReporter,
29
30
  logHandler: () => import_middlewares.logHandler,
31
+ onError: () => import_utils.onError,
30
32
  processedBy: () => import_middlewares.processedBy
31
33
  });
32
34
  module.exports = __toCommonJS(base_exports);
@@ -37,6 +39,7 @@ var import_serverBase = require("./serverBase");
37
39
  // Annotate the CommonJS export names for ESM import in node:
38
40
  0 && (module.exports = {
39
41
  AGGRED_DIR,
42
+ ErrorDigest,
40
43
  bindRenderHandler,
41
44
  createErrorHtml,
42
45
  createServerBase,
@@ -45,5 +48,6 @@ var import_serverBase = require("./serverBase");
45
48
  injectLogger,
46
49
  injectReporter,
47
50
  logHandler,
51
+ onError,
48
52
  processedBy
49
53
  });
@@ -43,13 +43,12 @@ function createCustomMiddlewaresCtx(c, locals) {
43
43
  var _c_env_node, _c_env_node1;
44
44
  const baseContext = (0, import_base.createBaseHookContext)(c);
45
45
  const reporter = c.get("reporter");
46
+ const response = baseContext.response;
47
+ response.locals = locals;
46
48
  return {
47
49
  ...baseContext,
48
50
  reporter,
49
- response: {
50
- ...baseContext.response,
51
- locals
52
- },
51
+ response,
53
52
  source: {
54
53
  req: (_c_env_node = c.env.node) === null || _c_env_node === void 0 ? void 0 : _c_env_node.req,
55
54
  res: (_c_env_node1 = c.env.node) === null || _c_env_node1 === void 0 ? void 0 : _c_env_node1.res
@@ -59,8 +59,15 @@ function createRenderHandler(render) {
59
59
  return res;
60
60
  };
61
61
  }
62
- async function getRenderHandler(options) {
62
+ async function getRenderHandler(options, serverBase) {
63
63
  const { routes, pwd, config } = options;
64
+ const onFallback = async (reason, utils, error) => {
65
+ await (serverBase === null || serverBase === void 0 ? void 0 : serverBase.runner.fallback({
66
+ reason,
67
+ error,
68
+ ...utils
69
+ }));
70
+ };
64
71
  if (routes && routes.length > 0) {
65
72
  var _config_server, _options_config_security;
66
73
  const ssrConfig = (_config_server = config.server) === null || _config_server === void 0 ? void 0 : _config_server.ssr;
@@ -71,7 +78,8 @@ async function getRenderHandler(options) {
71
78
  staticGenerate: options.staticGenerate,
72
79
  metaName: options.metaName || "modern-js",
73
80
  forceCSR,
74
- nonce: (_options_config_security = options.config.security) === null || _options_config_security === void 0 ? void 0 : _options_config_security.nonce
81
+ nonce: (_options_config_security = options.config.security) === null || _options_config_security === void 0 ? void 0 : _options_config_security.nonce,
82
+ onFallback
75
83
  });
76
84
  return render;
77
85
  }
@@ -88,7 +96,7 @@ async function bindRenderHandler(server, options) {
88
96
  await ssrCache.loadCacheMod((0, import_utils.checkIsProd)() ? pwd : void 0);
89
97
  }
90
98
  const pageRoutes = routes.filter((route) => !route.isApi).sort(import_utils.sortRoutes);
91
- const render = await getRenderHandler(options);
99
+ const render = await getRenderHandler(options, server);
92
100
  for (const route of pageRoutes) {
93
101
  const { urlPath: originUrlPath, entryName } = route;
94
102
  const urlPath = originUrlPath.endsWith("/") ? `${originUrlPath}*` : `${originUrlPath}/*`;
@@ -22,13 +22,38 @@ __export(render_exports, {
22
22
  });
23
23
  module.exports = __toCommonJS(render_exports);
24
24
  var import_universal = require("@modern-js/utils/universal");
25
+ var import_trie_router = require("hono/router/trie-router");
25
26
  var import_constants = require("../../../base/constants");
26
27
  var import_utils = require("../../utils");
27
28
  var import_dataHandler = require("./dataHandler");
28
29
  var import_ssrRender = require("./ssrRender");
29
- async function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, nonce }) {
30
+ function getRouter(routes) {
31
+ const sorted = routes.sort(import_utils.sortRoutes);
32
+ const router = new import_trie_router.TrieRouter();
33
+ for (const route of sorted) {
34
+ const { urlPath: originUrlPath } = route;
35
+ const urlPath = originUrlPath.endsWith("/") ? `${originUrlPath}*` : `${originUrlPath}/*`;
36
+ router.add("*", urlPath, route);
37
+ }
38
+ return router;
39
+ }
40
+ function matchRoute(router, request) {
41
+ const pathname = (0, import_utils.getPathname)(request);
42
+ const matched = router.match("*", pathname);
43
+ const result = matched[0][0];
44
+ return result || [];
45
+ }
46
+ async function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, nonce, onFallback: onFallbackFn }) {
47
+ const router = getRouter(routes);
30
48
  return async (req, { logger, nodeReq, reporter, templates, serverManifest, locals, metrics }) => {
31
- const routeInfo = matchRoute(req, routes);
49
+ const [routeInfo, params] = matchRoute(router, req);
50
+ const onFallback = async (reason, error) => {
51
+ return onFallbackFn === null || onFallbackFn === void 0 ? void 0 : onFallbackFn(reason, {
52
+ logger,
53
+ reporter,
54
+ metrics
55
+ }, error);
56
+ };
32
57
  if (!routeInfo) {
33
58
  return new Response((0, import_utils.createErrorHtml)(404), {
34
59
  status: 404,
@@ -46,7 +71,11 @@ async function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, n
46
71
  }
47
72
  });
48
73
  }
49
- const renderMode = getRenderMode(req, metaName || "modern-js", routeInfo.isSSR, forceCSR, nodeReq);
74
+ const renderMode = await getRenderMode(req, metaName || "modern-js", routeInfo.isSSR, forceCSR, nodeReq, onFallback);
75
+ const onError = async (e) => {
76
+ (0, import_utils.onError)(logger, import_utils.ErrorDigest.ERENDER, e, req);
77
+ await (onFallback === null || onFallback === void 0 ? void 0 : onFallback("error", e));
78
+ };
50
79
  const renderOptions = {
51
80
  pwd,
52
81
  html,
@@ -58,6 +87,7 @@ async function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, n
58
87
  nodeReq,
59
88
  reporter,
60
89
  serverRoutes: routes,
90
+ params,
61
91
  locals,
62
92
  serverManifest,
63
93
  metrics
@@ -66,38 +96,46 @@ async function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, n
66
96
  case "data":
67
97
  let response = await (0, import_dataHandler.dataHandler)(req, renderOptions);
68
98
  if (!response) {
69
- response = await renderHandler(req, renderOptions, "ssr");
99
+ response = await renderHandler(req, renderOptions, "ssr", onError);
70
100
  }
71
101
  return response;
72
102
  case "ssr":
73
103
  case "csr":
74
- return renderHandler(req, renderOptions, renderMode);
104
+ return renderHandler(req, renderOptions, renderMode, onError);
75
105
  default:
76
106
  throw new Error(`Unknown render mode: ${renderMode}`);
77
107
  }
78
108
  };
79
109
  }
80
- async function renderHandler(request, options, mode) {
110
+ async function renderHandler(request, options, mode, onError) {
81
111
  const serverData = {
82
112
  router: {
83
113
  baseUrl: options.routeInfo.urlPath,
84
- params: {}
114
+ params: options.params
85
115
  }
86
116
  };
87
- const response = await (mode === "ssr" ? (0, import_ssrRender.ssrRender)(request, options) : csrRender(options.html));
88
- return (0, import_utils.transformResponse)(response, injectServerData(serverData));
89
- }
90
- function matchRoute(req, routes) {
91
- const sorted = routes.sort(import_utils.sortRoutes);
92
- for (const route of sorted) {
93
- const pathname = (0, import_utils.getPathname)(req);
94
- if (pathname.startsWith(route.urlPath)) {
95
- return route;
117
+ let response;
118
+ if (mode === "ssr") {
119
+ try {
120
+ response = await (0, import_ssrRender.ssrRender)(request, options);
121
+ } catch (e) {
122
+ await onError(e);
123
+ response = csrRender(options.html);
96
124
  }
125
+ } else {
126
+ response = csrRender(options.html);
127
+ }
128
+ const newRes = (0, import_utils.transformResponse)(response, injectServerData(serverData));
129
+ const { routeInfo } = options;
130
+ applyExtendHeaders(newRes, routeInfo);
131
+ return newRes;
132
+ function applyExtendHeaders(r, route) {
133
+ Object.entries(route.responseHeaders || {}).forEach(([k, v]) => {
134
+ r.headers.set(k, v);
135
+ });
97
136
  }
98
- return void 0;
99
137
  }
100
- function getRenderMode(req, framework, isSSR, forceCSR, nodeReq) {
138
+ async function getRenderMode(req, framework, isSSR, forceCSR, nodeReq, onFallback) {
101
139
  const query = (0, import_utils.parseQuery)(req);
102
140
  const fallbackHeader = `x-${(0, import_universal.cutNameByHyphen)(framework)}-ssr-fallback`;
103
141
  if (isSSR) {
@@ -105,6 +143,11 @@ function getRenderMode(req, framework, isSSR, forceCSR, nodeReq) {
105
143
  return "data";
106
144
  }
107
145
  if (forceCSR && (query.csr || req.headers.get(fallbackHeader) || (nodeReq === null || nodeReq === void 0 ? void 0 : nodeReq.headers[fallbackHeader]))) {
146
+ if (query.csr) {
147
+ await (onFallback === null || onFallback === void 0 ? void 0 : onFallback("query"));
148
+ } else {
149
+ await (onFallback === null || onFallback === void 0 ? void 0 : onFallback("header"));
150
+ }
108
151
  return "csr";
109
152
  }
110
153
  return "ssr";
@@ -49,7 +49,7 @@ const defaultReporter = {
49
49
  reportWarn() {
50
50
  }
51
51
  };
52
- async function ssrRender(request, { routeInfo, html, staticGenerate, nonce, metaName, reporter, logger, nodeReq, serverManifest, locals, metrics }) {
52
+ async function ssrRender(request, { routeInfo, html, staticGenerate, nonce, metaName, reporter, logger, nodeReq, serverManifest, locals, params, metrics }) {
53
53
  var _serverManifest_renderBundles;
54
54
  const { entryName } = routeInfo;
55
55
  const loadableStats = serverManifest.loadableStats || {};
@@ -69,7 +69,7 @@ async function ssrRender(request, { routeInfo, html, staticGenerate, nonce, meta
69
69
  const ssrContext = {
70
70
  request: {
71
71
  baseUrl: routeInfo.urlPath,
72
- params: {},
72
+ params,
73
73
  pathname: nodeReq ? getPathnameFromNodeReq(nodeReq) : (0, import_utils.getPathname)(request),
74
74
  host,
75
75
  query,
@@ -18,7 +18,9 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var error_exports = {};
20
20
  __export(error_exports, {
21
- createErrorHtml: () => createErrorHtml
21
+ ErrorDigest: () => ErrorDigest,
22
+ createErrorHtml: () => createErrorHtml,
23
+ onError: () => onError
22
24
  });
23
25
  module.exports = __toCommonJS(error_exports);
24
26
  const ERROR_PAGE_TEXT = {
@@ -59,7 +61,20 @@ const createErrorHtml = (status) => {
59
61
  </html>
60
62
  `;
61
63
  };
64
+ var ErrorDigest;
65
+ (function(ErrorDigest2) {
66
+ ErrorDigest2["ENOTF"] = "Page could not be found";
67
+ ErrorDigest2["EINTER"] = "Internal server error";
68
+ ErrorDigest2["ERENDER"] = "SSR render failed";
69
+ })(ErrorDigest || (ErrorDigest = {}));
70
+ function onError(logger, digest, error, req) {
71
+ const headers = req === null || req === void 0 ? void 0 : req.headers;
72
+ headers === null || headers === void 0 ? void 0 : headers.delete("cookie");
73
+ logger.error(req ? `Server Error - ${digest}, error = %s, req.url = %s, req.headers = %o` : `Server Error - ${digest}, error = %s`, error instanceof Error ? error.stack || error.message : error, req === null || req === void 0 ? void 0 : req.url, headers);
74
+ }
62
75
  // Annotate the CommonJS export names for ESM import in node:
63
76
  0 && (module.exports = {
64
- createErrorHtml
77
+ ErrorDigest,
78
+ createErrorHtml,
79
+ onError
65
80
  });
@@ -33,6 +33,7 @@ const gather = (0, import_plugin.createParallelWorkflow)();
33
33
  const config = (0, import_plugin.createWaterfall)();
34
34
  const prepare = (0, import_plugin.createWaterfall)();
35
35
  const prepareWebServer = (0, import_plugin.createAsyncPipeline)();
36
+ const fallback = (0, import_plugin.createParallelWorkflow)();
36
37
  const prepareApiServer = (0, import_plugin.createAsyncPipeline)();
37
38
  const onApiChange = (0, import_plugin.createAsyncWaterfall)();
38
39
  const repack = (0, import_plugin.createWaterfall)();
@@ -56,6 +57,7 @@ const serverHooks = {
56
57
  gather,
57
58
  config,
58
59
  prepare,
60
+ fallback,
59
61
  prepareWebServer,
60
62
  prepareApiServer,
61
63
  repack,
@@ -74,7 +74,7 @@ var bindBFFHandler = function() {
74
74
  ];
75
75
  return [
76
76
  4,
77
- getRenderHandler(options)
77
+ getRenderHandler(options, server)
78
78
  ];
79
79
  case 4:
80
80
  _tmp = _state.sent();
@@ -1,12 +1,51 @@
1
1
  import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
+ import { _ as _instanceof } from "@swc/helpers/_/_instanceof";
2
3
  import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
3
4
  import path from "path";
4
- import { LOADABLE_STATS_FILE, MAIN_ENTRY_NAME, ROUTE_MANIFEST_FILE, SERVER_BUNDLE_DIRECTORY } from "@modern-js/utils";
5
- function getServerManifest(pwd, routes) {
5
+ import { LOADABLE_STATS_FILE, MAIN_ENTRY_NAME, ROUTE_MANIFEST_FILE, SERVER_BUNDLE_DIRECTORY, fs } from "@modern-js/utils";
6
+ var dynamicImport = function(filePath) {
7
+ try {
8
+ var module = require(filePath);
9
+ return Promise.resolve(module);
10
+ } catch (e) {
11
+ return Promise.reject(e);
12
+ }
13
+ };
14
+ var loadBundle = function() {
15
+ var _ref = _async_to_generator(function(filepath, logger) {
16
+ return _ts_generator(this, function(_state) {
17
+ switch (_state.label) {
18
+ case 0:
19
+ return [
20
+ 4,
21
+ fs.pathExists(filepath)
22
+ ];
23
+ case 1:
24
+ if (!_state.sent()) {
25
+ return [
26
+ 2,
27
+ void 0
28
+ ];
29
+ }
30
+ return [
31
+ 2,
32
+ dynamicImport(filepath).catch(function(e) {
33
+ logger.error("Load ".concat(filepath, " bundle failed, error = %s"), _instanceof(e, Error) ? e.stack || e.message : e);
34
+ return void 0;
35
+ })
36
+ ];
37
+ }
38
+ });
39
+ });
40
+ return function loadBundle2(filepath, logger) {
41
+ return _ref.apply(this, arguments);
42
+ };
43
+ }();
44
+ function getServerManifest(pwd, routes, logger) {
6
45
  return _getServerManifest.apply(this, arguments);
7
46
  }
8
47
  function _getServerManifest() {
9
- _getServerManifest = _async_to_generator(function(pwd, routes) {
48
+ _getServerManifest = _async_to_generator(function(pwd, routes, logger) {
10
49
  var loaderBundles, renderBundles, loadableUri, loadableStats, routesManifestUri, routeManifest;
11
50
  return _ts_generator(this, function(_state) {
12
51
  switch (_state.label) {
@@ -15,41 +54,31 @@ function _getServerManifest() {
15
54
  renderBundles = {};
16
55
  return [
17
56
  4,
18
- Promise.all(routes.map(function() {
57
+ Promise.all(routes.filter(function(route) {
58
+ return Boolean(route.bundle);
59
+ }).map(function() {
19
60
  var _ref = _async_to_generator(function(route) {
20
- var entryName, loaderBundlePath, renderBundlePath, dynamicImport;
61
+ var entryName, renderBundlePath, loaderBundlePath, renderBundle, loaderBundle;
21
62
  return _ts_generator(this, function(_state2) {
22
63
  switch (_state2.label) {
23
64
  case 0:
24
65
  entryName = route.entryName || MAIN_ENTRY_NAME;
25
- loaderBundlePath = path.join(pwd, SERVER_BUNDLE_DIRECTORY, "".concat(entryName, "-server-loaders.js"));
26
66
  renderBundlePath = path.join(pwd, route.bundle || "");
27
- dynamicImport = function(filePath) {
28
- try {
29
- var module = require(filePath);
30
- return Promise.resolve(module);
31
- } catch (e) {
32
- return Promise.reject(e);
33
- }
34
- };
67
+ loaderBundlePath = path.join(pwd, SERVER_BUNDLE_DIRECTORY, "".concat(entryName, "-server-loaders.js"));
35
68
  return [
36
69
  4,
37
- Promise.allSettled([
38
- dynamicImport(loaderBundlePath),
39
- dynamicImport(renderBundlePath)
40
- ]).then(function(results) {
41
- var _results_ = results[0], loaderStatus = _results_.status;
42
- if (loaderStatus === "fulfilled") {
43
- loaderBundles[entryName] = results[0].value;
44
- }
45
- var _results_1 = results[1], renderStatus = _results_1.status;
46
- if (renderStatus === "fulfilled") {
47
- renderBundles[entryName] = results[1].value;
48
- }
49
- })
70
+ loadBundle(renderBundlePath, logger)
50
71
  ];
51
72
  case 1:
52
- _state2.sent();
73
+ renderBundle = _state2.sent();
74
+ return [
75
+ 4,
76
+ loadBundle(loaderBundlePath, logger)
77
+ ];
78
+ case 2:
79
+ loaderBundle = _state2.sent();
80
+ renderBundle && (renderBundles[entryName] = renderBundle);
81
+ loaderBundle && (loaderBundles[entryName] = loaderBundle);
53
82
  return [
54
83
  2
55
84
  ];
@@ -98,7 +127,7 @@ function _getServerManifest() {
98
127
  function injectServerManifest(pwd, routes) {
99
128
  return function() {
100
129
  var _ref = _async_to_generator(function(c, next) {
101
- var serverManifest;
130
+ var logger, serverManifest;
102
131
  return _ts_generator(this, function(_state) {
103
132
  switch (_state.label) {
104
133
  case 0:
@@ -107,9 +136,10 @@ function injectServerManifest(pwd, routes) {
107
136
  3,
108
137
  2
109
138
  ];
139
+ logger = c.get("logger");
110
140
  return [
111
141
  4,
112
- getServerManifest(pwd, routes)
142
+ getServerManifest(pwd, routes, logger)
113
143
  ];
114
144
  case 1:
115
145
  serverManifest = _state.sent();
@@ -1,4 +1,5 @@
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 path from "path";
4
5
  import { fileReader } from "@modern-js/runtime-utils/fileReader";
@@ -31,6 +32,10 @@ function createPublicMiddleware(param) {
31
32
  if (mimeType) {
32
33
  c.header("Content-Type", mimeType);
33
34
  }
35
+ Object.entries(route.responseHeaders || {}).forEach(function(param2) {
36
+ var _param = _sliced_to_array(param2, 2), k = _param[0], v = _param[1];
37
+ c.header(k, v);
38
+ });
34
39
  return [
35
40
  2,
36
41
  c.body(data, 200)
@@ -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
  };
@@ -41,11 +41,11 @@ function createCustomMiddlewaresCtx(c, locals) {
41
41
  var _c_env_node, _c_env_node1;
42
42
  var baseContext = createBaseHookContext(c);
43
43
  var reporter = c.get("reporter");
44
+ var response = baseContext.response;
45
+ response.locals = locals;
44
46
  return _object_spread_props(_object_spread({}, baseContext), {
45
47
  reporter,
46
- response: _object_spread_props(_object_spread({}, baseContext.response), {
47
- locals
48
- }),
48
+ response,
49
49
  source: {
50
50
  req: (_c_env_node = c.env.node) === null || _c_env_node === void 0 ? void 0 : _c_env_node.req,
51
51
  res: (_c_env_node1 = c.env.node) === null || _c_env_node1 === void 0 ? void 0 : _c_env_node1.res
@@ -1,4 +1,5 @@
1
1
  import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
2
+ import { _ as _object_spread } from "@swc/helpers/_/_object_spread";
2
3
  import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
3
4
  import { checkIsProd, sortRoutes, getRuntimeEnv } from "../../utils";
4
5
  import { initReporter } from "../monitor";
@@ -45,14 +46,38 @@ function createRenderHandler(render) {
45
46
  };
46
47
  }();
47
48
  }
48
- function getRenderHandler(options) {
49
+ function getRenderHandler(options, serverBase) {
49
50
  return _getRenderHandler.apply(this, arguments);
50
51
  }
51
52
  function _getRenderHandler() {
52
- _getRenderHandler = _async_to_generator(function(options) {
53
- var routes, pwd, config, _config_server, _options_config_security, ssrConfig, forceCSR, render;
53
+ _getRenderHandler = _async_to_generator(function(options, serverBase) {
54
+ var routes, pwd, config, onFallback, _config_server, _options_config_security, ssrConfig, forceCSR, render;
54
55
  return _ts_generator(this, function(_state) {
55
56
  routes = options.routes, pwd = options.pwd, config = options.config;
57
+ onFallback = function() {
58
+ var _ref = _async_to_generator(function(reason, utils, error) {
59
+ return _ts_generator(this, function(_state2) {
60
+ switch (_state2.label) {
61
+ case 0:
62
+ return [
63
+ 4,
64
+ serverBase === null || serverBase === void 0 ? void 0 : serverBase.runner.fallback(_object_spread({
65
+ reason,
66
+ error
67
+ }, utils))
68
+ ];
69
+ case 1:
70
+ _state2.sent();
71
+ return [
72
+ 2
73
+ ];
74
+ }
75
+ });
76
+ });
77
+ return function onFallback2(reason, utils, error) {
78
+ return _ref.apply(this, arguments);
79
+ };
80
+ }();
56
81
  if (routes && routes.length > 0) {
57
82
  ;
58
83
  ssrConfig = (_config_server = config.server) === null || _config_server === void 0 ? void 0 : _config_server.ssr;
@@ -63,7 +88,8 @@ function _getRenderHandler() {
63
88
  staticGenerate: options.staticGenerate,
64
89
  metaName: options.metaName || "modern-js",
65
90
  forceCSR,
66
- nonce: (_options_config_security = options.config.security) === null || _options_config_security === void 0 ? void 0 : _options_config_security.nonce
91
+ nonce: (_options_config_security = options.config.security) === null || _options_config_security === void 0 ? void 0 : _options_config_security.nonce,
92
+ onFallback
67
93
  });
68
94
  return [
69
95
  2,
@@ -120,7 +146,7 @@ function _bindRenderHandler() {
120
146
  }).sort(sortRoutes);
121
147
  return [
122
148
  4,
123
- getRenderHandler(options)
149
+ getRenderHandler(options, server)
124
150
  ];
125
151
  case 4:
126
152
  render = _state.sent();