@bleedingdev/modern-js-runtime 3.5.0-ultramodern.101 → 3.5.0-ultramodern.103

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 (72) hide show
  1. package/dist/cjs/cli/ssr/index.js +1 -0
  2. package/dist/cjs/core/browser/hydrate.js +31 -27
  3. package/dist/cjs/core/react/wrapper.js +23 -28
  4. package/dist/cjs/core/server/requestResponse.js +5 -5
  5. package/dist/cjs/core/server/scriptOrder.js +1 -1
  6. package/dist/cjs/core/server/stream/beforeTemplate.worker.js +1 -10
  7. package/dist/cjs/core/server/utils.js +3 -3
  8. package/dist/cjs/module-federation/distributed-ssr.js +13 -12
  9. package/dist/cjs/module-federation/last-known-good.js +1 -1
  10. package/dist/cjs/module-federation/manifest-recovery-runtime-plugin.js +27 -38
  11. package/dist/cjs/router/cli/code/index.js +16 -9
  12. package/dist/cjs/router/cli/code/templates.js +36 -27
  13. package/dist/cjs/router/cli/handler.js +7 -1
  14. package/dist/cjs/router/runtime/plugin.js +22 -17
  15. package/dist/cjs/router/runtime/plugin.node.js +11 -3
  16. package/dist/cjs/router/runtime/provider.js +2 -2
  17. package/dist/cjs/router/runtime/redirect.js +51 -0
  18. package/dist/cjs/router/runtime/routerHelper.js +4 -0
  19. package/dist/cjs/router/runtime/rsc-router.js +2 -13
  20. package/dist/cjs/router/runtime/utils.js +3 -2
  21. package/dist/esm/cli/ssr/index.mjs +1 -0
  22. package/dist/esm/core/browser/hydrate.mjs +30 -22
  23. package/dist/esm/core/react/wrapper.mjs +23 -28
  24. package/dist/esm/core/server/requestResponse.mjs +4 -4
  25. package/dist/esm/core/server/scriptOrder.mjs +1 -1
  26. package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +1 -10
  27. package/dist/esm/core/server/utils.mjs +1 -1
  28. package/dist/esm/module-federation/distributed-ssr.mjs +13 -12
  29. package/dist/esm/module-federation/last-known-good.mjs +1 -1
  30. package/dist/esm/module-federation/manifest-recovery-runtime-plugin.mjs +22 -33
  31. package/dist/esm/router/cli/code/index.mjs +16 -9
  32. package/dist/esm/router/cli/code/templates.mjs +36 -27
  33. package/dist/esm/router/cli/handler.mjs +7 -1
  34. package/dist/esm/router/runtime/plugin.mjs +24 -19
  35. package/dist/esm/router/runtime/plugin.node.mjs +12 -4
  36. package/dist/esm/router/runtime/provider.mjs +2 -2
  37. package/dist/esm/router/runtime/redirect.mjs +13 -0
  38. package/dist/esm/router/runtime/routerHelper.mjs +2 -1
  39. package/dist/esm/router/runtime/rsc-router.mjs +2 -13
  40. package/dist/esm/router/runtime/utils.mjs +2 -1
  41. package/dist/esm-node/cli/ssr/index.mjs +1 -0
  42. package/dist/esm-node/core/browser/hydrate.mjs +30 -22
  43. package/dist/esm-node/core/react/wrapper.mjs +23 -28
  44. package/dist/esm-node/core/server/requestResponse.mjs +4 -4
  45. package/dist/esm-node/core/server/scriptOrder.mjs +1 -1
  46. package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +1 -10
  47. package/dist/esm-node/core/server/utils.mjs +1 -1
  48. package/dist/esm-node/module-federation/distributed-ssr.mjs +13 -12
  49. package/dist/esm-node/module-federation/last-known-good.mjs +1 -1
  50. package/dist/esm-node/module-federation/manifest-recovery-runtime-plugin.mjs +22 -33
  51. package/dist/esm-node/router/cli/code/index.mjs +16 -9
  52. package/dist/esm-node/router/cli/code/templates.mjs +36 -27
  53. package/dist/esm-node/router/cli/handler.mjs +7 -1
  54. package/dist/esm-node/router/runtime/plugin.mjs +24 -19
  55. package/dist/esm-node/router/runtime/plugin.node.mjs +12 -4
  56. package/dist/esm-node/router/runtime/provider.mjs +2 -2
  57. package/dist/esm-node/router/runtime/redirect.mjs +14 -0
  58. package/dist/esm-node/router/runtime/routerHelper.mjs +2 -1
  59. package/dist/esm-node/router/runtime/rsc-router.mjs +2 -13
  60. package/dist/esm-node/router/runtime/utils.mjs +2 -1
  61. package/dist/types/core/browser/hydrate.d.ts +0 -1
  62. package/dist/types/core/server/utils.d.ts +1 -1
  63. package/dist/types/module-federation/distributed-ssr.d.ts +3 -3
  64. package/dist/types/module-federation/manifest-recovery-runtime-plugin.d.ts +1 -1
  65. package/dist/types/router/cli/code/index.d.ts +6 -1
  66. package/dist/types/router/cli/code/templates.d.ts +8 -3
  67. package/dist/types/router/cli/handler.d.ts +4 -0
  68. package/dist/types/router/runtime/redirect.d.ts +1 -0
  69. package/dist/types/router/runtime/routerHelper.d.ts +7 -0
  70. package/dist/types/router/runtime/rsc-router.d.ts +1 -2
  71. package/package.json +14 -14
  72. package/rstest.config.mts +2 -0
@@ -21,7 +21,12 @@ async function handleGeneratorEntryCode(api, entrypoints, options = {}) {
21
21
  const { generatorRegisterCode, generateCode, generatorServerRegisterCode } = await import("./code/index.mjs");
22
22
  originEntrypointsByKey.set(entrypointsKey, cloneDeep(entrypoints));
23
23
  const enableRsc = resolvedConfig?.server?.rsc;
24
- const routesByEntry = await generateCode(appContext, resolvedConfig, entrypoints, api);
24
+ const routesByEntry = await generateCode(appContext, resolvedConfig, entrypoints, api, {
25
+ hydrateRscClientRoutes: normalizedOptions.hydrateRscClientRoutes,
26
+ includeRouteServerLoadersInSsrEntry: normalizedOptions.includeRouteServerLoadersInSsrEntry,
27
+ isolateRouteDataInRscLayer: normalizedOptions.isolateRouteDataInRscLayer,
28
+ serverRoutesFileName: normalizedOptions.serverRoutesFileName
29
+ });
25
30
  await Promise.all(entrypoints.map(async (entrypoint)=>{
26
31
  if (entrypoint.nestedRoutesEntry || entrypoint.pageRoutesEntry) {
27
32
  const route = appContext.serverRoutes.find((r)=>r.entryName === entrypoint.entryName);
@@ -44,6 +49,7 @@ async function handleGeneratorEntryCode(api, entrypoints, options = {}) {
44
49
  internalSrcAlias: appContext.internalSrcAlias,
45
50
  globalApp: entrypoint.fileSystemRoutes?.globalApp,
46
51
  rscType: 'server',
52
+ routesImportPath: normalizedOptions.serverRoutesFileName ? `./${normalizedOptions.serverRoutesFileName.replace(/\.js$/, '')}` : void 0,
47
53
  basename
48
54
  }));
49
55
  }
@@ -1,11 +1,12 @@
1
1
  import "node:module";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { merge } from "@modern-js/runtime-utils/merge";
4
- import { RouterProvider, createBrowserRouter, createHashRouter, createRoutesFromElements, useHref, useLocation, useMatches } from "@modern-js/runtime-utils/router";
4
+ import { RouterProvider, createBrowserRouter, createHashRouter, createRoutesFromElements, useHref, useInRouterContext, useLocation, useMatches, useNavigate, useParams } from "@modern-js/runtime-utils/router";
5
5
  import { normalizePathname } from "@modern-js/runtime-utils/url";
6
6
  import * as __rspack_external_react from "react";
7
- import { InternalRuntimeContext, getGlobalIsRscClient, getGlobalLayoutApp, getGlobalRoutes } from "../../core/context/index.mjs";
7
+ import { InternalRuntimeContext, getGlobalEnableRsc, getGlobalIsRscClient, getGlobalLayoutApp, getGlobalRoutes } from "../../core/context/index.mjs";
8
8
  import { applyRouterRuntimeState } from "./lifecycle.mjs";
9
+ import { Link } from "./PrefetchLink.mjs";
9
10
  import { routerProviderRegistryHooks } from "./provider.mjs";
10
11
  import { createClientRouterFromPayload } from "./rsc-router.mjs";
11
12
  import { createRouteObjectsFromConfig, deserializeErrors, renderRoutes, urlJoin } from "./utils.mjs";
@@ -39,9 +40,13 @@ const routerPlugin = (userConfig = {})=>({
39
40
  }
40
41
  }
41
42
  context.router = {
43
+ Link: Link,
42
44
  useMatches: useMatches,
43
45
  useLocation: useLocation,
44
- useHref: useHref
46
+ useHref: useHref,
47
+ useInRouterContext: useInRouterContext,
48
+ useNavigate: useNavigate,
49
+ useParams: useParams
45
50
  };
46
51
  Object.defineProperty(context, 'routes', {
47
52
  get () {
@@ -65,7 +70,7 @@ const routerPlugin = (userConfig = {})=>({
65
70
  };
66
71
  let cachedRouter = null;
67
72
  const RouterWrapper = (props)=>{
68
- const routerResult = useRouterCreation(process.env.MODERN_ENABLE_RSC ? {
73
+ const routerResult = useRouterCreation(("u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ : true === getGlobalEnableRsc()) ? {
69
74
  ...props,
70
75
  rscPayload: props?.rscPayload
71
76
  } : props, {
@@ -83,18 +88,18 @@ const routerPlugin = (userConfig = {})=>({
83
88
  const { routes } = routerResult;
84
89
  routesContainer.current = routes;
85
90
  beforeCreateRouter = false;
86
- const RouterContent = ()=>/*#__PURE__*/ jsxs(Fragment, {
87
- children: [
88
- /*#__PURE__*/ jsx(RouterProvider, {
89
- router: router
90
- }),
91
- /*#__PURE__*/ jsx(EmptyComponent, {}),
92
- /*#__PURE__*/ jsx(EmptyComponent, {})
93
- ]
94
- });
91
+ const routerContent = /*#__PURE__*/ jsxs(Fragment, {
92
+ children: [
93
+ /*#__PURE__*/ jsx(RouterProvider, {
94
+ router: router
95
+ }),
96
+ /*#__PURE__*/ jsx(EmptyComponent, {}),
97
+ /*#__PURE__*/ jsx(EmptyComponent, {})
98
+ ]
99
+ });
95
100
  return App ? /*#__PURE__*/ jsx(App, {
96
- children: /*#__PURE__*/ jsx(RouterContent, {})
97
- }) : /*#__PURE__*/ jsx(RouterContent, {});
101
+ children: routerContent
102
+ }) : routerContent;
98
103
  };
99
104
  return RouterWrapper;
100
105
  });
@@ -122,15 +127,15 @@ function useRouterCreation(props, options) {
122
127
  const baseUrl = selectBasePath(location.pathname).replace(/^\/*/, '/');
123
128
  const _basename = '/' === baseUrl ? urlJoin(baseUrl, runtimeContext._internalRouterBaseName || basename || '') : baseUrl;
124
129
  const { unstable_getBlockNavState: getBlockNavState } = runtimeContext;
125
- const rscPayload = process.env.MODERN_ENABLE_RSC && props?.rscPayload ? safeUse(props.rscPayload) : null;
126
- let hydrationData = process.env.MODERN_ENABLE_RSC ? window._ROUTER_DATA || rscPayload : window._ROUTER_DATA;
130
+ const rscPayload = ("u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ : true === getGlobalEnableRsc()) && props?.rscPayload ? safeUse(props.rscPayload) : null;
131
+ let hydrationData = "u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ ? window._ROUTER_DATA || rscPayload : window._ROUTER_DATA : true === getGlobalEnableRsc() ? window._ROUTER_DATA || rscPayload : window._ROUTER_DATA;
127
132
  return (0, __rspack_external_react.useMemo)(()=>{
128
133
  if (hydrationData?.errors) hydrationData = {
129
134
  ...hydrationData,
130
135
  errors: deserializeErrors(hydrationData.errors)
131
136
  };
132
137
  let routes = null;
133
- routes = process.env.MODERN_ENABLE_RSC && getGlobalIsRscClient() ? createRoutes ? createRoutes() : createRouteObjectsFromConfig({
138
+ routes = ("u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ : true === getGlobalEnableRsc()) && getGlobalIsRscClient() ? createRoutes ? createRoutes() : createRouteObjectsFromConfig({
134
139
  routesConfig: finalRouteConfig
135
140
  }) : createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes({
136
141
  routesConfig: finalRouteConfig,
@@ -138,7 +143,7 @@ function useRouterCreation(props, options) {
138
143
  }));
139
144
  if (!routes) routes = [];
140
145
  const hooks = api.getHooks();
141
- if (process.env.MODERN_ENABLE_RSC && rscPayload) try {
146
+ if (("u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ : true === getGlobalEnableRsc()) && rscPayload) try {
142
147
  const router = createClientRouterFromPayload(rscPayload, routes, _basename);
143
148
  return {
144
149
  router,
@@ -2,7 +2,7 @@ import "node:module";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { merge } from "@modern-js/runtime-utils/merge";
4
4
  import { createRequestContext } from "@modern-js/runtime-utils/node";
5
- import { StaticRouterProvider, createRoutesFromElements, createStaticHandler, createStaticRouter } from "@modern-js/runtime-utils/router";
5
+ import { StaticRouterProvider, createRoutesFromElements, createStaticHandler, createStaticRouter, useInRouterContext, useLocation, useNavigate, useParams } from "@modern-js/runtime-utils/router";
6
6
  import { time } from "@modern-js/runtime-utils/time";
7
7
  import { LOADER_REPORTER_NAME } from "@modern-js/utils/universal/constants";
8
8
  import { useContext } from "react";
@@ -10,6 +10,7 @@ import { InternalRuntimeContext, getGlobalEnableRsc, getGlobalLayoutApp, getGlob
10
10
  import { setServerPayload } from "../../core/context/serverPayload/index.server.mjs";
11
11
  import DeferredDataScripts_node from "./DeferredDataScripts.node.mjs";
12
12
  import { applyRouterRuntimeState, createRouterServerSnapshot } from "./lifecycle.mjs";
13
+ import { Link } from "./PrefetchLink.mjs";
13
14
  import { routerProviderRegistryHooks } from "./provider.mjs";
14
15
  import { RSCStaticRouter, createServerPayload, handleRSCRedirect, prepareRSCRoutes } from "./rsc-router.mjs";
15
16
  import { createRouteObjectsFromConfig, renderRoutes, urlJoin } from "./utils.mjs";
@@ -47,6 +48,13 @@ const routerPlugin = (userConfig = {})=>({
47
48
  setup: (api)=>{
48
49
  let finalRouteConfig = {};
49
50
  api.onBeforeRender(async (context, interrupt)=>{
51
+ context.router = {
52
+ Link: Link,
53
+ useInRouterContext: useInRouterContext,
54
+ useLocation: useLocation,
55
+ useNavigate: useNavigate,
56
+ useParams: useParams
57
+ };
50
58
  const pluginConfig = api.getRuntimeConfig();
51
59
  const { basename = '', routesConfig, createRoutes } = merge(pluginConfig.router || {}, userConfig);
52
60
  finalRouteConfig = {
@@ -135,10 +143,8 @@ const routerPlugin = (userConfig = {})=>({
135
143
  const enableRsc = getGlobalEnableRsc();
136
144
  return (props)=>{
137
145
  const context = useContext(InternalRuntimeContext);
138
- const { routerContext, ssrContext, routes } = context;
139
- const { nonce, mode, useJsonScript } = ssrContext;
146
+ const { routerContext, routes } = context;
140
147
  const { basename } = routerContext;
141
- const remixRouter = createStaticRouter(routes, routerContext);
142
148
  if (enableRsc) return App ? /*#__PURE__*/ jsx(App, {
143
149
  children: /*#__PURE__*/ jsx(RSCStaticRouter, {
144
150
  basename: basename
@@ -147,6 +153,8 @@ const routerPlugin = (userConfig = {})=>({
147
153
  basename: basename
148
154
  });
149
155
  {
156
+ const { nonce, mode, useJsonScript } = context.ssrContext;
157
+ const remixRouter = createStaticRouter(routes, routerContext);
150
158
  const routerWrapper = /*#__PURE__*/ jsxs(Fragment, {
151
159
  children: [
152
160
  /*#__PURE__*/ jsx(StaticRouterProvider, {
@@ -17,7 +17,7 @@ function createRouterProviderRealm(registrations) {
17
17
  const providers = new Map();
18
18
  let defaultProvider;
19
19
  for (const registration of registrations){
20
- if (!registration.name) throw new Error('[@modern-js/runtime] A router provider realm cannot contain an unnamed provider.');
20
+ if (0 === registration.name.length) throw new Error('[@modern-js/runtime] A router provider realm cannot contain an unnamed provider.');
21
21
  if (providers.has(registration.name)) throw new Error(`[@modern-js/runtime] Router provider "${registration.name}" is declared more than once in the same runtime realm.`);
22
22
  if (true === registration.isDefault && void 0 !== defaultProvider && defaultProvider !== registration.name) throw new Error(`[@modern-js/runtime] Router provider realm declares both "${defaultProvider}" and "${registration.name}" as defaults.`);
23
23
  providers.set(registration.name, registration.factory);
@@ -27,7 +27,7 @@ function createRouterProviderRealm(registrations) {
27
27
  ...providers.keys()
28
28
  ]);
29
29
  return Object.freeze({
30
- ...defaultProvider ? {
30
+ ...void 0 !== defaultProvider ? {
31
31
  defaultProvider
32
32
  } : {},
33
33
  get: (name)=>providers.get(name),
@@ -0,0 +1,14 @@
1
+ import "node:module";
2
+ const handleRSCRedirect = (headers, basename, status)=>{
3
+ const newHeaders = new Headers(headers);
4
+ let redirectUrl = headers.get('Location');
5
+ if ('/' !== basename) redirectUrl = redirectUrl.replace(basename, '');
6
+ newHeaders.set('X-Modernjs-Redirect', redirectUrl);
7
+ newHeaders.set('X-Modernjs-BaseUrl', basename);
8
+ newHeaders.delete('Location');
9
+ return new Response(null, {
10
+ status,
11
+ headers: newHeaders
12
+ });
13
+ };
14
+ export { handleRSCRedirect };
@@ -1,5 +1,6 @@
1
1
  import "node:module";
2
2
  import { ROUTE_MODULES } from "@modern-js/utils/universal/constants";
3
+ const isRouteErrorResponse = (error)=>null !== error && 'object' == typeof error && 'number' == typeof error.status && 'string' == typeof error.statusText && 'boolean' == typeof error.internal && 'data' in error;
3
4
  const isObjectLike = (value)=>'object' == typeof value && null !== value || 'function' == typeof value;
4
5
  const isRouteComponent = (value)=>'function' == typeof value || isObjectLike(value) && '$$typeof' in value;
5
6
  const getRouteModules = ()=>{
@@ -52,4 +53,4 @@ const handleRouteModuleError = (error)=>{
52
53
  console.error(error);
53
54
  return null;
54
55
  };
55
- export { createShouldRevalidate, handleRouteModule, handleRouteModuleError, resolveRouteComponent };
56
+ export { createShouldRevalidate, handleRouteModule, handleRouteModuleError, isRouteErrorResponse, resolveRouteComponent };
@@ -86,18 +86,6 @@ const createServerPayload = (routerContext, routes)=>{
86
86
  })
87
87
  };
88
88
  };
89
- const handleRSCRedirect = (headers, basename, status)=>{
90
- const newHeaders = new Headers(headers);
91
- let redirectUrl = headers.get('Location');
92
- if ('/' !== basename) redirectUrl = redirectUrl.replace(basename, '');
93
- newHeaders.set('X-Modernjs-Redirect', redirectUrl);
94
- newHeaders.set('X-Modernjs-BaseUrl', basename);
95
- newHeaders.delete('Location');
96
- return new Response(null, {
97
- status: status,
98
- headers: newHeaders
99
- });
100
- };
101
89
  const prepareRSCRoutes = async (routes)=>{
102
90
  const isLazyComponent = (component)=>null != component && 'object' == typeof component && '_init' in component && '_payload' in component;
103
91
  const processRoutes = async (routesList)=>{
@@ -326,4 +314,5 @@ const RSCStaticRouter = ({ basename })=>{
326
314
  children: createRSCStaticRouterComponent(payload, basename)
327
315
  });
328
316
  };
329
- export { RSCStaticRouter, createClientRouterFromPayload, createServerPayload, handleRSCRedirect, prepareRSCRoutes };
317
+ export { handleRSCRedirect } from "./redirect.mjs";
318
+ export { RSCStaticRouter, createClientRouterFromPayload, createServerPayload, prepareRSCRoutes };
@@ -1,10 +1,11 @@
1
1
  import "node:module";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import { renderNestedRoute } from "@modern-js/runtime-utils/browser";
4
- import { Route, UNSAFE_ErrorResponseImpl, isRouteErrorResponse } from "@modern-js/runtime-utils/router";
4
+ import { Route, UNSAFE_ErrorResponseImpl } from "@modern-js/runtime-utils/router";
5
5
  import react from "react";
6
6
  import { DefaultNotFound } from "./DefaultNotFound.mjs";
7
7
  import DeferredDataScripts from "./DeferredDataScripts.mjs";
8
+ import { isRouteErrorResponse } from "./routerHelper.mjs";
8
9
  function getRouteComponents(routes, { globalApp, ssrMode, props }) {
9
10
  const Layout = ({ Component, ...props })=>{
10
11
  const GlobalLayout = globalApp;
@@ -1,6 +1,5 @@
1
1
  import type React from 'react';
2
2
  import { type Root } from 'react-dom/client';
3
3
  import type { TRuntimeContext } from '../context/runtime';
4
- export declare const isReact18: () => boolean;
5
4
  export declare function hydrateWithReact(App: React.ReactElement, rootElement: HTMLElement): Promise<Root>;
6
5
  export declare function hydrateRoot(App: React.ReactElement, context: TRuntimeContext, ModernRender: (App: React.ReactElement) => Promise<HTMLElement | Root>, ModernHydrate: (App: React.ReactElement, callback?: () => void) => Promise<HTMLElement | Root>): Promise<HTMLElement | Root>;
@@ -1,5 +1,5 @@
1
1
  import type { ServerUserConfig } from '@modern-js/app-tools';
2
- import { type StaticHandlerContext } from '@modern-js/runtime-utils/router';
2
+ import type { StaticHandlerContext } from '@modern-js/runtime-utils/router';
3
3
  import type { SSRConfig } from './shared';
4
4
  export declare function attributesToString(attributes: Record<string, any>): string;
5
5
  /**
@@ -23,11 +23,11 @@ export type DistributedSsrFragmentContext = {
23
23
  required: true;
24
24
  resolve?: (remote: string, expose: string, props: Record<string, unknown>) => DistributedSsrFragmentResult | PromiseLike<DistributedSsrFragmentResult>;
25
25
  };
26
- export type DistributedSsrBoundaryProps = {
26
+ export type DistributedSsrBoundaryProps<Props extends object = Record<string, unknown>> = {
27
27
  children: ReactNode;
28
28
  expose: string;
29
29
  fallback: ReactNode;
30
- fragmentProps?: Record<string, unknown>;
30
+ fragmentProps?: Props;
31
31
  remote: string;
32
32
  };
33
33
  export type CreateDistributedSsrComponentOptions<Props extends object> = {
@@ -49,7 +49,7 @@ export declare function useDistributedSsrFragmentProps<Props extends object>({ b
49
49
  * Node SSR has no distributed-fragment context and therefore renders the
50
50
  * child normally, preserving Module Federation's in-process SSR path.
51
51
  */
52
- export declare function DistributedSsrBoundary({ children, expose, fallback, fragmentProps, remote, }: DistributedSsrBoundaryProps): import("react").JSX.Element;
52
+ export declare function DistributedSsrBoundary<Props extends object = Record<string, unknown>>({ children, expose, fallback, fragmentProps, remote, }: DistributedSsrBoundaryProps<Props>): import("react").JSX.Element;
53
53
  /**
54
54
  * Defers creation of the native Module Federation component until React
55
55
  * actually renders that child. A workerd request with a verified distributed
@@ -20,6 +20,6 @@ export type ModuleFederationManifestRecoveryPluginOptions = {
20
20
  */
21
21
  export declare const createModuleFederationManifestRecoveryPlugin: (options?: ModuleFederationManifestRecoveryPluginOptions) => {
22
22
  name: string;
23
- errorLoadRemote(args: ErrorLoadRemoteArgs): Promise<any>;
23
+ errorLoadRemote(args: ErrorLoadRemoteArgs): Promise<unknown>;
24
24
  };
25
25
  export default createModuleFederationManifestRecoveryPlugin;
@@ -5,6 +5,11 @@ import type { Entrypoint, NestedRouteForCli, PageRoute } from '@modern-js/types'
5
5
  * Generate routing information for a single entry point (can be reused by the routes inspect feature)
6
6
  */
7
7
  export declare function generateRoutesForEntry(entrypoint: Entrypoint, appContext: AppToolsContext): Promise<NestedRouteForCli[]>;
8
- export declare const generateCode: (appContext: AppToolsContext, config: AppNormalizedConfig, entrypoints: Entrypoint[], api: CLIPluginAPI<AppTools>) => Promise<Record<string, (NestedRouteForCli | PageRoute)[]>>;
8
+ export declare const generateCode: (appContext: AppToolsContext, config: AppNormalizedConfig, entrypoints: Entrypoint[], api: CLIPluginAPI<AppTools>, options?: {
9
+ hydrateRscClientRoutes?: boolean;
10
+ includeRouteServerLoadersInSsrEntry?: boolean;
11
+ isolateRouteDataInRscLayer?: boolean;
12
+ serverRoutesFileName?: string;
13
+ }) => Promise<Record<string, (NestedRouteForCli | PageRoute)[]>>;
9
14
  export declare function generatorRegisterCode(internalDirectory: string, entryName: string, code: string): void;
10
15
  export declare function generatorServerRegisterCode(internalDirectory: string, entryName: string, code: string): void;
@@ -3,7 +3,7 @@ import type { Entrypoint, NestedRouteForCli, PageRoute, RouteLegacy, SSRMode } f
3
3
  export declare const routesForServer: ({ routesForServerLoaderMatches, }: {
4
4
  routesForServerLoaderMatches: (NestedRouteForCli | PageRoute)[];
5
5
  }) => string;
6
- export declare const fileSystemRoutes: ({ metaName, routes, ssrMode, nestedRoutesEntry, entryName, internalDirectory, splitRouteChunks, isRscClientBundle, srcDirectory, internalSrcAlias, }: {
6
+ export declare const fileSystemRoutes: ({ metaName, routes, ssrMode, nestedRoutesEntry, entryName, internalDirectory, splitRouteChunks, isRscClientBundle, hydrateRscClientRoutes, isolateRouteDataInRscLayer, srcDirectory, internalSrcAlias, }: {
7
7
  metaName: string;
8
8
  routes: RouteLegacy[] | (NestedRouteForCli | PageRoute)[];
9
9
  ssrMode?: SSRMode;
@@ -12,11 +12,15 @@ export declare const fileSystemRoutes: ({ metaName, routes, ssrMode, nestedRoute
12
12
  internalDirectory: string;
13
13
  splitRouteChunks?: boolean;
14
14
  isRscClientBundle?: boolean;
15
+ hydrateRscClientRoutes?: boolean;
16
+ isolateRouteDataInRscLayer?: boolean;
15
17
  srcDirectory?: string;
16
18
  internalSrcAlias?: string;
17
19
  }) => Promise<string>;
18
- export declare function ssrLoaderCombinedModule(entrypoints: Entrypoint[], entrypoint: Entrypoint, config: AppNormalizedConfig, appContext: AppToolsContext): string | null;
19
- export declare const runtimeGlobalContext: ({ entryName, metaName, srcDirectory, nestedRoutesEntry, internalSrcAlias, globalApp, rscType, basename, }: {
20
+ export declare function ssrLoaderCombinedModule(entrypoints: Entrypoint[], entrypoint: Entrypoint, config: AppNormalizedConfig, appContext: AppToolsContext, options?: {
21
+ includeRouteServerLoaders?: boolean;
22
+ }): string | null;
23
+ export declare const runtimeGlobalContext: ({ entryName, metaName, srcDirectory, nestedRoutesEntry, internalSrcAlias, globalApp, rscType, routesImportPath, basename, }: {
20
24
  entryName: string;
21
25
  metaName: string;
22
26
  srcDirectory: string;
@@ -24,5 +28,6 @@ export declare const runtimeGlobalContext: ({ entryName, metaName, srcDirectory,
24
28
  internalSrcAlias: string;
25
29
  globalApp?: string | false;
26
30
  rscType?: 'server' | 'client' | false;
31
+ routesImportPath?: string;
27
32
  basename?: string;
28
33
  }) => Promise<string>;
@@ -10,6 +10,10 @@ type RegenerateRoutesFn = (params: {
10
10
  }) => Promise<void>;
11
11
  type HandleGeneratorEntryCodeOptions = {
12
12
  entrypointsKey?: string;
13
+ hydrateRscClientRoutes?: boolean;
14
+ includeRouteServerLoadersInSsrEntry?: boolean;
15
+ isolateRouteDataInRscLayer?: boolean;
16
+ serverRoutesFileName?: string;
13
17
  };
14
18
  type HandleFileChangeOptions = {
15
19
  includeEntry?: (entrypoint: Entrypoint) => boolean;
@@ -0,0 +1 @@
1
+ export declare const handleRSCRedirect: (headers: Headers, basename: string, status: number) => Response;
@@ -1,5 +1,12 @@
1
1
  import type { ShouldRevalidateFunction } from '@modern-js/runtime-utils/router';
2
2
  import type { ElementType } from 'react';
3
+ export type ModernRouteErrorResponse = {
4
+ status: number;
5
+ statusText: string;
6
+ internal: boolean;
7
+ data: unknown;
8
+ };
9
+ export declare const isRouteErrorResponse: (error: unknown) => error is ModernRouteErrorResponse;
3
10
  export declare const createShouldRevalidate: (routeId: string) => ShouldRevalidateFunction;
4
11
  export declare const resolveRouteComponent: (routeModule: unknown) => ElementType<Record<string, unknown>>;
5
12
  export declare const handleRouteModule: (routeModule: unknown, routeId: string) => unknown;
@@ -2,6 +2,7 @@ import { type RouteObject, type StaticHandlerContext } from '@modern-js/runtime-
2
2
  import React from 'react';
3
3
  import type { ServerPayload } from '../../core/context';
4
4
  import type { RouteManifest } from './types';
5
+ export { handleRSCRedirect } from './redirect';
5
6
  declare global {
6
7
  interface Window {
7
8
  _MODERNJS_ROUTE_MANIFEST?: RouteManifest;
@@ -9,7 +10,6 @@ declare global {
9
10
  }
10
11
  }
11
12
  export declare const createServerPayload: (routerContext: StaticHandlerContext, routes: RouteObject[]) => ServerPayload;
12
- export declare const handleRSCRedirect: (headers: Headers, basename: string, status: number) => Response;
13
13
  export declare const prepareRSCRoutes: (routes: RouteObject[]) => Promise<void>;
14
14
  export declare const createClientRouterFromPayload: (payload: ServerPayload, originalRoutes: RouteObject[], basename?: string) => import("react-router").DataRouter;
15
15
  interface RSCStaticRouterProps {
@@ -17,4 +17,3 @@ interface RSCStaticRouterProps {
17
17
  useJsonScript?: boolean;
18
18
  }
19
19
  export declare const RSCStaticRouter: React.FC<RSCStaticRouterProps>;
20
- export {};
package/package.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "modern",
18
18
  "modern.js"
19
19
  ],
20
- "version": "3.5.0-ultramodern.101",
20
+ "version": "3.5.0-ultramodern.103",
21
21
  "engines": {
22
22
  "node": ">=20"
23
23
  },
@@ -246,12 +246,12 @@
246
246
  "dependencies": {
247
247
  "@loadable/component": "5.16.7",
248
248
  "@loadable/server": "5.16.7",
249
- "@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.5.0-ultramodern.101",
250
- "@modern-js/plugin-data-loader": "npm:@bleedingdev/modern-js-plugin-data-loader@3.5.0-ultramodern.101",
251
- "@modern-js/render": "npm:@bleedingdev/modern-js-render@3.5.0-ultramodern.101",
252
- "@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.5.0-ultramodern.101",
253
- "@modern-js/types": "npm:@bleedingdev/modern-js-types@3.5.0-ultramodern.101",
254
- "@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.5.0-ultramodern.101",
249
+ "@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.5.0-ultramodern.103",
250
+ "@modern-js/plugin-data-loader": "npm:@bleedingdev/modern-js-plugin-data-loader@3.5.0-ultramodern.103",
251
+ "@modern-js/render": "npm:@bleedingdev/modern-js-render@3.5.0-ultramodern.103",
252
+ "@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.5.0-ultramodern.103",
253
+ "@modern-js/types": "npm:@bleedingdev/modern-js-types@3.5.0-ultramodern.103",
254
+ "@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.5.0-ultramodern.103",
255
255
  "@swc/core": "1.15.43",
256
256
  "@swc/helpers": "^0.5.23",
257
257
  "@swc/plugin-loadable-components": "^11.15.0",
@@ -265,14 +265,14 @@
265
265
  "isbot": "5.2.0",
266
266
  "react-helmet": "^6.1.0",
267
267
  "react-helmet-async": "3.0.0",
268
- "react-is": "^19.2.7"
268
+ "react-is": "^19.2.8"
269
269
  },
270
270
  "peerDependencies": {
271
- "react": "^19.2.7",
272
- "react-dom": "^19.2.7"
271
+ "react": "^19.2.8",
272
+ "react-dom": "^19.2.8"
273
273
  },
274
274
  "devDependencies": {
275
- "@modern-js/app-tools": "npm:@bleedingdev/modern-js-app-tools@3.5.0-ultramodern.101",
275
+ "@modern-js/app-tools": "npm:@bleedingdev/modern-js-app-tools@3.5.0-ultramodern.103",
276
276
  "@remix-run/web-fetch": "^4.4.2",
277
277
  "@rsbuild/core": "2.1.5",
278
278
  "@rslib/core": "0.23.2",
@@ -282,10 +282,10 @@
282
282
  "@types/cookie": "0.6.0",
283
283
  "@types/invariant": "^2.2.37",
284
284
  "@types/loadable__server": "5.12.11",
285
- "@types/node": "^26.1.1",
285
+ "@types/node": "^26.2.0",
286
286
  "@typescript/native-preview": "7.0.0-dev.20260707.2",
287
- "react": "^19.2.7",
288
- "react-dom": "^19.2.7",
287
+ "react": "^19.2.8",
288
+ "react-dom": "^19.2.8",
289
289
  "ts-node": "^10.9.2",
290
290
  "typescript": "^7.0.2"
291
291
  },
package/rstest.config.mts CHANGED
@@ -24,6 +24,7 @@ export default {
24
24
  testEnvironment: 'node',
25
25
  exclude: [
26
26
  'tests/boundary-debugger/client.test.tsx',
27
+ 'tests/router/plugin.client.test.tsx',
27
28
  'tests/router/prefetch.test.tsx',
28
29
  ],
29
30
  extends: commonConfig,
@@ -51,6 +52,7 @@ export default {
51
52
  testEnvironment: 'happy-dom',
52
53
  include: [
53
54
  'tests/boundary-debugger/client.test.tsx',
55
+ 'tests/router/plugin.client.test.tsx',
54
56
  'tests/router/prefetch.test.tsx',
55
57
  ],
56
58
  extends: commonConfig,