@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
@@ -0,0 +1,446 @@
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 asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
10
+ try {
11
+ var info = gen[key](arg);
12
+ var value = info.value;
13
+ } catch (error) {
14
+ reject(error);
15
+ return;
16
+ }
17
+ if (info.done) {
18
+ resolve(value);
19
+ } else {
20
+ Promise.resolve(value).then(_next, _throw);
21
+ }
22
+ }
23
+ function _asyncToGenerator(fn) {
24
+ return function() {
25
+ var self = this, args = arguments;
26
+ return new Promise(function(resolve, reject) {
27
+ var gen = fn.apply(self, args);
28
+ function _next(value) {
29
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
30
+ }
31
+ function _throw(err) {
32
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
33
+ }
34
+ _next(undefined);
35
+ });
36
+ };
37
+ }
38
+ function _defineProperty(obj, key, value) {
39
+ if (key in obj) {
40
+ Object.defineProperty(obj, key, {
41
+ value: value,
42
+ enumerable: true,
43
+ configurable: true,
44
+ writable: true
45
+ });
46
+ } else {
47
+ obj[key] = value;
48
+ }
49
+ return obj;
50
+ }
51
+ function _iterableToArrayLimit(arr, i) {
52
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
53
+ if (_i == null) return;
54
+ var _arr = [];
55
+ var _n = true;
56
+ var _d = false;
57
+ var _s, _e;
58
+ try {
59
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
60
+ _arr.push(_s.value);
61
+ if (i && _arr.length === i) break;
62
+ }
63
+ } catch (err) {
64
+ _d = true;
65
+ _e = err;
66
+ } finally{
67
+ try {
68
+ if (!_n && _i["return"] != null) _i["return"]();
69
+ } finally{
70
+ if (_d) throw _e;
71
+ }
72
+ }
73
+ return _arr;
74
+ }
75
+ function _nonIterableRest() {
76
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
77
+ }
78
+ function _objectSpread(target) {
79
+ for(var i = 1; i < arguments.length; i++){
80
+ var source = arguments[i] != null ? arguments[i] : {};
81
+ var ownKeys = Object.keys(source);
82
+ if (typeof Object.getOwnPropertySymbols === "function") {
83
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
84
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
85
+ }));
86
+ }
87
+ ownKeys.forEach(function(key) {
88
+ _defineProperty(target, key, source[key]);
89
+ });
90
+ }
91
+ return target;
92
+ }
93
+ function _objectWithoutProperties(source, excluded) {
94
+ if (source == null) return {};
95
+ var target = _objectWithoutPropertiesLoose(source, excluded);
96
+ var key, i;
97
+ if (Object.getOwnPropertySymbols) {
98
+ var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
99
+ for(i = 0; i < sourceSymbolKeys.length; i++){
100
+ key = sourceSymbolKeys[i];
101
+ if (excluded.indexOf(key) >= 0) continue;
102
+ if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
103
+ target[key] = source[key];
104
+ }
105
+ }
106
+ return target;
107
+ }
108
+ function _objectWithoutPropertiesLoose(source, excluded) {
109
+ if (source == null) return {};
110
+ var target = {};
111
+ var sourceKeys = Object.keys(source);
112
+ var key, i;
113
+ for(i = 0; i < sourceKeys.length; i++){
114
+ key = sourceKeys[i];
115
+ if (excluded.indexOf(key) >= 0) continue;
116
+ target[key] = source[key];
117
+ }
118
+ return target;
119
+ }
120
+ function _slicedToArray(arr, i) {
121
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
122
+ }
123
+ function _unsupportedIterableToArray(o, minLen) {
124
+ if (!o) return;
125
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
126
+ var n = Object.prototype.toString.call(o).slice(8, -1);
127
+ if (n === "Object" && o.constructor) n = o.constructor.name;
128
+ if (n === "Map" || n === "Set") return Array.from(n);
129
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
130
+ }
131
+ var __generator = this && this.__generator || function(thisArg, body) {
132
+ var f, y, t, g, _ = {
133
+ label: 0,
134
+ sent: function() {
135
+ if (t[0] & 1) throw t[1];
136
+ return t[1];
137
+ },
138
+ trys: [],
139
+ ops: []
140
+ };
141
+ return g = {
142
+ next: verb(0),
143
+ "throw": verb(1),
144
+ "return": verb(2)
145
+ }, typeof Symbol === "function" && (g[Symbol.iterator] = function() {
146
+ return this;
147
+ }), g;
148
+ function verb(n) {
149
+ return function(v) {
150
+ return step([
151
+ n,
152
+ v
153
+ ]);
154
+ };
155
+ }
156
+ function step(op) {
157
+ if (f) throw new TypeError("Generator is already executing.");
158
+ while(_)try {
159
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
160
+ if (y = 0, t) op = [
161
+ op[0] & 2,
162
+ t.value
163
+ ];
164
+ switch(op[0]){
165
+ case 0:
166
+ case 1:
167
+ t = op;
168
+ break;
169
+ case 4:
170
+ _.label++;
171
+ return {
172
+ value: op[1],
173
+ done: false
174
+ };
175
+ case 5:
176
+ _.label++;
177
+ y = op[1];
178
+ op = [
179
+ 0
180
+ ];
181
+ continue;
182
+ case 7:
183
+ op = _.ops.pop();
184
+ _.trys.pop();
185
+ continue;
186
+ default:
187
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
188
+ _ = 0;
189
+ continue;
190
+ }
191
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
192
+ _.label = op[1];
193
+ break;
194
+ }
195
+ if (op[0] === 6 && _.label < t[1]) {
196
+ _.label = t[1];
197
+ t = op;
198
+ break;
199
+ }
200
+ if (t && _.label < t[2]) {
201
+ _.label = t[2];
202
+ _.ops.push(op);
203
+ break;
204
+ }
205
+ if (t[2]) _.ops.pop();
206
+ _.trys.pop();
207
+ continue;
208
+ }
209
+ op = body.call(thisArg, _);
210
+ } catch (e) {
211
+ op = [
212
+ 6,
213
+ e
214
+ ];
215
+ y = 0;
216
+ } finally{
217
+ f = t = 0;
218
+ }
219
+ if (op[0] & 5) throw op[1];
220
+ return {
221
+ value: op[0] ? op[1] : void 0,
222
+ done: true
223
+ };
224
+ }
225
+ };
226
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
227
+ import React, { useContext, useMemo } from "react";
228
+ import { Link as RouterLink, matchRoutes, useResolvedPath, useHref, useMatches, NavLink as RouterNavLink } from "react-router-dom";
229
+ import { RuntimeReactContext } from "../../core";
230
+ function composeEventHandlers(theirHandler, ourHandler) {
231
+ return function(event) {
232
+ theirHandler === null || theirHandler === void 0 ? void 0 : theirHandler(event);
233
+ if (!event.defaultPrevented) {
234
+ ourHandler(event);
235
+ }
236
+ };
237
+ }
238
+ var ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
239
+ function usePrefetchBehavior(prefetch, theirElementProps) {
240
+ var _React_useState = _slicedToArray(React.useState(false), 2), maybePrefetch = _React_useState[0], setMaybePrefetch = _React_useState[1];
241
+ var _React_useState1 = _slicedToArray(React.useState(false), 2), shouldPrefetch = _React_useState1[0], setShouldPrefetch = _React_useState1[1];
242
+ var onFocus = theirElementProps.onFocus, onBlur = theirElementProps.onBlur, onMouseEnter = theirElementProps.onMouseEnter, onMouseLeave = theirElementProps.onMouseLeave, onTouchStart = theirElementProps.onTouchStart;
243
+ React.useEffect(function() {
244
+ if (prefetch === "render") {
245
+ setShouldPrefetch(true);
246
+ }
247
+ }, [
248
+ prefetch
249
+ ]);
250
+ var setIntent = function() {
251
+ if (prefetch === "intent") {
252
+ setMaybePrefetch(true);
253
+ }
254
+ };
255
+ var cancelIntent = function() {
256
+ if (prefetch === "intent") {
257
+ setMaybePrefetch(false);
258
+ setShouldPrefetch(false);
259
+ }
260
+ };
261
+ React.useEffect(function() {
262
+ if (maybePrefetch) {
263
+ var id = setTimeout(function() {
264
+ setShouldPrefetch(true);
265
+ }, 100);
266
+ return function() {
267
+ clearTimeout(id);
268
+ };
269
+ }
270
+ }, [
271
+ maybePrefetch
272
+ ]);
273
+ return [
274
+ shouldPrefetch,
275
+ {
276
+ onFocus: composeEventHandlers(onFocus, setIntent),
277
+ onBlur: composeEventHandlers(onBlur, cancelIntent),
278
+ onMouseEnter: composeEventHandlers(onMouseEnter, setIntent),
279
+ onMouseLeave: composeEventHandlers(onMouseLeave, cancelIntent),
280
+ onTouchStart: composeEventHandlers(onTouchStart, setIntent)
281
+ }
282
+ ];
283
+ }
284
+ function loadRouteModule(route, routeAssets) {
285
+ return _loadRouteModule.apply(this, arguments);
286
+ }
287
+ function _loadRouteModule() {
288
+ _loadRouteModule = _asyncToGenerator(function(route, routeAssets) {
289
+ var routeId, chunkIds, error;
290
+ return __generator(this, function(_state) {
291
+ switch(_state.label){
292
+ case 0:
293
+ routeId = route.id;
294
+ if (!routeId) {
295
+ return [
296
+ 2
297
+ ];
298
+ }
299
+ if (!routeAssets[routeId]) {
300
+ return [
301
+ 2
302
+ ];
303
+ }
304
+ chunkIds = routeAssets[routeId].chunkIds;
305
+ if (!chunkIds) {
306
+ return [
307
+ 2
308
+ ];
309
+ }
310
+ _state.label = 1;
311
+ case 1:
312
+ _state.trys.push([
313
+ 1,
314
+ 3,
315
+ ,
316
+ 4
317
+ ]);
318
+ return [
319
+ 4,
320
+ Promise.all(chunkIds.map(function(chunkId) {
321
+ return __webpack_chunk_load__ === null || __webpack_chunk_load__ === void 0 ? void 0 : __webpack_chunk_load__(String(chunkId));
322
+ }))
323
+ ];
324
+ case 2:
325
+ _state.sent();
326
+ return [
327
+ 3,
328
+ 4
329
+ ];
330
+ case 3:
331
+ error = _state.sent();
332
+ console.error(error);
333
+ return [
334
+ 3,
335
+ 4
336
+ ];
337
+ case 4:
338
+ return [
339
+ 2
340
+ ];
341
+ }
342
+ });
343
+ });
344
+ return _loadRouteModule.apply(this, arguments);
345
+ }
346
+ var getRequestUrl = function(pathname, routeId) {
347
+ var LOADER_ID_PARAM = "__loader";
348
+ var DIRECT_PARAM = "__ssrDirect";
349
+ var _window_location = window.location, protocol = _window_location.protocol, host = _window_location.host;
350
+ var url = new URL(pathname, "".concat(protocol, "//").concat(host));
351
+ url.searchParams.append(LOADER_ID_PARAM, routeId);
352
+ url.searchParams.append(DIRECT_PARAM, "true");
353
+ return url;
354
+ };
355
+ var createDataHref = function(href) {
356
+ return /* @__PURE__ */ jsx("link", {
357
+ rel: "prefetch",
358
+ as: "fetch",
359
+ href: href
360
+ }, href);
361
+ };
362
+ var getDataHref = function(route, pathname, basename) {
363
+ var id = route.id;
364
+ var path = basename === "/" ? pathname : "".concat(basename).concat(pathname);
365
+ var url = getRequestUrl(path, id);
366
+ return createDataHref(url.toString());
367
+ };
368
+ var PrefetchPageLinks = function(param) {
369
+ var pathname = param.pathname;
370
+ var context = useContext(RuntimeReactContext);
371
+ var routeManifest = context.routeManifest, routes = context.routes;
372
+ var routeAssets = routeManifest.routeAssets;
373
+ var matches = Array.isArray(routes) ? matchRoutes(routes, pathname) : [];
374
+ if (Array.isArray(matches)) {
375
+ matches === null || matches === void 0 ? void 0 : matches.forEach(function(match) {
376
+ return loadRouteModule(match.route, routeAssets);
377
+ });
378
+ }
379
+ if (!window._SSR_DATA) {
380
+ return null;
381
+ }
382
+ return /* @__PURE__ */ jsx(PrefetchDataLinks, {
383
+ matches: matches,
384
+ pathname: pathname,
385
+ routeManifest: routeManifest
386
+ });
387
+ };
388
+ var PrefetchDataLinks = function(param) {
389
+ var matches = param.matches, pathname = param.pathname, routeManifest = param.routeManifest;
390
+ var currentMatches = useMatches();
391
+ var basename = useHref("/");
392
+ var dataHrefs = useMemo(function() {
393
+ return matches === null || matches === void 0 ? void 0 : matches.filter(function(match) {
394
+ return match.route.loader && typeof match.route.loader === "function" && match.route.loader.length > 0;
395
+ }).filter(function(match, index) {
396
+ var currentMatch = currentMatches[index];
397
+ if (!currentMatch || currentMatch.id !== match.route.id) {
398
+ return true;
399
+ }
400
+ if (currentMatch.pathname !== match.pathname) {
401
+ return true;
402
+ }
403
+ if (currentMatch.pathname.endsWith("*") && currentMatch.params["*"] !== match.params["*"]) {
404
+ return true;
405
+ }
406
+ return false;
407
+ }).map(function(match) {
408
+ return getDataHref(match.route, pathname, basename);
409
+ });
410
+ }, [
411
+ matches,
412
+ pathname,
413
+ routeManifest
414
+ ]);
415
+ return /* @__PURE__ */ jsx(Fragment, {
416
+ children: dataHrefs
417
+ });
418
+ };
419
+ var createPrefetchLink = function(Link2) {
420
+ return React.forwardRef(function(_param, forwardedRef) {
421
+ var to = _param.to, _param_prefetch = _param.prefetch, prefetch = _param_prefetch === void 0 ? "none" : _param_prefetch, props = _objectWithoutProperties(_param, [
422
+ "to",
423
+ "prefetch"
424
+ ]);
425
+ var isAbsolute = typeof to === "string" && ABSOLUTE_URL_REGEX.test(to);
426
+ var _usePrefetchBehavior = _slicedToArray(usePrefetchBehavior(prefetch, props), 2), shouldPrefetch = _usePrefetchBehavior[0], prefetchHandlers = _usePrefetchBehavior[1];
427
+ var resolvedPath = useResolvedPath(to);
428
+ var pathname = resolvedPath.pathname;
429
+ return /* @__PURE__ */ jsxs(Fragment, {
430
+ children: [
431
+ /* @__PURE__ */ jsx(Link2, _objectSpread({
432
+ ref: forwardedRef,
433
+ to: to
434
+ }, props, prefetchHandlers)),
435
+ shouldPrefetch && __webpack_chunk_load__ && !isAbsolute ? /* @__PURE__ */ jsx(PrefetchPageLinks, {
436
+ pathname: pathname
437
+ }) : null
438
+ ]
439
+ });
440
+ });
441
+ };
442
+ var Link = createPrefetchLink(RouterLink);
443
+ Link.displayName = "Link";
444
+ var NavLink = createPrefetchLink(RouterNavLink);
445
+ NavLink.displayName = "NavLink";
446
+ export { Link as PrefetchLink, NavLink as PrefetchNavLink, composeEventHandlers };
@@ -2,6 +2,7 @@ import { routerPlugin } from "./plugin";
2
2
  var runtime_default = routerPlugin;
3
3
  import { modifyRoutes } from "./plugin";
4
4
  export * from "./withRouter";
5
+ import { PrefetchLink, PrefetchNavLink } from "./PrefetchLink";
5
6
  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 };
7
+ import { defer, json, redirect } from "@modern-js/utils/universal/remix-router";
8
+ export { Await, BrowserRouter, Form, HashRouter, Link, MemoryRouter, NavLink, Navigate, Outlet, PrefetchLink, PrefetchNavLink, 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 };
@@ -74,6 +74,7 @@ var routerPlugin = function(param) {
74
74
  return pathname.search(baseUrl) === 0;
75
75
  }) || "/";
76
76
  };
77
+ var routes = [];
77
78
  finalRouteConfig = routesConfig;
78
79
  return {
79
80
  name: "@modern-js/plugin-router",
@@ -85,6 +86,11 @@ var routerPlugin = function(param) {
85
86
  useMatches: useMatches,
86
87
  useLocation: useLocation
87
88
  };
89
+ Object.defineProperty(context, "routes", {
90
+ get: function get() {
91
+ return routes;
92
+ }
93
+ });
88
94
  return next({
89
95
  context: context
90
96
  });
@@ -100,7 +106,10 @@ var routerPlugin = function(param) {
100
106
  return function(props) {
101
107
  var _window__SERVER_DATA;
102
108
  beforeCreateRouter = true;
103
- var routes = createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes(finalRouteConfig));
109
+ routes = createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes({
110
+ routesConfig: finalRouteConfig,
111
+ props: props
112
+ }));
104
113
  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
114
  var _basename = baseUrl === "/" ? urlJoin(baseUrl, basename) : baseUrl;
106
115
  var hydrationData = window._ROUTER_DATA;
@@ -229,7 +229,7 @@ var __generator = this && this.__generator || function(thisArg, body) {
229
229
  };
230
230
  import { jsx } from "react/jsx-runtime";
231
231
  import { useContext } from "react";
232
- import { createStaticHandler } from "@modern-js/utils/remix-router";
232
+ import { createStaticHandler } from "@modern-js/utils/universal/remix-router";
233
233
  import { createStaticRouter, StaticRouterProvider } from "react-router-dom/server";
234
234
  import hoistNonReactStatics from "hoist-non-react-statics";
235
235
  import { createRoutesFromElements } from "react-router-dom";
@@ -321,7 +321,10 @@ var routerPlugin = function(param) {
321
321
  _context_ssrContext = context.ssrContext, request = _context_ssrContext.request, ssrMode = _context_ssrContext.mode;
322
322
  baseUrl = request.baseUrl;
323
323
  _basename = baseUrl === "/" ? urlJoin(baseUrl, basename) : baseUrl;
324
- routes = createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes(routesConfig, ssrMode));
324
+ routes = createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes({
325
+ routesConfig: routesConfig,
326
+ ssrMode: ssrMode
327
+ }));
325
328
  query = createStaticHandler(routes, {
326
329
  basename: _basename
327
330
  }).query;
@@ -132,23 +132,23 @@ function _unsupportedIterableToArray(o, minLen) {
132
132
  }
133
133
  import { jsx } from "react/jsx-runtime";
134
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";
135
+ import { ErrorResponse, isRouteErrorResponse } from "@modern-js/utils/universal/remix-router";
136
+ import { renderNestedRoute } from "@modern-js/utils/universal/nestedRoutes";
137
137
  import { DefaultNotFound } from "./DefaultNotFound";
138
138
  import DeferredDataScripts from "./DeferredDataScripts";
139
139
  function getRouteComponents(routes, param) {
140
- var globalApp = param.globalApp, ssrMode = param.ssrMode;
140
+ var globalApp = param.globalApp, ssrMode = param.ssrMode, props = param.props;
141
141
  var Layout = function(_param) {
142
- var Component = _param.Component, props = _objectWithoutProperties(_param, [
142
+ var Component = _param.Component, props2 = _objectWithoutProperties(_param, [
143
143
  "Component"
144
144
  ]);
145
145
  var GlobalLayout = globalApp;
146
146
  if (!GlobalLayout) {
147
- return /* @__PURE__ */ jsx(Component, _objectSpread({}, props));
147
+ return /* @__PURE__ */ jsx(Component, _objectSpread({}, props2));
148
148
  }
149
149
  return /* @__PURE__ */ jsx(GlobalLayout, _objectSpread({
150
150
  Component: Component
151
- }, props));
151
+ }, props2));
152
152
  };
153
153
  var routeElements = [];
154
154
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
@@ -157,7 +157,8 @@ function getRouteComponents(routes, param) {
157
157
  var route = _step.value;
158
158
  if (route.type === "nested") {
159
159
  var routeElement = renderNestedRoute(route, {
160
- DeferredDataComponent: ssrMode === "stream" ? DeferredDataScripts : void 0
160
+ DeferredDataComponent: ssrMode === "stream" ? DeferredDataScripts : void 0,
161
+ props: props
161
162
  });
162
163
  routeElements.push(routeElement);
163
164
  } else {
@@ -190,7 +191,8 @@ function getRouteComponents(routes, param) {
190
191
  }, "*"));
191
192
  return routeElements;
192
193
  }
193
- function renderRoutes(routesConfig, ssrMode) {
194
+ function renderRoutes(param) {
195
+ var routesConfig = param.routesConfig, props = param.props, ssrMode = param.ssrMode;
194
196
  if (!routesConfig) {
195
197
  return null;
196
198
  }
@@ -200,7 +202,8 @@ function renderRoutes(routesConfig, ssrMode) {
200
202
  }
201
203
  var routeElements = getRouteComponents(routes, {
202
204
  globalApp: globalApp,
203
- ssrMode: ssrMode
205
+ ssrMode: ssrMode,
206
+ props: props
204
207
  });
205
208
  return routeElements;
206
209
  }
@@ -243,6 +243,9 @@ var ssr = function(config) {
243
243
  return __generator(this, function(_state) {
244
244
  App = param.App, context = param.context, ModernRender = param.ModernRender, ModernHydrate = param.ModernHydrate;
245
245
  hydrateContext = _objectSpreadProps(_objectSpread({}, context), {
246
+ get routes () {
247
+ return context.routes;
248
+ },
246
249
  _hydration: true
247
250
  });
248
251
  callback = function() {
@@ -26,19 +26,23 @@ function _objectSpread(target) {
26
26
  }
27
27
  return target;
28
28
  }
29
- import { serializeJson } from "@modern-js/utils/serialize";
29
+ import { serializeJson } from "@modern-js/utils/universal/serialize";
30
30
  import { buildTemplate } from "./buildTemplate.share";
31
31
  function buildShellAfterTemplate(afterAppTemplate, options) {
32
32
  var injectSSRDataScript = function injectSSRDataScript(template) {
33
33
  var ssrDataScript = buildSSRDataScript();
34
34
  return template.replace("<!--<?- SSRDataScript ?>-->", ssrDataScript);
35
35
  function buildSSRDataScript() {
36
- var ssrContext = options.ssrContext, renderLevel = options.renderLevel;
36
+ var _options_context = options.context, ssrContext = _options_context.ssrContext, initialData = _options_context.initialData, __i18nData__ = _options_context.__i18nData__, renderLevel = options.renderLevel;
37
37
  var request = ssrContext.request, enableUnsafeCtx = ssrContext.enableUnsafeCtx;
38
38
  var unsafeContext = {
39
39
  headers: request.headers
40
40
  };
41
41
  var SSRData = {
42
+ data: {
43
+ initialData: initialData,
44
+ i18nData: __i18nData__
45
+ },
42
46
  context: {
43
47
  request: _objectSpread({
44
48
  params: request.params,
@@ -81,8 +81,8 @@ function getHeadTemplate(beforeEntryTemplate, context) {
81
81
  var routeManifest2 = routeAssets[routeId];
82
82
  if (routeManifest2) {
83
83
  var _cssChunks;
84
- var _routeManifest2_assets = routeManifest2.assets, assets = _routeManifest2_assets === void 0 ? [] : _routeManifest2_assets;
85
- var _cssChunks1 = assets.filter(function(asset) {
84
+ var _routeManifest2_referenceCssAssets = routeManifest2.referenceCssAssets, referenceCssAssets = _routeManifest2_referenceCssAssets === void 0 ? [] : _routeManifest2_referenceCssAssets;
85
+ var _cssChunks1 = referenceCssAssets.filter(function(asset) {
86
86
  return asset === null || asset === void 0 ? void 0 : asset.endsWith(".css");
87
87
  });
88
88
  (_cssChunks = cssChunks).push.apply(_cssChunks, _toConsumableArray(_cssChunks1));
@@ -48,12 +48,11 @@ 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, routerContext = context.routerContext;
51
+ var ssrContext = context.ssrContext;
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
- ssrContext: ssrContext,
56
- routerContext: routerContext,
55
+ context: context,
57
56
  renderLevel: renderLevel
58
57
  });
59
58
  return {
@@ -171,7 +171,7 @@ 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 { serializeJson } from "@modern-js/utils/serialize";
174
+ import { serializeJson } from "@modern-js/utils/universal/serialize";
175
175
  import ReactHelmet from "react-helmet";
176
176
  import { serializeErrors } from "../../../router/runtime/utils";
177
177
  import helmetReplace from "../helmet";
@@ -1,7 +1,7 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import React, { useContext, useMemo } from "react";
3
3
  import hoistNonReactStatics from "hoist-non-react-statics";
4
- import { ROUTE_MANIFEST } from "@modern-js/utils/constants";
4
+ import { ROUTE_MANIFEST } from "@modern-js/utils/universal/constants";
5
5
  import {
6
6
  RuntimeReactContext
7
7
  } from "../runtimeContext";
@@ -24,10 +24,14 @@ const createApp = ({ plugins }) => {
24
24
  return (App) => {
25
25
  const runner = appRuntime.init();
26
26
  const WrapperComponent = (props) => {
27
+ var _a;
27
28
  const element = React.createElement(
28
29
  App || React.Fragment,
29
- { ...props },
30
- props.children
30
+ App ? { ...props } : null,
31
+ App ? props.children : React.cloneElement(props.children, {
32
+ ...(_a = props.children) == null ? void 0 : _a.props,
33
+ ...props
34
+ })
31
35
  );
32
36
  const context = useContext(RuntimeReactContext);
33
37
  return runner.provide(