@modern-js/runtime 2.68.0 → 2.68.2

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 (88) hide show
  1. package/dist/cjs/cli/code.js +6 -3
  2. package/dist/cjs/cli/template.js +72 -21
  3. package/dist/cjs/cli/template.server.js +62 -13
  4. package/dist/cjs/core/context/index.js +19 -2
  5. package/dist/cjs/core/context/serverPayload.server.js +40 -0
  6. package/dist/cjs/core/server/requestHandler.js +47 -11
  7. package/dist/cjs/router/cli/code/index.js +13 -6
  8. package/dist/cjs/router/cli/code/templates.js +44 -20
  9. package/dist/cjs/router/cli/handler.js +17 -2
  10. package/dist/cjs/router/cli/index.js +6 -5
  11. package/dist/cjs/router/index.js +0 -21
  12. package/dist/cjs/router/internal.js +30 -0
  13. package/dist/cjs/router/runtime/PrefetchLink.js +3 -4
  14. package/dist/cjs/router/runtime/constants.js +2 -2
  15. package/dist/cjs/router/runtime/index.js +1 -12
  16. package/dist/cjs/router/runtime/internal.js +36 -0
  17. package/dist/cjs/router/runtime/plugin.js +134 -76
  18. package/dist/cjs/router/runtime/plugin.node.js +73 -32
  19. package/dist/cjs/router/runtime/rsc-router.js +322 -0
  20. package/dist/cjs/router/runtime/utils.js +76 -1
  21. package/dist/cjs/rsc/client.js +11 -0
  22. package/dist/cjs/rsc/server.js +40 -0
  23. package/dist/esm/cli/code.js +6 -3
  24. package/dist/esm/cli/template.js +25 -6
  25. package/dist/esm/cli/template.server.js +3 -3
  26. package/dist/esm/core/context/index.js +14 -1
  27. package/dist/esm/core/context/serverPayload.server.js +15 -0
  28. package/dist/esm/core/server/requestHandler.js +102 -9
  29. package/dist/esm/router/cli/code/index.js +12 -6
  30. package/dist/esm/router/cli/code/templates.js +29 -13
  31. package/dist/esm/router/cli/handler.js +33 -6
  32. package/dist/esm/router/cli/index.js +6 -5
  33. package/dist/esm/router/index.js +0 -6
  34. package/dist/esm/router/internal.js +5 -0
  35. package/dist/esm/router/runtime/PrefetchLink.js +2 -2
  36. package/dist/esm/router/runtime/constants.js +2 -2
  37. package/dist/esm/router/runtime/index.js +1 -9
  38. package/dist/esm/router/runtime/internal.js +10 -0
  39. package/dist/esm/router/runtime/plugin.js +134 -85
  40. package/dist/esm/router/runtime/plugin.node.js +110 -40
  41. package/dist/esm/router/runtime/rsc-router.js +437 -0
  42. package/dist/esm/router/runtime/utils.js +95 -1
  43. package/dist/esm/rsc/client.js +6 -0
  44. package/dist/esm/rsc/server.js +86 -0
  45. package/dist/esm-node/cli/code.js +6 -3
  46. package/dist/esm-node/cli/template.js +72 -21
  47. package/dist/esm-node/cli/template.server.js +62 -13
  48. package/dist/esm-node/core/context/index.js +14 -1
  49. package/dist/esm-node/core/context/serverPayload.server.js +15 -0
  50. package/dist/esm-node/core/server/requestHandler.js +45 -9
  51. package/dist/esm-node/router/cli/code/index.js +12 -6
  52. package/dist/esm-node/router/cli/code/templates.js +44 -20
  53. package/dist/esm-node/router/cli/handler.js +17 -2
  54. package/dist/esm-node/router/cli/index.js +6 -5
  55. package/dist/esm-node/router/index.js +0 -6
  56. package/dist/esm-node/router/internal.js +5 -0
  57. package/dist/esm-node/router/runtime/PrefetchLink.js +2 -2
  58. package/dist/esm-node/router/runtime/constants.js +2 -2
  59. package/dist/esm-node/router/runtime/index.js +1 -9
  60. package/dist/esm-node/router/runtime/internal.js +10 -0
  61. package/dist/esm-node/router/runtime/plugin.js +126 -78
  62. package/dist/esm-node/router/runtime/plugin.node.js +75 -34
  63. package/dist/esm-node/router/runtime/rsc-router.js +284 -0
  64. package/dist/esm-node/router/runtime/utils.js +74 -1
  65. package/dist/esm-node/rsc/client.js +6 -0
  66. package/dist/esm-node/rsc/server.js +35 -0
  67. package/dist/types/cli/template.d.ts +4 -2
  68. package/dist/types/cli/template.server.d.ts +2 -1
  69. package/dist/types/common.d.ts +1 -1
  70. package/dist/types/config.d.ts +1 -1
  71. package/dist/types/core/context/index.d.ts +38 -3
  72. package/dist/types/core/context/serverPayload.server.d.ts +3 -0
  73. package/dist/types/core/server/requestHandler.d.ts +1 -1
  74. package/dist/types/index.d.ts +1 -1
  75. package/dist/types/router/cli/code/index.d.ts +1 -0
  76. package/dist/types/router/cli/code/templates.d.ts +4 -2
  77. package/dist/types/router/index.d.ts +0 -2
  78. package/dist/types/router/internal.d.ts +2 -0
  79. package/dist/types/router/runtime/PrefetchLink.d.ts +0 -1
  80. package/dist/types/router/runtime/constants.d.ts +3 -3
  81. package/dist/types/router/runtime/index.d.ts +1 -9
  82. package/dist/types/router/runtime/internal.d.ts +8 -0
  83. package/dist/types/router/runtime/rsc-router.d.ts +14 -0
  84. package/dist/types/router/runtime/utils.d.ts +26 -5
  85. package/dist/types/rsc/client.d.ts +1 -0
  86. package/dist/types/rsc/server.d.ts +1 -0
  87. package/package.json +21 -12
  88. package/static/modern-inline.js +1 -1
@@ -71,7 +71,8 @@ const generateCode = async (entrypoints, appContext, config, hooks) => {
71
71
  metaName,
72
72
  entryName,
73
73
  mountId,
74
- urlPath: (_serverRoutes_find = serverRoutes.find((route) => route.entryName === entryName)) === null || _serverRoutes_find === void 0 ? void 0 : _serverRoutes_find.urlPath
74
+ urlPath: (_serverRoutes_find = serverRoutes.find((route) => route.entryName === entryName)) === null || _serverRoutes_find === void 0 ? void 0 : _serverRoutes_find.urlPath,
75
+ isNestedRouter: entrypoint.nestedRoutesEntry
75
76
  });
76
77
  } else {
77
78
  indexCode = template.index({
@@ -83,7 +84,8 @@ const generateCode = async (entrypoints, appContext, config, hooks) => {
83
84
  customEntry,
84
85
  customBootstrap,
85
86
  mountId,
86
- enableRsc: config.server.rsc
87
+ enableRsc: config.server.rsc,
88
+ isNestedRouter: !!entrypoint.nestedRoutesEntry
87
89
  });
88
90
  }
89
91
  const indexFile = import_path.default.resolve(internalDirectory, `./${entryName}/${import_constants.ENTRY_POINT_FILE_NAME}`);
@@ -112,6 +114,7 @@ const generateCode = async (entrypoints, appContext, config, hooks) => {
112
114
  } else if (config.server.rsc) {
113
115
  const indexServerFile = import_path.default.resolve(internalDirectory, `./${entryName}/${import_constants.SERVER_ENTRY_POINT_FILE_NAME}`);
114
116
  const indexServerCode = serverTemplate.entryForCSRWithRSC({
117
+ entryName,
115
118
  metaName
116
119
  });
117
120
  await import_utils.fs.outputFile(indexServerFile, indexServerCode, "utf8");
@@ -130,7 +133,7 @@ const generateCode = async (entrypoints, appContext, config, hooks) => {
130
133
  const registerRuntimeFile = import_path.default.resolve(internalDirectory, `./${entryName}/${import_constants.ENTRY_POINT_RUNTIME_REGISTER_FILE_NAME}`);
131
134
  await import_utils.fs.outputFile(registerRuntimeFile, registerRuntimeCode, "utf8");
132
135
  let contextCode = "";
133
- if (!config.server.rsc) {
136
+ if (!config.server.rsc || entrypoint.nestedRoutesEntry) {
134
137
  contextCode = template.runtimeGlobalContext({
135
138
  entryName,
136
139
  srcDirectory,
@@ -41,7 +41,21 @@ module.exports = __toCommonJS(template_exports);
41
41
  var import_path = __toESM(require("path"));
42
42
  var import_utils = require("@modern-js/utils");
43
43
  var import_constants = require("./constants");
44
- const genRenderCode = ({ srcDirectory, internalSrcAlias, metaName, entry, customEntry, customBootstrap, mountId, enableRsc }) => {
44
+ const genRenderStatement = ({ customBootstrap, enableRsc, mountId, isNestedRouter }) => {
45
+ if (customBootstrap) {
46
+ return `customBootstrap(ModernRoot, () => render(<ModernRoot />, '${mountId || "root"}'));`;
47
+ }
48
+ if (enableRsc) {
49
+ if (!isNestedRouter) {
50
+ return `render(<ModernRoot>
51
+ <RscClientRoot rscPayload={data} />
52
+ </ModernRoot>, '${mountId || "root"}');`;
53
+ }
54
+ return `render(<ModernRoot rscPayload={data} />, '${mountId || "root"}');`;
55
+ }
56
+ return `render(<ModernRoot />, '${mountId || "root"}');`;
57
+ };
58
+ const genRenderCode = ({ srcDirectory, internalSrcAlias, metaName, entry, customEntry, customBootstrap, mountId, enableRsc, isNestedRouter }) => {
45
59
  if (customEntry) {
46
60
  return `import '${(0, import_utils.formatImportPath)(entry.replace(srcDirectory, internalSrcAlias))}'`;
47
61
  }
@@ -60,11 +74,14 @@ ${customBootstrap ? `import customBootstrap from '${(0, import_utils.formatImpor
60
74
 
61
75
  const ModernRoot = createRoot();
62
76
 
63
- ${customBootstrap ? `customBootstrap(ModernRoot, () => render(<ModernRoot />, '${mountId || "root"}'));` : enableRsc ? `render(<ModernRoot>
64
- <RscClientRoot data={data} />
65
- </ModernRoot>, '${mountId || "root"}');` : `render(<ModernRoot />, '${mountId || "root"}');`}`;
77
+ ${genRenderStatement({
78
+ customBootstrap,
79
+ enableRsc,
80
+ mountId,
81
+ isNestedRouter
82
+ })}`;
66
83
  };
67
- const entryForCSRWithRSC = ({ metaName, entryName, urlPath = "/", mountId = "root" }) => {
84
+ const entryForCSRWithRSC = ({ metaName, entryName, urlPath = "/", mountId = "root", isNestedRouter }) => {
68
85
  return `
69
86
  import '@${metaName}/runtime/registry/${entryName}';
70
87
  import { render } from '@${metaName}/runtime/browser';
@@ -72,28 +89,61 @@ const entryForCSRWithRSC = ({ metaName, entryName, urlPath = "/", mountId = "roo
72
89
 
73
90
  import {
74
91
  RscClientRoot,
75
- createFromFetch
92
+ createFromFetch,
93
+ isRedirectResponse,
94
+ rscStream,
95
+ callServer,
96
+ createFromReadableStream
76
97
  } from '@${metaName}/runtime/rsc/client';
77
98
 
78
- const content = createFromFetch(
79
- fetch('${urlPath}', {
80
- headers: {
81
- 'x-rsc-tree': 'true',
82
- },
83
- }),
84
- );
99
+ const handleRedirectResponse = (res: Response) => {
100
+ const { headers } = res;
101
+ const location = headers.get('X-Modernjs-Redirect');
102
+ const baseUrl = headers.get('X-Modernjs-BaseUrl');
103
+ if (location) {
104
+ if (baseUrl !== '/') {
105
+ window.location.replace(baseUrl + location);
106
+ } else {
107
+ window.location.replace(location);
108
+ }
109
+ return;
110
+ }
111
+ return res;
112
+ };
113
+
114
+ ${process.env.MODERN_DISABLE_INJECT_RSC_DATA ? `
115
+ const data = createFromFetch(
116
+ fetch(location.pathname, {
117
+ headers: {
118
+ 'x-rsc-tree': 'true',
119
+ },
120
+ }).then(handleRedirectResponse),
121
+ )
122
+ ` : `
123
+ const data = createFromReadableStream(rscStream, {
124
+ callServer: callServer,
125
+ });
126
+ `}
85
127
 
86
128
  const ModernRoot = createRoot();
87
129
 
88
- render(
89
- <ModernRoot>
90
- <RscClientRoot data={content} />
91
- </ModernRoot>,
92
- '${mountId}',
93
- );
130
+ ${isNestedRouter ? `
131
+ render(
132
+ <ModernRoot rscPayload={data}>
133
+ </ModernRoot>,
134
+ '${mountId}',
135
+ );
136
+ ` : `
137
+ render(
138
+ <ModernRoot>
139
+ <RscClientRoot rscPayload={data} />
140
+ </ModernRoot>,
141
+ '${mountId}',
142
+ );
143
+ `}
94
144
  `;
95
145
  };
96
- const index = ({ srcDirectory, internalSrcAlias, metaName, entry, entryName, customEntry, customBootstrap, mountId, enableRsc }) => `import '@${metaName}/runtime/registry/${entryName}';
146
+ const index = ({ srcDirectory, internalSrcAlias, metaName, entry, entryName, customEntry, customBootstrap, mountId, enableRsc, isNestedRouter }) => `import '@${metaName}/runtime/registry/${entryName}';
97
147
  ${genRenderCode({
98
148
  srcDirectory,
99
149
  internalSrcAlias,
@@ -102,7 +152,8 @@ ${genRenderCode({
102
152
  customEntry,
103
153
  customBootstrap,
104
154
  mountId,
105
- enableRsc
155
+ enableRsc,
156
+ isNestedRouter
106
157
  })}
107
158
  `;
108
159
  const register = () => `import './${import_constants.ENTRY_POINT_RUNTIME_GLOBAL_CONTEXT_FILE_NAME}';
@@ -48,6 +48,7 @@ import {
48
48
  createRequestHandler,
49
49
  } from '@#metaName/runtime/ssr/server';
50
50
  import { RSCServerSlot } from '@#metaName/runtime/rsc/client';
51
+ import { renderRsc } from '@#metaName/runtime/rsc/server';
51
52
  export { handleAction } from '@#metaName/runtime/rsc/server';
52
53
 
53
54
  const handleRequest = async (request, ServerRoot, options) => {
@@ -58,7 +59,7 @@ const handleRequest = async (request, ServerRoot, options) => {
58
59
  </ServerRoot>,
59
60
  {
60
61
  ...options,
61
- rscRoot: <options.RSCRoot />,
62
+ rscRoot: options.rscRoot,
62
63
  },
63
64
  );
64
65
 
@@ -70,7 +71,22 @@ const handleRequest = async (request, ServerRoot, options) => {
70
71
  };
71
72
 
72
73
  export const requestHandler = createRequestHandler(handleRequest, {
73
- enableRsc: true,
74
+ enableRsc: true
75
+ });
76
+
77
+ const handleRSCRequest = async (request, ServerRoot, options) => {
78
+ const { serverPayload } = options;
79
+ const stream = renderRsc({
80
+ element: options.rscRoot,
81
+ clientManifest: options.rscClientManifest!,
82
+ });
83
+
84
+ return new Response(stream);
85
+ }
86
+
87
+
88
+ export const rscPayloadHandler = createRequestHandler(handleRSCRequest, {
89
+ enableRsc: true
74
90
  });
75
91
  `;
76
92
  const serverIndex = (options) => {
@@ -80,24 +96,57 @@ const serverIndex = (options) => {
80
96
  ${genHandlerCode(options)}
81
97
  `;
82
98
  };
83
- const entryForCSRWithRSC = ({ metaName }) => {
99
+ const entryForCSRWithRSC = ({ metaName, entryName }) => {
84
100
  return `
85
- import App from './AppProxy';
86
- import { renderRsc } from '@${metaName}/runtime/rsc/server'
101
+ import '@${metaName}/runtime/registry/${entryName}';
102
+ import {
103
+ createRequestHandler,
104
+ } from '@${metaName}/runtime/ssr/server';
105
+ import { renderRsc, processRSCStream } from '@${metaName}/runtime/rsc/server'
87
106
  export { handleAction } from '@${metaName}/runtime/rsc/server';
88
107
 
108
+ const handleCSRRender = async (request, ServerRoot, options) => {
109
+ const rscPayloadStream = renderRsc({
110
+ element: options.rscRoot,
111
+ clientManifest: options.rscClientManifest!,
112
+ });
113
+ const stream = new ReadableStream({
114
+ start(controller) {
115
+ const encoder = new TextEncoder();
116
+
117
+ controller.enqueue(encoder.encode(options.html));
89
118
 
90
- export const rscRequestHandler = ({
91
- clientManifest
92
- }) => {
119
+ processRSCStream(rscPayloadStream, controller, encoder)
120
+ .catch(err => {
121
+ controller.error(err);
122
+ });
123
+ }
124
+ });
125
+
126
+ return new Response(stream, {
127
+ status: 200,
128
+ headers: new Headers({
129
+ 'content-type': 'text/html; charset=UTF-8',
130
+ }),
131
+ });
132
+ }
133
+
134
+ export const renderRscStreamHandler = createRequestHandler(handleCSRRender, {
135
+ enableRsc: true
136
+ });
137
+
138
+ const handleRequest = async (request, ServerRoot, options) => {
93
139
  const stream = renderRsc({
94
- element: <App/>,
95
- clientManifest,
96
- })
140
+ element: options.rscRoot,
141
+ clientManifest: options.rscClientManifest!,
142
+ });
97
143
 
98
- const response = new Response(stream);
99
- return response
144
+ return new Response(stream);
100
145
  }
146
+
147
+ export const rscPayloadHandler = createRequestHandler(handleRequest, {
148
+ enableRsc: true
149
+ });
101
150
  `;
102
151
  };
103
152
  function genHandlerCode({ mode, metaName, customServerEntry, srcDirectory, internalSrcAlias, enableRsc }) {
@@ -23,17 +23,28 @@ __export(context_exports, {
23
23
  getGlobalApp: () => getGlobalApp,
24
24
  getGlobalAppConfig: () => getGlobalAppConfig,
25
25
  getGlobalAppInit: () => getGlobalAppInit,
26
+ getGlobalEnableRsc: () => getGlobalEnableRsc,
26
27
  getGlobalInternalRuntimeContext: () => getGlobalInternalRuntimeContext,
28
+ getGlobalIsRscClient: () => getGlobalIsRscClient,
27
29
  getGlobalLayoutApp: () => getGlobalLayoutApp,
28
30
  getGlobalRSCRoot: () => getGlobalRSCRoot,
29
31
  getGlobalRoutes: () => getGlobalRoutes,
30
32
  getInitialContext: () => import_runtime.getInitialContext,
33
+ getServerPayload: () => import_serverPayload.getServerPayload,
31
34
  setGlobalContext: () => setGlobalContext,
32
- setGlobalInternalRuntimeContext: () => setGlobalInternalRuntimeContext
35
+ setGlobalInternalRuntimeContext: () => setGlobalInternalRuntimeContext,
36
+ setServerPayload: () => import_serverPayload.setServerPayload
33
37
  });
34
38
  module.exports = __toCommonJS(context_exports);
35
39
  var import_runtime = require("./runtime");
40
+ var import_serverPayload = require("./serverPayload.server");
36
41
  const globalContext = {};
42
+ function getGlobalIsRscClient() {
43
+ return globalContext.isRscClient;
44
+ }
45
+ function getGlobalEnableRsc() {
46
+ return globalContext.enableRsc;
47
+ }
37
48
  function setGlobalContext(context) {
38
49
  globalContext.entryName = context.entryName;
39
50
  globalContext.App = context.App;
@@ -42,6 +53,8 @@ function setGlobalContext(context) {
42
53
  globalContext.appConfig = typeof context.appConfig === "function" ? context.appConfig() : context.appConfig;
43
54
  globalContext.layoutApp = context.layoutApp;
44
55
  globalContext.RSCRoot = context.RSCRoot;
56
+ globalContext.isRscClient = context.isRscClient;
57
+ globalContext.enableRsc = context.enableRsc;
45
58
  }
46
59
  function getCurrentEntryName() {
47
60
  return globalContext.entryName;
@@ -79,11 +92,15 @@ function getGlobalLayoutApp() {
79
92
  getGlobalApp,
80
93
  getGlobalAppConfig,
81
94
  getGlobalAppInit,
95
+ getGlobalEnableRsc,
82
96
  getGlobalInternalRuntimeContext,
97
+ getGlobalIsRscClient,
83
98
  getGlobalLayoutApp,
84
99
  getGlobalRSCRoot,
85
100
  getGlobalRoutes,
86
101
  getInitialContext,
102
+ getServerPayload,
87
103
  setGlobalContext,
88
- setGlobalInternalRuntimeContext
104
+ setGlobalInternalRuntimeContext,
105
+ setServerPayload
89
106
  });
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var serverPayload_server_exports = {};
20
+ __export(serverPayload_server_exports, {
21
+ getServerPayload: () => getServerPayload,
22
+ setServerPayload: () => setServerPayload
23
+ });
24
+ module.exports = __toCommonJS(serverPayload_server_exports);
25
+ var import_node = require("@modern-js/runtime-utils/node");
26
+ const getServerPayload = () => {
27
+ const context = import_node.storage.useContext();
28
+ return context === null || context === void 0 ? void 0 : context.serverPayload;
29
+ };
30
+ const setServerPayload = (payload) => {
31
+ const context = import_node.storage.useContext();
32
+ if (context) {
33
+ context.serverPayload = payload;
34
+ }
35
+ };
36
+ // Annotate the CommonJS export names for ESM import in node:
37
+ 0 && (module.exports = {
38
+ getServerPayload,
39
+ setServerPayload
40
+ });
@@ -21,15 +21,40 @@ __export(requestHandler_exports, {
21
21
  createRequestHandler: () => createRequestHandler
22
22
  });
23
23
  module.exports = __toCommonJS(requestHandler_exports);
24
+ var import_jsx_runtime = require("react/jsx-runtime");
24
25
  var import_node = require("@modern-js/runtime-utils/node");
25
26
  var import_request = require("@modern-js/runtime-utils/universal/request");
27
+ var import_react = require("react");
26
28
  var import_context = require("../context");
27
29
  var import_runtime = require("../context/runtime");
30
+ var import_serverPayload = require("../context/serverPayload.server");
28
31
  var import_loaderManager = require("../loader/loaderManager");
29
- var import_react = require("../react");
32
+ var import_react2 = require("../react");
30
33
  var import_constants = require("./constants");
31
34
  var import_tracer = require("./tracer");
32
35
  var import_utils = require("./utils");
36
+ async function handleRSCRequest(request, Root, context, options, handleRequest) {
37
+ const serverPayload = (0, import_serverPayload.getServerPayload)();
38
+ if (typeof serverPayload !== "undefined") {
39
+ return await handleRequest(request, Root, {
40
+ ...options,
41
+ runtimeContext: context,
42
+ rscRoot: serverPayload
43
+ });
44
+ }
45
+ const App = (0, import_context.getGlobalRSCRoot)();
46
+ if (App) {
47
+ return await handleRequest(request, import_react.Fragment, {
48
+ ...options,
49
+ runtimeContext: context,
50
+ rscRoot: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(App, {})
51
+ });
52
+ }
53
+ return await handleRequest(request, Root, {
54
+ ...options,
55
+ runtimeContext: context
56
+ });
57
+ }
33
58
  function createSSRContext(request, options) {
34
59
  const { config, loaderContext, onError, onTiming, locals, resource, params, responseProxy, logger, metrics, reporter } = options;
35
60
  const { nonce, useJsonScript } = config;
@@ -100,10 +125,11 @@ const createRequestHandler = async (handleRequest, createRequestOptions) => {
100
125
  request,
101
126
  monitors: options.monitors,
102
127
  responseProxy,
103
- activeDeferreds
128
+ activeDeferreds,
129
+ serverPayload: void 0
104
130
  }, async () => {
105
131
  var _context_routerContext, _context_routerContext1, _context_routerContext2;
106
- const Root = (0, import_react.createRoot)();
132
+ const Root = (0, import_react2.createRoot)();
107
133
  const internalRuntimeContext = (0, import_context.getGlobalInternalRuntimeContext)();
108
134
  const hooks = internalRuntimeContext.hooks;
109
135
  const { routeManifest } = options.resource;
@@ -158,15 +184,25 @@ const createRequestHandler = async (handleRequest, createRequestOptions) => {
158
184
  context.initialData = initialData;
159
185
  const redirectResponse = getRedirectResponse(initialData);
160
186
  if (redirectResponse) {
161
- return redirectResponse;
187
+ if (createRequestOptions === null || createRequestOptions === void 0 ? void 0 : createRequestOptions.enableRsc) {
188
+ return initialData;
189
+ } else {
190
+ return redirectResponse;
191
+ }
192
+ }
193
+ if (!(createRequestOptions === null || createRequestOptions === void 0 ? void 0 : createRequestOptions.enableRsc)) {
194
+ const { htmlTemplate } = options.resource;
195
+ options.resource.htmlTemplate = htmlTemplate.replace("</head>", `${import_constants.CHUNK_CSS_PLACEHOLDER}</head>`);
196
+ }
197
+ let response;
198
+ if (createRequestOptions === null || createRequestOptions === void 0 ? void 0 : createRequestOptions.enableRsc) {
199
+ response = await handleRSCRequest(request, Root, context, options, handleRequest);
200
+ } else {
201
+ response = await handleRequest(request, Root, {
202
+ ...options,
203
+ runtimeContext: context
204
+ });
162
205
  }
163
- const { htmlTemplate } = options.resource;
164
- options.resource.htmlTemplate = htmlTemplate.replace("</head>", `${import_constants.CHUNK_CSS_PLACEHOLDER}</head>`);
165
- const response = await handleRequest(request, Root, {
166
- ...options,
167
- runtimeContext: context,
168
- RSCRoot: (createRequestOptions === null || createRequestOptions === void 0 ? void 0 : createRequestOptions.enableRsc) && (0, import_context.getGlobalRSCRoot)()
169
- });
170
206
  Object.entries(responseProxy.headers).forEach(([key, value]) => {
171
207
  response.headers.set(key, value);
172
208
  });
@@ -29,7 +29,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
29
29
  var code_exports = {};
30
30
  __export(code_exports, {
31
31
  generateCode: () => generateCode,
32
- generatorRegisterCode: () => generatorRegisterCode
32
+ generatorRegisterCode: () => generatorRegisterCode,
33
+ generatorServerRegisterCode: () => generatorServerRegisterCode
33
34
  });
34
35
  module.exports = __toCommonJS(code_exports);
35
36
  var import_path = __toESM(require("path"));
@@ -107,14 +108,15 @@ const generateCode = async (appContext, config, entrypoints, api, isRouterV5) =>
107
108
  code: await templates.fileSystemRoutes({
108
109
  metaName,
109
110
  routes,
110
- ssrMode: useSSG ? "string" : mode,
111
+ ssrMode: useSSG ? "string" : (0, import_utils.isUseRsc)(config2) ? "stream" : mode,
111
112
  nestedRoutesEntry: entrypoint.nestedRoutesEntry,
112
113
  entryName: entrypoint.entryName,
113
114
  internalDirectory,
114
- splitRouteChunks: config2 === null || config2 === void 0 ? void 0 : (_config_output = config2.output) === null || _config_output === void 0 ? void 0 : _config_output.splitRouteChunks
115
+ splitRouteChunks: config2 === null || config2 === void 0 ? void 0 : (_config_output = config2.output) === null || _config_output === void 0 ? void 0 : _config_output.splitRouteChunks,
116
+ isRscClient: (0, import_utils.isUseRsc)(config2)
115
117
  })
116
118
  });
117
- if (entrypoint.nestedRoutesEntry && (0, import_utils.isUseSSRBundle)(config2)) {
119
+ if (entrypoint.nestedRoutesEntry && ((0, import_utils.isUseSSRBundle)(config2) || (0, import_utils.isUseRsc)(config2))) {
118
120
  var _config_output1;
119
121
  const routesServerFile = (0, import_utils3.getServerLoadersFile)(internalDirectory, entryName);
120
122
  const filtedRoutesForServer = (0, import_utils2.filterRoutesForServer)(routes);
@@ -131,7 +133,8 @@ const generateCode = async (appContext, config, entrypoints, api, isRouterV5) =>
131
133
  nestedRoutesEntry: entrypoint.nestedRoutesEntry,
132
134
  entryName: entrypoint.entryName,
133
135
  internalDirectory,
134
- splitRouteChunks: config2 === null || config2 === void 0 ? void 0 : (_config_output1 = config2.output) === null || _config_output1 === void 0 ? void 0 : _config_output1.splitRouteChunks
136
+ splitRouteChunks: config2 === null || config2 === void 0 ? void 0 : (_config_output1 = config2.output) === null || _config_output1 === void 0 ? void 0 : _config_output1.splitRouteChunks,
137
+ isRscClient: false
135
138
  });
136
139
  await import_utils.fs.outputFile(import_path.default.resolve(internalDirectory, `./${entryName}/routes.server.js`), serverRoutesCode, "utf8");
137
140
  }
@@ -148,8 +151,12 @@ const generateCode = async (appContext, config, entrypoints, api, isRouterV5) =>
148
151
  function generatorRegisterCode(internalDirectory, entryName, code) {
149
152
  import_utils.fs.outputFileSync(import_path.default.resolve(internalDirectory, `./${entryName}/${import_constants.ENTRY_POINT_RUNTIME_GLOBAL_CONTEXT_FILE_NAME}.js`), code, "utf8");
150
153
  }
154
+ function generatorServerRegisterCode(internalDirectory, entryName, code) {
155
+ import_utils.fs.outputFileSync(import_path.default.resolve(internalDirectory, `./${entryName}/${import_constants.ENTRY_POINT_RUNTIME_GLOBAL_CONTEXT_FILE_NAME}.server.js`), code, "utf8");
156
+ }
151
157
  // Annotate the CommonJS export names for ESM import in node:
152
158
  0 && (module.exports = {
153
159
  generateCode,
154
- generatorRegisterCode
160
+ generatorRegisterCode,
161
+ generatorServerRegisterCode
155
162
  });
@@ -121,7 +121,7 @@ const routesForServer = ({ routesForServerLoaderMatches }) => {
121
121
  };
122
122
  const createMatchReg = (keyword) => new RegExp(`("${keyword}":\\s)"([^
123
123
  ]+)"`, "g");
124
- const fileSystemRoutes = async ({ metaName, routes, ssrMode, nestedRoutesEntry, entryName, internalDirectory, splitRouteChunks = true }) => {
124
+ const fileSystemRoutes = async ({ metaName, routes, ssrMode, nestedRoutesEntry, entryName, internalDirectory, splitRouteChunks = true, isRscClient = false }) => {
125
125
  const components = [];
126
126
  const loadings = [];
127
127
  const errors = [];
@@ -147,14 +147,14 @@ const fileSystemRoutes = async ({ metaName, routes, ssrMode, nestedRoutesEntry,
147
147
  return "";
148
148
  };
149
149
  const createLazyImport = ({ componentPath, routeId, webpackChunkName, eager }) => {
150
- const importOptions = webpackChunkName ? `/* webpackChunkName: "${routeId}" */ ` : eager ? `/* webpackMode: "eager" */ ` : "";
150
+ const importOptions = webpackChunkName ? `/* webpackChunkName: "${routeId}" */ ` : eager ? `/* webpackMode: "eager" */ ` : "";
151
151
  return `() => import(${importOptions}'${componentPath}').then(routeModule => handleRouteModule(routeModule, "${routeId}")).catch(handleRouteModuleError)`;
152
152
  };
153
- const traverseRouteTree = (route) => {
153
+ const traverseRouteTree = (route, isRscClient2) => {
154
154
  let children;
155
155
  if ("children" in route && route.children) {
156
156
  var _route_children;
157
- children = route === null || route === void 0 ? void 0 : (_route_children = route.children) === null || _route_children === void 0 ? void 0 : _route_children.map(traverseRouteTree);
157
+ children = route === null || route === void 0 ? void 0 : (_route_children = route.children) === null || _route_children === void 0 ? void 0 : _route_children.map((child) => traverseRouteTree(child, isRscClient2));
158
158
  }
159
159
  let loading;
160
160
  let error;
@@ -237,7 +237,6 @@ const fileSystemRoutes = async ({ metaName, routes, ssrMode, nestedRoutesEntry,
237
237
  }
238
238
  const finalRoute = {
239
239
  ...route,
240
- lazyImport,
241
240
  loading,
242
241
  loader,
243
242
  action,
@@ -245,7 +244,10 @@ const fileSystemRoutes = async ({ metaName, routes, ssrMode, nestedRoutesEntry,
245
244
  error,
246
245
  children
247
246
  };
248
- if (route._component) {
247
+ if (!isRscClient2) {
248
+ finalRoute.lazyImport = lazyImport;
249
+ }
250
+ if (route._component && !isRscClient2) {
249
251
  finalRoute.component = component;
250
252
  }
251
253
  if (route.type === "nested" && route._component && (route.loader || route.data)) {
@@ -258,7 +260,7 @@ const fileSystemRoutes = async ({ metaName, routes, ssrMode, nestedRoutesEntry,
258
260
  `;
259
261
  for (const route of routes) {
260
262
  if ("type" in route) {
261
- const newRoute = traverseRouteTree(route);
263
+ const newRoute = traverseRouteTree(route, isRscClient);
262
264
  const routeStr = JSON.stringify(newRoute, null, 2);
263
265
  const keywords = [
264
266
  "component",
@@ -357,9 +359,9 @@ const fileSystemRoutes = async ({ metaName, routes, ssrMode, nestedRoutesEntry,
357
359
  `;
358
360
  return `
359
361
  ${importLazyCode}
360
- ${importComponentsCode}
362
+ ${!isRscClient ? importComponentsCode : ""}
361
363
  ${importRuntimeRouterCode}
362
- ${rootLayoutCode}
364
+ ${!isRscClient ? rootLayoutCode : ""}
363
365
  ${importLoadingCode}
364
366
  ${importErrorComponentsCode}
365
367
  ${importLoadersCode}
@@ -398,7 +400,7 @@ function ssrLoaderCombinedModule(entrypoints, entrypoint, config, appContext) {
398
400
  }
399
401
  return null;
400
402
  }
401
- const runtimeGlobalContext = async ({ entryName, metaName, srcDirectory, nestedRoutesEntry, internalSrcAlias, globalApp }) => {
403
+ const runtimeGlobalContext = async ({ entryName, metaName, srcDirectory, nestedRoutesEntry, internalSrcAlias, globalApp, rscType = false }) => {
402
404
  const imports = [
403
405
  `import { setGlobalContext } from '@${metaName}/runtime/context';`
404
406
  ];
@@ -443,18 +445,40 @@ const runtimeGlobalContext = async ({ entryName, metaName, srcDirectory, nestedR
443
445
  } else {
444
446
  imports.push(`let layoutApp;`);
445
447
  }
446
- return `${imports.join("\n")}
448
+ const isClient = rscType === "client";
449
+ const enableRsc = Boolean(rscType);
450
+ if (isClient) {
451
+ return `${imports.join("\n")}
452
+
453
+ import { routes } from './routes';
454
+
455
+ const entryName = '${entryName}';
456
+ setGlobalContext({
457
+ entryName,
458
+ layoutApp,
459
+ routes,
460
+ appInit,
461
+ appConfig,
462
+ isRscClient: true,
463
+ enableRsc: true,
464
+ });
465
+ `;
466
+ } else {
467
+ return `${imports.join("\n")}
447
468
 
448
- import { routes } from './routes';
469
+ import { routes } from './routes';
449
470
 
450
- const entryName = '${entryName}';
451
- setGlobalContext({
452
- entryName,
453
- layoutApp,
454
- routes,
455
- appInit,
456
- appConfig,
457
- });`;
471
+ const entryName = '${entryName}';
472
+ setGlobalContext({
473
+ entryName,
474
+ layoutApp,
475
+ routes,
476
+ appInit,
477
+ appConfig,
478
+ enableRsc: ${enableRsc},
479
+ });
480
+ `;
481
+ }
458
482
  };
459
483
  // Annotate the CommonJS export names for ESM import in node:
460
484
  0 && (module.exports = {