@modern-js/runtime 2.65.1 → 2.65.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 (98) hide show
  1. package/dist/cjs/cache/index.js +22 -0
  2. package/dist/cjs/cli/code.js +1 -0
  3. package/dist/cjs/cli/ssr/index.js +1 -1
  4. package/dist/cjs/cli/template.js +7 -3
  5. package/dist/cjs/core/browser/index.js +1 -3
  6. package/dist/cjs/core/compat/requestContext.js +48 -0
  7. package/dist/cjs/core/compatible.js +2 -14
  8. package/dist/cjs/core/context/index.js +6 -0
  9. package/dist/cjs/core/context/monitors/default.js +38 -0
  10. package/dist/cjs/core/context/monitors/index.js +31 -0
  11. package/dist/cjs/core/context/monitors/index.server.js +33 -0
  12. package/dist/cjs/core/context/request/index.js +30 -0
  13. package/dist/cjs/core/context/request/index.server.js +32 -0
  14. package/dist/cjs/core/context/response/index.js +43 -0
  15. package/dist/cjs/core/context/response/index.server.js +62 -0
  16. package/dist/cjs/core/plugin/index.js +2 -0
  17. package/dist/cjs/core/server/requestHandler.js +83 -73
  18. package/dist/cjs/core/server/stream/shared.js +40 -45
  19. package/dist/cjs/core/server/string/index.js +50 -55
  20. package/dist/cjs/core/server/string/prefetch.js +47 -52
  21. package/dist/cjs/index.js +13 -0
  22. package/dist/cjs/react-server.js +38 -0
  23. package/dist/cjs/router/cli/code/templates.js +3 -1
  24. package/dist/cjs/router/cli/handler.js +1 -0
  25. package/dist/cjs/router/runtime/plugin.node.js +1 -2
  26. package/dist/cjs/router/runtime/utils.js +4 -6
  27. package/dist/esm/cache/index.js +1 -0
  28. package/dist/esm/cli/code.js +1 -0
  29. package/dist/esm/cli/ssr/index.js +1 -1
  30. package/dist/esm/cli/template.js +4 -4
  31. package/dist/esm/core/browser/index.js +3 -4
  32. package/dist/esm/core/compat/requestContext.js +25 -0
  33. package/dist/esm/core/compatible.js +5 -16
  34. package/dist/esm/core/context/index.js +5 -0
  35. package/dist/esm/core/context/monitors/default.js +20 -0
  36. package/dist/esm/core/context/monitors/index.js +7 -0
  37. package/dist/esm/core/context/monitors/index.server.js +9 -0
  38. package/dist/esm/core/context/request/index.js +6 -0
  39. package/dist/esm/core/context/request/index.server.js +8 -0
  40. package/dist/esm/core/context/response/index.js +16 -0
  41. package/dist/esm/core/context/response/index.server.js +41 -0
  42. package/dist/esm/core/plugin/index.js +3 -1
  43. package/dist/esm/core/server/requestHandler.js +134 -118
  44. package/dist/esm/core/server/stream/shared.js +49 -63
  45. package/dist/esm/core/server/string/index.js +82 -93
  46. package/dist/esm/core/server/string/prefetch.js +83 -94
  47. package/dist/esm/index.js +8 -0
  48. package/dist/esm/react-server.js +10 -0
  49. package/dist/esm/router/cli/code/templates.js +3 -3
  50. package/dist/esm/router/cli/handler.js +1 -0
  51. package/dist/esm/router/runtime/plugin.node.js +1 -2
  52. package/dist/esm/router/runtime/utils.js +4 -6
  53. package/dist/esm-node/cache/index.js +1 -0
  54. package/dist/esm-node/cli/code.js +1 -0
  55. package/dist/esm-node/cli/ssr/index.js +1 -1
  56. package/dist/esm-node/cli/template.js +7 -3
  57. package/dist/esm-node/core/browser/index.js +1 -3
  58. package/dist/esm-node/core/compat/requestContext.js +23 -0
  59. package/dist/esm-node/core/compatible.js +2 -14
  60. package/dist/esm-node/core/context/index.js +5 -0
  61. package/dist/esm-node/core/context/monitors/default.js +14 -0
  62. package/dist/esm-node/core/context/monitors/index.js +7 -0
  63. package/dist/esm-node/core/context/monitors/index.server.js +9 -0
  64. package/dist/esm-node/core/context/request/index.js +6 -0
  65. package/dist/esm-node/core/context/request/index.server.js +8 -0
  66. package/dist/esm-node/core/context/response/index.js +16 -0
  67. package/dist/esm-node/core/context/response/index.server.js +35 -0
  68. package/dist/esm-node/core/plugin/index.js +2 -0
  69. package/dist/esm-node/core/server/requestHandler.js +83 -73
  70. package/dist/esm-node/core/server/stream/shared.js +40 -45
  71. package/dist/esm-node/core/server/string/index.js +50 -55
  72. package/dist/esm-node/core/server/string/prefetch.js +47 -52
  73. package/dist/esm-node/index.js +8 -0
  74. package/dist/esm-node/react-server.js +10 -0
  75. package/dist/esm-node/router/cli/code/templates.js +3 -1
  76. package/dist/esm-node/router/cli/handler.js +1 -0
  77. package/dist/esm-node/router/runtime/plugin.node.js +1 -2
  78. package/dist/esm-node/router/runtime/utils.js +4 -6
  79. package/dist/types/cache/index.d.ts +1 -0
  80. package/dist/types/cli/template.d.ts +2 -1
  81. package/dist/types/core/compat/requestContext.d.ts +27 -0
  82. package/dist/types/core/compatible.d.ts +2 -2
  83. package/dist/types/core/config.d.ts +1 -1
  84. package/dist/types/core/context/index.d.ts +2 -0
  85. package/dist/types/core/context/monitors/default.d.ts +2 -0
  86. package/dist/types/core/context/monitors/index.d.ts +1 -0
  87. package/dist/types/core/context/monitors/index.server.d.ts +2 -0
  88. package/dist/types/core/context/request/index.d.ts +1 -0
  89. package/dist/types/core/context/request/index.server.d.ts +1 -0
  90. package/dist/types/core/context/response/index.d.ts +4 -0
  91. package/dist/types/core/context/response/index.server.d.ts +7 -0
  92. package/dist/types/core/context/runtime.d.ts +1 -0
  93. package/dist/types/core/types.d.ts +4 -17
  94. package/dist/types/index.d.ts +3 -0
  95. package/dist/types/react-server.d.ts +3 -0
  96. package/dist/types/router/cli/code/templates.d.ts +2 -1
  97. package/dist/types/router/runtime/utils.d.ts +3 -5
  98. package/package.json +22 -12
@@ -70,7 +70,8 @@ import './${ENTRY_POINT_RUNTIME_REGISTER_FILE_NAME}';
70
70
  `;
71
71
  const getImportRuntimeConfigCode = (srcDirectory, internalSrcAlias, runtimeConfigFile) => {
72
72
  if (runtimeConfigFile && findExists(JS_EXTENSIONS.map((ext) => path.resolve(srcDirectory, `${runtimeConfigFile}${ext}`)))) {
73
- return `import runtimeConfig from '${internalSrcAlias}/${runtimeConfigFile}';`;
73
+ return `import modernRuntime from '${internalSrcAlias}/${runtimeConfigFile}';
74
+ const runtimeConfig = typeof modernRuntime === 'function' ? modernRuntime(getCurrentEntryName()) : modernRuntime`;
74
75
  }
75
76
  return `let runtimeConfig;`;
76
77
  };
@@ -79,7 +80,8 @@ const getRegisterRuntimePluginCode = (entryName, name, config) => {
79
80
  return `plugins.push(${name}Plugin(mergeConfig(${JSON.stringify(config)}, (runtimeConfig || {})['${configName}'], ((runtimeConfig || {})['${configName}ByEntries'] || {})['${entryName}'], (getGlobalAppConfig() || {})['${configName}'])));`;
80
81
  };
81
82
  const runtimeRegister = ({ entryName, srcDirectory, internalSrcAlias, metaName, runtimeConfigFile, runtimePlugins }) => `import { registerPlugin, mergeConfig } from '@${metaName}/runtime/plugin';
82
- import { getGlobalAppConfig, getGlobalLayoutApp } from '@${metaName}/runtime/context';
83
+ import { getGlobalAppConfig, getGlobalLayoutApp, getCurrentEntryName } from '@${metaName}/runtime/context';
84
+
83
85
  ${getImportRuntimeConfigCode(srcDirectory, internalSrcAlias, runtimeConfigFile)}
84
86
 
85
87
  const plugins = [];
@@ -90,13 +92,15 @@ ${getRegisterRuntimePluginCode(entryName, name, config)}
90
92
  `).join("\n")}
91
93
  registerPlugin(plugins, runtimeConfig);
92
94
  `;
93
- const runtimeGlobalContext = ({ srcDirectory, internalSrcAlias, metaName, entry, customEntry }) => {
95
+ const runtimeGlobalContext = ({ entryName, srcDirectory, internalSrcAlias, metaName, entry, customEntry }) => {
94
96
  return `import { setGlobalContext } from '@${metaName}/runtime/context'
95
97
 
96
98
  import App from '${// We need to get the path of App.tsx here, but the entry is `src/entry.tsx`
97
99
  formatImportPath(customEntry ? entry.replace(/entry\.[tj]sx/, "App").replace(srcDirectory, internalSrcAlias) : entry.replace(srcDirectory, internalSrcAlias).replace(/\.[tj]sx/, ""))}';
98
100
 
101
+ const entryName = '${entryName}';
99
102
  setGlobalContext({
103
+ entryName,
100
104
  App,
101
105
  });`;
102
106
  };
@@ -75,9 +75,7 @@ async function render(App, id) {
75
75
  }),
76
76
  // garfish plugin params
77
77
  _internalRouterBaseName: App.props.basename,
78
- ...{
79
- ssrContext: ssrData.context
80
- }
78
+ ssrContext: ssrData.context
81
79
  });
82
80
  context.initialData = (_ssrData_data1 = ssrData.data) === null || _ssrData_data1 === void 0 ? void 0 : _ssrData_data1.initialData;
83
81
  const initialData = await runBeforeRender(context);
@@ -0,0 +1,23 @@
1
+ const makeRequestContext = (context) => {
2
+ const baseSSRContext = context.ssrContext;
3
+ const requestContext = baseSSRContext ? {
4
+ isBrowser: context.isBrowser,
5
+ request: baseSSRContext.request || {},
6
+ response: baseSSRContext.response || {},
7
+ logger: baseSSRContext.logger || {}
8
+ } : {};
9
+ return requestContext;
10
+ };
11
+ const requestContextPlugin = () => ({
12
+ name: "@modern-js/runtime-plugin-request-context",
13
+ setup(api) {
14
+ api.onBeforeRender((context) => {
15
+ const requestContext = makeRequestContext(context);
16
+ context.context = requestContext;
17
+ });
18
+ }
19
+ });
20
+ export {
21
+ makeRequestContext,
22
+ requestContextPlugin
23
+ };
@@ -76,9 +76,7 @@ const bootstrap = async (BootApp, id, root, ReactDOM) => {
76
76
  loaderManager: createLoaderManager(initialLoadersState, {
77
77
  skipStatic: true
78
78
  }),
79
- ...ssrData ? {
80
- ssrContext: ssrData === null || ssrData === void 0 ? void 0 : ssrData.context
81
- } : {}
79
+ ssrContext: (ssrData === null || ssrData === void 0 ? void 0 : ssrData.context) || {}
82
80
  });
83
81
  context.initialData = ssrData === null || ssrData === void 0 ? void 0 : (_ssrData_data1 = ssrData.data) === null || _ssrData_data1 === void 0 ? void 0 : _ssrData_data1.initialData;
84
82
  const initialData = await runBeforeRender(context);
@@ -138,19 +136,9 @@ const bootstrap = async (BootApp, id, root, ReactDOM) => {
138
136
  const useRuntimeContext = () => {
139
137
  var _context_ssrContext, _context_ssrContext1;
140
138
  const context = useContext(RuntimeReactContext);
141
- const baseSSRContext = context.ssrContext;
142
- const tSSRContext = baseSSRContext ? {
143
- isBrowser: context.isBrowser,
144
- request: baseSSRContext.request || {},
145
- response: baseSSRContext.response || {},
146
- logger: baseSSRContext.logger || {},
147
- getInitData: () => {
148
- return Object.freeze(context.initialData);
149
- }
150
- } : {};
151
139
  const pickedContext = {
152
140
  ...context,
153
- context: tSSRContext,
141
+ context: context.context || {},
154
142
  request: (_context_ssrContext = context.ssrContext) === null || _context_ssrContext === void 0 ? void 0 : _context_ssrContext.request,
155
143
  response: (_context_ssrContext1 = context.ssrContext) === null || _context_ssrContext1 === void 0 ? void 0 : _context_ssrContext1.response
156
144
  };
@@ -1,6 +1,7 @@
1
1
  import { RuntimeReactContext, getInitialContext } from "./runtime";
2
2
  const globalContext = {};
3
3
  function setGlobalContext(context) {
4
+ globalContext.entryName = context.entryName;
4
5
  globalContext.App = context.App;
5
6
  globalContext.routes = context.routes;
6
7
  globalContext.appInit = context.appInit;
@@ -8,6 +9,9 @@ function setGlobalContext(context) {
8
9
  globalContext.layoutApp = context.layoutApp;
9
10
  globalContext.RSCRoot = context.RSCRoot;
10
11
  }
12
+ function getCurrentEntryName() {
13
+ return globalContext.entryName;
14
+ }
11
15
  function getGlobalRSCRoot() {
12
16
  return globalContext.RSCRoot;
13
17
  }
@@ -36,6 +40,7 @@ function getGlobalLayoutApp() {
36
40
  }
37
41
  export {
38
42
  RuntimeReactContext,
43
+ getCurrentEntryName,
39
44
  getGlobalApp,
40
45
  getGlobalAppConfig,
41
46
  getGlobalAppInit,
@@ -0,0 +1,14 @@
1
+ const defaultMonitors = {
2
+ counter(name, ...args) {
3
+ },
4
+ info: console.info,
5
+ debug: console.debug,
6
+ trace: console.trace,
7
+ warn: console.warn,
8
+ error: console.error,
9
+ timing(name, dur, ...args) {
10
+ }
11
+ };
12
+ export {
13
+ defaultMonitors
14
+ };
@@ -0,0 +1,7 @@
1
+ import { defaultMonitors } from "./default";
2
+ const getMonitors = () => {
3
+ return defaultMonitors;
4
+ };
5
+ export {
6
+ getMonitors
7
+ };
@@ -0,0 +1,9 @@
1
+ import { storage } from "@modern-js/runtime-utils/node";
2
+ import { defaultMonitors } from "./default";
3
+ const getMonitors = () => {
4
+ const storageContext = storage.useContext();
5
+ return storageContext.monitors || defaultMonitors;
6
+ };
7
+ export {
8
+ getMonitors
9
+ };
@@ -0,0 +1,6 @@
1
+ const getRequest = () => {
2
+ return new Request(location.href);
3
+ };
4
+ export {
5
+ getRequest
6
+ };
@@ -0,0 +1,8 @@
1
+ import { storage } from "@modern-js/runtime-utils/node";
2
+ const getRequest = () => {
3
+ const context = storage.useContext();
4
+ return context === null || context === void 0 ? void 0 : context.request;
5
+ };
6
+ export {
7
+ getRequest
8
+ };
@@ -0,0 +1,16 @@
1
+ const getResponseProxy = () => {
2
+ return null;
3
+ };
4
+ const setHeaders = (headers) => {
5
+ };
6
+ const setStatus = (status) => {
7
+ };
8
+ const redirect = (url, init) => {
9
+ console.warn(`You should not use this API in the browser, please use the router's redirect or useNavigate method.`);
10
+ };
11
+ export {
12
+ getResponseProxy,
13
+ redirect,
14
+ setHeaders,
15
+ setStatus
16
+ };
@@ -0,0 +1,35 @@
1
+ import { storage } from "@modern-js/runtime-utils/node";
2
+ const getResponseProxy = () => {
3
+ const context = storage.useContext();
4
+ return context === null || context === void 0 ? void 0 : context.responseProxy;
5
+ };
6
+ const setHeaders = (headers) => {
7
+ const responseProxy = getResponseProxy();
8
+ Object.entries(headers).forEach(([key, value]) => {
9
+ responseProxy.headers[key] = value;
10
+ });
11
+ };
12
+ const setStatus = (status) => {
13
+ const responseProxy = getResponseProxy();
14
+ responseProxy.status = status;
15
+ };
16
+ const redirect = (url, init) => {
17
+ var _init_status;
18
+ const status = init === void 0 ? 307 : typeof init === "number" ? init : (_init_status = init.status) !== null && _init_status !== void 0 ? _init_status : 307;
19
+ var _init_headers;
20
+ const headers = init === void 0 ? {} : typeof init === "number" ? {} : (_init_headers = init.headers) !== null && _init_headers !== void 0 ? _init_headers : {};
21
+ setStatus(status);
22
+ setHeaders({
23
+ Location: url,
24
+ ...init && typeof init === "object" ? Object.fromEntries(Object.entries(headers).map(([k, v]) => [
25
+ k,
26
+ String(v)
27
+ ])) : {}
28
+ });
29
+ };
30
+ export {
31
+ getResponseProxy,
32
+ redirect,
33
+ setHeaders,
34
+ setStatus
35
+ };
@@ -2,12 +2,14 @@ import { runtime } from "@modern-js/plugin-v2/runtime";
2
2
  import { merge } from "@modern-js/runtime-utils/merge";
3
3
  import { compatPlugin } from "../compat";
4
4
  import { handleSetupResult } from "../compat/hooks";
5
+ import { requestContextPlugin } from "../compat/requestContext";
5
6
  import { setGlobalInternalRuntimeContext } from "../context";
6
7
  function registerPlugin(internalPlugins, runtimeConfig) {
7
8
  const { plugins = [] } = runtimeConfig || {};
8
9
  const { runtimeContext } = runtime.run({
9
10
  plugins: [
10
11
  compatPlugin(),
12
+ requestContextPlugin(),
11
13
  ...internalPlugins,
12
14
  ...plugins
13
15
  ],
@@ -1,3 +1,4 @@
1
+ import { storage } from "@modern-js/runtime-utils/node";
1
2
  import { getPathname, parseCookie, parseHeaders, parseQuery } from "@modern-js/runtime-utils/universal/request";
2
3
  import { getGlobalAppInit, getGlobalInternalRuntimeContext, getGlobalRSCRoot } from "../context";
3
4
  import { getInitialContext } from "../context/runtime";
@@ -44,6 +45,7 @@ function createSSRContext(request, options) {
44
45
  params,
45
46
  headers: headersData,
46
47
  host,
48
+ referer: headers.get("referer"),
47
49
  raw: request
48
50
  },
49
51
  response: {
@@ -51,7 +53,7 @@ function createSSRContext(request, options) {
51
53
  responseProxy.headers[key] = value;
52
54
  },
53
55
  status(code) {
54
- responseProxy.code = code;
56
+ responseProxy.status = code;
55
57
  },
56
58
  locals: locals || {}
57
59
  },
@@ -64,85 +66,93 @@ function createSSRContext(request, options) {
64
66
  }
65
67
  const createRequestHandler = async (handleRequest, createRequestOptions) => {
66
68
  const requestHandler = async (request, options) => {
67
- var _context_routerContext, _context_routerContext1, _context_routerContext2;
68
- const Root = createRoot();
69
- const internalRuntimeContext = getGlobalInternalRuntimeContext();
70
- const hooks = internalRuntimeContext.hooks;
71
- const { routeManifest } = options.resource;
72
- const context = getInitialContext(false, routeManifest);
73
- const runBeforeRender = async (context2) => {
74
- const result = await hooks.onBeforeRender.call(context2);
75
- if (typeof Response !== "undefined" && result instanceof Response) {
76
- return result;
77
- }
78
- const init = getGlobalAppInit();
79
- return init === null || init === void 0 ? void 0 : init(context2);
80
- };
69
+ const headersData = parseHeaders(request);
81
70
  const responseProxy = {
82
71
  headers: {},
83
- code: -1
72
+ status: -1
84
73
  };
85
- const ssrContext = createSSRContext(request, {
86
- ...options,
74
+ return storage.run({
75
+ headers: headersData,
76
+ request,
77
+ monitors: options.monitors,
87
78
  responseProxy
88
- });
89
- Object.assign(context, {
90
- ssrContext,
91
- isBrowser: false,
92
- loaderManager: createLoaderManager({}, {
93
- skipNonStatic: options.staticGenerate,
94
- // if not static generate, only non-static loader can exec on prod env
95
- skipStatic: process.env.NODE_ENV === "production" && !options.staticGenerate
96
- })
97
- });
98
- const getRedirectResponse = (result) => {
99
- if (typeof Response !== "undefined" && // fix: ssg workflow doesn't inject Web Response
100
- result instanceof Response && result.status >= 300 && result.status <= 399) {
101
- const { status } = result;
102
- const redirectUrl = result.headers.get("Location") || "/";
103
- const { ssrContext: ssrContext2 } = context;
104
- if (ssrContext2) {
105
- return new Response(null, {
106
- status,
107
- headers: {
108
- Location: redirectUrl
109
- }
110
- });
79
+ }, async () => {
80
+ var _context_routerContext, _context_routerContext1, _context_routerContext2;
81
+ const Root = createRoot();
82
+ const internalRuntimeContext = getGlobalInternalRuntimeContext();
83
+ const hooks = internalRuntimeContext.hooks;
84
+ const { routeManifest } = options.resource;
85
+ const context = getInitialContext(false, routeManifest);
86
+ const runBeforeRender = async (context2) => {
87
+ const result = await hooks.onBeforeRender.call(context2);
88
+ if (typeof Response !== "undefined" && result instanceof Response) {
89
+ return result;
90
+ }
91
+ const init = getGlobalAppInit();
92
+ return init === null || init === void 0 ? void 0 : init(context2);
93
+ };
94
+ const ssrContext = createSSRContext(request, {
95
+ ...options,
96
+ responseProxy
97
+ });
98
+ Object.assign(context, {
99
+ ssrContext,
100
+ isBrowser: false,
101
+ loaderManager: createLoaderManager({}, {
102
+ skipNonStatic: options.staticGenerate,
103
+ // if not static generate, only non-static loader can exec on prod env
104
+ skipStatic: process.env.NODE_ENV === "production" && !options.staticGenerate
105
+ })
106
+ });
107
+ const getRedirectResponse = (result) => {
108
+ if (typeof Response !== "undefined" && // fix: ssg workflow doesn't inject Web Response
109
+ result instanceof Response && result.status >= 300 && result.status <= 399) {
110
+ const { status } = result;
111
+ const redirectUrl = result.headers.get("Location") || "/";
112
+ const { ssrContext: ssrContext2 } = context;
113
+ if (ssrContext2) {
114
+ return new Response(null, {
115
+ status,
116
+ headers: {
117
+ Location: redirectUrl
118
+ }
119
+ });
120
+ }
111
121
  }
122
+ return void 0;
123
+ };
124
+ const initialData = await runBeforeRender(context);
125
+ if (((_context_routerContext = context.routerContext) === null || _context_routerContext === void 0 ? void 0 : _context_routerContext.statusCode) && ((_context_routerContext1 = context.routerContext) === null || _context_routerContext1 === void 0 ? void 0 : _context_routerContext1.statusCode) !== 200) {
126
+ var _context_routerContext3, _context_ssrContext;
127
+ (_context_ssrContext = context.ssrContext) === null || _context_ssrContext === void 0 ? void 0 : _context_ssrContext.response.status((_context_routerContext3 = context.routerContext) === null || _context_routerContext3 === void 0 ? void 0 : _context_routerContext3.statusCode);
112
128
  }
113
- return void 0;
114
- };
115
- const initialData = await runBeforeRender(context);
116
- if (((_context_routerContext = context.routerContext) === null || _context_routerContext === void 0 ? void 0 : _context_routerContext.statusCode) && ((_context_routerContext1 = context.routerContext) === null || _context_routerContext1 === void 0 ? void 0 : _context_routerContext1.statusCode) !== 200) {
117
- var _context_routerContext3, _context_ssrContext;
118
- (_context_ssrContext = context.ssrContext) === null || _context_ssrContext === void 0 ? void 0 : _context_ssrContext.response.status((_context_routerContext3 = context.routerContext) === null || _context_routerContext3 === void 0 ? void 0 : _context_routerContext3.statusCode);
119
- }
120
- const errors = Object.values(((_context_routerContext2 = context.routerContext) === null || _context_routerContext2 === void 0 ? void 0 : _context_routerContext2.errors) || {});
121
- if (errors.length > 0) {
122
- options.onError(errors[0], SSRErrors.LOADER_ERROR);
123
- }
124
- context.initialData = initialData;
125
- const redirectResponse = getRedirectResponse(initialData);
126
- if (redirectResponse) {
127
- return redirectResponse;
128
- }
129
- const { htmlTemplate } = options.resource;
130
- options.resource.htmlTemplate = htmlTemplate.replace("</head>", `${CHUNK_CSS_PLACEHOLDER}</head>`);
131
- const response = await handleRequest(request, Root, {
132
- ...options,
133
- runtimeContext: context,
134
- RSCRoot: (createRequestOptions === null || createRequestOptions === void 0 ? void 0 : createRequestOptions.enableRsc) && getGlobalRSCRoot()
135
- });
136
- Object.entries(responseProxy.headers).forEach(([key, value]) => {
137
- response.headers.set(key, value);
138
- });
139
- if (responseProxy.code !== -1) {
140
- return new Response(response.body, {
141
- status: responseProxy.code,
142
- headers: response.headers
129
+ const errors = Object.values(((_context_routerContext2 = context.routerContext) === null || _context_routerContext2 === void 0 ? void 0 : _context_routerContext2.errors) || {});
130
+ if (errors.length > 0) {
131
+ options.onError(errors[0], SSRErrors.LOADER_ERROR);
132
+ }
133
+ context.initialData = initialData;
134
+ const redirectResponse = getRedirectResponse(initialData);
135
+ if (redirectResponse) {
136
+ return redirectResponse;
137
+ }
138
+ const { htmlTemplate } = options.resource;
139
+ options.resource.htmlTemplate = htmlTemplate.replace("</head>", `${CHUNK_CSS_PLACEHOLDER}</head>`);
140
+ const response = await handleRequest(request, Root, {
141
+ ...options,
142
+ runtimeContext: context,
143
+ RSCRoot: (createRequestOptions === null || createRequestOptions === void 0 ? void 0 : createRequestOptions.enableRsc) && getGlobalRSCRoot()
144
+ });
145
+ Object.entries(responseProxy.headers).forEach(([key, value]) => {
146
+ response.headers.set(key, value);
143
147
  });
144
- }
145
- return response;
148
+ if (responseProxy.status !== -1) {
149
+ return new Response(response.body, {
150
+ status: responseProxy.status,
151
+ headers: response.headers
152
+ });
153
+ }
154
+ return response;
155
+ });
146
156
  };
147
157
  return requestHandler;
148
158
  };
@@ -1,7 +1,5 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { run } from "@modern-js/runtime-utils/node";
3
2
  import { time } from "@modern-js/runtime-utils/time";
4
- import { parseHeaders } from "@modern-js/runtime-utils/universal/request";
5
3
  import { wrapRuntimeContextProvider } from "../../react/wrapper";
6
4
  import { SSRErrors, SSRTimings } from "../tracer";
7
5
  import { getSSRConfigByEntry } from "../utils";
@@ -32,51 +30,48 @@ function getReadableStreamFromString(content) {
32
30
  function createRenderStreaming(createReadableStreamPromise) {
33
31
  return async (request, serverRoot, options) => {
34
32
  const createReadableStreamFromElement = await createReadableStreamPromise;
35
- const headersData = parseHeaders(request);
36
- return run(headersData, async () => {
37
- const end = time();
38
- const { runtimeContext, config, resource } = options;
39
- const { onError, onTiming } = options;
40
- const { htmlTemplate, entryName } = resource;
41
- const ssrConfig = getSSRConfigByEntry(entryName, config.ssr, config.ssrByEntries);
42
- const RSCServerRoot = ({ children }) => {
43
- return /* @__PURE__ */ _jsx(_Fragment, {
44
- children
45
- });
46
- };
47
- let rootElement = wrapRuntimeContextProvider(serverRoot, Object.assign(runtimeContext, {
48
- ssr: true
49
- }));
50
- rootElement = /* @__PURE__ */ _jsx(RSCServerRoot, {
51
- children: rootElement
33
+ const end = time();
34
+ const { runtimeContext, config, resource } = options;
35
+ const { onError, onTiming } = options;
36
+ const { htmlTemplate, entryName } = resource;
37
+ const ssrConfig = getSSRConfigByEntry(entryName, config.ssr, config.ssrByEntries);
38
+ const RSCServerRoot = ({ children }) => {
39
+ return /* @__PURE__ */ _jsx(_Fragment, {
40
+ children
52
41
  });
53
- const stream = await createReadableStreamFromElement(request, rootElement, {
54
- config,
55
- htmlTemplate,
56
- runtimeContext,
57
- ssrConfig,
58
- entryName,
59
- rscClientManifest: options.rscClientManifest,
60
- rscSSRManifest: options.rscSSRManifest,
61
- rscServerManifest: options.rscServerManifest,
62
- rscRoot: options.rscRoot,
63
- onShellReady() {
64
- const cost = end();
65
- onTiming(SSRTimings.RENDER_SHELL, cost);
66
- },
67
- onAllReady() {
68
- const cost = end();
69
- onTiming(SSRTimings.RENDER_HTML, cost);
70
- },
71
- onShellError(error) {
72
- onError(error, SSRErrors.RENDER_SHELL);
73
- },
74
- onError(error) {
75
- onError(error, SSRErrors.RENDER_STREAM);
76
- }
77
- });
78
- return stream;
42
+ };
43
+ let rootElement = wrapRuntimeContextProvider(serverRoot, Object.assign(runtimeContext, {
44
+ ssr: true
45
+ }));
46
+ rootElement = /* @__PURE__ */ _jsx(RSCServerRoot, {
47
+ children: rootElement
48
+ });
49
+ const stream = await createReadableStreamFromElement(request, rootElement, {
50
+ config,
51
+ htmlTemplate,
52
+ runtimeContext,
53
+ ssrConfig,
54
+ entryName,
55
+ rscClientManifest: options.rscClientManifest,
56
+ rscSSRManifest: options.rscSSRManifest,
57
+ rscServerManifest: options.rscServerManifest,
58
+ rscRoot: options.rscRoot,
59
+ onShellReady() {
60
+ const cost = end();
61
+ onTiming(SSRTimings.RENDER_SHELL, cost);
62
+ },
63
+ onAllReady() {
64
+ const cost = end();
65
+ onTiming(SSRTimings.RENDER_HTML, cost);
66
+ },
67
+ onShellError(error) {
68
+ onError(error, SSRErrors.RENDER_SHELL);
69
+ },
70
+ onError(error) {
71
+ onError(error, SSRErrors.RENDER_STREAM);
72
+ }
79
73
  });
74
+ return stream;
80
75
  };
81
76
  }
82
77
  export {