@modern-js/runtime 2.9.0 → 2.11.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 (44) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/dist/cjs/core/compatible.js +7 -3
  3. package/dist/cjs/router/runtime/DeferredDataScripts.node.js +2 -2
  4. package/dist/cjs/router/runtime/PrefetchLink.js +205 -0
  5. package/dist/cjs/router/runtime/index.js +6 -1
  6. package/dist/cjs/router/runtime/plugin.js +12 -1
  7. package/dist/cjs/router/runtime/plugin.node.js +7 -2
  8. package/dist/cjs/router/runtime/utils.js +19 -9
  9. package/dist/cjs/ssr/index.js +3 -0
  10. package/dist/cjs/ssr/serverRender/renderToStream/buildTemplate.after.js +9 -2
  11. package/dist/cjs/ssr/serverRender/renderToStream/bulidTemplate.before.js +2 -2
  12. package/dist/cjs/ssr/serverRender/renderToStream/template.js +2 -3
  13. package/dist/cjs/ssr/serverRender/renderToString/entry.js +1 -1
  14. package/dist/esm/core/compatible.js +3 -2
  15. package/dist/esm/router/runtime/DeferredDataScripts.node.js +2 -2
  16. package/dist/esm/router/runtime/PrefetchLink.js +446 -0
  17. package/dist/esm/router/runtime/index.js +3 -2
  18. package/dist/esm/router/runtime/plugin.js +10 -1
  19. package/dist/esm/router/runtime/plugin.node.js +5 -2
  20. package/dist/esm/router/runtime/utils.js +12 -9
  21. package/dist/esm/ssr/index.js +3 -0
  22. package/dist/esm/ssr/serverRender/renderToStream/buildTemplate.after.js +6 -2
  23. package/dist/esm/ssr/serverRender/renderToStream/bulidTemplate.before.js +2 -2
  24. package/dist/esm/ssr/serverRender/renderToStream/template.js +2 -3
  25. package/dist/esm/ssr/serverRender/renderToString/entry.js +1 -1
  26. package/dist/esm-node/core/compatible.js +7 -3
  27. package/dist/esm-node/router/runtime/DeferredDataScripts.node.js +2 -2
  28. package/dist/esm-node/router/runtime/PrefetchLink.js +177 -0
  29. package/dist/esm-node/router/runtime/index.js +4 -1
  30. package/dist/esm-node/router/runtime/plugin.js +12 -1
  31. package/dist/esm-node/router/runtime/plugin.node.js +7 -2
  32. package/dist/esm-node/router/runtime/utils.js +19 -9
  33. package/dist/esm-node/ssr/index.js +3 -0
  34. package/dist/esm-node/ssr/serverRender/renderToStream/buildTemplate.after.js +9 -2
  35. package/dist/esm-node/ssr/serverRender/renderToStream/bulidTemplate.before.js +2 -2
  36. package/dist/esm-node/ssr/serverRender/renderToStream/template.js +2 -3
  37. package/dist/esm-node/ssr/serverRender/renderToString/entry.js +1 -1
  38. package/dist/types/router/runtime/PrefetchLink.d.ts +30 -0
  39. package/dist/types/router/runtime/index.d.ts +3 -1
  40. package/dist/types/router/runtime/types.d.ts +10 -1
  41. package/dist/types/router/runtime/utils.d.ts +13 -3
  42. package/dist/types/runtimeContext.d.ts +3 -1
  43. package/dist/types/ssr/serverRender/renderToStream/buildTemplate.after.d.ts +2 -4
  44. package/package.json +12 -12
package/CHANGELOG.md CHANGED
@@ -1,5 +1,53 @@
1
1
  # @modern-js/runtime
2
2
 
3
+ ## 2.11.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 5d624fd: feat: assets and data prefetching is supported
8
+ feat: 支持资源和数据预加载
9
+ - e2466a1: fix: remove nestedRoutes file from @modern-js/utils
10
+ fix: 将 nestedRoutes 从 @modern-js/utils 中移除
11
+ - 02bb383: fix: fix lost props when using nested route in micro-front-end mode
12
+ 修复嵌套路由在微前端场景下主子应用传递 props 丢失问题
13
+ - 381a3b9: feat(utils): move universal utils to the universal folder
14
+
15
+ feat(utils): 将运行时使用的 utils 移动到 universal 目录
16
+
17
+ - Updated dependencies [cfb058f]
18
+ - Updated dependencies [0bd018b]
19
+ - Updated dependencies [5d624fd]
20
+ - Updated dependencies [e2466a1]
21
+ - Updated dependencies [02bb383]
22
+ - Updated dependencies [381a3b9]
23
+ - Updated dependencies [7a60f10]
24
+ - Updated dependencies [274b2e5]
25
+ - Updated dependencies [b9e1c54]
26
+ - @modern-js/utils@2.11.0
27
+ - @modern-js/plugin@2.11.0
28
+ - @modern-js/types@2.11.0
29
+
30
+ ## 2.10.0
31
+
32
+ ### Patch Changes
33
+
34
+ - 0da32d0: chore: upgrade jest and puppeteer
35
+ chore: 升级 jest 和 puppeteer 到 latest
36
+ - 5766414: fix: fix typos
37
+ fix: 修复拼写错误
38
+ - 950e138: fix: inject i18n placeholder in streaming ssr
39
+ fix: 流式 SSR 中,注入 i18n 数据占位字段
40
+ - Updated dependencies [3e0bd50]
41
+ - Updated dependencies [92d247f]
42
+ - Updated dependencies [0da32d0]
43
+ - Updated dependencies [0d9962b]
44
+ - Updated dependencies [fbefa7e]
45
+ - Updated dependencies [4d54233]
46
+ - Updated dependencies [6db4864]
47
+ - @modern-js/types@2.10.0
48
+ - @modern-js/plugin@2.10.0
49
+ - @modern-js/utils@2.10.0
50
+
3
51
  ## 2.9.0
4
52
 
5
53
  ### Patch Changes
@@ -35,7 +35,7 @@ module.exports = __toCommonJS(compatible_exports);
35
35
  var import_jsx_runtime = require("react/jsx-runtime");
36
36
  var import_react = __toESM(require("react"));
37
37
  var import_hoist_non_react_statics = __toESM(require("hoist-non-react-statics"));
38
- var import_constants = require("@modern-js/utils/constants");
38
+ var import_constants = require("@modern-js/utils/universal/constants");
39
39
  var import_runtimeContext = require("../runtimeContext");
40
40
  var import_plugin = require("./plugin");
41
41
  var import_loaderManager = require("./loader/loaderManager");
@@ -56,10 +56,14 @@ const createApp = ({ plugins }) => {
56
56
  return (App) => {
57
57
  const runner = appRuntime.init();
58
58
  const WrapperComponent = (props) => {
59
+ var _a;
59
60
  const element = import_react.default.createElement(
60
61
  App || import_react.default.Fragment,
61
- { ...props },
62
- props.children
62
+ App ? { ...props } : null,
63
+ App ? props.children : import_react.default.cloneElement(props.children, {
64
+ ...(_a = props.children) == null ? void 0 : _a.props,
65
+ ...props
66
+ })
63
67
  );
64
68
  const context = (0, import_react.useContext)(import_runtimeContext.RuntimeReactContext);
65
69
  return runner.provide(
@@ -23,12 +23,12 @@ module.exports = __toCommonJS(DeferredDataScripts_node_exports);
23
23
  var import_jsx_runtime = require("react/jsx-runtime");
24
24
  var import_react = require("react");
25
25
  var import_react_router_dom = require("react-router-dom");
26
- var import_serialize = require("@modern-js/utils/serialize");
26
+ var import_serialize = require("@modern-js/utils/universal/serialize");
27
27
  var import_common = require("../../common");
28
28
  var import_utils = require("./utils");
29
29
  const 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}}))};`;
30
30
  const resolveFnStr = `function r(e,r,o,A){A?_ROUTER_DATA.r[e][r].reject(A):_ROUTER_DATA.r[e][r].resolve(o)};`;
31
- const preResolvedFnStr = `function p(e,r){return void 0!==r?Promise.reject(new Error(r.message)):Promise.resovle(e)};`;
31
+ const preResolvedFnStr = `function p(e,r){return void 0!==r?Promise.reject(new Error(r.message)):Promise.resolve(e)};`;
32
32
  const DeferredDataScripts = () => {
33
33
  const context = (0, import_react.useContext)(import_react_router_dom.UNSAFE_DataRouterContext);
34
34
  const { staticContext } = context || {};
@@ -0,0 +1,205 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var PrefetchLink_exports = {};
29
+ __export(PrefetchLink_exports, {
30
+ PrefetchLink: () => Link,
31
+ PrefetchNavLink: () => NavLink,
32
+ composeEventHandlers: () => composeEventHandlers
33
+ });
34
+ module.exports = __toCommonJS(PrefetchLink_exports);
35
+ var import_jsx_runtime = require("react/jsx-runtime");
36
+ var import_react = __toESM(require("react"));
37
+ var import_react_router_dom = require("react-router-dom");
38
+ var import_core = require("../../core");
39
+ function composeEventHandlers(theirHandler, ourHandler) {
40
+ return (event) => {
41
+ theirHandler == null ? void 0 : theirHandler(event);
42
+ if (!event.defaultPrevented) {
43
+ ourHandler(event);
44
+ }
45
+ };
46
+ }
47
+ const ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
48
+ function usePrefetchBehavior(prefetch, theirElementProps) {
49
+ const [maybePrefetch, setMaybePrefetch] = import_react.default.useState(false);
50
+ const [shouldPrefetch, setShouldPrefetch] = import_react.default.useState(false);
51
+ const { onFocus, onBlur, onMouseEnter, onMouseLeave, onTouchStart } = theirElementProps;
52
+ import_react.default.useEffect(() => {
53
+ if (prefetch === "render") {
54
+ setShouldPrefetch(true);
55
+ }
56
+ }, [prefetch]);
57
+ const setIntent = () => {
58
+ if (prefetch === "intent") {
59
+ setMaybePrefetch(true);
60
+ }
61
+ };
62
+ const cancelIntent = () => {
63
+ if (prefetch === "intent") {
64
+ setMaybePrefetch(false);
65
+ setShouldPrefetch(false);
66
+ }
67
+ };
68
+ import_react.default.useEffect(() => {
69
+ if (maybePrefetch) {
70
+ const id = setTimeout(() => {
71
+ setShouldPrefetch(true);
72
+ }, 100);
73
+ return () => {
74
+ clearTimeout(id);
75
+ };
76
+ }
77
+ }, [maybePrefetch]);
78
+ return [
79
+ shouldPrefetch,
80
+ {
81
+ onFocus: composeEventHandlers(onFocus, setIntent),
82
+ onBlur: composeEventHandlers(onBlur, cancelIntent),
83
+ onMouseEnter: composeEventHandlers(onMouseEnter, setIntent),
84
+ onMouseLeave: composeEventHandlers(onMouseLeave, cancelIntent),
85
+ onTouchStart: composeEventHandlers(onTouchStart, setIntent)
86
+ }
87
+ ];
88
+ }
89
+ async function loadRouteModule(route, routeAssets) {
90
+ const routeId = route.id;
91
+ if (!routeId) {
92
+ return;
93
+ }
94
+ if (!routeAssets[routeId]) {
95
+ return;
96
+ }
97
+ const { chunkIds } = routeAssets[routeId];
98
+ if (!chunkIds) {
99
+ return;
100
+ }
101
+ try {
102
+ await Promise.all(
103
+ chunkIds.map((chunkId) => {
104
+ return __webpack_chunk_load__ == null ? void 0 : __webpack_chunk_load__(String(chunkId));
105
+ })
106
+ );
107
+ } catch (error) {
108
+ console.error(error);
109
+ }
110
+ }
111
+ const getRequestUrl = (pathname, routeId) => {
112
+ const LOADER_ID_PARAM = "__loader";
113
+ const DIRECT_PARAM = "__ssrDirect";
114
+ const { protocol, host } = window.location;
115
+ const url = new URL(pathname, `${protocol}//${host}`);
116
+ url.searchParams.append(LOADER_ID_PARAM, routeId);
117
+ url.searchParams.append(DIRECT_PARAM, "true");
118
+ return url;
119
+ };
120
+ const createDataHref = (href) => {
121
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("link", { rel: "prefetch", as: "fetch", href }, href);
122
+ };
123
+ const getDataHref = (route, pathname, basename) => {
124
+ const { id } = route;
125
+ const path = basename === "/" ? pathname : `${basename}${pathname}`;
126
+ const url = getRequestUrl(path, id);
127
+ return createDataHref(url.toString());
128
+ };
129
+ const PrefetchPageLinks = ({ pathname }) => {
130
+ const context = (0, import_react.useContext)(import_core.RuntimeReactContext);
131
+ const { routeManifest, routes } = context;
132
+ const { routeAssets } = routeManifest;
133
+ const matches = Array.isArray(routes) ? (0, import_react_router_dom.matchRoutes)(routes, pathname) : [];
134
+ if (Array.isArray(matches)) {
135
+ matches == null ? void 0 : matches.forEach((match) => loadRouteModule(match.route, routeAssets));
136
+ }
137
+ if (!window._SSR_DATA) {
138
+ return null;
139
+ }
140
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
141
+ PrefetchDataLinks,
142
+ {
143
+ matches,
144
+ pathname,
145
+ routeManifest
146
+ }
147
+ );
148
+ };
149
+ const PrefetchDataLinks = ({ matches, pathname, routeManifest }) => {
150
+ const currentMatches = (0, import_react_router_dom.useMatches)();
151
+ const basename = (0, import_react_router_dom.useHref)("/");
152
+ const dataHrefs = (0, import_react.useMemo)(() => {
153
+ return matches == null ? void 0 : matches.filter(
154
+ (match) => match.route.loader && typeof match.route.loader === "function" && match.route.loader.length > 0
155
+ ).filter((match, index) => {
156
+ const currentMatch = currentMatches[index];
157
+ if (!currentMatch || currentMatch.id !== match.route.id) {
158
+ return true;
159
+ }
160
+ if (currentMatch.pathname !== match.pathname) {
161
+ return true;
162
+ }
163
+ if (currentMatch.pathname.endsWith("*") && currentMatch.params["*"] !== match.params["*"]) {
164
+ return true;
165
+ }
166
+ return false;
167
+ }).map((match) => getDataHref(match.route, pathname, basename));
168
+ }, [matches, pathname, routeManifest]);
169
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: dataHrefs });
170
+ };
171
+ const createPrefetchLink = (Link2) => {
172
+ return import_react.default.forwardRef(
173
+ ({ to, prefetch = "none", ...props }, forwardedRef) => {
174
+ const isAbsolute = typeof to === "string" && ABSOLUTE_URL_REGEX.test(to);
175
+ const [shouldPrefetch, prefetchHandlers] = usePrefetchBehavior(
176
+ prefetch,
177
+ props
178
+ );
179
+ const resolvedPath = (0, import_react_router_dom.useResolvedPath)(to);
180
+ const { pathname } = resolvedPath;
181
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
182
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
183
+ Link2,
184
+ {
185
+ ref: forwardedRef,
186
+ to,
187
+ ...props,
188
+ ...prefetchHandlers
189
+ }
190
+ ),
191
+ shouldPrefetch && __webpack_chunk_load__ && !isAbsolute ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PrefetchPageLinks, { pathname }) : null
192
+ ] });
193
+ }
194
+ );
195
+ };
196
+ const Link = createPrefetchLink(import_react_router_dom.Link);
197
+ Link.displayName = "Link";
198
+ const NavLink = createPrefetchLink(import_react_router_dom.NavLink);
199
+ NavLink.displayName = "NavLink";
200
+ // Annotate the CommonJS export names for ESM import in node:
201
+ 0 && (module.exports = {
202
+ PrefetchLink,
203
+ PrefetchNavLink,
204
+ composeEventHandlers
205
+ });
@@ -27,6 +27,8 @@ __export(runtime_exports, {
27
27
  NavLink: () => import_react_router_dom.NavLink,
28
28
  Navigate: () => import_react_router_dom.Navigate,
29
29
  Outlet: () => import_react_router_dom.Outlet,
30
+ PrefetchLink: () => import_PrefetchLink.PrefetchLink,
31
+ PrefetchNavLink: () => import_PrefetchLink.PrefetchNavLink,
30
32
  Route: () => import_react_router_dom.Route,
31
33
  Router: () => import_react_router_dom.Router,
32
34
  RouterProvider: () => import_react_router_dom.RouterProvider,
@@ -81,8 +83,9 @@ module.exports = __toCommonJS(runtime_exports);
81
83
  var import_plugin = require("./plugin");
82
84
  var import_plugin2 = require("./plugin");
83
85
  __reExport(runtime_exports, require("./withRouter"), module.exports);
86
+ var import_PrefetchLink = require("./PrefetchLink");
84
87
  var import_react_router_dom = require("react-router-dom");
85
- var import_remix_router = require("@modern-js/utils/remix-router");
88
+ var import_remix_router = require("@modern-js/utils/universal/remix-router");
86
89
  var runtime_default = import_plugin.routerPlugin;
87
90
  // Annotate the CommonJS export names for ESM import in node:
88
91
  0 && (module.exports = {
@@ -95,6 +98,8 @@ var runtime_default = import_plugin.routerPlugin;
95
98
  NavLink,
96
99
  Navigate,
97
100
  Outlet,
101
+ PrefetchLink,
102
+ PrefetchNavLink,
98
103
  Route,
99
104
  Router,
100
105
  RouterProvider,
@@ -60,6 +60,7 @@ const routerPlugin = ({
60
60
  createRoutes
61
61
  }) => {
62
62
  const select = (pathname) => serverBase.find((baseUrl) => pathname.search(baseUrl) === 0) || "/";
63
+ let routes = [];
63
64
  finalRouteConfig = routesConfig;
64
65
  return {
65
66
  name: "@modern-js/plugin-router",
@@ -70,6 +71,11 @@ const routerPlugin = ({
70
71
  useMatches: import_react_router_dom.useMatches,
71
72
  useLocation: import_react_router_dom.useLocation
72
73
  };
74
+ Object.defineProperty(context, "routes", {
75
+ get() {
76
+ return routes;
77
+ }
78
+ });
73
79
  return next({ context });
74
80
  },
75
81
  hoc: ({ App }, next) => {
@@ -80,7 +86,12 @@ const routerPlugin = ({
80
86
  return (props) => {
81
87
  var _a;
82
88
  beforeCreateRouter = true;
83
- const routes = createRoutes ? createRoutes() : (0, import_react_router_dom.createRoutesFromElements)((0, import_utils.renderRoutes)(finalRouteConfig));
89
+ routes = createRoutes ? createRoutes() : (0, import_react_router_dom.createRoutesFromElements)(
90
+ (0, import_utils.renderRoutes)({
91
+ routesConfig: finalRouteConfig,
92
+ props
93
+ })
94
+ );
84
95
  const baseUrl = ((_a = window._SERVER_DATA) == null ? void 0 : _a.router.baseUrl) || select(location.pathname);
85
96
  const _basename = baseUrl === "/" ? (0, import_utils.urlJoin)(baseUrl, basename) : baseUrl;
86
97
  let hydrationData = window._ROUTER_DATA;
@@ -34,7 +34,7 @@ __export(plugin_node_exports, {
34
34
  module.exports = __toCommonJS(plugin_node_exports);
35
35
  var import_jsx_runtime = require("react/jsx-runtime");
36
36
  var import_react = require("react");
37
- var import_remix_router = require("@modern-js/utils/remix-router");
37
+ var import_remix_router = require("@modern-js/utils/universal/remix-router");
38
38
  var import_server = require("react-router-dom/server");
39
39
  var import_hoist_non_react_statics = __toESM(require("hoist-non-react-statics"));
40
40
  var import_react_router_dom = require("react-router-dom");
@@ -84,7 +84,12 @@ const routerPlugin = ({
84
84
  const { request, mode: ssrMode } = context.ssrContext;
85
85
  const baseUrl = request.baseUrl;
86
86
  const _basename = baseUrl === "/" ? (0, import_utils.urlJoin)(baseUrl, basename) : baseUrl;
87
- const routes = createRoutes ? createRoutes() : (0, import_react_router_dom.createRoutesFromElements)((0, import_utils.renderRoutes)(routesConfig, ssrMode));
87
+ const routes = createRoutes ? createRoutes() : (0, import_react_router_dom.createRoutesFromElements)(
88
+ (0, import_utils.renderRoutes)({
89
+ routesConfig,
90
+ ssrMode
91
+ })
92
+ );
88
93
  const { query } = (0, import_remix_router.createStaticHandler)(routes, {
89
94
  basename: _basename
90
95
  });
@@ -38,26 +38,28 @@ __export(utils_exports, {
38
38
  module.exports = __toCommonJS(utils_exports);
39
39
  var import_jsx_runtime = require("react/jsx-runtime");
40
40
  var import_react_router_dom = require("react-router-dom");
41
- var import_nestedRoutes = require("@modern-js/utils/nestedRoutes");
42
- var import_remix_router = require("@modern-js/utils/remix-router");
41
+ var import_remix_router = require("@modern-js/utils/universal/remix-router");
42
+ var import_nestedRoutes = require("@modern-js/utils/universal/nestedRoutes");
43
43
  var import_DefaultNotFound = require("./DefaultNotFound");
44
44
  var import_DeferredDataScripts = __toESM(require("./DeferredDataScripts"));
45
45
  function getRouteComponents(routes, {
46
46
  globalApp,
47
- ssrMode
47
+ ssrMode,
48
+ props
48
49
  }) {
49
- const Layout = ({ Component, ...props }) => {
50
+ const Layout = ({ Component, ...props2 }) => {
50
51
  const GlobalLayout = globalApp;
51
52
  if (!GlobalLayout) {
52
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Component, { ...props });
53
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Component, { ...props2 });
53
54
  }
54
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(GlobalLayout, { Component, ...props });
55
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(GlobalLayout, { Component, ...props2 });
55
56
  };
56
57
  const routeElements = [];
57
58
  for (const route of routes) {
58
59
  if (route.type === "nested") {
59
60
  const routeElement = (0, import_nestedRoutes.renderNestedRoute)(route, {
60
- DeferredDataComponent: ssrMode === "stream" ? import_DeferredDataScripts.default : void 0
61
+ DeferredDataComponent: ssrMode === "stream" ? import_DeferredDataScripts.default : void 0,
62
+ props
61
63
  });
62
64
  routeElements.push(routeElement);
63
65
  } else {
@@ -75,7 +77,11 @@ function getRouteComponents(routes, {
75
77
  routeElements.push(/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react_router_dom.Route, { path: "*", element: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_DefaultNotFound.DefaultNotFound, {}) }, "*"));
76
78
  return routeElements;
77
79
  }
78
- function renderRoutes(routesConfig, ssrMode) {
80
+ function renderRoutes({
81
+ routesConfig,
82
+ props,
83
+ ssrMode
84
+ }) {
79
85
  if (!routesConfig) {
80
86
  return null;
81
87
  }
@@ -83,7 +89,11 @@ function renderRoutes(routesConfig, ssrMode) {
83
89
  if (!routes) {
84
90
  return null;
85
91
  }
86
- const routeElements = getRouteComponents(routes, { globalApp, ssrMode });
92
+ const routeElements = getRouteComponents(routes, {
93
+ globalApp,
94
+ ssrMode,
95
+ props
96
+ });
87
97
  return routeElements;
88
98
  }
89
99
  function getLocation(serverContext) {
@@ -48,6 +48,9 @@ const ssr = (config) => ({
48
48
  var _a;
49
49
  const hydrateContext = {
50
50
  ...context,
51
+ get routes() {
52
+ return context.routes;
53
+ },
51
54
  _hydration: true
52
55
  };
53
56
  const callback = () => {
@@ -20,7 +20,7 @@ __export(buildTemplate_after_exports, {
20
20
  buildShellAfterTemplate: () => buildShellAfterTemplate
21
21
  });
22
22
  module.exports = __toCommonJS(buildTemplate_after_exports);
23
- var import_serialize = require("@modern-js/utils/serialize");
23
+ var import_serialize = require("@modern-js/utils/universal/serialize");
24
24
  var import_buildTemplate = require("./buildTemplate.share");
25
25
  function buildShellAfterTemplate(afterAppTemplate, options) {
26
26
  const callbacks = [injectSSRDataScript];
@@ -29,12 +29,19 @@ function buildShellAfterTemplate(afterAppTemplate, options) {
29
29
  const ssrDataScript = buildSSRDataScript();
30
30
  return template.replace("<!--<?- SSRDataScript ?>-->", ssrDataScript);
31
31
  function buildSSRDataScript() {
32
- const { ssrContext, renderLevel } = options;
32
+ const {
33
+ context: { ssrContext, initialData, __i18nData__ },
34
+ renderLevel
35
+ } = options;
33
36
  const { request, enableUnsafeCtx } = ssrContext;
34
37
  const unsafeContext = {
35
38
  headers: request.headers
36
39
  };
37
40
  const SSRData = {
41
+ data: {
42
+ initialData,
43
+ i18nData: __i18nData__
44
+ },
38
45
  context: {
39
46
  request: {
40
47
  params: request.params,
@@ -71,8 +71,8 @@ function getHeadTemplate(beforeEntryTemplate, context) {
71
71
  if (routeId) {
72
72
  const routeManifest2 = routeAssets[routeId];
73
73
  if (routeManifest2) {
74
- const { assets = [] } = routeManifest2;
75
- const _cssChunks = assets.filter(
74
+ const { referenceCssAssets = [] } = routeManifest2;
75
+ const _cssChunks = referenceCssAssets.filter(
76
76
  (asset) => asset == null ? void 0 : asset.endsWith(".css")
77
77
  );
78
78
  cssChunks.push(..._cssChunks);
@@ -24,15 +24,14 @@ var import_buildTemplate = require("./buildTemplate.after");
24
24
  var import_bulidTemplate = require("./bulidTemplate.before");
25
25
  const HTML_SEPARATOR = "<!--<?- html ?>-->";
26
26
  const getTemplates = (context, renderLevel) => {
27
- const { ssrContext, routerContext } = context;
27
+ const { ssrContext } = context;
28
28
  const [beforeAppTemplate = "", afterAppHtmlTemplate = ""] = ssrContext.template.split(HTML_SEPARATOR) || [];
29
29
  const builtBeforeTemplate = (0, import_bulidTemplate.buildShellBeforeTemplate)(
30
30
  beforeAppTemplate,
31
31
  context
32
32
  );
33
33
  const builtAfterTemplate = (0, import_buildTemplate.buildShellAfterTemplate)(afterAppHtmlTemplate, {
34
- ssrContext,
35
- routerContext,
34
+ context,
36
35
  renderLevel
37
36
  });
38
37
  return {
@@ -32,7 +32,7 @@ __export(entry_exports, {
32
32
  module.exports = __toCommonJS(entry_exports);
33
33
  var import_react = __toESM(require("react"));
34
34
  var import_server = __toESM(require("react-dom/server"));
35
- var import_serialize = require("@modern-js/utils/serialize");
35
+ var import_serialize = require("@modern-js/utils/universal/serialize");
36
36
  var import_react_helmet = __toESM(require("react-helmet"));
37
37
  var import_utils = require("../../../router/runtime/utils");
38
38
  var import_helmet = __toESM(require("../helmet"));
@@ -212,7 +212,7 @@ var __generator = this && this.__generator || function(thisArg, body) {
212
212
  import { jsx } from "react/jsx-runtime";
213
213
  import React, { useContext, useMemo } from "react";
214
214
  import hoistNonReactStatics from "hoist-non-react-statics";
215
- import { ROUTE_MANIFEST } from "@modern-js/utils/constants";
215
+ import { ROUTE_MANIFEST } from "@modern-js/utils/universal/constants";
216
216
  import { RuntimeReactContext } from "../runtimeContext";
217
217
  import { runtime } from "./plugin";
218
218
  import { createLoaderManager } from "./loader/loaderManager";
@@ -237,7 +237,8 @@ var createApp = function(param) {
237
237
  return function(App) {
238
238
  var runner = appRuntime.init();
239
239
  var WrapperComponent = function(props) {
240
- var element = React.createElement(App || React.Fragment, _objectSpread({}, props), props.children);
240
+ var _props_children;
241
+ var element = React.createElement(App || React.Fragment, App ? _objectSpread({}, props) : null, App ? props.children : React.cloneElement(props.children, _objectSpread({}, (_props_children = props.children) === null || _props_children === void 0 ? void 0 : _props_children.props, props)));
241
242
  var context = useContext(RuntimeReactContext);
242
243
  return runner.provide({
243
244
  element: element,
@@ -47,12 +47,12 @@ function _unsupportedIterableToArray(o, minLen) {
47
47
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
48
48
  import { Suspense, useEffect, useRef, useMemo, useContext } from "react";
49
49
  import { Await, UNSAFE_DataRouterContext as DataRouterContext, useAsyncError } from "react-router-dom";
50
- import { serializeJson } from "@modern-js/utils/serialize";
50
+ import { serializeJson } from "@modern-js/utils/universal/serialize";
51
51
  import { JSX_SHELL_STREAM_END_MARK } from "../../common";
52
52
  import { serializeErrors } from "./utils";
53
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
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)};";
55
+ var preResolvedFnStr = "function p(e,r){return void 0!==r?Promise.reject(new Error(r.message)):Promise.resolve(e)};";
56
56
  var DeferredDataScripts = function() {
57
57
  var context = useContext(DataRouterContext);
58
58
  var staticContext = (context || {}).staticContext;