@modern-js/runtime 2.6.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/cjs/common.js +6 -0
  3. package/dist/cjs/core/{app-config.js → appConfig.js} +3 -3
  4. package/dist/cjs/core/compatible.js +4 -4
  5. package/dist/cjs/core/index.js +6 -6
  6. package/dist/cjs/core/loader/useLoader.js +2 -2
  7. package/dist/cjs/core/types.js +15 -0
  8. package/dist/cjs/router/runtime/DeferredDataScripts.js +165 -0
  9. package/dist/cjs/router/runtime/index.js +116 -3
  10. package/dist/cjs/router/runtime/plugin.js +14 -1
  11. package/dist/cjs/router/runtime/plugin.node.js +12 -52
  12. package/dist/cjs/router/runtime/utils.js +68 -69
  13. package/dist/cjs/{runtime-context.js → runtimeContext.js} +3 -3
  14. package/dist/cjs/ssr/cli/index.js +2 -0
  15. package/dist/cjs/ssr/index.node.js +1 -0
  16. package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.after.js +2 -14
  17. package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.js +22 -7
  18. package/dist/cjs/ssr/serverRender/renderToStream/template.js +2 -1
  19. package/dist/cjs/ssr/serverRender/renderToString/entry.js +19 -8
  20. package/dist/esm/common.js +3 -1
  21. package/dist/esm/core/compatible.js +1 -1
  22. package/dist/esm/core/index.js +2 -2
  23. package/dist/esm/core/loader/useLoader.js +1 -1
  24. package/dist/esm/core/types.js +1 -0
  25. package/dist/esm/router/runtime/DeferredDataScripts.js +166 -0
  26. package/dist/esm/router/runtime/index.js +3 -2
  27. package/dist/esm/router/runtime/plugin.js +11 -3
  28. package/dist/esm/router/runtime/plugin.node.js +11 -68
  29. package/dist/esm/router/runtime/utils.js +138 -81
  30. package/dist/esm/ssr/cli/index.js +2 -0
  31. package/dist/esm/ssr/index.node.js +1 -0
  32. package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.after.js +2 -4
  33. package/dist/esm/ssr/serverRender/renderToStream/renderToPipe.js +19 -8
  34. package/dist/esm/ssr/serverRender/renderToStream/template.js +2 -1
  35. package/dist/esm/ssr/serverRender/renderToString/entry.js +15 -7
  36. package/dist/esm-node/common.js +4 -0
  37. package/dist/esm-node/core/compatible.js +1 -1
  38. package/dist/esm-node/core/index.js +2 -2
  39. package/dist/esm-node/core/loader/useLoader.js +1 -1
  40. package/dist/esm-node/core/types.js +0 -0
  41. package/dist/esm-node/router/runtime/DeferredDataScripts.js +148 -0
  42. package/dist/esm-node/router/runtime/index.js +113 -2
  43. package/dist/esm-node/router/runtime/plugin.js +15 -2
  44. package/dist/esm-node/router/runtime/plugin.node.js +12 -55
  45. package/dist/esm-node/router/runtime/utils.js +59 -69
  46. package/dist/esm-node/ssr/cli/index.js +2 -0
  47. package/dist/esm-node/ssr/index.node.js +1 -0
  48. package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.after.js +2 -4
  49. package/dist/esm-node/ssr/serverRender/renderToStream/renderToPipe.js +22 -7
  50. package/dist/esm-node/ssr/serverRender/renderToStream/template.js +2 -1
  51. package/dist/esm-node/ssr/serverRender/renderToString/entry.js +19 -8
  52. package/dist/types/common.d.ts +3 -1
  53. package/dist/types/core/compatible.d.ts +1 -1
  54. package/dist/types/core/index.d.ts +4 -3
  55. package/dist/types/core/loader/index.d.ts +1 -2
  56. package/dist/types/core/loader/useLoader.d.ts +1 -15
  57. package/dist/types/core/plugin.d.ts +15 -15
  58. package/dist/types/core/types.d.ts +22 -0
  59. package/dist/types/index.d.ts +1 -1
  60. package/dist/types/router/runtime/DeferredDataScripts.d.ts +8 -0
  61. package/dist/types/router/runtime/index.d.ts +4 -2
  62. package/dist/types/router/runtime/utils.d.ts +23 -4
  63. package/dist/types/{runtime-context.d.ts → runtimeContext.d.ts} +2 -0
  64. package/dist/types/ssr/serverRender/renderToStream/buildTemplate.after.d.ts +2 -0
  65. package/package.json +12 -15
  66. /package/dist/esm/core/{app-config.js → appConfig.js} +0 -0
  67. /package/dist/esm/{runtime-context.js → runtimeContext.js} +0 -0
  68. /package/dist/esm-node/core/{app-config.js → appConfig.js} +0 -0
  69. /package/dist/esm-node/{runtime-context.js → runtimeContext.js} +0 -0
  70. /package/dist/types/core/{app-config.d.ts → appConfig.d.ts} +0 -0
@@ -227,10 +227,9 @@ var __generator = this && this.__generator || function(thisArg, body) {
227
227
  };
228
228
  }
229
229
  };
230
- import { jsx, jsxs } from "react/jsx-runtime";
230
+ import { jsx } from "react/jsx-runtime";
231
231
  import { useContext } from "react";
232
- import serialize from "serialize-javascript";
233
- import { createStaticHandler, isRouteErrorResponse } from "@remix-run/router";
232
+ import { createStaticHandler } from "@modern-js/utils/remix-router";
234
233
  import { createStaticRouter, StaticRouterProvider } from "react-router-dom/server";
235
234
  import hoistNonReactStatics from "hoist-non-react-statics";
236
235
  import { createRoutesFromElements } from "react-router-dom";
@@ -298,45 +297,6 @@ function createFetchHeaders(requestHeaders) {
298
297
  }
299
298
  return headers;
300
299
  }
301
- function serializeErrors(errors) {
302
- if (!errors) {
303
- return null;
304
- }
305
- var entries = Object.entries(errors);
306
- var serialized = {};
307
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
308
- try {
309
- for(var _iterator = entries[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
310
- var _step_value = _slicedToArray(_step.value, 2), key = _step_value[0], val = _step_value[1];
311
- if (isRouteErrorResponse(val)) {
312
- serialized[key] = _objectSpreadProps(_objectSpread({}, val), {
313
- __type: "RouteErrorResponse"
314
- });
315
- } else if (_instanceof(val, Error)) {
316
- serialized[key] = {
317
- message: val.message,
318
- __type: "Error"
319
- };
320
- } else {
321
- serialized[key] = val;
322
- }
323
- }
324
- } catch (err) {
325
- _didIteratorError = true;
326
- _iteratorError = err;
327
- } finally{
328
- try {
329
- if (!_iteratorNormalCompletion && _iterator.return != null) {
330
- _iterator.return();
331
- }
332
- } finally{
333
- if (_didIteratorError) {
334
- throw _iteratorError;
335
- }
336
- }
337
- }
338
- return serialized;
339
- }
340
300
  var routerPlugin = function(param) {
341
301
  var _param_basename = param.basename, basename = _param_basename === void 0 ? "" : _param_basename, routesConfig = param.routesConfig, createRoutes = param.createRoutes;
342
302
  return {
@@ -346,7 +306,7 @@ var routerPlugin = function(param) {
346
306
  init: function init(param, next) {
347
307
  var context = param.context;
348
308
  return _asyncToGenerator(function() {
349
- var request, baseUrl, _basename, routes, query, remixRequest, routerContext, router;
309
+ var _context_ssrContext, request, ssrMode, baseUrl, _basename, routes, query, remixRequest, routerContext, router;
350
310
  return __generator(this, function(_state) {
351
311
  switch(_state.label){
352
312
  case 0:
@@ -358,10 +318,10 @@ var routerPlugin = function(param) {
358
318
  })
359
319
  ];
360
320
  }
361
- request = context.ssrContext.request;
321
+ _context_ssrContext = context.ssrContext, request = _context_ssrContext.request, ssrMode = _context_ssrContext.mode;
362
322
  baseUrl = request.baseUrl;
363
323
  _basename = baseUrl === "/" ? urlJoin(baseUrl, basename) : baseUrl;
364
- routes = createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes(routesConfig));
324
+ routes = createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes(routesConfig, ssrMode));
365
325
  query = createStaticHandler(routes, {
366
326
  basename: _basename
367
327
  }).query;
@@ -403,29 +363,12 @@ var routerPlugin = function(param) {
403
363
  var getRouteApp = function() {
404
364
  return function(props) {
405
365
  var _useContext = useContext(RuntimeReactContext), router = _useContext.router, routerContext = _useContext.routerContext;
406
- var data = {
407
- loaderData: routerContext.loaderData,
408
- actionData: routerContext.actionData,
409
- errors: serializeErrors(routerContext.errors)
410
- };
411
- var hydrateScript = "window.__staticRouterHydrationData = ".concat(serialize(data, {
412
- isJSON: true
413
- }), ";");
414
- return /* @__PURE__ */ jsxs(App, _objectSpreadProps(_objectSpread({}, props), {
415
- children: [
416
- /* @__PURE__ */ jsx(StaticRouterProvider, {
417
- router: router,
418
- context: routerContext,
419
- hydrate: false
420
- }),
421
- /* @__PURE__ */ jsx("script", {
422
- suppressHydrationWarning: true,
423
- id: "the-nonce",
424
- dangerouslySetInnerHTML: {
425
- __html: hydrateScript
426
- }
427
- })
428
- ]
366
+ return /* @__PURE__ */ jsx(App, _objectSpreadProps(_objectSpread({}, props), {
367
+ children: /* @__PURE__ */ jsx(StaticRouterProvider, {
368
+ router: router,
369
+ context: routerContext,
370
+ hydrate: false
371
+ })
429
372
  }));
430
373
  };
431
374
  };
@@ -1,3 +1,11 @@
1
+ function _arrayLikeToArray(arr, len) {
2
+ if (len == null || len > arr.length) len = arr.length;
3
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
4
+ return arr2;
5
+ }
6
+ function _arrayWithHoles(arr) {
7
+ if (Array.isArray(arr)) return arr;
8
+ }
1
9
  function _defineProperty(obj, key, value) {
2
10
  if (key in obj) {
3
11
  Object.defineProperty(obj, key, {
@@ -11,6 +19,40 @@ function _defineProperty(obj, key, value) {
11
19
  }
12
20
  return obj;
13
21
  }
22
+ function _instanceof(left, right) {
23
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
24
+ return !!right[Symbol.hasInstance](left);
25
+ } else {
26
+ return left instanceof right;
27
+ }
28
+ }
29
+ function _iterableToArrayLimit(arr, i) {
30
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
31
+ if (_i == null) return;
32
+ var _arr = [];
33
+ var _n = true;
34
+ var _d = false;
35
+ var _s, _e;
36
+ try {
37
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
38
+ _arr.push(_s.value);
39
+ if (i && _arr.length === i) break;
40
+ }
41
+ } catch (err) {
42
+ _d = true;
43
+ _e = err;
44
+ } finally{
45
+ try {
46
+ if (!_n && _i["return"] != null) _i["return"]();
47
+ } finally{
48
+ if (_d) throw _e;
49
+ }
50
+ }
51
+ return _arr;
52
+ }
53
+ function _nonIterableRest() {
54
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
55
+ }
14
56
  function _objectSpread(target) {
15
57
  for(var i = 1; i < arguments.length; i++){
16
58
  var source = arguments[i] != null ? arguments[i] : {};
@@ -77,70 +119,25 @@ function _objectWithoutPropertiesLoose(source, excluded) {
77
119
  }
78
120
  return target;
79
121
  }
122
+ function _slicedToArray(arr, i) {
123
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
124
+ }
125
+ function _unsupportedIterableToArray(o, minLen) {
126
+ if (!o) return;
127
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
128
+ var n = Object.prototype.toString.call(o).slice(8, -1);
129
+ if (n === "Object" && o.constructor) n = o.constructor.name;
130
+ if (n === "Map" || n === "Set") return Array.from(n);
131
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
132
+ }
80
133
  import { jsx } from "react/jsx-runtime";
81
- import { Suspense } from "react";
82
134
  import { Route } from "react-router-dom";
135
+ import { renderNestedRoute } from "@modern-js/utils/nestedRoutes";
136
+ import { ErrorResponse, isRouteErrorResponse } from "@modern-js/utils/remix-router";
83
137
  import { DefaultNotFound } from "./DefaultNotFound";
84
- var renderNestedRoute = function(nestedRoute, parent) {
85
- var children = nestedRoute.children, index = nestedRoute.index, id = nestedRoute.id, component = nestedRoute.component, isRoot = nestedRoute.isRoot;
86
- var Component = component;
87
- var routeProps = {
88
- caseSensitive: nestedRoute.caseSensitive,
89
- path: nestedRoute.path,
90
- id: nestedRoute.id,
91
- loader: createLoader(nestedRoute),
92
- action: nestedRoute.action,
93
- hasErrorBoundary: nestedRoute.hasErrorBoundary,
94
- shouldRevalidate: nestedRoute.shouldRevalidate,
95
- handle: nestedRoute.handle,
96
- index: nestedRoute.index,
97
- element: nestedRoute.element,
98
- errorElement: nestedRoute.errorElement
99
- };
100
- if (nestedRoute.error) {
101
- var errorElement = /* @__PURE__ */ jsx(nestedRoute.error, {});
102
- routeProps.errorElement = errorElement;
103
- }
104
- var element;
105
- if (Component) {
106
- if (parent === null || parent === void 0 ? void 0 : parent.loading) {
107
- var Loading = parent.loading;
108
- if (isLoadableComponent(Component)) {
109
- element = /* @__PURE__ */ jsx(Component, {
110
- fallback: /* @__PURE__ */ jsx(Loading, {})
111
- });
112
- } else {
113
- element = /* @__PURE__ */ jsx(Suspense, {
114
- fallback: /* @__PURE__ */ jsx(Loading, {}),
115
- children: /* @__PURE__ */ jsx(Component, {})
116
- });
117
- }
118
- } else if (isLoadableComponent(Component) || isRoot) {
119
- element = /* @__PURE__ */ jsx(Component, {});
120
- } else {
121
- element = /* @__PURE__ */ jsx(Suspense, {
122
- fallback: null,
123
- children: /* @__PURE__ */ jsx(Component, {})
124
- });
125
- }
126
- } else {
127
- nestedRoute.loading = parent === null || parent === void 0 ? void 0 : parent.loading;
128
- }
129
- if (element) {
130
- routeProps.element = element;
131
- }
132
- var childElements = children === null || children === void 0 ? void 0 : children.map(function(childRoute) {
133
- return renderNestedRoute(childRoute, nestedRoute);
134
- });
135
- var routeElement = index ? /* @__PURE__ */ jsx(Route, _objectSpreadProps(_objectSpread({}, routeProps), {
136
- index: true
137
- }), id) : /* @__PURE__ */ jsx(Route, _objectSpreadProps(_objectSpread({}, routeProps), {
138
- index: false,
139
- children: childElements
140
- }), id);
141
- return routeElement;
142
- };
143
- function getRouteComponents(routes, globalApp) {
138
+ import DeferredDataScripts from "./DeferredDataScripts";
139
+ function getRouteComponents(routes, param) {
140
+ var globalApp = param.globalApp, ssrMode = param.ssrMode;
144
141
  var Layout = function(_param) {
145
142
  var Component = _param.Component, props = _objectWithoutProperties(_param, [
146
143
  "Component"
@@ -159,7 +156,9 @@ function getRouteComponents(routes, globalApp) {
159
156
  for(var _iterator = routes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
160
157
  var route = _step.value;
161
158
  if (route.type === "nested") {
162
- var routeElement = renderNestedRoute(route);
159
+ var routeElement = renderNestedRoute(route, {
160
+ DeferredDataComponent: ssrMode === "stream" ? DeferredDataScripts : void 0
161
+ });
163
162
  routeElements.push(routeElement);
164
163
  } else {
165
164
  var routeElement1 = /* @__PURE__ */ jsx(Route, {
@@ -191,7 +190,7 @@ function getRouteComponents(routes, globalApp) {
191
190
  }, "*"));
192
191
  return routeElements;
193
192
  }
194
- function renderRoutes(routesConfig) {
193
+ function renderRoutes(routesConfig, ssrMode) {
195
194
  if (!routesConfig) {
196
195
  return null;
197
196
  }
@@ -199,7 +198,10 @@ function renderRoutes(routesConfig) {
199
198
  if (!routes) {
200
199
  return null;
201
200
  }
202
- var routeElements = getRouteComponents(routes, globalApp);
201
+ var routeElements = getRouteComponents(routes, {
202
+ globalApp: globalApp,
203
+ ssrMode: ssrMode
204
+ });
203
205
  return routeElements;
204
206
  }
205
207
  function getLocation(serverContext) {
@@ -236,25 +238,80 @@ function standardSlash(str) {
236
238
  }
237
239
  return addr;
238
240
  }
239
- function createLoader(route) {
240
- var loader = route.loader;
241
- if (loader) {
242
- return function(args) {
243
- if (typeof route.lazyImport === "function") {
244
- route.lazyImport();
241
+ function serializeErrors(errors) {
242
+ if (!errors) {
243
+ return null;
244
+ }
245
+ var entries = Object.entries(errors);
246
+ var serialized = {};
247
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
248
+ try {
249
+ for(var _iterator = entries[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
250
+ var _step_value = _slicedToArray(_step.value, 2), key = _step_value[0], val = _step_value[1];
251
+ if (isRouteErrorResponse(val)) {
252
+ serialized[key] = _objectSpreadProps(_objectSpread({}, val), {
253
+ __type: "RouteErrorResponse"
254
+ });
255
+ } else if (_instanceof(val, Error)) {
256
+ serialized[key] = {
257
+ message: val.message,
258
+ stack: val.stack,
259
+ __type: "Error"
260
+ };
261
+ } else {
262
+ serialized[key] = val;
245
263
  }
246
- return loader(args);
247
- };
248
- } else {
249
- return function() {
250
- if (typeof route.lazyImport === "function") {
251
- route.lazyImport();
264
+ }
265
+ } catch (err) {
266
+ _didIteratorError = true;
267
+ _iteratorError = err;
268
+ } finally{
269
+ try {
270
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
271
+ _iterator.return();
272
+ }
273
+ } finally{
274
+ if (_didIteratorError) {
275
+ throw _iteratorError;
252
276
  }
253
- return null;
254
- };
277
+ }
255
278
  }
279
+ return serialized;
256
280
  }
257
- function isLoadableComponent(component) {
258
- return component && component.displayName === "Loadable" && component.preload && typeof component.preload === "function";
281
+ function deserializeErrors(errors) {
282
+ if (!errors) {
283
+ return null;
284
+ }
285
+ var entries = Object.entries(errors);
286
+ var serialized = {};
287
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
288
+ try {
289
+ for(var _iterator = entries[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
290
+ var _step_value = _slicedToArray(_step.value, 2), key = _step_value[0], val = _step_value[1];
291
+ if (val && val.__type === "RouteErrorResponse") {
292
+ serialized[key] = new ErrorResponse(val.status, val.statusText, val.data, val.internal === true);
293
+ } else if (val && val.__type === "Error") {
294
+ var error = new Error(val.message);
295
+ error.stack = val.stack;
296
+ serialized[key] = error;
297
+ } else {
298
+ serialized[key] = val;
299
+ }
300
+ }
301
+ } catch (err) {
302
+ _didIteratorError = true;
303
+ _iteratorError = err;
304
+ } finally{
305
+ try {
306
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
307
+ _iterator.return();
308
+ }
309
+ } finally{
310
+ if (_didIteratorError) {
311
+ throw _iteratorError;
312
+ }
313
+ }
314
+ }
315
+ return serialized;
259
316
  }
260
- export { getLocation, getRouteComponents, renderRoutes, standardSlash, urlJoin };
317
+ export { deserializeErrors, getLocation, getRouteComponents, renderRoutes, serializeErrors, standardSlash, urlJoin };
@@ -113,6 +113,8 @@ var cli_default = function() {
113
113
  return {
114
114
  source: {
115
115
  alias: {
116
+ // ensure that all packages use the same storage in @modern-js/utils/ssr
117
+ "@modern-js/utils/ssr": require.resolve("@modern-js/utils/ssr"),
116
118
  "@modern-js/runtime/plugins": pluginsExportsUtils.getPath()
117
119
  }
118
120
  },
@@ -214,6 +214,7 @@ var ssr = function() {
214
214
  var context = param.context;
215
215
  var request = context.ssrContext.request;
216
216
  context.ssrContext.request = formatServer(request);
217
+ context.ssrContext.mode = config.mode;
217
218
  return next({
218
219
  context: context
219
220
  });
@@ -26,7 +26,7 @@ function _objectSpread(target) {
26
26
  }
27
27
  return target;
28
28
  }
29
- import serialize from "serialize-javascript";
29
+ import { serializeJson } from "@modern-js/utils/serialize";
30
30
  import { buildTemplate } from "./buildTemplate.share";
31
31
  function buildShellAfterTemplate(afterAppTemplate, options) {
32
32
  var injectSSRDataScript = function injectSSRDataScript(template) {
@@ -50,9 +50,7 @@ function buildShellAfterTemplate(afterAppTemplate, options) {
50
50
  },
51
51
  renderLevel: renderLevel
52
52
  };
53
- return "\n <script>window._SSR_DATA = ".concat(serialize(SSRData, {
54
- isJSON: true
55
- }), "</script>\n ");
53
+ return "\n <script>window._SSR_DATA = ".concat(serializeJson(SSRData), "</script>\n ");
56
54
  }
57
55
  };
58
56
  var callbacks = [
@@ -59,13 +59,16 @@ function _objectSpreadProps(target, source) {
59
59
  }
60
60
  import { Transform } from "stream";
61
61
  import { RenderLevel } from "../types";
62
+ import { ESCAPED_SHELL_STREAM_END_MARK } from "../../../common";
62
63
  import { getTemplates } from "./template";
64
+ var ShellChunkStatus = /* @__PURE__ */ function(ShellChunkStatus2) {
65
+ ShellChunkStatus2[ShellChunkStatus2["IDLE"] = 0] = "IDLE";
66
+ ShellChunkStatus2[ShellChunkStatus2["START"] = 1] = "START";
67
+ ShellChunkStatus2[ShellChunkStatus2["FINIESH"] = 2] = "FINIESH";
68
+ return ShellChunkStatus2;
69
+ }(ShellChunkStatus || {});
63
70
  function renderToPipe(rootElement, context, options) {
64
- var joinChunk = function joinChunk() {
65
- var before = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : "", chunk = arguments.length > 1 ? arguments[1] : void 0, after = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "";
66
- return "".concat(before).concat(chunk.toString()).concat(after);
67
- };
68
- var isShellStream = true;
71
+ var shellChunkStatus = 0 /* IDLE */ ;
69
72
  var ssrContext = context.ssrContext;
70
73
  var forUserPipe = function(stream) {
71
74
  return new Promise(function(resolve) {
@@ -81,9 +84,17 @@ function renderToPipe(rootElement, context, options) {
81
84
  var injectableTransform = new Transform({
82
85
  transform: function transform(chunk, _encoding, callback) {
83
86
  try {
84
- if (isShellStream) {
85
- this.push(joinChunk(shellBefore, chunk, shellAfter));
86
- isShellStream = false;
87
+ if (shellChunkStatus !== 2 /* FINIESH */ ) {
88
+ var concatedChunk = chunk.toString();
89
+ if (shellChunkStatus === 0 /* IDLE */ ) {
90
+ concatedChunk = "".concat(shellBefore).concat(concatedChunk);
91
+ shellChunkStatus = 1 /* START */ ;
92
+ }
93
+ if (shellChunkStatus === 1 /* START */ && concatedChunk.endsWith(ESCAPED_SHELL_STREAM_END_MARK)) {
94
+ concatedChunk = concatedChunk.replace(ESCAPED_SHELL_STREAM_END_MARK, shellAfter);
95
+ shellChunkStatus = 2 /* FINIESH */ ;
96
+ }
97
+ this.push(concatedChunk);
87
98
  } else {
88
99
  this.push(chunk);
89
100
  }
@@ -48,11 +48,12 @@ import { buildShellAfterTemplate } from "./buildTemplate.after";
48
48
  import { buildShellBeforeTemplate } from "./bulidTemplate.before";
49
49
  var HTML_SEPARATOR = "<!--<?- html ?>-->";
50
50
  var getTemplates = function(context, renderLevel) {
51
- var ssrContext = context.ssrContext;
51
+ var ssrContext = context.ssrContext, routerContext = context.routerContext;
52
52
  var _ref = _slicedToArray(ssrContext.template.split(HTML_SEPARATOR) || [], 2), tmp = _ref[0], beforeAppTemplate = tmp === void 0 ? "" : tmp, tmp1 = _ref[1], afterAppHtmlTemplate = tmp1 === void 0 ? "" : tmp1;
53
53
  var builtBeforeTemplate = buildShellBeforeTemplate(beforeAppTemplate, context);
54
54
  var builtAfterTemplate = buildShellAfterTemplate(afterAppHtmlTemplate, {
55
55
  ssrContext: ssrContext,
56
+ routerContext: routerContext,
56
57
  renderLevel: renderLevel
57
58
  });
58
59
  return {
@@ -171,8 +171,9 @@ var __generator = this && this.__generator || function(thisArg, body) {
171
171
  };
172
172
  import React from "react";
173
173
  import ReactDomServer from "react-dom/server";
174
- import serialize from "serialize-javascript";
174
+ import { serializeJson } from "@modern-js/utils/serialize";
175
175
  import ReactHelmet from "react-helmet";
176
+ import { serializeErrors } from "../../../router/runtime/utils";
176
177
  import helmetReplace from "../helmet";
177
178
  import { RenderLevel } from "../types";
178
179
  import { time } from "../time";
@@ -236,7 +237,7 @@ var Entry = /*#__PURE__*/ function() {
236
237
  value: function renderToHtml(context) {
237
238
  var _this = this;
238
239
  return _asyncToGenerator(function() {
239
- var _ssrContext_redirection, _ssrContext_redirection1, _ssrContext_redirection2, ssrContext, prefetchData, html, templateData, SSRData, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, fragment, helmetData;
240
+ var _ssrContext_redirection, _ssrContext_redirection1, _ssrContext_redirection2, ssrContext, prefetchData, routerContext, routerData, html, templateData, SSRData, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, fragment, helmetData;
240
241
  return __generator(this, function(_state) {
241
242
  switch(_state.label){
242
243
  case 0:
@@ -268,9 +269,14 @@ var Entry = /*#__PURE__*/ function() {
268
269
  ""
269
270
  ];
270
271
  }
272
+ routerContext = context.routerContext;
273
+ routerData = routerContext ? {
274
+ loaderData: routerContext.loaderData,
275
+ errors: serializeErrors(routerContext.errors)
276
+ } : void 0;
271
277
  html = "";
272
278
  templateData = buildTemplateData(ssrContext, prefetchData, _this.result.renderLevel);
273
- SSRData = _this.getSSRDataScript(templateData);
279
+ SSRData = _this.getSSRDataScript(templateData, routerData);
274
280
  _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
275
281
  try {
276
282
  for(_iterator = _this.fragments[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
@@ -395,11 +401,13 @@ var Entry = /*#__PURE__*/ function() {
395
401
  },
396
402
  {
397
403
  key: "getSSRDataScript",
398
- value: function getSSRDataScript(templateData) {
404
+ value: function getSSRDataScript(templateData, routerData) {
405
+ var ssrDataScripts = "<script>window._SSR_DATA = ".concat(serializeJson(templateData), "</script>");
406
+ if (routerData) {
407
+ ssrDataScripts += "\n<script>window._ROUTER_DATA = ".concat(serializeJson(routerData), "</script>");
408
+ }
399
409
  return {
400
- SSRDataScript: "\n <script>window._SSR_DATA = ".concat(serialize(templateData, {
401
- isJSON: true
402
- }), "</script>\n ")
410
+ SSRDataScript: ssrDataScripts
403
411
  };
404
412
  }
405
413
  }
@@ -1,4 +1,8 @@
1
1
  const isBrowser = () => typeof window !== "undefined" && window.name !== "nodejs";
2
+ const JSX_SHELL_STREAM_END_MARK = "<!--<?- SHELL_STREAM_END ?>-->";
3
+ const ESCAPED_SHELL_STREAM_END_MARK = "&lt;!--&lt;?- SHELL_STREAM_END ?&gt;--&gt;";
2
4
  export {
5
+ ESCAPED_SHELL_STREAM_END_MARK,
6
+ JSX_SHELL_STREAM_END_MARK,
3
7
  isBrowser
4
8
  };
@@ -4,7 +4,7 @@ import hoistNonReactStatics from "hoist-non-react-statics";
4
4
  import { ROUTE_MANIFEST } from "@modern-js/utils/constants";
5
5
  import {
6
6
  RuntimeReactContext
7
- } from "../runtime-context";
7
+ } from "../runtimeContext";
8
8
  import { runtime } from "./plugin";
9
9
  import { createLoaderManager } from "./loader/loaderManager";
10
10
  const IS_REACT18 = process.env.IS_REACT18 === "true";
@@ -1,7 +1,7 @@
1
1
  import { createPlugin, createRuntime, runtime, registerInit } from "./plugin";
2
- import { defineConfig, getConfig } from "./app-config";
2
+ import { defineConfig, getConfig } from "./appConfig";
3
3
  export * from "./compatible";
4
- import { RuntimeReactContext, ServerRouterContext } from "../runtime-context";
4
+ import { RuntimeReactContext, ServerRouterContext } from "../runtimeContext";
5
5
  export * from "./loader";
6
6
  export * from "@modern-js/plugin";
7
7
  export {
@@ -7,7 +7,7 @@ import {
7
7
  useEffect
8
8
  } from "react";
9
9
  import invariant from "invariant";
10
- import { RuntimeReactContext } from "../../runtime-context";
10
+ import { RuntimeReactContext } from "../../runtimeContext";
11
11
  import { LoaderStatus } from "./loaderManager";
12
12
  const useLoader = (loaderFn, options = { params: void 0 }) => {
13
13
  const context = useContext(RuntimeReactContext);
File without changes