@modern-js/server-core 2.49.1 → 2.49.3-alpha.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 (31) 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/index.js +4 -0
  4. package/dist/cjs/base/middlewares/customServer/context.js +3 -4
  5. package/dist/cjs/base/middlewares/renderHandler/index.js +11 -3
  6. package/dist/cjs/base/middlewares/renderHandler/render.js +33 -7
  7. package/dist/cjs/base/utils/error.js +17 -2
  8. package/dist/cjs/core/plugin.js +2 -0
  9. package/dist/esm/base/adapters/node/bff.js +1 -1
  10. package/dist/esm/base/adapters/node/middlewares/serverManifest.js +60 -30
  11. package/dist/esm/base/index.js +3 -1
  12. package/dist/esm/base/middlewares/customServer/context.js +3 -3
  13. package/dist/esm/base/middlewares/renderHandler/index.js +31 -5
  14. package/dist/esm/base/middlewares/renderHandler/render.js +181 -39
  15. package/dist/esm/base/utils/error.js +15 -1
  16. package/dist/esm/core/plugin.js +2 -0
  17. package/dist/esm-node/base/adapters/node/bff.js +1 -1
  18. package/dist/esm-node/base/adapters/node/middlewares/serverManifest.js +27 -26
  19. package/dist/esm-node/base/index.js +3 -1
  20. package/dist/esm-node/base/middlewares/customServer/context.js +3 -4
  21. package/dist/esm-node/base/middlewares/renderHandler/index.js +11 -3
  22. package/dist/esm-node/base/middlewares/renderHandler/render.js +34 -8
  23. package/dist/esm-node/base/utils/error.js +14 -1
  24. package/dist/esm-node/core/plugin.js +2 -0
  25. package/dist/types/base/adapters/node/middlewares/serverManifest.d.ts +2 -2
  26. package/dist/types/base/index.d.ts +1 -1
  27. package/dist/types/base/middlewares/renderHandler/index.d.ts +1 -1
  28. package/dist/types/base/middlewares/renderHandler/render.d.ts +9 -2
  29. package/dist/types/base/utils/error.d.ts +7 -0
  30. package/dist/types/core/plugin.d.ts +51 -2
  31. 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();
@@ -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}/*`;
@@ -26,9 +26,16 @@ var import_constants = require("../../../base/constants");
26
26
  var import_utils = require("../../utils");
27
27
  var import_dataHandler = require("./dataHandler");
28
28
  var import_ssrRender = require("./ssrRender");
29
- async function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, nonce }) {
29
+ async function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, nonce, onFallback: onFallbackFn }) {
30
30
  return async (req, { logger, nodeReq, reporter, templates, serverManifest, locals, metrics }) => {
31
31
  const routeInfo = matchRoute(req, routes);
32
+ const onFallback = async (reason, error) => {
33
+ return onFallbackFn === null || onFallbackFn === void 0 ? void 0 : onFallbackFn(reason, {
34
+ logger,
35
+ reporter,
36
+ metrics
37
+ }, error);
38
+ };
32
39
  if (!routeInfo) {
33
40
  return new Response((0, import_utils.createErrorHtml)(404), {
34
41
  status: 404,
@@ -46,7 +53,11 @@ async function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, n
46
53
  }
47
54
  });
48
55
  }
49
- const renderMode = getRenderMode(req, metaName || "modern-js", routeInfo.isSSR, forceCSR, nodeReq);
56
+ const renderMode = await getRenderMode(req, metaName || "modern-js", routeInfo.isSSR, forceCSR, nodeReq, onFallback);
57
+ const onError = async (e) => {
58
+ (0, import_utils.onError)(logger, import_utils.ErrorDigest.ERENDER, e, req);
59
+ await (onFallback === null || onFallback === void 0 ? void 0 : onFallback("error", e));
60
+ };
50
61
  const renderOptions = {
51
62
  pwd,
52
63
  html,
@@ -66,25 +77,35 @@ async function createRender({ routes, pwd, metaName, staticGenerate, forceCSR, n
66
77
  case "data":
67
78
  let response = await (0, import_dataHandler.dataHandler)(req, renderOptions);
68
79
  if (!response) {
69
- response = await renderHandler(req, renderOptions, "ssr");
80
+ response = await renderHandler(req, renderOptions, "ssr", onError);
70
81
  }
71
82
  return response;
72
83
  case "ssr":
73
84
  case "csr":
74
- return renderHandler(req, renderOptions, renderMode);
85
+ return renderHandler(req, renderOptions, renderMode, onError);
75
86
  default:
76
87
  throw new Error(`Unknown render mode: ${renderMode}`);
77
88
  }
78
89
  };
79
90
  }
80
- async function renderHandler(request, options, mode) {
91
+ async function renderHandler(request, options, mode, onError) {
81
92
  const serverData = {
82
93
  router: {
83
94
  baseUrl: options.routeInfo.urlPath,
84
95
  params: {}
85
96
  }
86
97
  };
87
- const response = await (mode === "ssr" ? (0, import_ssrRender.ssrRender)(request, options) : csrRender(options.html));
98
+ let response;
99
+ if (mode === "ssr") {
100
+ try {
101
+ response = await (0, import_ssrRender.ssrRender)(request, options);
102
+ } catch (e) {
103
+ await onError(e);
104
+ response = csrRender(options.html);
105
+ }
106
+ } else {
107
+ response = csrRender(options.html);
108
+ }
88
109
  return (0, import_utils.transformResponse)(response, injectServerData(serverData));
89
110
  }
90
111
  function matchRoute(req, routes) {
@@ -97,7 +118,7 @@ function matchRoute(req, routes) {
97
118
  }
98
119
  return void 0;
99
120
  }
100
- function getRenderMode(req, framework, isSSR, forceCSR, nodeReq) {
121
+ async function getRenderMode(req, framework, isSSR, forceCSR, nodeReq, onFallback) {
101
122
  const query = (0, import_utils.parseQuery)(req);
102
123
  const fallbackHeader = `x-${(0, import_universal.cutNameByHyphen)(framework)}-ssr-fallback`;
103
124
  if (isSSR) {
@@ -105,6 +126,11 @@ function getRenderMode(req, framework, isSSR, forceCSR, nodeReq) {
105
126
  return "data";
106
127
  }
107
128
  if (forceCSR && (query.csr || req.headers.get(fallbackHeader) || (nodeReq === null || nodeReq === void 0 ? void 0 : nodeReq.headers[fallbackHeader]))) {
129
+ if (query.csr) {
130
+ await (onFallback === null || onFallback === void 0 ? void 0 : onFallback("query"));
131
+ } else {
132
+ await (onFallback === null || onFallback === void 0 ? void 0 : onFallback("header"));
133
+ }
108
134
  return "csr";
109
135
  }
110
136
  return "ssr";
@@ -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,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();