@modern-js/runtime 2.6.0 → 2.8.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 (82) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/README.md +2 -2
  3. package/dist/cjs/cli/index.js +4 -3
  4. package/dist/cjs/common.js +6 -0
  5. package/dist/cjs/core/{app-config.js → appConfig.js} +3 -3
  6. package/dist/cjs/core/compatible.js +4 -4
  7. package/dist/cjs/core/index.js +6 -6
  8. package/dist/cjs/core/loader/useLoader.js +2 -2
  9. package/dist/cjs/core/types.js +15 -0
  10. package/dist/cjs/router/runtime/DeferredDataScripts.js +165 -0
  11. package/dist/cjs/router/runtime/index.js +116 -3
  12. package/dist/cjs/router/runtime/plugin.js +14 -1
  13. package/dist/cjs/router/runtime/plugin.node.js +12 -52
  14. package/dist/cjs/router/runtime/utils.js +68 -69
  15. package/dist/cjs/{runtime-context.js → runtimeContext.js} +3 -3
  16. package/dist/cjs/ssr/cli/index.js +3 -2
  17. package/dist/cjs/ssr/index.node.js +1 -0
  18. package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.after.js +2 -14
  19. package/dist/cjs/ssr/serverRender/renderToStream/bulidTemplate.before.js +5 -1
  20. package/dist/cjs/ssr/serverRender/renderToStream/renderToPipe.js +22 -7
  21. package/dist/cjs/ssr/serverRender/renderToStream/template.js +2 -1
  22. package/dist/cjs/ssr/serverRender/renderToString/entry.js +19 -8
  23. package/dist/cjs/state/runtime/index.js +2 -8
  24. package/dist/esm/cli/index.js +4 -3
  25. package/dist/esm/common.js +3 -1
  26. package/dist/esm/core/compatible.js +1 -1
  27. package/dist/esm/core/index.js +2 -2
  28. package/dist/esm/core/loader/useLoader.js +1 -1
  29. package/dist/esm/core/types.js +1 -0
  30. package/dist/esm/router/runtime/DeferredDataScripts.js +166 -0
  31. package/dist/esm/router/runtime/index.js +3 -2
  32. package/dist/esm/router/runtime/plugin.js +11 -3
  33. package/dist/esm/router/runtime/plugin.node.js +11 -68
  34. package/dist/esm/router/runtime/utils.js +138 -81
  35. package/dist/esm/ssr/cli/index.js +4 -3
  36. package/dist/esm/ssr/index.node.js +1 -0
  37. package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.after.js +2 -4
  38. package/dist/esm/ssr/serverRender/renderToStream/bulidTemplate.before.js +1 -1
  39. package/dist/esm/ssr/serverRender/renderToStream/renderToPipe.js +19 -8
  40. package/dist/esm/ssr/serverRender/renderToStream/template.js +2 -1
  41. package/dist/esm/ssr/serverRender/renderToString/entry.js +15 -7
  42. package/dist/esm/state/runtime/index.js +1 -2
  43. package/dist/esm-node/cli/index.js +4 -3
  44. package/dist/esm-node/common.js +4 -0
  45. package/dist/esm-node/core/compatible.js +1 -1
  46. package/dist/esm-node/core/index.js +2 -2
  47. package/dist/esm-node/core/loader/useLoader.js +1 -1
  48. package/dist/esm-node/core/types.js +0 -0
  49. package/dist/esm-node/router/runtime/DeferredDataScripts.js +148 -0
  50. package/dist/esm-node/router/runtime/index.js +113 -2
  51. package/dist/esm-node/router/runtime/plugin.js +15 -2
  52. package/dist/esm-node/router/runtime/plugin.node.js +12 -55
  53. package/dist/esm-node/router/runtime/utils.js +59 -69
  54. package/dist/esm-node/ssr/cli/index.js +4 -3
  55. package/dist/esm-node/ssr/index.node.js +1 -0
  56. package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.after.js +2 -4
  57. package/dist/esm-node/ssr/serverRender/renderToStream/bulidTemplate.before.js +5 -1
  58. package/dist/esm-node/ssr/serverRender/renderToStream/renderToPipe.js +22 -7
  59. package/dist/esm-node/ssr/serverRender/renderToStream/template.js +2 -1
  60. package/dist/esm-node/ssr/serverRender/renderToString/entry.js +19 -8
  61. package/dist/esm-node/state/runtime/index.js +1 -4
  62. package/dist/types/common.d.ts +3 -1
  63. package/dist/types/core/compatible.d.ts +1 -1
  64. package/dist/types/core/index.d.ts +4 -3
  65. package/dist/types/core/loader/index.d.ts +1 -2
  66. package/dist/types/core/loader/useLoader.d.ts +1 -15
  67. package/dist/types/core/plugin.d.ts +15 -15
  68. package/dist/types/core/types.d.ts +22 -0
  69. package/dist/types/index.d.ts +1 -1
  70. package/dist/types/router/runtime/DeferredDataScripts.d.ts +8 -0
  71. package/dist/types/router/runtime/index.d.ts +4 -2
  72. package/dist/types/router/runtime/utils.d.ts +23 -4
  73. package/dist/types/{runtime-context.d.ts → runtimeContext.d.ts} +2 -0
  74. package/dist/types/ssr/serverRender/renderToStream/buildTemplate.after.d.ts +2 -0
  75. package/dist/types/state/runtime/index.d.ts +0 -1
  76. package/package.json +15 -18
  77. package/types/router.d.ts +1 -1
  78. /package/dist/esm/core/{app-config.js → appConfig.js} +0 -0
  79. /package/dist/esm/{runtime-context.js → runtimeContext.js} +0 -0
  80. /package/dist/esm-node/core/{app-config.js → appConfig.js} +0 -0
  81. /package/dist/esm-node/{runtime-context.js → runtimeContext.js} +0 -0
  82. /package/dist/types/core/{app-config.d.ts → appConfig.d.ts} +0 -0
@@ -0,0 +1,166 @@
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
+ }
9
+ function _iterableToArrayLimit(arr, i) {
10
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
11
+ if (_i == null) return;
12
+ var _arr = [];
13
+ var _n = true;
14
+ var _d = false;
15
+ var _s, _e;
16
+ try {
17
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
18
+ _arr.push(_s.value);
19
+ if (i && _arr.length === i) break;
20
+ }
21
+ } catch (err) {
22
+ _d = true;
23
+ _e = err;
24
+ } finally{
25
+ try {
26
+ if (!_n && _i["return"] != null) _i["return"]();
27
+ } finally{
28
+ if (_d) throw _e;
29
+ }
30
+ }
31
+ return _arr;
32
+ }
33
+ function _nonIterableRest() {
34
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
35
+ }
36
+ function _slicedToArray(arr, i) {
37
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
38
+ }
39
+ function _unsupportedIterableToArray(o, minLen) {
40
+ if (!o) return;
41
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
42
+ var n = Object.prototype.toString.call(o).slice(8, -1);
43
+ if (n === "Object" && o.constructor) n = o.constructor.name;
44
+ if (n === "Map" || n === "Set") return Array.from(n);
45
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
46
+ }
47
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
48
+ import { Suspense, useEffect, useRef, useMemo, useContext } from "react";
49
+ import { Await, UNSAFE_DataRouterContext as DataRouterContext, useAsyncError } from "react-router-dom";
50
+ import { serializeJson } from "@modern-js/utils/serialize";
51
+ import { JSX_SHELL_STREAM_END_MARK } from "../../common";
52
+ import { serializeErrors } from "./utils";
53
+ var setupFnStr = "function s(r,e){_ROUTER_DATA.r=_ROUTER_DATA.r||{},_ROUTER_DATA.r[r]=_ROUTER_DATA.r[r]||{};return new Promise((function(A,R){_ROUTER_DATA.r[r][e]={resolve:A,reject:R}}))};";
54
+ var resolveFnStr = "function r(e,r,o,A){A?_ROUTER_DATA.r[e][r].reject(A):_ROUTER_DATA.r[e][r].resolve(o)};";
55
+ var preResolvedFnStr = "function p(e,r){return void 0!==r?Promise.reject(new Error(r.message)):Promise.resovle(e)};";
56
+ var DeferredDataScripts = function() {
57
+ var context = useContext(DataRouterContext);
58
+ var staticContext = (context || {}).staticContext;
59
+ var hydratedRef = useRef(false);
60
+ useEffect(function() {
61
+ hydratedRef.current = true;
62
+ }, []);
63
+ var deferredScripts = useMemo(function() {
64
+ if (!staticContext) {
65
+ return null;
66
+ }
67
+ var activeDeferreds = staticContext.activeDeferreds || [];
68
+ var _ROUTER_DATA = {
69
+ loaderData: staticContext.loaderData,
70
+ errors: serializeErrors(staticContext.errors)
71
+ };
72
+ var initialScripts = [
73
+ "_ROUTER_DATA = ".concat(serializeJson(_ROUTER_DATA), ";"),
74
+ "_ROUTER_DATA.s = ".concat(setupFnStr),
75
+ "_ROUTER_DATA.r = ".concat(resolveFnStr),
76
+ "_ROUTER_DATA.p = ".concat(preResolvedFnStr)
77
+ ].join("\n");
78
+ var deferredDataScripts = [];
79
+ initialScripts += Object.entries(activeDeferreds).map(function(param) {
80
+ var _param = _slicedToArray(param, 2), routeId = _param[0], deferredData = _param[1];
81
+ var pendingKeys = new Set(deferredData.pendingKeys);
82
+ var deferredKeys = deferredData.deferredKeys;
83
+ var deferredKeyPromiseStr = deferredKeys.map(function(key) {
84
+ if (pendingKeys.has(key)) {
85
+ deferredDataScripts.push(/* @__PURE__ */ jsx(DeferredDataScript, {
86
+ data: deferredData.data[key],
87
+ dataKey: key,
88
+ routeId: routeId
89
+ }, "".concat(routeId, " | ").concat(key)));
90
+ return "".concat(JSON.stringify(key), ": _ROUTER_DATA.s(").concat(JSON.stringify(routeId), ",").concat(JSON.stringify(key), ") ");
91
+ } else {
92
+ var trackedPromise = deferredData.data[key];
93
+ if (typeof trackedPromise._error !== "undefined") {
94
+ var error = {
95
+ message: trackedPromise._error.message,
96
+ stack: process.env.NODE_ENV !== "production" ? trackedPromise._error.stack : void 0
97
+ };
98
+ return "".concat(JSON.stringify(key), ": _ROUTER_DATA.p(").concat(void 0, ", ").concat(serializeJson(error), ")");
99
+ } else {
100
+ if (typeof trackedPromise._data === "undefined") {
101
+ throw new Error("The deferred data for ".concat(key, " was not resolved, did you forget to return data from a deferred promise"));
102
+ }
103
+ return "".concat(JSON.stringify(key), ": _ROUTER_DATA.p(").concat(serializeJson(trackedPromise._data), ")");
104
+ }
105
+ }
106
+ }).join(",\n");
107
+ return "Object.assign(_ROUTER_DATA.loaderData[".concat(JSON.stringify(routeId), "], {").concat(deferredKeyPromiseStr, "});");
108
+ }).join("\n");
109
+ return [
110
+ initialScripts,
111
+ deferredDataScripts
112
+ ];
113
+ }, []);
114
+ if (!deferredScripts) {
115
+ return null;
116
+ }
117
+ return /* @__PURE__ */ jsxs(Fragment, {
118
+ children: [
119
+ !hydratedRef.current && /* @__PURE__ */ jsx("script", {
120
+ async: true,
121
+ suppressHydrationWarning: true,
122
+ dangerouslySetInnerHTML: {
123
+ __html: deferredScripts[0]
124
+ }
125
+ }),
126
+ !hydratedRef.current && deferredScripts[1],
127
+ JSX_SHELL_STREAM_END_MARK
128
+ ]
129
+ });
130
+ };
131
+ var DeferredDataScript = function(param) {
132
+ var data = param.data, routeId = param.routeId, dataKey = param.dataKey;
133
+ return /* @__PURE__ */ jsx(Suspense, {
134
+ children: typeof document === "undefined" && data && dataKey && routeId ? /* @__PURE__ */ jsx(Await, {
135
+ resolve: data,
136
+ errorElement: /* @__PURE__ */ jsx(ErrorDeferredDataScript, {
137
+ routeId: routeId,
138
+ dataKey: dataKey
139
+ }),
140
+ children: function(data2) {
141
+ return /* @__PURE__ */ jsx("script", {
142
+ async: true,
143
+ suppressHydrationWarning: true,
144
+ dangerouslySetInnerHTML: {
145
+ __html: "_ROUTER_DATA.r(".concat(JSON.stringify(routeId), ", ").concat(JSON.stringify(dataKey), ", ").concat(serializeJson(data2), ");")
146
+ }
147
+ });
148
+ }
149
+ }) : null
150
+ });
151
+ };
152
+ var ErrorDeferredDataScript = function(param) {
153
+ var routeId = param.routeId, dataKey = param.dataKey;
154
+ var error = useAsyncError();
155
+ return /* @__PURE__ */ jsx("script", {
156
+ suppressHydrationWarning: true,
157
+ dangerouslySetInnerHTML: {
158
+ __html: "_ROUTER_DATA.r(".concat(JSON.stringify(routeId), ", ").concat(JSON.stringify(dataKey), ", ").concat(void 0, ", ").concat(serializeJson({
159
+ message: error.message,
160
+ stack: error.stack
161
+ }), ");")
162
+ }
163
+ });
164
+ };
165
+ var DeferredDataScripts_default = DeferredDataScripts;
166
+ export { DeferredDataScripts_default as default };
@@ -1,6 +1,7 @@
1
1
  import { routerPlugin } from "./plugin";
2
2
  var runtime_default = routerPlugin;
3
3
  import { modifyRoutes } from "./plugin";
4
- export * from "react-router-dom";
5
4
  export * from "./withRouter";
6
- export { runtime_default as default, modifyRoutes };
5
+ import { createBrowserRouter, createHashRouter, createMemoryRouter, RouterProvider, BrowserRouter, HashRouter, MemoryRouter, Router, Await, Form, Link, NavLink, Navigate, Outlet, Route, Routes, ScrollRestoration, useActionData, useAsyncError, useAsyncValue, useBeforeUnload, useFetcher, useFetchers, useFormAction, useHref, useInRouterContext, useLinkClickHandler, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes, useSearchParams, useSubmit, createRoutesFromChildren, createRoutesFromElements, createSearchParams, generatePath, isRouteErrorResponse, matchPath, matchRoutes, renderMatches, resolvePath } from "react-router-dom";
6
+ import { defer, json, redirect } from "@modern-js/utils/remix-router";
7
+ export { Await, BrowserRouter, Form, HashRouter, Link, MemoryRouter, NavLink, Navigate, Outlet, Route, Router, RouterProvider, Routes, ScrollRestoration, createBrowserRouter, createHashRouter, createMemoryRouter, createRoutesFromChildren, createRoutesFromElements, createSearchParams, runtime_default as default, defer, generatePath, isRouteErrorResponse, json, matchPath, matchRoutes, modifyRoutes, redirect, renderMatches, resolvePath, useActionData, useAsyncError, useAsyncValue, useBeforeUnload, useFetcher, useFetchers, useFormAction, useHref, useInRouterContext, useLinkClickHandler, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes, useSearchParams, useSubmit };
@@ -53,7 +53,7 @@ function _objectSpreadProps(target, source) {
53
53
  import { jsx } from "react/jsx-runtime";
54
54
  import { createBrowserRouter, createHashRouter, RouterProvider, createRoutesFromElements, useMatches, useLocation } from "react-router-dom";
55
55
  import hoistNonReactStatics from "hoist-non-react-statics";
56
- import { renderRoutes, urlJoin } from "./utils";
56
+ import { deserializeErrors, renderRoutes, urlJoin } from "./utils";
57
57
  var finalRouteConfig = {
58
58
  routes: []
59
59
  };
@@ -103,10 +103,18 @@ var routerPlugin = function(param) {
103
103
  var routes = createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes(finalRouteConfig));
104
104
  var baseUrl = ((_window__SERVER_DATA = window._SERVER_DATA) === null || _window__SERVER_DATA === void 0 ? void 0 : _window__SERVER_DATA.router.baseUrl) || select(location.pathname);
105
105
  var _basename = baseUrl === "/" ? urlJoin(baseUrl, basename) : baseUrl;
106
+ var hydrationData = window._ROUTER_DATA;
107
+ if (hydrationData === null || hydrationData === void 0 ? void 0 : hydrationData.errors) {
108
+ hydrationData = _objectSpreadProps(_objectSpread({}, hydrationData), {
109
+ errors: deserializeErrors(hydrationData.errors)
110
+ });
111
+ }
106
112
  var router = supportHtml5History ? createBrowserRouter(routes, {
107
- basename: _basename
113
+ basename: _basename,
114
+ hydrationData: hydrationData
108
115
  }) : createHashRouter(routes, {
109
- basename: _basename
116
+ basename: _basename,
117
+ hydrationData: hydrationData
110
118
  });
111
119
  return /* @__PURE__ */ jsx(App, _objectSpreadProps(_objectSpread({}, props), {
112
120
  children: /* @__PURE__ */ jsx(RouterProvider, {
@@ -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 };
@@ -61,7 +61,7 @@ function _unsupportedIterableToArray(o, minLen) {
61
61
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
62
62
  }
63
63
  import path from "path";
64
- import { getEntryOptions, SERVER_RENDER_FUNCTION_NAME, LOADABLE_STATS_FILE, isUseSSRBundle, createRuntimeExportsUtils, isSingleEntry } from "@modern-js/utils";
64
+ import { getEntryOptions, SERVER_RENDER_FUNCTION_NAME, LOADABLE_STATS_FILE, isUseSSRBundle, createRuntimeExportsUtils, isSSGEntry } from "@modern-js/utils";
65
65
  var PLUGIN_IDENTIFIER = "ssr";
66
66
  var hasStringSSREntry = function(userConfig) {
67
67
  var isStreaming = function(ssr) {
@@ -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
  },
@@ -163,8 +165,7 @@ var cli_default = function() {
163
165
  throw new Error("You should switch to file-system based router to support streaming SSR.");
164
166
  }
165
167
  }
166
- var ssgConfig = userConfig.output.ssg;
167
- var useSSG = isSingleEntry(entrypoints) ? Boolean(ssgConfig) : ssgConfig === true || typeof (ssgConfig === null || ssgConfig === void 0 ? void 0 : ssgConfig[0]) === "function" || Boolean(ssgConfig === null || ssgConfig === void 0 ? void 0 : ssgConfig[entryName]);
168
+ var useSSG = isSSGEntry(userConfig, entryName, entrypoints);
168
169
  ssrConfigMap.set(entryName, ssrConfig || useSSG);
169
170
  if (ssrConfig || useSSG) {
170
171
  imports.push({
@@ -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 = [
@@ -71,7 +71,7 @@ function getHeadTemplate(beforeEntryTemplate, context) {
71
71
  }
72
72
  var routeAssets = routeManifest.routeAssets;
73
73
  var cssChunks = [];
74
- var matches = matchRoutes(routes, routerContext.location);
74
+ var matches = matchRoutes(routes, routerContext.location, routerContext.basename);
75
75
  matches === null || matches === void 0 ? void 0 : matches.forEach(function(match, index) {
76
76
  if (!index) {
77
77
  return;