@bleedingdev/modern-js-runtime 3.9.0-ultramodern.1 → 3.9.0-ultramodern.11

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 (166) hide show
  1. package/dist/cjs/cli/code.js +3 -1
  2. package/dist/cjs/cli/ssr/index.js +2 -74
  3. package/dist/cjs/core/browser/hydrate.js +6 -1
  4. package/dist/cjs/core/context/index.js +4 -43
  5. package/dist/cjs/core/context/public.js +4 -7
  6. package/dist/cjs/core/context/runtime.js +17 -5
  7. package/dist/cjs/core/react/wrapper.js +22 -65
  8. package/dist/cjs/core/server/helmet.js +5 -4
  9. package/dist/cjs/core/server/requestResponse.js +4 -4
  10. package/dist/cjs/core/server/routerCleanup.js +2 -2
  11. package/dist/cjs/core/server/shared.js +171 -4
  12. package/dist/cjs/core/server/stream/afterTemplate.js +21 -16
  13. package/dist/cjs/core/server/stream/beforeTemplate.js +34 -25
  14. package/dist/cjs/core/server/stream/beforeTemplate.worker.js +28 -21
  15. package/dist/cjs/core/server/stream/createReadableStream.js +208 -123
  16. package/dist/cjs/core/server/stream/createReadableStream.worker.js +159 -90
  17. package/dist/cjs/core/server/stream/deferredScript.js +3 -3
  18. package/dist/cjs/core/server/stream/shared.js +2 -2
  19. package/dist/cjs/core/server/string/index.js +100 -64
  20. package/dist/cjs/core/server/string/loadable.js +34 -19
  21. package/dist/cjs/core/server/string/ssrData.js +5 -12
  22. package/dist/cjs/core/server/utils.js +1 -2
  23. package/dist/cjs/exports/head.js +7 -14
  24. package/dist/cjs/router/runtime/PrefetchLink.js +67 -123
  25. package/dist/cjs/router/runtime/hooks.js +13 -2
  26. package/dist/cjs/router/runtime/internal.js +7 -45
  27. package/dist/cjs/router/runtime/plugin.js +2 -8
  28. package/dist/cjs/router/runtime/plugin.node.js +2 -30
  29. package/dist/cjs/router/runtime/redirect.js +1 -1
  30. package/dist/esm/cli/code.mjs +3 -1
  31. package/dist/esm/cli/ssr/index.mjs +3 -72
  32. package/dist/esm/core/browser/hydrate.mjs +7 -2
  33. package/dist/esm/core/context/index.mjs +2 -5
  34. package/dist/esm/core/context/public.mjs +1 -5
  35. package/dist/esm/core/context/runtime.mjs +13 -4
  36. package/dist/esm/core/react/wrapper.mjs +21 -67
  37. package/dist/esm/core/server/helmet.mjs +5 -4
  38. package/dist/esm/core/server/requestResponse.mjs +3 -3
  39. package/dist/esm/core/server/routerCleanup.mjs +1 -1
  40. package/dist/esm/core/server/shared.mjs +153 -1
  41. package/dist/esm/core/server/stream/afterTemplate.mjs +23 -18
  42. package/dist/esm/core/server/stream/beforeTemplate.mjs +37 -28
  43. package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +31 -24
  44. package/dist/esm/core/server/stream/createReadableStream.mjs +207 -122
  45. package/dist/esm/core/server/stream/createReadableStream.worker.mjs +149 -90
  46. package/dist/esm/core/server/stream/deferredScript.mjs +3 -3
  47. package/dist/esm/core/server/stream/shared.mjs +2 -2
  48. package/dist/esm/core/server/string/index.mjs +104 -68
  49. package/dist/esm/core/server/string/loadable.mjs +34 -19
  50. package/dist/esm/core/server/string/ssrData.mjs +5 -12
  51. package/dist/esm/core/server/utils.mjs +1 -2
  52. package/dist/esm/exports/head.mjs +7 -14
  53. package/dist/esm/router/runtime/PrefetchLink.mjs +67 -123
  54. package/dist/esm/router/runtime/hooks.mjs +9 -1
  55. package/dist/esm/router/runtime/internal.mjs +2 -33
  56. package/dist/esm/router/runtime/plugin.mjs +1 -7
  57. package/dist/esm/router/runtime/plugin.node.mjs +1 -29
  58. package/dist/esm/router/runtime/redirect.mjs +1 -1
  59. package/dist/esm-node/cli/code.mjs +3 -1
  60. package/dist/esm-node/cli/ssr/index.mjs +3 -72
  61. package/dist/esm-node/core/browser/hydrate.mjs +7 -2
  62. package/dist/esm-node/core/context/index.mjs +2 -5
  63. package/dist/esm-node/core/context/public.mjs +1 -5
  64. package/dist/esm-node/core/context/runtime.mjs +13 -4
  65. package/dist/esm-node/core/react/wrapper.mjs +21 -67
  66. package/dist/esm-node/core/server/helmet.mjs +5 -4
  67. package/dist/esm-node/core/server/requestResponse.mjs +3 -3
  68. package/dist/esm-node/core/server/routerCleanup.mjs +1 -1
  69. package/dist/esm-node/core/server/shared.mjs +153 -1
  70. package/dist/esm-node/core/server/stream/afterTemplate.mjs +23 -18
  71. package/dist/esm-node/core/server/stream/beforeTemplate.mjs +37 -28
  72. package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +31 -24
  73. package/dist/esm-node/core/server/stream/createReadableStream.mjs +207 -122
  74. package/dist/esm-node/core/server/stream/createReadableStream.worker.mjs +149 -90
  75. package/dist/esm-node/core/server/stream/deferredScript.mjs +3 -3
  76. package/dist/esm-node/core/server/stream/shared.mjs +2 -2
  77. package/dist/esm-node/core/server/string/index.mjs +104 -68
  78. package/dist/esm-node/core/server/string/loadable.mjs +34 -19
  79. package/dist/esm-node/core/server/string/ssrData.mjs +5 -12
  80. package/dist/esm-node/core/server/utils.mjs +1 -2
  81. package/dist/esm-node/exports/head.mjs +7 -14
  82. package/dist/esm-node/router/runtime/PrefetchLink.mjs +67 -123
  83. package/dist/esm-node/router/runtime/hooks.mjs +9 -1
  84. package/dist/esm-node/router/runtime/internal.mjs +2 -33
  85. package/dist/esm-node/router/runtime/plugin.mjs +1 -7
  86. package/dist/esm-node/router/runtime/plugin.node.mjs +1 -29
  87. package/dist/esm-node/router/runtime/redirect.mjs +1 -1
  88. package/dist/types/cli/ssr/index.d.ts +0 -3
  89. package/dist/types/core/context/index.d.ts +4 -6
  90. package/dist/types/core/context/public.d.ts +1 -23
  91. package/dist/types/core/context/runtime.d.ts +26 -2
  92. package/dist/types/core/react/wrapper.d.ts +6 -0
  93. package/dist/types/core/server/helmet.d.ts +4 -5
  94. package/dist/types/core/server/requestHandler.d.ts +2 -2
  95. package/dist/types/core/server/requestResponse.d.ts +1 -1
  96. package/dist/types/core/server/routerCleanup.d.ts +1 -1
  97. package/dist/types/core/server/shared.d.ts +24 -1
  98. package/dist/types/core/server/stream/afterTemplate.d.ts +2 -1
  99. package/dist/types/core/server/stream/beforeTemplate.d.ts +4 -1
  100. package/dist/types/core/server/stream/beforeTemplate.worker.d.ts +4 -1
  101. package/dist/types/core/server/stream/shared.d.ts +2 -2
  102. package/dist/types/core/server/string/loadable.d.ts +6 -3
  103. package/dist/types/core/server/string/ssrData.d.ts +2 -1
  104. package/dist/types/core/server/string/types.d.ts +1 -5
  105. package/dist/types/core/server/tracer.d.ts +1 -1
  106. package/dist/types/core/server/utils.d.ts +1 -1
  107. package/dist/types/core/types.d.ts +1 -2
  108. package/dist/types/exports/head.d.ts +2 -2
  109. package/dist/types/router/runtime/PrefetchLink.d.ts +27 -2
  110. package/dist/types/router/runtime/hooks.d.ts +19 -2
  111. package/dist/types/router/runtime/internal.d.ts +4 -21
  112. package/dist/types/router/runtime/types.d.ts +2 -43
  113. package/package.json +18 -46
  114. package/rstest.config.mts +32 -2
  115. package/dist/cjs/boundary-debugger/index.js +0 -317
  116. package/dist/cjs/core/context/extensions.js +0 -74
  117. package/dist/cjs/core/context/helmetContext.js +0 -54
  118. package/dist/cjs/core/server/federatedCss.js +0 -58
  119. package/dist/cjs/core/server/scriptOrder.js +0 -140
  120. package/dist/cjs/module-federation/consume-surface.js +0 -199
  121. package/dist/cjs/module-federation/distributed-ssr.js +0 -135
  122. package/dist/cjs/module-federation/index.js +0 -316
  123. package/dist/cjs/module-federation/last-known-good.js +0 -157
  124. package/dist/cjs/module-federation/manifest-recovery-runtime-plugin.js +0 -129
  125. package/dist/cjs/module-federation/surface-resolution-types.js +0 -61
  126. package/dist/cjs/router/runtime/lifecycle.js +0 -167
  127. package/dist/cjs/router/runtime/provider.js +0 -153
  128. package/dist/esm/boundary-debugger/index.mjs +0 -277
  129. package/dist/esm/core/context/extensions.mjs +0 -33
  130. package/dist/esm/core/context/helmetContext.mjs +0 -13
  131. package/dist/esm/core/server/federatedCss.mjs +0 -20
  132. package/dist/esm/core/server/scriptOrder.mjs +0 -90
  133. package/dist/esm/module-federation/consume-surface.mjs +0 -158
  134. package/dist/esm/module-federation/distributed-ssr.mjs +0 -82
  135. package/dist/esm/module-federation/index.mjs +0 -115
  136. package/dist/esm/module-federation/last-known-good.mjs +0 -113
  137. package/dist/esm/module-federation/manifest-recovery-runtime-plugin.mjs +0 -89
  138. package/dist/esm/module-federation/surface-resolution-types.mjs +0 -8
  139. package/dist/esm/router/runtime/lifecycle.mjs +0 -105
  140. package/dist/esm/router/runtime/provider.mjs +0 -100
  141. package/dist/esm-node/boundary-debugger/index.mjs +0 -278
  142. package/dist/esm-node/core/context/extensions.mjs +0 -34
  143. package/dist/esm-node/core/context/helmetContext.mjs +0 -14
  144. package/dist/esm-node/core/server/federatedCss.mjs +0 -21
  145. package/dist/esm-node/core/server/scriptOrder.mjs +0 -91
  146. package/dist/esm-node/module-federation/consume-surface.mjs +0 -159
  147. package/dist/esm-node/module-federation/distributed-ssr.mjs +0 -83
  148. package/dist/esm-node/module-federation/index.mjs +0 -116
  149. package/dist/esm-node/module-federation/last-known-good.mjs +0 -114
  150. package/dist/esm-node/module-federation/manifest-recovery-runtime-plugin.mjs +0 -90
  151. package/dist/esm-node/module-federation/surface-resolution-types.mjs +0 -9
  152. package/dist/esm-node/router/runtime/lifecycle.mjs +0 -106
  153. package/dist/esm-node/router/runtime/provider.mjs +0 -101
  154. package/dist/types/boundary-debugger/index.d.ts +0 -28
  155. package/dist/types/core/context/extensions.d.ts +0 -35
  156. package/dist/types/core/context/helmetContext.d.ts +0 -10
  157. package/dist/types/core/server/federatedCss.d.ts +0 -5
  158. package/dist/types/core/server/scriptOrder.d.ts +0 -25
  159. package/dist/types/module-federation/consume-surface.d.ts +0 -104
  160. package/dist/types/module-federation/distributed-ssr.d.ts +0 -61
  161. package/dist/types/module-federation/index.d.ts +0 -71
  162. package/dist/types/module-federation/last-known-good.d.ts +0 -52
  163. package/dist/types/module-federation/manifest-recovery-runtime-plugin.d.ts +0 -25
  164. package/dist/types/module-federation/surface-resolution-types.d.ts +0 -23
  165. package/dist/types/router/runtime/lifecycle.d.ts +0 -27
  166. package/dist/types/router/runtime/provider.d.ts +0 -78
@@ -6,4 +6,12 @@ const onBeforeCreateRouter = createRouterSyncHook();
6
6
  const onAfterCreateRouter = createRouterSyncHook();
7
7
  const onBeforeHydrateRouter = createRouterSyncHook();
8
8
  const onAfterHydrateRouter = createRouterSyncHook();
9
- export { modifyRoutes, onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeCreateRoutes, onBeforeHydrateRouter };
9
+ const routerProviderRegistryHooks = {
10
+ modifyRoutes: modifyRoutes,
11
+ onBeforeCreateRoutes: onBeforeCreateRoutes,
12
+ onBeforeCreateRouter: onBeforeCreateRouter,
13
+ onAfterCreateRouter: onAfterCreateRouter,
14
+ onBeforeHydrateRouter: onBeforeHydrateRouter,
15
+ onAfterHydrateRouter: onAfterHydrateRouter
16
+ };
17
+ export { modifyRoutes, onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeCreateRoutes, onBeforeHydrateRouter, routerProviderRegistryHooks };
@@ -1,34 +1,3 @@
1
- import { merge } from "@modern-js/runtime-utils/merge";
2
- import { modifyRoutes, routerPlugin } from "./plugin.mjs";
3
- import { createRouterProviderRealm, registerRouterProvider, reportUnsupportedProviderRegistryHooks, resolveRouterProvider, routerProviderRegistryHooks } from "./provider.mjs";
4
- registerRouterProvider('react-router', routerPlugin, {
5
- isDefault: true
6
- });
7
- const createRouterPlugin = (localProviders = [])=>{
8
- const providerRealm = createRouterProviderRealm([
9
- {
10
- name: 'react-router',
11
- factory: routerPlugin,
12
- isDefault: true
13
- },
14
- ...localProviders
15
- ]);
16
- return (userConfig = {})=>({
17
- name: '@modern-js/plugin-router',
18
- registryHooks: routerProviderRegistryHooks,
19
- setup: (api)=>{
20
- const mergedConfig = merge(api.getRuntimeConfig().router || {}, userConfig);
21
- const pluginFactory = resolveRouterProvider(mergedConfig.framework, {
22
- realm: providerRealm
23
- });
24
- const providerPlugin = pluginFactory(userConfig);
25
- reportUnsupportedProviderRegistryHooks(providerPlugin);
26
- providerPlugin.setup?.(api);
27
- }
28
- });
29
- };
30
- const internal_routerPlugin = createRouterPlugin();
31
- const internal = internal_routerPlugin;
1
+ export { routerProviderRegistryHooks } from "./hooks.mjs";
2
+ export { modifyRoutes, routerPlugin as default, routerPlugin } from "./plugin.mjs";
32
3
  export { renderRoutes } from "./utils.mjs";
33
- export default internal;
34
- export { createRouterPlugin, createRouterProviderRealm, internal_routerPlugin as routerPlugin, modifyRoutes, registerRouterProvider, resolveRouterProvider };
@@ -4,9 +4,8 @@ import { RouterProvider, createBrowserRouter, createHashRouter, createRoutesFrom
4
4
  import { normalizePathname } from "@modern-js/runtime-utils/url";
5
5
  import * as __rspack_external_react from "react";
6
6
  import { InternalRuntimeContext, getGlobalEnableRsc, getGlobalIsRscClient, getGlobalLayoutApp, getGlobalRoutes } from "../../core/context/index.mjs";
7
- import { applyRouterRuntimeState } from "./lifecycle.mjs";
7
+ import { routerProviderRegistryHooks } from "./hooks.mjs";
8
8
  import { Link } from "./PrefetchLink.mjs";
9
- import { routerProviderRegistryHooks } from "./provider.mjs";
10
9
  import { createClientRouterFromPayload } from "./rsc-router.mjs";
11
10
  import { createRouteObjectsFromConfig, deserializeErrors, renderRoutes, urlJoin } from "./utils.mjs";
12
11
  let finalRouteConfig = {
@@ -168,11 +167,6 @@ function useRouterCreation(props, options) {
168
167
  basename: _basename,
169
168
  hydrationData
170
169
  });
171
- applyRouterRuntimeState(runtimeContext, {
172
- framework: 'react-router',
173
- basename: _basename,
174
- instance: router
175
- });
176
170
  hooks.onAfterCreateRouter.call({
177
171
  ...routerLifecycleContext,
178
172
  router,
@@ -8,9 +8,8 @@ import { useContext } from "react";
8
8
  import { InternalRuntimeContext, getGlobalEnableRsc, getGlobalLayoutApp, getGlobalRoutes } from "../../core/context/index.mjs";
9
9
  import { setServerPayload } from "../../core/context/serverPayload/index.server.mjs";
10
10
  import DeferredDataScripts_node from "./DeferredDataScripts.node.mjs";
11
- import { applyRouterRuntimeState, createRouterServerSnapshot } from "./lifecycle.mjs";
11
+ import { routerProviderRegistryHooks } from "./hooks.mjs";
12
12
  import { Link } from "./PrefetchLink.mjs";
13
- import { routerProviderRegistryHooks } from "./provider.mjs";
14
13
  import { RSCStaticRouter, createServerPayload, handleRSCRedirect, prepareRSCRoutes } from "./rsc-router.mjs";
15
14
  import { createRouteObjectsFromConfig, renderRoutes, urlJoin } from "./utils.mjs";
16
15
  function createRemixRequest(request) {
@@ -23,24 +22,6 @@ function createRemixRequest(request) {
23
22
  signal: controller.signal
24
23
  });
25
24
  }
26
- function createReactRouterServerSnapshot(routerContext, basename) {
27
- return createRouterServerSnapshot({
28
- framework: 'react-router',
29
- basename,
30
- statusCode: routerContext.statusCode,
31
- errors: routerContext.errors,
32
- routerData: {
33
- loaderData: routerContext.loaderData,
34
- errors: routerContext.errors
35
- },
36
- matches: routerContext.matches.map((match)=>{
37
- const routeId = match.route.id;
38
- return 'string' == typeof routeId ? {
39
- routeId
40
- } : void 0;
41
- }).filter((match)=>void 0 !== match)
42
- });
43
- }
44
25
  const routerPlugin = (userConfig = {})=>({
45
26
  name: '@modern-js/plugin-router',
46
27
  registryHooks: routerProviderRegistryHooks,
@@ -107,18 +88,9 @@ const routerPlugin = (userConfig = {})=>({
107
88
  throw errors[0];
108
89
  }
109
90
  context.routerContext = routerContext;
110
- const routerServerSnapshot = createReactRouterServerSnapshot(routerContext, _basename);
111
- applyRouterRuntimeState(context, {
112
- framework: 'react-router',
113
- basename: _basename,
114
- instance: routerContext,
115
- matchedRouteIds: routerServerSnapshot.matchedRouteIds,
116
- serverSnapshot: routerServerSnapshot
117
- });
118
91
  hooks.onAfterCreateRouter.call({
119
92
  ...routerLifecycleContext,
120
93
  router: routerContext,
121
- serverSnapshot: routerServerSnapshot,
122
94
  runtimeContext: context
123
95
  });
124
96
  let payload;
@@ -1,7 +1,7 @@
1
1
  const handleRSCRedirect = (headers, basename, status)=>{
2
2
  const newHeaders = new Headers(headers);
3
3
  let redirectUrl = headers.get('Location');
4
- if (!redirectUrl || ![
4
+ if (null === redirectUrl || '' === redirectUrl || ![
5
5
  301,
6
6
  302,
7
7
  303,
@@ -74,7 +74,9 @@ const generateCode = async (entrypoints, appContext, config, hooks)=>{
74
74
  const bootstrapFile = path.resolve(internalDirectory, `./${entryName}/${ENTRY_BOOTSTRAP_FILE_NAME}`);
75
75
  await fs.outputFile(bootstrapFile, `import(/* webpackChunkName: "async-${entryName}" */ './${INDEX_FILE_NAME}');`, 'utf8');
76
76
  const bootstrapServerFile = path.resolve(internalDirectory, `./${entryName}/${ENTRY_SERVER_BOOTSTRAP_FILE_NAME}`);
77
- if (ssrMode) await fs.outputFile(bootstrapServerFile, `export const requestHandler = import('./${SERVER_ENTRY_POINT_FILE_NAME}').then((m) => m.requestHandler)`, 'utf8');
77
+ if (ssrMode) await fs.outputFile(bootstrapServerFile, `export const requestHandler = import('./${SERVER_ENTRY_POINT_FILE_NAME}').then((m) => m.requestHandler);
78
+ // The renderer awaits this promise later; retain its rejection without an early unhandled rejection.
79
+ requestHandler.catch(() => {});`, 'utf8');
78
80
  }
79
81
  if (ssrMode) {
80
82
  const indexServerCode = __rspack_external__template_server_mjs_f98cfe58.serverIndex({
@@ -4,51 +4,6 @@ import { LOADABLE_STATS_FILE, isUseSSRBundle } from "@modern-js/utils";
4
4
  import path from "path";
5
5
  import loadable_bundler_plugin from "./loadable-bundler-plugin.mjs";
6
6
  import { resolveSSRMode } from "./mode.mjs";
7
- const getRspackPlugins = (rspackConfig)=>{
8
- if (!rspackConfig) return [];
9
- const rspackEntries = Array.isArray(rspackConfig) ? rspackConfig : [
10
- rspackConfig
11
- ];
12
- const plugins = [];
13
- for (const entry of rspackEntries){
14
- if (!entry || 'function' == typeof entry || 'object' != typeof entry) continue;
15
- const maybePlugins = entry.plugins;
16
- if (Array.isArray(maybePlugins)) {
17
- for (const plugin of maybePlugins)if (plugin) plugins.push(plugin);
18
- }
19
- }
20
- return plugins;
21
- };
22
- const getRspackPluginName = (plugin)=>{
23
- if ('string' == typeof plugin) return plugin;
24
- if ('function' == typeof plugin) return plugin.name;
25
- if (Array.isArray(plugin)) {
26
- const [first] = plugin;
27
- if (!first) return;
28
- if ('string' == typeof first) return first;
29
- if ('function' == typeof first) return first.name;
30
- if ('object' == typeof first) return first.name || first.constructor?.name;
31
- return;
32
- }
33
- return plugin.name || plugin.constructor?.name;
34
- };
35
- const hasServerRenderingConfig = (userConfig)=>{
36
- const { output, server } = userConfig;
37
- if (output?.ssg) return true;
38
- if (output?.ssgByEntries && Object.keys(output.ssgByEntries).length > 0) return true;
39
- if (server?.ssr) return true;
40
- if (server?.ssrByEntries && Object.keys(server.ssrByEntries).length > 0) return true;
41
- return false;
42
- };
43
- const isModuleFederationAppSSREnabledInConfig = (ssr)=>{
44
- if (!ssr || 'object' != typeof ssr) return false;
45
- return true === ssr.moduleFederationAppSSR;
46
- };
47
- const isModuleFederationAppSSREnabled = (userConfig)=>{
48
- if (isModuleFederationAppSSREnabledInConfig(userConfig.server?.ssr)) return true;
49
- if (userConfig.server?.ssrByEntries && 'object' == typeof userConfig.server.ssrByEntries) return Object.values(userConfig.server.ssrByEntries).some(isModuleFederationAppSSREnabledInConfig);
50
- return false;
51
- };
52
7
  const checkUseStringSSR = (config, appDirectory, entrypoints)=>{
53
8
  if (entrypoints && entrypoints.length > 0) {
54
9
  for (const entrypoint of entrypoints){
@@ -64,41 +19,19 @@ const checkUseStringSSR = (config, appDirectory, entrypoints)=>{
64
19
  }
65
20
  return true;
66
21
  };
67
- const isModuleFederationRspackPlugin = (plugin)=>{
68
- const candidate = getRspackPluginName(plugin);
69
- return 'string' == typeof candidate && /modulefederation/i.test(candidate);
70
- };
71
- const hasModuleFederationMarker = (config)=>{
72
- if ('true' === process.env.MF_SSR_PRJ) return true;
73
- const define = config.source?.define || {};
74
- if ('REMOTE_IP_STRATEGY' in define || 'FEDERATION_IPV4' in define) return true;
75
- const plugins = getRspackPlugins(config.tools?.rspack);
76
- return plugins.some(isModuleFederationRspackPlugin);
77
- };
78
22
  const isNodeEnvironmentTarget = (target)=>'string' == typeof target && ('node' === target || 'async-node' === target || target.startsWith('node'));
79
- const shouldUseModuleFederationNodeOutput = (config)=>isNodeEnvironmentTarget(config.output?.target) && hasModuleFederationMarker(config);
80
23
  const ssrBuilderPlugin = (modernAPI, outputModule, exportLoadablePath)=>({
81
24
  name: '@modern-js/builder-plugin-ssr',
82
25
  setup (api) {
83
26
  api.modifyEnvironmentConfig((config, { name, mergeEnvironmentConfig })=>{
84
27
  const isServerEnvironment = isNodeEnvironmentTarget(config.output.target) || 'workerSSR' === name;
85
28
  const userConfig = modernAPI.getNormalizedConfig();
86
- const hasServerRendering = hasServerRenderingConfig(userConfig);
87
- const hasModuleFederationRuntimeMarker = hasServerRendering && shouldUseModuleFederationNodeOutput(config);
88
- const hasExplicitMfSsrFlag = isModuleFederationAppSSREnabled(userConfig);
89
- const requireExplicitMfSsrFlag = 'true' === process.env.MODERN_MF_APP_SSR_REQUIRE_EXPLICIT;
90
- if (hasServerRendering && hasModuleFederationRuntimeMarker && !hasExplicitMfSsrFlag) {
91
- const warningMessage = '[modernjs][mf-ssr] Module Federation SSR was auto-detected from runtime markers. Set server.ssr.moduleFederationAppSSR=true explicitly in host and remotes to avoid heuristic drift.';
92
- if (requireExplicitMfSsrFlag) throw new Error(`${warningMessage} (enforced by MODERN_MF_APP_SSR_REQUIRE_EXPLICIT=true)`);
93
- console.warn(warningMessage);
94
- }
95
- const isModuleFederationAppSSR = hasServerRendering && hasExplicitMfSsrFlag;
96
29
  const ssrEnv = userConfig.deploy?.worker?.ssr || userConfig.server?.rsc ? 'edge' : 'node';
97
30
  const appContext = modernAPI.getAppContext();
98
31
  const { appDirectory, entrypoints } = appContext;
99
32
  const useLoadablePlugin = isUseSSRBundle(userConfig) && !isServerEnvironment && checkUseStringSSR(userConfig, appDirectory, entrypoints);
100
33
  const outputConfig = {
101
- module: isServerEnvironment && (outputModule || 'workerSSR' === name && userConfig.deploy?.target === 'cloudflare')
34
+ module: isServerEnvironment && outputModule
102
35
  };
103
36
  const useLoadableComponents = isUseSSRBundle(userConfig) && checkUseStringSSR(userConfig, appDirectory, entrypoints);
104
37
  return mergeEnvironmentConfig(config, {
@@ -108,12 +41,10 @@ const ssrBuilderPlugin = (modernAPI, outputModule, exportLoadablePath)=>({
108
41
  'process.env.MODERN_SSR_ENV': JSON.stringify(ssrEnv),
109
42
  'process.env.MODERN_ENABLE_HYDRATION': JSON.stringify(isUseSSRBundle(userConfig)),
110
43
  'process.env.MODERN_ENABLE_RSC': JSON.stringify(Boolean(userConfig.server?.rsc)),
111
- __MODERN_ENABLE_RSC__: JSON.stringify(Boolean(userConfig.server?.rsc)),
112
- 'process.env.MODERN_MF_APP_SSR': JSON.stringify(String(isModuleFederationAppSSR))
44
+ __MODERN_ENABLE_RSC__: JSON.stringify(Boolean(userConfig.server?.rsc))
113
45
  }
114
46
  },
115
47
  output: outputConfig,
116
- splitChunks: isServerEnvironment && (hasModuleFederationRuntimeMarker || hasExplicitMfSsrFlag) ? false : void 0,
117
48
  tools: {
118
49
  bundlerChain: useLoadablePlugin ? (chain)=>{
119
50
  chain.plugin('loadable').use(loadable_bundler_plugin, [
@@ -182,4 +113,4 @@ const ssrPlugin = ()=>({
182
113
  });
183
114
  const cli_ssr = ssrPlugin;
184
115
  export default cli_ssr;
185
- export { shouldUseModuleFederationNodeOutput, ssrPlugin };
116
+ export { ssrPlugin };
@@ -1,5 +1,5 @@
1
1
  import "node:module";
2
- import { jsx } from "react/jsx-runtime";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { loadableReady } from "@loadable/component";
4
4
  import { SSR_HYDRATION_ID_PREFIX } from "@modern-js/utils/universal/constants";
5
5
  import { hydrateRoot } from "react-dom/client";
@@ -35,7 +35,12 @@ function hydrate_hydrateRoot(App, context, ModernRender, ModernHydrate) {
35
35
  callback: callback,
36
36
  children: App
37
37
  });
38
- return ModernHydrate(wrapRuntimeContextProvider(/*#__PURE__*/ jsx(SSRApp, {}), hydrateContext));
38
+ return ModernHydrate(/*#__PURE__*/ jsxs(Fragment, {
39
+ children: [
40
+ wrapRuntimeContextProvider(/*#__PURE__*/ jsx(SSRApp, {}), hydrateContext),
41
+ null
42
+ ]
43
+ }));
39
44
  }
40
45
  }
41
46
  return stringSSRHydrate();
@@ -42,10 +42,7 @@ function getGlobalBasename() {
42
42
  return globalContext.basename;
43
43
  }
44
44
  export { DefaultNotFound } from "../../router/runtime/DefaultNotFound.mjs";
45
- export { modifyRoutes, onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeCreateRoutes, onBeforeHydrateRouter } from "../../router/runtime/hooks.mjs";
46
- export { applyRouterRuntimeState, applyRouterServerPrepareResult, cleanupRouterRuntimeState, createRouterRuntimeState, createRouterServerSnapshot, getRouterHydrationScripts, getRouterMatchedRouteIds, getRouterRuntimeState, getRouterServerSnapshot } from "../../router/runtime/lifecycle.mjs";
47
- export { createRouterProviderRealm, registerRouterProvider, resolveRouterProvider, routerProviderRegistryHooks } from "../../router/runtime/provider.mjs";
48
- export { createRuntimeContextExtension } from "./extensions.mjs";
49
- export { InternalRuntimeContext, RuntimeContext, getInitialContext } from "./runtime.mjs";
45
+ export { modifyRoutes, onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeCreateRoutes, onBeforeHydrateRouter, routerProviderRegistryHooks } from "../../router/runtime/hooks.mjs";
46
+ export { InternalRuntimeContext, RuntimeComponentResolverContext, RuntimeContext, getInitialContext } from "./runtime.mjs";
50
47
  export { getServerPayload, setServerPayload } from "./serverPayload/index.mjs";
51
48
  export { getCurrentEntryName, getGlobalApp, getGlobalBasename, getGlobalEnableRsc, getGlobalInternalRuntimeContext, getGlobalIsRscClient, getGlobalLayoutApp, getGlobalRSCRoot, getGlobalRoutes, setGlobalContext, setGlobalInternalRuntimeContext };
@@ -1,6 +1,2 @@
1
1
  import "node:module";
2
- import { createContext, useContext } from "react";
3
- const RuntimeContext = createContext({});
4
- const ReactRuntimeContext = RuntimeContext;
5
- const useRuntimeContext = ()=>useContext(RuntimeContext);
6
- export { ReactRuntimeContext, RuntimeContext, useRuntimeContext };
2
+ export { ReactRuntimeContext, RuntimeContext, useRuntimeContext } from "./runtime.mjs";
@@ -1,7 +1,17 @@
1
1
  import "node:module";
2
- import { createContext } from "react";
2
+ import { createContext, useContext } from "react";
3
3
  const ROUTE_MANIFEST = '_MODERNJS_ROUTE_MANIFEST';
4
- const InternalRuntimeContext = createContext({});
4
+ function getRuntimeReactContext(kind, create) {
5
+ const key = Symbol.for(`@modern-js/runtime:react-context:v1:${kind}`);
6
+ const contexts = globalThis;
7
+ contexts[key] ??= create();
8
+ return contexts[key];
9
+ }
10
+ const InternalRuntimeContext = getRuntimeReactContext('internal', ()=>createContext({}));
11
+ const RuntimeContext = getRuntimeReactContext('public', ()=>createContext({}));
12
+ const RuntimeComponentResolverContext = getRuntimeReactContext('component-resolver', ()=>createContext(void 0));
13
+ const ReactRuntimeContext = RuntimeContext;
14
+ const useRuntimeContext = ()=>useContext(RuntimeContext);
5
15
  const getInitialContext = (isBrowser = true, routeManifest)=>{
6
16
  const requestContext = {
7
17
  request: {
@@ -25,5 +35,4 @@ const getInitialContext = (isBrowser = true, routeManifest)=>{
25
35
  context: requestContext
26
36
  };
27
37
  };
28
- export { ReactRuntimeContext, RuntimeContext, useRuntimeContext } from "./public.mjs";
29
- export { InternalRuntimeContext, getInitialContext };
38
+ export { InternalRuntimeContext, ReactRuntimeContext, RuntimeComponentResolverContext, RuntimeContext, getInitialContext, useRuntimeContext };
@@ -1,46 +1,15 @@
1
1
  import "node:module";
2
2
  import { jsx } from "react/jsx-runtime";
3
- import { HelmetProvider } from "react-helmet-async";
4
- import { InternalRuntimeContext, RuntimeContext, getGlobalEnableRsc, getInitialContext } from "../context/index.mjs";
5
- import { stripRuntimeContextExtensions } from "../context/extensions.mjs";
6
- import { ensureHelmetContext } from "../context/helmetContext.mjs";
7
- function createRscSafeRequestContext(ssrContext) {
8
- const requestContext = getInitialContext().requestContext;
9
- Object.defineProperty(requestContext.response, 'setHeader', {
10
- enumerable: false
3
+ import { InternalRuntimeContext, RuntimeContext, getGlobalEnableRsc, getGlobalInternalRuntimeContext } from "../context/index.mjs";
4
+ import { RuntimeComponentResolverContext } from "../context/runtime.mjs";
5
+ function wrapRuntimeComponentResolver(root, hooks = getGlobalInternalRuntimeContext()?.hooks) {
6
+ return /*#__PURE__*/ jsx(RuntimeComponentResolverContext.Provider, {
7
+ value: hooks?.resolveComponent?.call,
8
+ children: root
11
9
  });
12
- Object.defineProperty(requestContext.response, 'status', {
13
- enumerable: false
14
- });
15
- if (void 0 === ssrContext) return requestContext;
16
- const { request, response } = ssrContext;
17
- return {
18
- request: {
19
- url: request.url,
20
- userAgent: request.userAgent,
21
- cookie: request.cookie,
22
- pathname: request.pathname,
23
- query: {
24
- ...request.query
25
- },
26
- params: {
27
- ...request.params
28
- },
29
- headers: {
30
- ...request.headers
31
- },
32
- host: request.host,
33
- referer: request.referer
34
- },
35
- response: Object.assign(requestContext.response, {
36
- locals: response.locals ?? {}
37
- })
38
- };
39
10
  }
40
11
  function wrapRuntimeContextProvider(App, contextValue) {
41
12
  const { isBrowser, initialData, routes, context, routeManifest, routerContext, unstable_getBlockNavState, ssrContext, _internalContext, _internalRouterBaseName, ...rest } = contextValue;
42
- const internalContextValue = contextValue;
43
- const helmetContext = ensureHelmetContext(internalContextValue);
44
13
  const runtimeContextValue = {
45
14
  isBrowser,
46
15
  initialData,
@@ -48,37 +17,22 @@ function wrapRuntimeContextProvider(App, contextValue) {
48
17
  context,
49
18
  ...rest
50
19
  };
51
- stripRuntimeContextExtensions(runtimeContextValue);
52
- if (true === getGlobalEnableRsc() && false === isBrowser) {
53
- const rscSafeRequestContext = createRscSafeRequestContext(ssrContext);
54
- const rscInternalContextValue = {
55
- ...internalContextValue,
56
- context: rscSafeRequestContext,
57
- requestContext: rscSafeRequestContext
58
- };
59
- delete rscInternalContextValue.ssrContext;
60
- const rscRuntimeContextValue = {
61
- ...runtimeContextValue,
62
- context: rscSafeRequestContext,
63
- requestContext: rscSafeRequestContext
64
- };
65
- return /*#__PURE__*/ jsx(InternalRuntimeContext.Provider, {
66
- value: rscInternalContextValue,
67
- children: /*#__PURE__*/ jsx(RuntimeContext.Provider, {
68
- value: rscRuntimeContextValue,
69
- children: App
70
- })
71
- });
72
- }
73
- return /*#__PURE__*/ jsx(InternalRuntimeContext.Provider, {
74
- value: internalContextValue,
20
+ const isRsc = true === getGlobalEnableRsc();
21
+ const projection = {
22
+ internalContext: contextValue,
23
+ publicContext: runtimeContextValue
24
+ };
25
+ const values = getGlobalInternalRuntimeContext()?.hooks.transformRuntimeContext?.call(projection, {
26
+ context: contextValue,
27
+ isRsc
28
+ }) ?? projection;
29
+ const root = /*#__PURE__*/ jsx(InternalRuntimeContext.Provider, {
30
+ value: values.internalContext,
75
31
  children: /*#__PURE__*/ jsx(RuntimeContext.Provider, {
76
- value: runtimeContextValue,
77
- children: /*#__PURE__*/ jsx(HelmetProvider, {
78
- context: helmetContext,
79
- children: App
80
- })
32
+ value: values.publicContext,
33
+ children: App
81
34
  })
82
35
  });
36
+ return isRsc && false === isBrowser ? root : wrapRuntimeComponentResolver(root);
83
37
  }
84
- export { wrapRuntimeContextProvider };
38
+ export { wrapRuntimeComponentResolver, wrapRuntimeContextProvider };
@@ -1,5 +1,4 @@
1
1
  import "node:module";
2
- import { getHelmetContext } from "../context/helmetContext.mjs";
3
2
  import { safeReplace } from "./utils.mjs";
4
3
  const EOL = '\n';
5
4
  const RE_HTML_ATTR = /<html[^>]*>/;
@@ -7,8 +6,10 @@ const RE_BODY_ATTR = /<body[^>]*>/;
7
6
  const RE_LAST_IN_HEAD = /<\/head>/;
8
7
  const RE_TITLE = /<title[^>]*>([\s\S\n\r]*?)<\/title>/;
9
8
  const TEST_TITLE_CONTENT = /(?<=<title[^>]*>)([\s\S\n\r]*?)([.|\S])([\s\S\n\r]*?)(?=<\/title>)/;
10
- function getHelmetData(runtimeContext) {
11
- return getHelmetContext(runtimeContext)?.helmet ?? void 0;
9
+ function getHelmetData(providers) {
10
+ let result;
11
+ for (const provider of providers)result = provider.getHeadData?.() ?? result;
12
+ return result;
12
13
  }
13
14
  function createReplaceHelemt(helmetData) {
14
15
  return helmetData ? (template)=>helmetReplace(template, helmetData) : (tempalte)=>tempalte;
@@ -20,7 +21,7 @@ function helmetReplace(content, helmetData) {
20
21
  const htmlAttributes = helmetData.htmlAttributes.toString();
21
22
  if (htmlAttributes) result = safeReplace(result, RE_HTML_ATTR, `<html ${htmlAttributes}>`);
22
23
  const base = helmetData.base.toString();
23
- const priority = helmetData.priority.toString();
24
+ const priority = helmetData.priority?.toString() ?? '';
24
25
  const link = helmetData.link.toString();
25
26
  const meta = helmetData.meta.toString();
26
27
  const noscript = helmetData.noscript.toString();
@@ -1,12 +1,12 @@
1
1
  import "node:module";
2
- import { getRouterServerSnapshot } from "../../router/runtime/lifecycle.mjs";
2
+ import { getRouterServerSnapshot } from "@modern-js/runtime-extensions/router-state";
3
3
  import { handleRSCRedirect } from "../../router/runtime/redirect.mjs";
4
4
  import { SSRErrors } from "./tracer.mjs";
5
5
  const isRedirectStatus = (status)=>301 === status || 302 === status || 303 === status || 307 === status || 308 === status;
6
6
  const isNullBodyStatus = (status)=>204 === status || 205 === status || 304 === status;
7
7
  const getRedirectLocation = (headers)=>{
8
8
  const location = headers.get('Location');
9
- return location && URL.canParse(location, 'http://localhost') ? location : void 0;
9
+ return null !== location && '' !== location && URL.canParse(location, 'http://localhost') ? location : void 0;
10
10
  };
11
11
  const processRedirect = (headers, status, ctx)=>{
12
12
  headers.delete('content-length');
@@ -28,7 +28,7 @@ const createLoaderRedirectResponse = (beforeRenderResult, redirectCtx)=>{
28
28
  if (void 0 === beforeRenderResult || !isRedirectStatus(beforeRenderResult.status)) return;
29
29
  if (beforeRenderResult.headers.has('X-Modernjs-Redirect')) return beforeRenderResult;
30
30
  const redirectUrl = getRedirectLocation(beforeRenderResult.headers);
31
- if (!redirectUrl) return;
31
+ if (void 0 === redirectUrl) return;
32
32
  return processRedirect(new Headers(beforeRenderResult.headers), beforeRenderResult.status, redirectCtx);
33
33
  };
34
34
  const finalizeRenderResponse = async (response, responseProxy, redirectCtx, routerCleanup)=>{
@@ -1,5 +1,5 @@
1
1
  import "node:module";
2
- import { getRouterRuntimeState } from "../../router/runtime/lifecycle.mjs";
2
+ import { getRouterRuntimeState } from "@modern-js/runtime-extensions/router-state";
3
3
  const ROUTER_CLEANUP_ERROR = 'An error occurs during router runtime cleanup';
4
4
  async function runWithRouterCleanupOnError(routerCleanup, callback) {
5
5
  try {