@bleedingdev/modern-js-runtime 3.5.0-ultramodern.98 → 3.8.1-ultramodern.1

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 (86) hide show
  1. package/dist/cjs/cli/index.js +1 -11
  2. package/dist/cjs/cli/ssr/index.js +1 -0
  3. package/dist/cjs/core/browser/hydrate.js +31 -27
  4. package/dist/cjs/core/browser/index.js +4 -15
  5. package/dist/cjs/core/react/wrapper.js +23 -28
  6. package/dist/cjs/core/server/requestResponse.js +5 -5
  7. package/dist/cjs/core/server/scriptOrder.js +1 -1
  8. package/dist/cjs/core/server/stream/beforeTemplate.worker.js +1 -10
  9. package/dist/cjs/core/server/string/index.js +3 -3
  10. package/dist/cjs/core/server/utils.js +3 -3
  11. package/dist/cjs/document/cli/index.js +5 -2
  12. package/dist/cjs/module-federation/distributed-ssr.js +13 -12
  13. package/dist/cjs/module-federation/last-known-good.js +1 -1
  14. package/dist/cjs/module-federation/manifest-recovery-runtime-plugin.js +27 -38
  15. package/dist/cjs/router/cli/code/index.js +16 -9
  16. package/dist/cjs/router/cli/code/templates.js +36 -27
  17. package/dist/cjs/router/cli/handler.js +7 -1
  18. package/dist/cjs/router/runtime/plugin.js +22 -17
  19. package/dist/cjs/router/runtime/plugin.node.js +11 -3
  20. package/dist/cjs/router/runtime/provider.js +2 -2
  21. package/dist/cjs/router/runtime/redirect.js +51 -0
  22. package/dist/cjs/router/runtime/routerHelper.js +4 -0
  23. package/dist/cjs/router/runtime/rsc-router.js +2 -13
  24. package/dist/cjs/router/runtime/utils.js +3 -2
  25. package/dist/esm/cli/index.mjs +2 -12
  26. package/dist/esm/cli/ssr/index.mjs +1 -0
  27. package/dist/esm/core/browser/hydrate.mjs +30 -22
  28. package/dist/esm/core/browser/index.mjs +5 -13
  29. package/dist/esm/core/react/wrapper.mjs +23 -28
  30. package/dist/esm/core/server/requestResponse.mjs +4 -4
  31. package/dist/esm/core/server/scriptOrder.mjs +1 -1
  32. package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +1 -10
  33. package/dist/esm/core/server/string/index.mjs +3 -3
  34. package/dist/esm/core/server/utils.mjs +1 -1
  35. package/dist/esm/document/cli/index.mjs +1 -1
  36. package/dist/esm/module-federation/distributed-ssr.mjs +13 -12
  37. package/dist/esm/module-federation/last-known-good.mjs +1 -1
  38. package/dist/esm/module-federation/manifest-recovery-runtime-plugin.mjs +22 -33
  39. package/dist/esm/router/cli/code/index.mjs +16 -9
  40. package/dist/esm/router/cli/code/templates.mjs +36 -27
  41. package/dist/esm/router/cli/handler.mjs +7 -1
  42. package/dist/esm/router/runtime/plugin.mjs +24 -19
  43. package/dist/esm/router/runtime/plugin.node.mjs +12 -4
  44. package/dist/esm/router/runtime/provider.mjs +2 -2
  45. package/dist/esm/router/runtime/redirect.mjs +13 -0
  46. package/dist/esm/router/runtime/routerHelper.mjs +2 -1
  47. package/dist/esm/router/runtime/rsc-router.mjs +2 -13
  48. package/dist/esm/router/runtime/utils.mjs +2 -1
  49. package/dist/esm-node/cli/index.mjs +2 -12
  50. package/dist/esm-node/cli/ssr/index.mjs +1 -0
  51. package/dist/esm-node/core/browser/hydrate.mjs +30 -22
  52. package/dist/esm-node/core/browser/index.mjs +5 -13
  53. package/dist/esm-node/core/react/wrapper.mjs +23 -28
  54. package/dist/esm-node/core/server/requestResponse.mjs +4 -4
  55. package/dist/esm-node/core/server/scriptOrder.mjs +1 -1
  56. package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +1 -10
  57. package/dist/esm-node/core/server/string/index.mjs +3 -3
  58. package/dist/esm-node/core/server/utils.mjs +1 -1
  59. package/dist/esm-node/document/cli/index.mjs +1 -1
  60. package/dist/esm-node/module-federation/distributed-ssr.mjs +13 -12
  61. package/dist/esm-node/module-federation/last-known-good.mjs +1 -1
  62. package/dist/esm-node/module-federation/manifest-recovery-runtime-plugin.mjs +22 -33
  63. package/dist/esm-node/router/cli/code/index.mjs +16 -9
  64. package/dist/esm-node/router/cli/code/templates.mjs +36 -27
  65. package/dist/esm-node/router/cli/handler.mjs +7 -1
  66. package/dist/esm-node/router/runtime/plugin.mjs +24 -19
  67. package/dist/esm-node/router/runtime/plugin.node.mjs +12 -4
  68. package/dist/esm-node/router/runtime/provider.mjs +2 -2
  69. package/dist/esm-node/router/runtime/redirect.mjs +14 -0
  70. package/dist/esm-node/router/runtime/routerHelper.mjs +2 -1
  71. package/dist/esm-node/router/runtime/rsc-router.mjs +2 -13
  72. package/dist/esm-node/router/runtime/utils.mjs +2 -1
  73. package/dist/types/core/browser/hydrate.d.ts +0 -1
  74. package/dist/types/core/browser/index.d.ts +0 -1
  75. package/dist/types/core/server/utils.d.ts +1 -1
  76. package/dist/types/document/cli/index.d.ts +1 -0
  77. package/dist/types/module-federation/distributed-ssr.d.ts +3 -3
  78. package/dist/types/module-federation/manifest-recovery-runtime-plugin.d.ts +1 -1
  79. package/dist/types/router/cli/code/index.d.ts +6 -1
  80. package/dist/types/router/cli/code/templates.d.ts +8 -3
  81. package/dist/types/router/cli/handler.d.ts +4 -0
  82. package/dist/types/router/runtime/redirect.d.ts +1 -0
  83. package/dist/types/router/runtime/routerHelper.d.ts +7 -0
  84. package/dist/types/router/runtime/rsc-router.d.ts +1 -2
  85. package/package.json +15 -14
  86. package/rstest.config.mts +2 -0
@@ -1,10 +1,11 @@
1
1
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
2
  import { merge } from "@modern-js/runtime-utils/merge";
3
- import { RouterProvider, createBrowserRouter, createHashRouter, createRoutesFromElements, useHref, useLocation, useMatches } from "@modern-js/runtime-utils/router";
3
+ import { RouterProvider, createBrowserRouter, createHashRouter, createRoutesFromElements, useHref, useInRouterContext, useLocation, useMatches, useNavigate, useParams } from "@modern-js/runtime-utils/router";
4
4
  import { normalizePathname } from "@modern-js/runtime-utils/url";
5
5
  import * as __rspack_external_react from "react";
6
- import { InternalRuntimeContext, getGlobalIsRscClient, getGlobalLayoutApp, getGlobalRoutes } from "../../core/context/index.mjs";
6
+ import { InternalRuntimeContext, getGlobalEnableRsc, getGlobalIsRscClient, getGlobalLayoutApp, getGlobalRoutes } from "../../core/context/index.mjs";
7
7
  import { applyRouterRuntimeState } from "./lifecycle.mjs";
8
+ import { Link } from "./PrefetchLink.mjs";
8
9
  import { routerProviderRegistryHooks } from "./provider.mjs";
9
10
  import { createClientRouterFromPayload } from "./rsc-router.mjs";
10
11
  import { createRouteObjectsFromConfig, deserializeErrors, renderRoutes, urlJoin } from "./utils.mjs";
@@ -38,9 +39,13 @@ const routerPlugin = (userConfig = {})=>({
38
39
  }
39
40
  }
40
41
  context.router = {
42
+ Link: Link,
41
43
  useMatches: useMatches,
42
44
  useLocation: useLocation,
43
- useHref: useHref
45
+ useHref: useHref,
46
+ useInRouterContext: useInRouterContext,
47
+ useNavigate: useNavigate,
48
+ useParams: useParams
44
49
  };
45
50
  Object.defineProperty(context, 'routes', {
46
51
  get () {
@@ -64,7 +69,7 @@ const routerPlugin = (userConfig = {})=>({
64
69
  };
65
70
  let cachedRouter = null;
66
71
  const RouterWrapper = (props)=>{
67
- const routerResult = useRouterCreation(process.env.MODERN_ENABLE_RSC ? {
72
+ const routerResult = useRouterCreation(("u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ : true === getGlobalEnableRsc()) ? {
68
73
  ...props,
69
74
  rscPayload: props?.rscPayload
70
75
  } : props, {
@@ -82,18 +87,18 @@ const routerPlugin = (userConfig = {})=>({
82
87
  const { routes } = routerResult;
83
88
  routesContainer.current = routes;
84
89
  beforeCreateRouter = false;
85
- const RouterContent = ()=>/*#__PURE__*/ jsxs(Fragment, {
86
- children: [
87
- /*#__PURE__*/ jsx(RouterProvider, {
88
- router: router
89
- }),
90
- /*#__PURE__*/ jsx(EmptyComponent, {}),
91
- /*#__PURE__*/ jsx(EmptyComponent, {})
92
- ]
93
- });
90
+ const routerContent = /*#__PURE__*/ jsxs(Fragment, {
91
+ children: [
92
+ /*#__PURE__*/ jsx(RouterProvider, {
93
+ router: router
94
+ }),
95
+ /*#__PURE__*/ jsx(EmptyComponent, {}),
96
+ /*#__PURE__*/ jsx(EmptyComponent, {})
97
+ ]
98
+ });
94
99
  return App ? /*#__PURE__*/ jsx(App, {
95
- children: /*#__PURE__*/ jsx(RouterContent, {})
96
- }) : /*#__PURE__*/ jsx(RouterContent, {});
100
+ children: routerContent
101
+ }) : routerContent;
97
102
  };
98
103
  return RouterWrapper;
99
104
  });
@@ -121,15 +126,15 @@ function useRouterCreation(props, options) {
121
126
  const baseUrl = selectBasePath(location.pathname).replace(/^\/*/, '/');
122
127
  const _basename = '/' === baseUrl ? urlJoin(baseUrl, runtimeContext._internalRouterBaseName || basename || '') : baseUrl;
123
128
  const { unstable_getBlockNavState: getBlockNavState } = runtimeContext;
124
- const rscPayload = process.env.MODERN_ENABLE_RSC && props?.rscPayload ? safeUse(props.rscPayload) : null;
125
- let hydrationData = process.env.MODERN_ENABLE_RSC ? window._ROUTER_DATA || rscPayload : window._ROUTER_DATA;
129
+ const rscPayload = ("u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ : true === getGlobalEnableRsc()) && props?.rscPayload ? safeUse(props.rscPayload) : null;
130
+ 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;
126
131
  return (0, __rspack_external_react.useMemo)(()=>{
127
132
  if (hydrationData?.errors) hydrationData = {
128
133
  ...hydrationData,
129
134
  errors: deserializeErrors(hydrationData.errors)
130
135
  };
131
136
  let routes = null;
132
- routes = process.env.MODERN_ENABLE_RSC && getGlobalIsRscClient() ? createRoutes ? createRoutes() : createRouteObjectsFromConfig({
137
+ routes = ("u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ : true === getGlobalEnableRsc()) && getGlobalIsRscClient() ? createRoutes ? createRoutes() : createRouteObjectsFromConfig({
133
138
  routesConfig: finalRouteConfig
134
139
  }) : createRoutes ? createRoutes() : createRoutesFromElements(renderRoutes({
135
140
  routesConfig: finalRouteConfig,
@@ -137,7 +142,7 @@ function useRouterCreation(props, options) {
137
142
  }));
138
143
  if (!routes) routes = [];
139
144
  const hooks = api.getHooks();
140
- if (process.env.MODERN_ENABLE_RSC && rscPayload) try {
145
+ if (("u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ : true === getGlobalEnableRsc()) && rscPayload) try {
141
146
  const router = createClientRouterFromPayload(rscPayload, routes, _basename);
142
147
  return {
143
148
  router,
@@ -1,7 +1,7 @@
1
1
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
2
  import { merge } from "@modern-js/runtime-utils/merge";
3
3
  import { createRequestContext } from "@modern-js/runtime-utils/node";
4
- import { StaticRouterProvider, createRoutesFromElements, createStaticHandler, createStaticRouter } from "@modern-js/runtime-utils/router";
4
+ import { StaticRouterProvider, createRoutesFromElements, createStaticHandler, createStaticRouter, useInRouterContext, useLocation, useNavigate, useParams } from "@modern-js/runtime-utils/router";
5
5
  import { time } from "@modern-js/runtime-utils/time";
6
6
  import { LOADER_REPORTER_NAME } from "@modern-js/utils/universal/constants";
7
7
  import { useContext } from "react";
@@ -9,6 +9,7 @@ import { InternalRuntimeContext, getGlobalEnableRsc, getGlobalLayoutApp, getGlob
9
9
  import { setServerPayload } from "../../core/context/serverPayload/index.server.mjs";
10
10
  import DeferredDataScripts_node from "./DeferredDataScripts.node.mjs";
11
11
  import { applyRouterRuntimeState, createRouterServerSnapshot } from "./lifecycle.mjs";
12
+ import { Link } from "./PrefetchLink.mjs";
12
13
  import { routerProviderRegistryHooks } from "./provider.mjs";
13
14
  import { RSCStaticRouter, createServerPayload, handleRSCRedirect, prepareRSCRoutes } from "./rsc-router.mjs";
14
15
  import { createRouteObjectsFromConfig, renderRoutes, urlJoin } from "./utils.mjs";
@@ -46,6 +47,13 @@ const routerPlugin = (userConfig = {})=>({
46
47
  setup: (api)=>{
47
48
  let finalRouteConfig = {};
48
49
  api.onBeforeRender(async (context, interrupt)=>{
50
+ context.router = {
51
+ Link: Link,
52
+ useInRouterContext: useInRouterContext,
53
+ useLocation: useLocation,
54
+ useNavigate: useNavigate,
55
+ useParams: useParams
56
+ };
49
57
  const pluginConfig = api.getRuntimeConfig();
50
58
  const { basename = '', routesConfig, createRoutes } = merge(pluginConfig.router || {}, userConfig);
51
59
  finalRouteConfig = {
@@ -134,10 +142,8 @@ const routerPlugin = (userConfig = {})=>({
134
142
  const enableRsc = getGlobalEnableRsc();
135
143
  return (props)=>{
136
144
  const context = useContext(InternalRuntimeContext);
137
- const { routerContext, ssrContext, routes } = context;
138
- const { nonce, mode, useJsonScript } = ssrContext;
145
+ const { routerContext, routes } = context;
139
146
  const { basename } = routerContext;
140
- const remixRouter = createStaticRouter(routes, routerContext);
141
147
  if (enableRsc) return App ? /*#__PURE__*/ jsx(App, {
142
148
  children: /*#__PURE__*/ jsx(RSCStaticRouter, {
143
149
  basename: basename
@@ -146,6 +152,8 @@ const routerPlugin = (userConfig = {})=>({
146
152
  basename: basename
147
153
  });
148
154
  {
155
+ const { nonce, mode, useJsonScript } = context.ssrContext;
156
+ const remixRouter = createStaticRouter(routes, routerContext);
149
157
  const routerWrapper = /*#__PURE__*/ jsxs(Fragment, {
150
158
  children: [
151
159
  /*#__PURE__*/ jsx(StaticRouterProvider, {
@@ -16,7 +16,7 @@ function createRouterProviderRealm(registrations) {
16
16
  const providers = new Map();
17
17
  let defaultProvider;
18
18
  for (const registration of registrations){
19
- if (!registration.name) throw new Error('[@modern-js/runtime] A router provider realm cannot contain an unnamed provider.');
19
+ if (0 === registration.name.length) throw new Error('[@modern-js/runtime] A router provider realm cannot contain an unnamed provider.');
20
20
  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.`);
21
21
  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.`);
22
22
  providers.set(registration.name, registration.factory);
@@ -26,7 +26,7 @@ function createRouterProviderRealm(registrations) {
26
26
  ...providers.keys()
27
27
  ]);
28
28
  return Object.freeze({
29
- ...defaultProvider ? {
29
+ ...void 0 !== defaultProvider ? {
30
30
  defaultProvider
31
31
  } : {},
32
32
  get: (name)=>providers.get(name),
@@ -0,0 +1,13 @@
1
+ const handleRSCRedirect = (headers, basename, status)=>{
2
+ const newHeaders = new Headers(headers);
3
+ let redirectUrl = headers.get('Location');
4
+ if ('/' !== basename) redirectUrl = redirectUrl.replace(basename, '');
5
+ newHeaders.set('X-Modernjs-Redirect', redirectUrl);
6
+ newHeaders.set('X-Modernjs-BaseUrl', basename);
7
+ newHeaders.delete('Location');
8
+ return new Response(null, {
9
+ status,
10
+ headers: newHeaders
11
+ });
12
+ };
13
+ export { handleRSCRedirect };
@@ -1,4 +1,5 @@
1
1
  import { ROUTE_MODULES } from "@modern-js/utils/universal/constants";
2
+ const isRouteErrorResponse = (error)=>null !== error && 'object' == typeof error && 'number' == typeof error.status && 'string' == typeof error.statusText && 'boolean' == typeof error.internal && 'data' in error;
2
3
  const isObjectLike = (value)=>'object' == typeof value && null !== value || 'function' == typeof value;
3
4
  const isRouteComponent = (value)=>'function' == typeof value || isObjectLike(value) && '$$typeof' in value;
4
5
  const getRouteModules = ()=>{
@@ -51,4 +52,4 @@ const handleRouteModuleError = (error)=>{
51
52
  console.error(error);
52
53
  return null;
53
54
  };
54
- export { createShouldRevalidate, handleRouteModule, handleRouteModuleError, resolveRouteComponent };
55
+ export { createShouldRevalidate, handleRouteModule, handleRouteModuleError, isRouteErrorResponse, resolveRouteComponent };
@@ -85,18 +85,6 @@ const createServerPayload = (routerContext, routes)=>{
85
85
  })
86
86
  };
87
87
  };
88
- const handleRSCRedirect = (headers, basename, status)=>{
89
- const newHeaders = new Headers(headers);
90
- let redirectUrl = headers.get('Location');
91
- if ('/' !== basename) redirectUrl = redirectUrl.replace(basename, '');
92
- newHeaders.set('X-Modernjs-Redirect', redirectUrl);
93
- newHeaders.set('X-Modernjs-BaseUrl', basename);
94
- newHeaders.delete('Location');
95
- return new Response(null, {
96
- status: status,
97
- headers: newHeaders
98
- });
99
- };
100
88
  const prepareRSCRoutes = async (routes)=>{
101
89
  const isLazyComponent = (component)=>null != component && 'object' == typeof component && '_init' in component && '_payload' in component;
102
90
  const processRoutes = async (routesList)=>{
@@ -325,4 +313,5 @@ const RSCStaticRouter = ({ basename })=>{
325
313
  children: createRSCStaticRouterComponent(payload, basename)
326
314
  });
327
315
  };
328
- export { RSCStaticRouter, createClientRouterFromPayload, createServerPayload, handleRSCRedirect, prepareRSCRoutes };
316
+ export { handleRSCRedirect } from "./redirect.mjs";
317
+ export { RSCStaticRouter, createClientRouterFromPayload, createServerPayload, prepareRSCRoutes };
@@ -1,9 +1,10 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { renderNestedRoute } from "@modern-js/runtime-utils/browser";
3
- import { Route, UNSAFE_ErrorResponseImpl, isRouteErrorResponse } from "@modern-js/runtime-utils/router";
3
+ import { Route, UNSAFE_ErrorResponseImpl } from "@modern-js/runtime-utils/router";
4
4
  import react from "react";
5
5
  import { DefaultNotFound } from "./DefaultNotFound.mjs";
6
6
  import DeferredDataScripts from "./DeferredDataScripts.mjs";
7
+ import { isRouteErrorResponse } from "./routerHelper.mjs";
7
8
  function getRouteComponents(routes, { globalApp, ssrMode, props }) {
8
9
  const Layout = ({ Component, ...props })=>{
9
10
  const GlobalLayout = globalApp;
@@ -1,6 +1,6 @@
1
1
  import __rslib_shim_module__ from "node:module";
2
2
  const require = /*#__PURE__*/ __rslib_shim_module__.createRequire(/*#__PURE__*/ (()=>import.meta.url)());
3
- import { cleanRequireCache, isReact18 as utils_isReact18 } from "@modern-js/utils";
3
+ import { cleanRequireCache } from "@modern-js/utils";
4
4
  import path_0 from "path";
5
5
  import { documentPlugin } from "../document/cli/index.mjs";
6
6
  import { getEntrypointRoutesDir, getEntrypointRoutesOwner, handleFileChange, handleGeneratorEntryCode, handleModifyEntrypoints, isRouteEntry, routerPlugin, updateNestedRoutesSpec } from "../router/cli/index.mjs";
@@ -56,12 +56,10 @@ const runtimePlugin = (params)=>({
56
56
  });
57
57
  api.config(()=>{
58
58
  const { appDirectory, metaName } = api.getAppContext();
59
- const isReact18 = utils_isReact18(appDirectory);
60
- process.env.IS_REACT18 = isReact18.toString();
61
59
  return {
62
60
  source: {
63
61
  globalVars: {
64
- 'process.env.IS_REACT18': process.env.IS_REACT18
62
+ 'process.env.IS_REACT18': 'true'
65
63
  },
66
64
  include: [
67
65
  new RegExp(`[\\\\/]node_modules[\\\\/]@${metaName}[\\\\/]runtime[\\\\/].*[\\\\/]head\\.`)
@@ -70,14 +68,6 @@ const runtimePlugin = (params)=>({
70
68
  tools: {
71
69
  bundlerChain: (chain)=>{
72
70
  chain.module.rule('modern-entry').test(/\.jsx?$/).include.add(path_0.resolve(appDirectory, 'node_modules', `.${metaName}`)).end().sideEffects(true);
73
- },
74
- rspack: (_config, { appendPlugins, rspack })=>{
75
- if (!isReact18) appendPlugins([
76
- new rspack.IgnorePlugin({
77
- resourceRegExp: /^react-dom\/client$/,
78
- contextRegExp: /@modern-js\/runtime/
79
- })
80
- ]);
81
71
  }
82
72
  }
83
73
  };
@@ -108,6 +108,7 @@ const ssrBuilderPlugin = (modernAPI, outputModule, exportLoadablePath)=>({
108
108
  'process.env.MODERN_SSR_ENV': JSON.stringify(ssrEnv),
109
109
  'process.env.MODERN_ENABLE_HYDRATION': JSON.stringify(isUseSSRBundle(userConfig)),
110
110
  'process.env.MODERN_ENABLE_RSC': JSON.stringify(Boolean(userConfig.server?.rsc)),
111
+ __MODERN_ENABLE_RSC__: JSON.stringify(Boolean(userConfig.server?.rsc)),
111
112
  'process.env.MODERN_MF_APP_SSR': JSON.stringify(isModuleFederationAppSSR)
112
113
  }
113
114
  },
@@ -6,15 +6,23 @@ import { hydrateRoot } from "react-dom/client";
6
6
  import { RenderLevel } from "../constants.mjs";
7
7
  import { wrapRuntimeContextProvider } from "../react/wrapper.mjs";
8
8
  import { WithCallback } from "./withCallback.mjs";
9
- const isReact18 = ()=>'true' === process.env.IS_REACT18;
10
9
  const runtimeProcess = Reflect.get(globalThis, 'process');
10
+ const runtimeEnvironment = null !== runtimeProcess && 'object' == typeof runtimeProcess ? Reflect.get(runtimeProcess, 'env') : void 0;
11
+ const readRuntimeEnvironment = (name)=>{
12
+ if (null === runtimeEnvironment || 'object' != typeof runtimeEnvironment) return;
13
+ const value = Reflect.get(runtimeEnvironment, name);
14
+ return 'string' == typeof value ? value : void 0;
15
+ };
11
16
  const loadableReadyOptions = {
12
- chunkLoadingGlobal: runtimeProcess?.env?.MODERN_CHUNK_LOADING_GLOBAL || '__LOADABLE_LOADED_CHUNKS__'
17
+ chunkLoadingGlobal: (()=>{
18
+ const configured = readRuntimeEnvironment('MODERN_CHUNK_LOADING_GLOBAL');
19
+ return void 0 === configured || '' === configured ? '__LOADABLE_LOADED_CHUNKS__' : configured;
20
+ })()
13
21
  };
14
- async function hydrateWithReact(App, rootElement) {
15
- return hydrateRoot(rootElement, App, {
22
+ function hydrateWithReact(App, rootElement) {
23
+ return Promise.resolve(hydrateRoot(rootElement, App, {
16
24
  identifierPrefix: SSR_HYDRATION_ID_PREFIX
17
- });
25
+ }));
18
26
  }
19
27
  function hydrate_hydrateRoot(App, context, ModernRender, ModernHydrate) {
20
28
  const hydrateContext = {
@@ -27,9 +35,9 @@ function hydrate_hydrateRoot(App, context, ModernRender, ModernHydrate) {
27
35
  const callback = ()=>{
28
36
  delete hydrateContext._hydration;
29
37
  };
30
- const renderLevel = window?._SSR_DATA?.renderLevel || RenderLevel.CLIENT_RENDER;
31
- const renderMode = window?._SSR_DATA?.mode || 'string';
32
- if (isReact18() && 'stream' === renderMode) return streamSSRHydrate();
38
+ const renderLevel = window?._SSR_DATA?.renderLevel ?? RenderLevel.CLIENT_RENDER;
39
+ const renderMode = window?._SSR_DATA?.mode ?? 'string';
40
+ if ('stream' === renderMode) return streamSSRHydrate();
33
41
  function streamSSRHydrate() {
34
42
  if (renderLevel !== RenderLevel.SERVER_RENDER) return ModernRender(wrapRuntimeContextProvider(App, context));
35
43
  {
@@ -43,23 +51,23 @@ function hydrate_hydrateRoot(App, context, ModernRender, ModernHydrate) {
43
51
  return stringSSRHydrate();
44
52
  function stringSSRHydrate() {
45
53
  if (renderLevel === RenderLevel.CLIENT_RENDER) return ModernRender(wrapRuntimeContextProvider(App, context));
46
- if (renderLevel === RenderLevel.SERVER_RENDER) return new Promise((resolve)=>{
47
- isReact18() ? loadableReady(()=>{
54
+ {
55
+ if (renderLevel === RenderLevel.SERVER_RENDER) return loadableReady(()=>void 0, loadableReadyOptions).then(()=>{
48
56
  const SSRApp = ()=>/*#__PURE__*/ jsx(WithCallback, {
49
57
  callback: callback,
50
58
  children: App
51
59
  });
52
- ModernHydrate(wrapRuntimeContextProvider(/*#__PURE__*/ jsx(SSRApp, {}), hydrateContext)).then((root)=>{
53
- resolve(root);
54
- });
55
- }, loadableReadyOptions) : loadableReady(()=>{
56
- ModernHydrate(wrapRuntimeContextProvider(App, hydrateContext), callback).then((root)=>{
57
- resolve(root);
58
- });
59
- }, loadableReadyOptions);
60
- });
61
- console.warn(`unknow render level: ${renderLevel}, execute render()`);
62
- return ModernRender(wrapRuntimeContextProvider(App, context));
60
+ return ModernHydrate(wrapRuntimeContextProvider(/*#__PURE__*/ jsx(SSRApp, {}), hydrateContext));
61
+ });
62
+ const runtimeConsole = Reflect.get(globalThis, 'console');
63
+ if (null !== runtimeConsole && 'object' == typeof runtimeConsole) {
64
+ const warn = Reflect.get(runtimeConsole, 'warn');
65
+ if ('function' == typeof warn) Reflect.apply(warn, runtimeConsole, [
66
+ `unknow render level: ${renderLevel}, execute render()`
67
+ ]);
68
+ }
69
+ return ModernRender(wrapRuntimeContextProvider(App, context));
70
+ }
63
71
  }
64
72
  }
65
- export { hydrateWithReact, hydrate_hydrateRoot as hydrateRoot, isReact18 };
73
+ export { hydrateWithReact, hydrate_hydrateRoot as hydrateRoot };
@@ -1,6 +1,6 @@
1
1
  import "node:module";
2
- import { SSR_HYDRATION_ID_PREFIX } from "@modern-js/utils/universal/constants";
3
2
  import { parseCookie } from "cookie";
3
+ import { createRoot } from "react-dom/client";
4
4
  import { getGlobalInternalRuntimeContext } from "../context/index.mjs";
5
5
  import { getInitialContext } from "../context/runtime.mjs";
6
6
  import { wrapRuntimeContextProvider } from "../react/wrapper.mjs";
@@ -70,8 +70,8 @@ async function renderApp(App, id, hydrateFromSsrData, internalRuntimeContext) {
70
70
  return renderFunc(App, rootElement);
71
71
  }
72
72
  async function ModernHydrate(App, callback) {
73
- const hydrateFunc = IS_REACT18 ? hydrateWithReact18 : hydrateWithReact17;
74
- return hydrateFunc(App, rootElement, callback);
73
+ if (IS_REACT18) return hydrateWithReact(App, rootElement);
74
+ return hydrateWithReact17(App, rootElement, callback);
75
75
  }
76
76
  if (hydrateFromSsrData && process.env.MODERN_ENABLE_HYDRATION && window._SSR_DATA) return hydrateRoot(App, context, ModernRender, ModernHydrate);
77
77
  return ModernRender(wrapRuntimeContextProvider(App, context));
@@ -86,8 +86,7 @@ function createNestedAppRenderer() {
86
86
  return (App, id)=>renderApp(App, id, false, internalRuntimeContext);
87
87
  }
88
88
  async function renderWithReact18(App, rootElement) {
89
- const ReactDOM = await import("react-dom/client");
90
- const root = ReactDOM.createRoot(rootElement);
89
+ const root = createRoot(rootElement);
91
90
  root.render(App);
92
91
  return root;
93
92
  }
@@ -96,16 +95,9 @@ async function renderWithReact17(App, rootElement) {
96
95
  ReactDOM.render(App, rootElement);
97
96
  return rootElement;
98
97
  }
99
- async function hydrateWithReact18(App, rootElement) {
100
- const ReactDOM = await import("react-dom/client");
101
- const root = ReactDOM.hydrateRoot(rootElement, App, {
102
- identifierPrefix: SSR_HYDRATION_ID_PREFIX
103
- });
104
- return root;
105
- }
106
98
  async function hydrateWithReact17(App, rootElement, callback) {
107
99
  const ReactDOM = await import("react-dom");
108
100
  const root = ReactDOM.hydrate(App, rootElement, callback);
109
101
  return root;
110
102
  }
111
- export { createNestedAppRenderer, hydrateWithReact, hydrateWithReact17, hydrateWithReact18, render, renderWithReact17, renderWithReact18 };
103
+ export { createNestedAppRenderer, hydrateWithReact, hydrateWithReact17, render, renderWithReact17, renderWithReact18 };
@@ -4,39 +4,34 @@ import { HelmetProvider } from "react-helmet-async";
4
4
  import { InternalRuntimeContext, RuntimeContext, getGlobalEnableRsc } from "../context/index.mjs";
5
5
  import { stripRuntimeContextExtensions } from "../context/extensions.mjs";
6
6
  import { ensureHelmetContext } from "../context/helmetContext.mjs";
7
- function toRscSafeRecord(value) {
8
- if (!value || 'object' != typeof value) return value;
9
- return Object.fromEntries(Object.entries(value));
10
- }
11
- function createRscSafeSsrContext(ssrContext) {
12
- if (!ssrContext) return ssrContext;
13
- const { request } = ssrContext;
7
+ function createRscSafeRequestContext(ssrContext) {
8
+ if (void 0 === ssrContext) return {
9
+ request: {},
10
+ response: {
11
+ locals: {}
12
+ }
13
+ };
14
+ const { request, response } = ssrContext;
14
15
  return {
15
- nonce: ssrContext.nonce,
16
- useJsonScript: ssrContext.useJsonScript,
17
- htmlModifiers: [],
18
- baseUrl: ssrContext.baseUrl,
19
- request: request ? {
16
+ request: {
20
17
  url: request.url,
21
18
  userAgent: request.userAgent,
22
19
  cookie: request.cookie,
23
20
  pathname: request.pathname,
24
- query: toRscSafeRecord(request.query),
25
- params: toRscSafeRecord(request.params),
26
- headers: toRscSafeRecord(request.headers),
21
+ query: {
22
+ ...request.query
23
+ },
24
+ params: {
25
+ ...request.params
26
+ },
27
+ headers: {
28
+ ...request.headers
29
+ },
27
30
  host: request.host,
28
31
  referer: request.referer
29
- } : request,
30
- mode: ssrContext.mode,
31
- loaderFailureMode: ssrContext.loaderFailureMode
32
- };
33
- }
34
- function createRscSafeRequestContext(ssrContext) {
35
- const safeSsrContext = createRscSafeSsrContext(ssrContext);
36
- return {
37
- request: safeSsrContext?.request || {},
32
+ },
38
33
  response: {
39
- locals: ssrContext?.response?.locals || {}
34
+ locals: response.locals ?? {}
40
35
  }
41
36
  };
42
37
  }
@@ -52,14 +47,14 @@ function wrapRuntimeContextProvider(App, contextValue) {
52
47
  ...rest
53
48
  };
54
49
  stripRuntimeContextExtensions(runtimeContextValue);
55
- if (getGlobalEnableRsc() && !isBrowser) {
50
+ if (true === getGlobalEnableRsc() && false === isBrowser) {
56
51
  const rscSafeRequestContext = createRscSafeRequestContext(ssrContext);
57
52
  const rscInternalContextValue = {
58
53
  ...internalContextValue,
59
54
  context: rscSafeRequestContext,
60
- requestContext: rscSafeRequestContext,
61
- ssrContext: createRscSafeSsrContext(ssrContext)
55
+ requestContext: rscSafeRequestContext
62
56
  };
57
+ delete rscInternalContextValue.ssrContext;
63
58
  const rscRuntimeContextValue = {
64
59
  ...runtimeContextValue,
65
60
  context: rscSafeRequestContext,
@@ -1,6 +1,6 @@
1
1
  import "node:module";
2
2
  import { getRouterServerSnapshot } from "../../router/runtime/lifecycle.mjs";
3
- import { handleRSCRedirect } from "../../router/runtime/rsc-router.mjs";
3
+ import { handleRSCRedirect } from "../../router/runtime/redirect.mjs";
4
4
  import { SSRErrors } from "./tracer.mjs";
5
5
  const isRedirectStatus = (status)=>status >= 300 && status <= 399;
6
6
  const isNullBodyStatus = (status)=>204 === status || 205 === status || 304 === status;
@@ -14,12 +14,12 @@ const processRedirect = (headers, status, ctx)=>{
14
14
  const applyRouterSnapshotResult = (context, onError)=>{
15
15
  const routerServerSnapshot = getRouterServerSnapshot(context);
16
16
  const routerStatusCode = routerServerSnapshot?.statusCode ?? context.routerContext?.statusCode;
17
- if (routerStatusCode && 200 !== routerStatusCode) context.ssrContext?.response.status(routerStatusCode);
17
+ if (void 0 !== routerStatusCode && 0 !== routerStatusCode && !Number.isNaN(routerStatusCode) && 200 !== routerStatusCode) context.ssrContext?.response.status(routerStatusCode);
18
18
  const errors = Object.values(routerServerSnapshot?.errors || context.routerContext?.errors || {});
19
19
  if (errors.length > 0) onError(errors[0], SSRErrors.LOADER_ERROR);
20
20
  };
21
21
  const createLoaderRedirectResponse = (beforeRenderResult, redirectCtx)=>{
22
- if (!beforeRenderResult || !isRedirectStatus(beforeRenderResult.status)) return;
22
+ if (void 0 === beforeRenderResult || !isRedirectStatus(beforeRenderResult.status)) return;
23
23
  if (beforeRenderResult.headers.has('X-Modernjs-Redirect')) return beforeRenderResult;
24
24
  const redirectUrl = beforeRenderResult.headers.get('Location') || '/';
25
25
  return processRedirect(new Headers({
@@ -27,7 +27,7 @@ const createLoaderRedirectResponse = (beforeRenderResult, redirectCtx)=>{
27
27
  }), beforeRenderResult.status, redirectCtx);
28
28
  };
29
29
  const finalizeRenderResponse = (response, responseProxy, redirectCtx, routerCleanup)=>{
30
- if (-1 !== responseProxy.status && isRedirectStatus(responseProxy.status) && responseProxy.headers.Location) return processRedirect(new Headers(responseProxy.headers), responseProxy.status, redirectCtx);
30
+ if (-1 !== responseProxy.status && isRedirectStatus(responseProxy.status) && void 0 !== responseProxy.headers.Location && '' !== responseProxy.headers.Location) return processRedirect(new Headers(responseProxy.headers), responseProxy.status, redirectCtx);
31
31
  Object.entries(responseProxy.headers).forEach(([key, value])=>{
32
32
  response.headers.set(key, value);
33
33
  });
@@ -44,7 +44,7 @@ function getMatchedRouteAssets(runtimeContext, routeManifest) {
44
44
  return matchedRouteIds.flatMap((routeId)=>routeAssets[routeId]?.assets ?? []);
45
45
  }
46
46
  function getMatchedRouteChunks(runtimeContext, routeManifest, routeAssetToChunk) {
47
- if (!routeManifest) return [];
47
+ if (void 0 === routeManifest) return [];
48
48
  return getMatchedRouteAssets(runtimeContext, routeManifest).map(routeAssetToChunk);
49
49
  }
50
50
  const orderHydrationScriptChunks = ({ asyncEntryChunks, collectedChunks, matchedRouteChunks, entryName })=>{
@@ -1,5 +1,4 @@
1
1
  import "node:module";
2
- import { matchRoutes } from "@modern-js/runtime-utils/router";
3
2
  import { getRouterMatchedRouteIds } from "../../../router/runtime/lifecycle.mjs";
4
3
  import { CHUNK_CSS_PLACEHOLDER } from "../constants.mjs";
5
4
  import { createFederatedCssLinks } from "../federatedCss.mjs";
@@ -28,20 +27,12 @@ async function buildShellBeforeTemplate(beforeAppTemplate, options) {
28
27
  });
29
28
  return safeReplace(template, CHUNK_CSS_PLACEHOLDER, css);
30
29
  async function getCssChunks() {
31
- const { routeManifest, routerContext, routes } = runtimeContext;
30
+ const { routeManifest } = runtimeContext;
32
31
  const routeAssets = routeManifest?.routeAssets;
33
32
  if (!routeAssets) return '';
34
33
  let matchedRouteManifests = [];
35
34
  const matchedRouteIds = getRouterMatchedRouteIds(runtimeContext);
36
35
  if (matchedRouteIds?.length) matchedRouteManifests = matchedRouteIds.map((routeId)=>routeAssets[routeId]).filter(Boolean);
37
- else if (routerContext && routes) {
38
- const matches = matchRoutes(routes, routerContext.location, routerContext.basename);
39
- matchedRouteManifests = matches?.map((match, index)=>{
40
- if (!index) return;
41
- const routeId = match.route.id;
42
- if (routeId) return routeAssets[routeId];
43
- }).filter((routeManifest)=>void 0 !== routeManifest) ?? [];
44
- }
45
36
  const asyncEntry = routeAssets[`async-${entryName}`];
46
37
  if (asyncEntry) matchedRouteManifests.push(asyncEntry);
47
38
  const cssChunks = matchedRouteManifests.reduce((chunks, routeManifest)=>{
@@ -86,7 +86,7 @@ async function generateHtml(App, htmlTemplate, chunkSet, collectors, htmlModifie
86
86
  createReplaceHtml(html),
87
87
  createReplaceChunkJs(jsChunk, entryName),
88
88
  createReplaceChunkCss(cssChunk),
89
- createReplaceSSRDataScript(ssrScripts),
89
+ createReplaceSSRDataScript(ssrScripts, entryName),
90
90
  createReplaceHelemt(helmetData),
91
91
  ...htmlModifiers
92
92
  ]);
@@ -95,8 +95,8 @@ async function generateHtml(App, htmlTemplate, chunkSet, collectors, htmlModifie
95
95
  function createReplaceHtml(html) {
96
96
  return (template)=>safeReplace(template, HTML_PLACEHOLDER, html);
97
97
  }
98
- function createReplaceSSRDataScript(data) {
99
- return (template)=>safeReplace(template, SSR_DATA_PLACEHOLDER, data);
98
+ function createReplaceSSRDataScript(data, entryName) {
99
+ return (template)=>replaceChunkJsPlaceholder(template, data, entryName, SSR_DATA_PLACEHOLDER);
100
100
  }
101
101
  function createReplaceChunkJs(js, entryName) {
102
102
  return (template)=>replaceChunkJsPlaceholder(template, js, entryName);
@@ -1,5 +1,5 @@
1
1
  import "node:module";
2
- import { isRouteErrorResponse } from "@modern-js/runtime-utils/router";
2
+ import { isRouteErrorResponse } from "../../router/runtime/routerHelper.mjs";
3
3
  function attributesToString(attributes) {
4
4
  return Object.entries(attributes).reduce((str, [key, value])=>void 0 === value ? str : `${str} ${key}="${value}"`, '');
5
5
  }
@@ -349,4 +349,4 @@ const documentPlugin = ()=>({
349
349
  });
350
350
  const cli = documentPlugin;
351
351
  export default cli;
352
- export { documentPlugin, getDocumentByEntryName };
352
+ export { documentPlugin, getDocumentByEntryName, processScriptPlaceholders };