@modern-js/runtime 2.64.1 → 2.64.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 (62) hide show
  1. package/dist/cjs/cli/code.js +67 -28
  2. package/dist/cjs/cli/constants.js +1 -1
  3. package/dist/cjs/cli/ssr/index.js +4 -1
  4. package/dist/cjs/cli/template.js +91 -4
  5. package/dist/cjs/cli/template.server.js +65 -3
  6. package/dist/cjs/core/context/index.js +6 -0
  7. package/dist/cjs/core/server/requestHandler.js +11 -5
  8. package/dist/cjs/core/server/stream/afterTemplate.js +2 -0
  9. package/dist/cjs/core/server/stream/createReadableStream.worker.js +8 -4
  10. package/dist/cjs/core/server/stream/index.js +12 -2
  11. package/dist/cjs/core/server/stream/shared.js +19 -6
  12. package/dist/cjs/core/server/string/index.js +4 -4
  13. package/dist/cjs/core/server/string/prefetch.js +3 -3
  14. package/dist/cjs/core/server/tracer.js +3 -18
  15. package/dist/cjs/router/cli/code/index.js +1 -1
  16. package/dist/cjs/rsc/client.js +22 -0
  17. package/dist/cjs/rsc/server.js +22 -0
  18. package/dist/esm/cli/code.js +178 -51
  19. package/dist/esm/cli/constants.js +1 -1
  20. package/dist/esm/cli/ssr/index.js +4 -1
  21. package/dist/esm/cli/template.js +29 -4
  22. package/dist/esm/cli/template.server.js +11 -3
  23. package/dist/esm/core/context/index.js +5 -0
  24. package/dist/esm/core/server/requestHandler.js +12 -6
  25. package/dist/esm/core/server/stream/afterTemplate.js +5 -0
  26. package/dist/esm/core/server/stream/createReadableStream.worker.js +9 -5
  27. package/dist/esm/core/server/stream/index.js +5 -1
  28. package/dist/esm/core/server/stream/shared.js +76 -54
  29. package/dist/esm/core/server/string/index.js +5 -5
  30. package/dist/esm/core/server/string/prefetch.js +3 -3
  31. package/dist/esm/core/server/tracer.js +2 -16
  32. package/dist/esm/router/cli/code/index.js +1 -1
  33. package/dist/esm/rsc/client.js +1 -0
  34. package/dist/esm/rsc/server.js +1 -0
  35. package/dist/esm-node/cli/code.js +67 -28
  36. package/dist/esm-node/cli/constants.js +1 -1
  37. package/dist/esm-node/cli/ssr/index.js +4 -1
  38. package/dist/esm-node/cli/template.js +87 -4
  39. package/dist/esm-node/cli/template.server.js +64 -3
  40. package/dist/esm-node/core/context/index.js +5 -0
  41. package/dist/esm-node/core/server/requestHandler.js +12 -6
  42. package/dist/esm-node/core/server/stream/afterTemplate.js +2 -0
  43. package/dist/esm-node/core/server/stream/createReadableStream.worker.js +8 -4
  44. package/dist/esm-node/core/server/stream/index.js +1 -1
  45. package/dist/esm-node/core/server/stream/shared.js +20 -7
  46. package/dist/esm-node/core/server/string/index.js +5 -5
  47. package/dist/esm-node/core/server/string/prefetch.js +3 -3
  48. package/dist/esm-node/core/server/tracer.js +2 -15
  49. package/dist/esm-node/router/cli/code/index.js +1 -1
  50. package/dist/esm-node/rsc/client.js +1 -0
  51. package/dist/esm-node/rsc/server.js +1 -0
  52. package/dist/types/cli/constants.d.ts +1 -1
  53. package/dist/types/cli/template.d.ts +20 -1
  54. package/dist/types/cli/template.server.d.ts +4 -0
  55. package/dist/types/core/context/index.d.ts +5 -0
  56. package/dist/types/core/server/requestHandler.d.ts +3 -1
  57. package/dist/types/core/server/stream/shared.d.ts +8 -2
  58. package/dist/types/core/server/tracer.d.ts +3 -5
  59. package/dist/types/core/types.d.ts +3 -2
  60. package/dist/types/rsc/client.d.ts +1 -0
  61. package/dist/types/rsc/server.d.ts +1 -0
  62. package/package.json +28 -11
@@ -56,7 +56,7 @@ const prefetch = async (App, request, options, ssrConfig, { onError, onTiming })
56
56
  onTiming(import_tracer.SSRTimings.PRERENDER, cost);
57
57
  } catch (e) {
58
58
  const error = e;
59
- onError(import_tracer.SSRErrors.PRERENDER, error);
59
+ onError(error, import_tracer.SSRErrors.PRERENDER);
60
60
  throw e;
61
61
  }
62
62
  }
@@ -73,13 +73,13 @@ const prefetch = async (App, request, options, ssrConfig, { onError, onTiming })
73
73
  const cost = end();
74
74
  onTiming(import_tracer.SSRTimings.USE_LOADER, cost);
75
75
  } catch (e) {
76
- onError(import_tracer.SSRErrors.USE_LOADER, e);
76
+ onError(e, import_tracer.SSRErrors.USE_LOADER);
77
77
  throw e;
78
78
  }
79
79
  Object.keys(loadersData).forEach((id) => {
80
80
  const data = loadersData[id];
81
81
  if (data._error) {
82
- onError(import_tracer.SSRErrors.USE_LOADER, data._error);
82
+ onError(data._error, import_tracer.SSRErrors.USE_LOADER);
83
83
  delete data._error;
84
84
  }
85
85
  });
@@ -19,9 +19,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  var tracer_exports = {};
20
20
  __export(tracer_exports, {
21
21
  SSRErrors: () => SSRErrors,
22
- SSRTimings: () => SSRTimings,
23
- createOnError: () => createOnError,
24
- createOnTiming: () => createOnTiming
22
+ SSRTimings: () => SSRTimings
25
23
  });
26
24
  module.exports = __toCommonJS(tracer_exports);
27
25
  var SSRTimings;
@@ -38,23 +36,10 @@ var SSRErrors;
38
36
  SSRErrors2["RENDER_HTML"] = "App Render To HTML";
39
37
  SSRErrors2["RENDER_STREAM"] = "An error occurs during streaming SSR";
40
38
  SSRErrors2["RENDER_SHELL"] = "An error occurs during streaming render shell";
39
+ SSRErrors2["LOADER_ERROR"] = "App error occurs during data loader";
41
40
  })(SSRErrors || (SSRErrors = {}));
42
- function createOnError(onError) {
43
- return (key, e) => {
44
- const error = e instanceof Error ? e : new Error("Unexpected Server Error");
45
- error.name = key;
46
- onError === null || onError === void 0 ? void 0 : onError(e);
47
- };
48
- }
49
- function createOnTiming(onTiming) {
50
- return (key, cost) => {
51
- onTiming === null || onTiming === void 0 ? void 0 : onTiming(key, cost);
52
- };
53
- }
54
41
  // Annotate the CommonJS export names for ESM import in node:
55
42
  0 && (module.exports = {
56
43
  SSRErrors,
57
- SSRTimings,
58
- createOnError,
59
- createOnTiming
44
+ SSRTimings
60
45
  });
@@ -147,7 +147,7 @@ const generateCode = async (appContext, config, entrypoints, api) => {
147
147
  }
148
148
  };
149
149
  function generatorRegisterCode(internalDirectory, entryName, code) {
150
- import_utils.fs.outputFileSync(import_path.default.resolve(internalDirectory, `./${entryName}/${import_constants.ENTRY_POINT_RUNTIME_GLOBAL_CONTEXT_FILE_NAME}`), code, "utf8");
150
+ import_utils.fs.outputFileSync(import_path.default.resolve(internalDirectory, `./${entryName}/${import_constants.ENTRY_POINT_RUNTIME_GLOBAL_CONTEXT_FILE_NAME}.js`), code, "utf8");
151
151
  }
152
152
  // Annotate the CommonJS export names for ESM import in node:
153
153
  0 && (module.exports = {
@@ -0,0 +1,22 @@
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 __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
15
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
16
+ var client_exports = {};
17
+ module.exports = __toCommonJS(client_exports);
18
+ __reExport(client_exports, require("@modern-js/render/client"), module.exports);
19
+ // Annotate the CommonJS export names for ESM import in node:
20
+ 0 && (module.exports = {
21
+ ...require("@modern-js/render/client")
22
+ });
@@ -0,0 +1,22 @@
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 __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
15
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
16
+ var server_exports = {};
17
+ module.exports = __toCommonJS(server_exports);
18
+ __reExport(server_exports, require("@modern-js/render/rsc"), module.exports);
19
+ // Annotate the CommonJS export names for ESM import in node:
20
+ 0 && (module.exports = {
21
+ ...require("@modern-js/render/rsc")
22
+ });
@@ -23,18 +23,18 @@ function getSSRMode(entry, config) {
23
23
  }
24
24
  var generateCode = function() {
25
25
  var _ref = _async_to_generator(function(entrypoints, appContext, config, hooks) {
26
- var mountId, enableAsyncEntry, runtimeConfigFile, internalDirectory, internalSrcAlias, metaName, srcDirectory;
26
+ var mountId, enableAsyncEntry, runtimeConfigFile, internalDirectory, internalSrcAlias, metaName, srcDirectory, serverRoutes;
27
27
  return _ts_generator(this, function(_state) {
28
28
  switch (_state.label) {
29
29
  case 0:
30
30
  mountId = config.html.mountId;
31
31
  enableAsyncEntry = config.source.enableAsyncEntry;
32
- runtimeConfigFile = appContext.runtimeConfigFile, internalDirectory = appContext.internalDirectory, internalSrcAlias = appContext.internalSrcAlias, metaName = appContext.metaName, srcDirectory = appContext.srcDirectory;
32
+ runtimeConfigFile = appContext.runtimeConfigFile, internalDirectory = appContext.internalDirectory, internalSrcAlias = appContext.internalSrcAlias, metaName = appContext.metaName, srcDirectory = appContext.srcDirectory, serverRoutes = appContext.serverRoutes;
33
33
  return [
34
34
  4,
35
35
  Promise.all(entrypoints.map(function() {
36
36
  var _ref2 = _async_to_generator(function(entrypoint) {
37
- var entryName, isAutoMount, entry, customEntry, customBootstrap, customServerEntry, _ref3, runtimePlugins, indexCode, indexFile, ssrMode, bootstrapFile, bootstrapServerFile, indexServerCode, indexServerFile, registerCode, registerFile, registerRuntimeCode, registerRuntimeFile, contextCode, contextFile;
37
+ var entryName, isAutoMount, entry, customEntry, customBootstrap, customServerEntry, _ref3, runtimePlugins, ssrMode, indexCode, _serverRoutes_find, indexFile, bootstrapFile, bootstrapServerFile, indexServerCode, indexServerFile, indexServerFile1, indexServerCode1, registerCode, registerFile, registerRuntimeCode, registerRuntimeFile, contextCode, AppProxyPath, appProxyCode, contextServerCode, contextFile, contextFile1;
38
38
  return _ts_generator(this, function(_state2) {
39
39
  switch (_state2.label) {
40
40
  case 0:
@@ -48,7 +48,24 @@ var generateCode = function() {
48
48
  ];
49
49
  case 1:
50
50
  _ref3 = _state2.sent(), runtimePlugins = _ref3.plugins;
51
- if (isAutoMount) {
51
+ if (!isAutoMount)
52
+ return [
53
+ 3,
54
+ 17
55
+ ];
56
+ ssrMode = getSSRMode(entryName, config);
57
+ indexCode = "";
58
+ if (!ssrMode && config.server.rsc) {
59
+ ;
60
+ indexCode = template.entryForCSRWithRSC({
61
+ metaName,
62
+ entryName,
63
+ mountId,
64
+ urlPath: (_serverRoutes_find = serverRoutes.find(function(route) {
65
+ return route.entryName === entryName;
66
+ })) === null || _serverRoutes_find === void 0 ? void 0 : _serverRoutes_find.urlPath
67
+ });
68
+ } else {
52
69
  indexCode = template.index({
53
70
  srcDirectory,
54
71
  internalSrcAlias,
@@ -57,55 +74,165 @@ var generateCode = function() {
57
74
  entryName,
58
75
  customEntry,
59
76
  customBootstrap,
60
- mountId
61
- });
62
- indexFile = path.resolve(internalDirectory, "./".concat(entryName, "/").concat(ENTRY_POINT_FILE_NAME));
63
- fs.outputFileSync(indexFile, indexCode, "utf8");
64
- ssrMode = getSSRMode(entryName, config);
65
- if (enableAsyncEntry) {
66
- bootstrapFile = path.resolve(internalDirectory, "./".concat(entryName, "/").concat(ENTRY_BOOTSTRAP_FILE_NAME));
67
- fs.outputFileSync(bootstrapFile, 'import(/* webpackChunkName: "async-'.concat(entryName, `" */ './`).concat(INDEX_FILE_NAME, "');"), "utf8");
68
- bootstrapServerFile = path.resolve(internalDirectory, "./".concat(entryName, "/").concat(ENTRY_SERVER_BOOTSTRAP_FILE_NAME));
69
- if (ssrMode) {
70
- fs.outputFileSync(bootstrapServerFile, "export const requestHandler = import('./".concat(SERVER_ENTRY_POINT_FILE_NAME, "').then((m) => m.requestHandler)"), "utf8");
71
- }
72
- }
73
- if (ssrMode) {
74
- indexServerCode = serverTemplate.serverIndex({
75
- entry,
76
- entryName,
77
- internalSrcAlias,
78
- metaName,
79
- mode: ssrMode,
80
- customServerEntry,
81
- srcDirectory
82
- });
83
- indexServerFile = path.resolve(internalDirectory, "./".concat(entryName, "/").concat(SERVER_ENTRY_POINT_FILE_NAME));
84
- fs.outputFileSync(indexServerFile, indexServerCode, "utf8");
85
- }
86
- registerCode = template.register();
87
- registerFile = path.resolve(internalDirectory, "./".concat(entryName, "/").concat(ENTRY_POINT_REGISTER_FILE_NAME));
88
- fs.outputFileSync(registerFile, registerCode, "utf8");
89
- registerRuntimeCode = template.runtimeRegister({
90
- entryName,
91
- srcDirectory,
92
- internalSrcAlias,
93
- metaName,
94
- runtimeConfigFile,
95
- runtimePlugins
96
- });
97
- registerRuntimeFile = path.resolve(internalDirectory, "./".concat(entryName, "/").concat(ENTRY_POINT_RUNTIME_REGISTER_FILE_NAME));
98
- fs.outputFileSync(registerRuntimeFile, registerRuntimeCode, "utf8");
99
- contextCode = template.runtimeGlobalContext({
100
- srcDirectory,
101
- internalSrcAlias,
102
- metaName,
103
- entry,
104
- customEntry
77
+ mountId,
78
+ enableRsc: config.server.rsc
105
79
  });
106
- contextFile = path.resolve(internalDirectory, "./".concat(entryName, "/").concat(ENTRY_POINT_RUNTIME_GLOBAL_CONTEXT_FILE_NAME));
107
- fs.outputFileSync(contextFile, contextCode, "utf8");
108
80
  }
81
+ indexFile = path.resolve(internalDirectory, "./".concat(entryName, "/").concat(ENTRY_POINT_FILE_NAME));
82
+ return [
83
+ 4,
84
+ fs.outputFile(indexFile, indexCode, "utf8")
85
+ ];
86
+ case 2:
87
+ _state2.sent();
88
+ if (!enableAsyncEntry)
89
+ return [
90
+ 3,
91
+ 5
92
+ ];
93
+ bootstrapFile = path.resolve(internalDirectory, "./".concat(entryName, "/").concat(ENTRY_BOOTSTRAP_FILE_NAME));
94
+ return [
95
+ 4,
96
+ fs.outputFile(bootstrapFile, 'import(/* webpackChunkName: "async-'.concat(entryName, `" */ './`).concat(INDEX_FILE_NAME, "');"), "utf8")
97
+ ];
98
+ case 3:
99
+ _state2.sent();
100
+ bootstrapServerFile = path.resolve(internalDirectory, "./".concat(entryName, "/").concat(ENTRY_SERVER_BOOTSTRAP_FILE_NAME));
101
+ if (!ssrMode)
102
+ return [
103
+ 3,
104
+ 5
105
+ ];
106
+ return [
107
+ 4,
108
+ fs.outputFile(bootstrapServerFile, "export const requestHandler = import('./".concat(SERVER_ENTRY_POINT_FILE_NAME, "').then((m) => m.requestHandler)"), "utf8")
109
+ ];
110
+ case 4:
111
+ _state2.sent();
112
+ _state2.label = 5;
113
+ case 5:
114
+ if (!ssrMode)
115
+ return [
116
+ 3,
117
+ 7
118
+ ];
119
+ indexServerCode = serverTemplate.serverIndex({
120
+ entry,
121
+ entryName,
122
+ internalSrcAlias,
123
+ metaName,
124
+ mode: ssrMode,
125
+ customServerEntry,
126
+ srcDirectory,
127
+ enableRsc: config.server.rsc
128
+ });
129
+ indexServerFile = path.resolve(internalDirectory, "./".concat(entryName, "/").concat(SERVER_ENTRY_POINT_FILE_NAME));
130
+ return [
131
+ 4,
132
+ fs.outputFile(indexServerFile, indexServerCode, "utf8")
133
+ ];
134
+ case 6:
135
+ _state2.sent();
136
+ return [
137
+ 3,
138
+ 9
139
+ ];
140
+ case 7:
141
+ if (!config.server.rsc)
142
+ return [
143
+ 3,
144
+ 9
145
+ ];
146
+ indexServerFile1 = path.resolve(internalDirectory, "./".concat(entryName, "/").concat(SERVER_ENTRY_POINT_FILE_NAME));
147
+ indexServerCode1 = serverTemplate.entryForCSRWithRSC({
148
+ metaName
149
+ });
150
+ return [
151
+ 4,
152
+ fs.outputFile(indexServerFile1, indexServerCode1, "utf8")
153
+ ];
154
+ case 8:
155
+ _state2.sent();
156
+ _state2.label = 9;
157
+ case 9:
158
+ registerCode = template.register();
159
+ registerFile = path.resolve(internalDirectory, "./".concat(entryName, "/").concat(ENTRY_POINT_REGISTER_FILE_NAME));
160
+ return [
161
+ 4,
162
+ fs.outputFile(registerFile, registerCode, "utf8")
163
+ ];
164
+ case 10:
165
+ _state2.sent();
166
+ registerRuntimeCode = template.runtimeRegister({
167
+ entryName,
168
+ srcDirectory,
169
+ internalSrcAlias,
170
+ metaName,
171
+ runtimeConfigFile,
172
+ runtimePlugins
173
+ });
174
+ registerRuntimeFile = path.resolve(internalDirectory, "./".concat(entryName, "/").concat(ENTRY_POINT_RUNTIME_REGISTER_FILE_NAME));
175
+ return [
176
+ 4,
177
+ fs.outputFile(registerRuntimeFile, registerRuntimeCode, "utf8")
178
+ ];
179
+ case 11:
180
+ _state2.sent();
181
+ contextCode = "";
182
+ if (!!config.server.rsc)
183
+ return [
184
+ 3,
185
+ 12
186
+ ];
187
+ contextCode = template.runtimeGlobalContext({
188
+ srcDirectory,
189
+ internalSrcAlias,
190
+ metaName,
191
+ entry,
192
+ customEntry
193
+ });
194
+ return [
195
+ 3,
196
+ 15
197
+ ];
198
+ case 12:
199
+ AppProxyPath = path.join(internalDirectory, entryName, "./AppProxy.jsx");
200
+ appProxyCode = template.AppProxyForRSC({
201
+ srcDirectory,
202
+ internalSrcAlias,
203
+ entry,
204
+ customEntry
205
+ });
206
+ return [
207
+ 4,
208
+ fs.outputFile(AppProxyPath, appProxyCode)
209
+ ];
210
+ case 13:
211
+ _state2.sent();
212
+ contextCode = template.runtimeGlobalContextForRSCClient({
213
+ metaName
214
+ });
215
+ contextServerCode = template.runtimeGlobalContextForRSCServer({
216
+ metaName
217
+ });
218
+ contextFile = path.resolve(internalDirectory, "./".concat(entryName, "/").concat(ENTRY_POINT_RUNTIME_GLOBAL_CONTEXT_FILE_NAME, ".server.js"));
219
+ return [
220
+ 4,
221
+ fs.outputFile(contextFile, contextServerCode, "utf8")
222
+ ];
223
+ case 14:
224
+ _state2.sent();
225
+ _state2.label = 15;
226
+ case 15:
227
+ contextFile1 = path.resolve(internalDirectory, "./".concat(entryName, "/").concat(ENTRY_POINT_RUNTIME_GLOBAL_CONTEXT_FILE_NAME, ".js"));
228
+ return [
229
+ 4,
230
+ fs.outputFile(contextFile1, contextCode, "utf8")
231
+ ];
232
+ case 16:
233
+ _state2.sent();
234
+ _state2.label = 17;
235
+ case 17:
109
236
  return [
110
237
  2
111
238
  ];
@@ -5,7 +5,7 @@ var INDEX_FILE_NAME = "index";
5
5
  var ENTRY_BOOTSTRAP_FILE_NAME = "bootstrap.jsx";
6
6
  var ENTRY_SERVER_BOOTSTRAP_FILE_NAME = "bootstrap.server.jsx";
7
7
  var ENTRY_POINT_RUNTIME_REGISTER_FILE_NAME = "runtime-register.js";
8
- var ENTRY_POINT_RUNTIME_GLOBAL_CONTEXT_FILE_NAME = "runtime-global-context.js";
8
+ var ENTRY_POINT_RUNTIME_GLOBAL_CONTEXT_FILE_NAME = "runtime-global-context";
9
9
  var ENTRY_POINT_REGISTER_FILE_NAME = "register.js";
10
10
  export {
11
11
  APP_FILE_NAME,
@@ -47,13 +47,16 @@ var ssrBuilderPlugin = function(modernAPI) {
47
47
  setup: function setup(api) {
48
48
  api.modifyEnvironmentConfig(function(config, param) {
49
49
  var name = param.name, mergeEnvironmentConfig = param.mergeEnvironmentConfig;
50
+ var _userConfig_deploy_worker, _userConfig_deploy, _userConfig_server;
50
51
  var isServerEnvironment = config.output.target === "node" || name === "workerSSR";
51
52
  var userConfig = modernAPI.getNormalizedConfig();
53
+ var ssrEnv = ((_userConfig_deploy = userConfig.deploy) === null || _userConfig_deploy === void 0 ? void 0 : (_userConfig_deploy_worker = _userConfig_deploy.worker) === null || _userConfig_deploy_worker === void 0 ? void 0 : _userConfig_deploy_worker.ssr) || ((_userConfig_server = userConfig.server) === null || _userConfig_server === void 0 ? void 0 : _userConfig_server.rsc) ? "edge" : "node";
52
54
  var useLoadablePlugin = isUseSSRBundle(userConfig) && !isServerEnvironment && checkUseStringSSR(userConfig);
53
55
  return mergeEnvironmentConfig(config, {
54
56
  source: {
55
57
  define: {
56
- "process.env.MODERN_TARGET": isServerEnvironment ? JSON.stringify("node") : JSON.stringify("browser")
58
+ "process.env.MODERN_TARGET": isServerEnvironment ? JSON.stringify("node") : JSON.stringify("browser"),
59
+ "process.env.MODERN_SSR_ENV": JSON.stringify(ssrEnv)
57
60
  }
58
61
  },
59
62
  tools: {
@@ -2,14 +2,18 @@ import path from "path";
2
2
  import { JS_EXTENSIONS, findExists, formatImportPath } from "@modern-js/utils";
3
3
  import { ENTRY_POINT_RUNTIME_GLOBAL_CONTEXT_FILE_NAME, ENTRY_POINT_RUNTIME_REGISTER_FILE_NAME } from "./constants";
4
4
  var genRenderCode = function(param) {
5
- var srcDirectory = param.srcDirectory, internalSrcAlias = param.internalSrcAlias, metaName = param.metaName, entry = param.entry, customEntry = param.customEntry, customBootstrap = param.customBootstrap, mountId = param.mountId;
5
+ var srcDirectory = param.srcDirectory, internalSrcAlias = param.internalSrcAlias, metaName = param.metaName, entry = param.entry, customEntry = param.customEntry, customBootstrap = param.customBootstrap, mountId = param.mountId, enableRsc = param.enableRsc;
6
6
  if (customEntry) {
7
7
  return "import '".concat(formatImportPath(entry.replace(srcDirectory, internalSrcAlias)), "'");
8
8
  }
9
- return "import { createRoot } from '@".concat(metaName, "/runtime/react';\nimport { render } from '@").concat(metaName, "/runtime/browser';\n").concat(customBootstrap ? "import customBootstrap from '".concat(formatImportPath(customBootstrap.replace(srcDirectory, internalSrcAlias)), "';") : "", "\n\nconst ModernRoot = createRoot();\n\n").concat(customBootstrap ? "customBootstrap(ModernRoot, () => render(<ModernRoot />, '".concat(mountId || "root", "'));") : "render(<ModernRoot />, '".concat(mountId || "root", "');"));
9
+ return "import { createRoot } from '@".concat(metaName, "/runtime/react';\nimport { render } from '@").concat(metaName, "/runtime/browser';\n\n").concat(enableRsc ? "import { RscClientRoot, createFromReadableStream, rscStream, callServer } from '@".concat(metaName, "/runtime/rsc/client';") : "", "\n\n").concat(enableRsc ? "const data = createFromReadableStream(rscStream, {\n callServer: callServer,\n });" : "", "\n\n").concat(customBootstrap ? "import customBootstrap from '".concat(formatImportPath(customBootstrap.replace(srcDirectory, internalSrcAlias)), "';") : "", "\n\n\n\nconst ModernRoot = createRoot();\n\n").concat(customBootstrap ? "customBootstrap(ModernRoot, () => render(<ModernRoot />, '".concat(mountId || "root", "'));") : enableRsc ? "render(<ModernRoot>\n <RscClientRoot data={data} />\n </ModernRoot>, '".concat(mountId || "root", "');") : "render(<ModernRoot />, '".concat(mountId || "root", "');"));
10
+ };
11
+ var entryForCSRWithRSC = function(param) {
12
+ var metaName = param.metaName, entryName = param.entryName, _param_urlPath = param.urlPath, urlPath = _param_urlPath === void 0 ? "/" : _param_urlPath, _param_mountId = param.mountId, mountId = _param_mountId === void 0 ? "root" : _param_mountId;
13
+ return "\n import '@".concat(metaName, "/runtime/registry/").concat(entryName, "';\n import { render } from '@").concat(metaName, "/runtime/browser';\n import { createRoot } from '@").concat(metaName, "/runtime/react';\n\n import {\n RscClientRoot,\n createFromFetch\n } from '@").concat(metaName, "/runtime/rsc/client';\n\n const content = createFromFetch(\n fetch('").concat(urlPath, "', {\n headers: {\n 'x-rsc-tree': 'true',\n },\n }),\n );\n\n const ModernRoot = createRoot();\n\n render(\n <ModernRoot>\n <RscClientRoot data={content} />\n </ModernRoot>,\n '").concat(mountId, "',\n );\n ");
10
14
  };
11
15
  var index = function(param) {
12
- var srcDirectory = param.srcDirectory, internalSrcAlias = param.internalSrcAlias, metaName = param.metaName, entry = param.entry, entryName = param.entryName, customEntry = param.customEntry, customBootstrap = param.customBootstrap, mountId = param.mountId;
16
+ var srcDirectory = param.srcDirectory, internalSrcAlias = param.internalSrcAlias, metaName = param.metaName, entry = param.entry, entryName = param.entryName, customEntry = param.customEntry, customBootstrap = param.customBootstrap, mountId = param.mountId, enableRsc = param.enableRsc;
13
17
  return "import '@".concat(metaName, "/runtime/registry/").concat(entryName, "';\n").concat(genRenderCode({
14
18
  srcDirectory,
15
19
  internalSrcAlias,
@@ -17,7 +21,8 @@ var index = function(param) {
17
21
  entry,
18
22
  customEntry,
19
23
  customBootstrap,
20
- mountId
24
+ mountId,
25
+ enableRsc
21
26
  }), "\n");
22
27
  };
23
28
  var register = function() {
@@ -46,9 +51,29 @@ var runtimeGlobalContext = function(param) {
46
51
  var srcDirectory = param.srcDirectory, internalSrcAlias = param.internalSrcAlias, metaName = param.metaName, entry = param.entry, customEntry = param.customEntry;
47
52
  return "import { setGlobalContext } from '@".concat(metaName, "/runtime/context'\n\nimport App from '").concat(formatImportPath(customEntry ? entry.replace(/entry\.[tj]sx/, "App").replace(srcDirectory, internalSrcAlias) : entry.replace(srcDirectory, internalSrcAlias).replace(/\.[tj]sx/, "")), "';\n\nsetGlobalContext({\n App,\n});");
48
53
  };
54
+ var runtimeGlobalContextForRSCServer = function(param) {
55
+ var metaName = param.metaName;
56
+ return "\n import { createElement, Fragment } from 'react';\n import { setGlobalContext } from '@".concat(metaName, "/runtime/context';\n import AppProxy from './AppProxy';\n\n const DefaultRoot = ({ children }: { children?: ReactNode }) =>\n createElement(Fragment, null, children);\n\n\n setGlobalContext({\n App: DefaultRoot,\n RSCRoot: AppProxy,\n });");
57
+ };
58
+ var runtimeGlobalContextForRSCClient = function(param) {
59
+ var metaName = param.metaName;
60
+ return "\n import { createElement, Fragment } from 'react';\n import { setGlobalContext } from '@".concat(metaName, "/runtime/context';\n\n const DefaultRoot = ({ children }: { children?: ReactNode }) =>\n createElement(Fragment, null, children);\n\n setGlobalContext({\n App: DefaultRoot\n });");
61
+ };
62
+ var AppProxyForRSC = function(param) {
63
+ var srcDirectory = param.srcDirectory, internalSrcAlias = param.internalSrcAlias, entry = param.entry, customEntry = param.customEntry;
64
+ return "\n import App from '".concat(
65
+ // We need to get the path of App.tsx here, but the entry is `src/entry.tsx`
66
+ formatImportPath(customEntry ? entry.replace(/entry\.[tj]sx/, "App").replace(srcDirectory, internalSrcAlias) : entry.replace(srcDirectory, internalSrcAlias).replace(".tsx", "")),
67
+ "';\n import React from 'react';\n\n export default function Root() {\n return React.createElement(App, null);\n }\n "
68
+ );
69
+ };
49
70
  export {
71
+ AppProxyForRSC,
72
+ entryForCSRWithRSC,
50
73
  index,
51
74
  register,
52
75
  runtimeGlobalContext,
76
+ runtimeGlobalContextForRSCClient,
77
+ runtimeGlobalContextForRSCServer,
53
78
  runtimeRegister
54
79
  };
@@ -1,15 +1,22 @@
1
1
  import { formatImportPath } from "@modern-js/utils";
2
2
  var SERVER_ENTRY = "\nimport {\n #render,\n createRequestHandler,\n} from '@#metaName/runtime/ssr/server';\n\nconst handleRequest = async (request, ServerRoot, options) => {\n\n const body = await #render(request, <ServerRoot />, options);\n\n return new Response(body, {\n headers: {\n 'content-type': 'text/html; charset=utf-8',\n #headers\n },\n })\n};\n\nexport const requestHandler = createRequestHandler(handleRequest);\n";
3
+ var SERVER_ENTRY_RSC = "\nimport {\n renderStreaming,\n createRequestHandler,\n} from '@#metaName/runtime/ssr/server';\nimport { RSCServerSlot } from '@#metaName/runtime/rsc/client';\nexport { handleAction } from '@#metaName/runtime/rsc/server';\n\nconst handleRequest = async (request, ServerRoot, options) => {\n\n const body = await renderStreaming(request,\n <ServerRoot>\n <RSCServerSlot />\n </ServerRoot>,\n {\n ...options,\n rscRoot: <options.RSCRoot />,\n },\n );\n\n return new Response(body, {\n headers: {\n 'content-type': 'text/html; charset=utf-8',\n #headers\n },\n })\n};\n\nexport const requestHandler = createRequestHandler(handleRequest, {\n enableRsc: true,\n});\n";
3
4
  var serverIndex = function(options) {
4
5
  var _options_metaName = options.metaName, metaName = _options_metaName === void 0 ? "modern-js" : _options_metaName, entryName = options.entryName;
5
6
  return "\n import '@".concat(metaName, "/runtime/registry/").concat(entryName, "';\n ").concat(genHandlerCode(options), "\n ");
6
7
  };
8
+ var entryForCSRWithRSC = function(param) {
9
+ var metaName = param.metaName;
10
+ return "\n import App from './AppProxy';\n import { renderRsc } from '@".concat(metaName, "/runtime/rsc/server'\n export { handleAction } from '@").concat(metaName, "/runtime/rsc/server';\n\n\n export const rscRequestHandler = ({\n clientManifest\n }) => {\n const stream = renderRsc({\n element: <App/>,\n clientManifest,\n })\n\n const response = new Response(stream, {\n headers: {\n 'Transfer-Encoding': 'chunked',\n },\n });\n return response\n }\n");
11
+ };
7
12
  function genHandlerCode(param) {
8
- var mode = param.mode, metaName = param.metaName, customServerEntry = param.customServerEntry, srcDirectory = param.srcDirectory, internalSrcAlias = param.internalSrcAlias;
13
+ var mode = param.mode, metaName = param.metaName, customServerEntry = param.customServerEntry, srcDirectory = param.srcDirectory, internalSrcAlias = param.internalSrcAlias, enableRsc = param.enableRsc;
9
14
  if (customServerEntry) {
10
- return "export { default as requestHandler } from '".concat(formatImportPath(customServerEntry.replace(srcDirectory, internalSrcAlias)), "'");
15
+ var realEntryPath = formatImportPath(customServerEntry.replace(srcDirectory, internalSrcAlias));
16
+ return "\n export * from '".concat(realEntryPath, "';\n export { default as requestHandler } from '").concat(realEntryPath, "'");
11
17
  } else {
12
- var serverEntry = transformServerEntry(SERVER_ENTRY, {
18
+ var entrySource = enableRsc ? SERVER_ENTRY_RSC : SERVER_ENTRY;
19
+ var serverEntry = transformServerEntry(entrySource, {
13
20
  metaName: metaName || "modern-js",
14
21
  mode
15
22
  });
@@ -22,5 +29,6 @@ function transformServerEntry(source, options) {
22
29
  return output;
23
30
  }
24
31
  export {
32
+ entryForCSRWithRSC,
25
33
  serverIndex
26
34
  };
@@ -6,6 +6,10 @@ function setGlobalContext(context) {
6
6
  globalContext.appInit = context.appInit;
7
7
  globalContext.appConfig = typeof context.appConfig === "function" ? context.appConfig() : context.appConfig;
8
8
  globalContext.layoutApp = context.layoutApp;
9
+ globalContext.RSCRoot = context.RSCRoot;
10
+ }
11
+ function getGlobalRSCRoot() {
12
+ return globalContext.RSCRoot;
9
13
  }
10
14
  function setGlobalInternalRuntimeContext(context) {
11
15
  globalContext.internalRuntimeContext = context;
@@ -37,6 +41,7 @@ export {
37
41
  getGlobalAppInit,
38
42
  getGlobalInternalRuntimeContext,
39
43
  getGlobalLayoutApp,
44
+ getGlobalRSCRoot,
40
45
  getGlobalRoutes,
41
46
  getInitialContext,
42
47
  setGlobalContext,
@@ -6,11 +6,12 @@ import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
6
6
  import { _ as _type_of } from "@swc/helpers/_/_type_of";
7
7
  import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
8
8
  import { getPathname, parseCookie, parseHeaders, parseQuery } from "@modern-js/runtime-utils/universal/request";
9
- import { getGlobalAppInit, getGlobalInternalRuntimeContext } from "../context";
9
+ import { getGlobalAppInit, getGlobalInternalRuntimeContext, getGlobalRSCRoot } from "../context";
10
10
  import { getInitialContext } from "../context/runtime";
11
11
  import { createLoaderManager } from "../loader/loaderManager";
12
12
  import { createRoot } from "../react";
13
13
  import { CHUNK_CSS_PLACEHOLDER } from "./constants";
14
+ import { SSRErrors } from "./tracer";
14
15
  import { getSSRConfigByEntry, getSSRMode } from "./utils";
15
16
  function createSSRContext(request, options) {
16
17
  var config = options.config, loaderContext = options.loaderContext, onError = options.onError, onTiming = options.onTiming, locals = options.locals, resource = options.resource, params = options.params, responseProxy = options.responseProxy, logger = options.logger, metrics = options.metrics, reporter = options.reporter;
@@ -69,12 +70,12 @@ function createSSRContext(request, options) {
69
70
  };
70
71
  }
71
72
  var createRequestHandler = function() {
72
- var _ref = _async_to_generator(function(handleRequest) {
73
+ var _ref = _async_to_generator(function(handleRequest, createRequestOptions) {
73
74
  var requestHandler;
74
75
  return _ts_generator(this, function(_state) {
75
76
  requestHandler = function() {
76
77
  var _ref2 = _async_to_generator(function(request, options) {
77
- var _context_routerContext, _context_routerContext1, Root, internalRuntimeContext, hooks, routeManifest, context, runBeforeRender, responseProxy, ssrContext, getRedirectResponse, initialData, _context_routerContext2, _context_ssrContext, redirectResponse, htmlTemplate, response;
78
+ var _context_routerContext, _context_routerContext1, _context_routerContext2, Root, internalRuntimeContext, hooks, routeManifest, context, runBeforeRender, responseProxy, ssrContext, getRedirectResponse, initialData, _context_routerContext3, _context_ssrContext, errors, redirectResponse, htmlTemplate, response;
78
79
  return _ts_generator(this, function(_state2) {
79
80
  switch (_state2.label) {
80
81
  case 0:
@@ -154,7 +155,11 @@ var createRequestHandler = function() {
154
155
  initialData = _state2.sent();
155
156
  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) {
156
157
  ;
157
- (_context_ssrContext = context.ssrContext) === null || _context_ssrContext === void 0 ? void 0 : _context_ssrContext.response.status((_context_routerContext2 = context.routerContext) === null || _context_routerContext2 === void 0 ? void 0 : _context_routerContext2.statusCode);
158
+ (_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);
159
+ }
160
+ errors = Object.values(((_context_routerContext2 = context.routerContext) === null || _context_routerContext2 === void 0 ? void 0 : _context_routerContext2.errors) || {});
161
+ if (errors.length > 0) {
162
+ options.onError(errors[0], SSRErrors.LOADER_ERROR);
158
163
  }
159
164
  context.initialData = initialData;
160
165
  redirectResponse = getRedirectResponse(initialData);
@@ -169,7 +174,8 @@ var createRequestHandler = function() {
169
174
  return [
170
175
  4,
171
176
  handleRequest(request, Root, _object_spread_props(_object_spread({}, options), {
172
- runtimeContext: context
177
+ runtimeContext: context,
178
+ RSCRoot: (createRequestOptions === null || createRequestOptions === void 0 ? void 0 : createRequestOptions.enableRsc) && getGlobalRSCRoot()
173
179
  }))
174
180
  ];
175
181
  case 2:
@@ -204,7 +210,7 @@ var createRequestHandler = function() {
204
210
  ];
205
211
  });
206
212
  });
207
- return function createRequestHandler2(handleRequest) {
213
+ return function createRequestHandler2(handleRequest, createRequestOptions) {
208
214
  return _ref.apply(this, arguments);
209
215
  };
210
216
  }();
@@ -31,6 +31,11 @@ function buildShellAfterTemplate(afterAppTemplate, options) {
31
31
  return _ts_generator(this, function(_state) {
32
32
  routeManifest = runtimeContext.routeManifest;
33
33
  routeAssets = routeManifest.routeAssets;
34
+ if (!routeAssets)
35
+ return [
36
+ 2,
37
+ template
38
+ ];
34
39
  asyncEntry = routeAssets["async-".concat(entryName2)];
35
40
  if (asyncEntry) {
36
41
  ;