@bleedingdev/modern-js-runtime 3.9.0-ultramodern.4 → 3.9.0-ultramodern.6

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 (154) hide show
  1. package/dist/cjs/cli/ssr/index.js +2 -74
  2. package/dist/cjs/core/context/index.js +4 -43
  3. package/dist/cjs/core/context/public.js +4 -8
  4. package/dist/cjs/core/context/runtime.js +17 -6
  5. package/dist/cjs/core/react/wrapper.js +22 -65
  6. package/dist/cjs/core/server/helmet.js +5 -4
  7. package/dist/cjs/core/server/requestResponse.js +4 -4
  8. package/dist/cjs/core/server/routerCleanup.js +2 -2
  9. package/dist/cjs/core/server/shared.js +171 -4
  10. package/dist/cjs/core/server/stream/afterTemplate.js +21 -16
  11. package/dist/cjs/core/server/stream/beforeTemplate.js +34 -25
  12. package/dist/cjs/core/server/stream/beforeTemplate.worker.js +28 -21
  13. package/dist/cjs/core/server/stream/createReadableStream.js +208 -123
  14. package/dist/cjs/core/server/stream/createReadableStream.worker.js +159 -90
  15. package/dist/cjs/core/server/stream/deferredScript.js +3 -3
  16. package/dist/cjs/core/server/stream/shared.js +2 -2
  17. package/dist/cjs/core/server/string/index.js +100 -64
  18. package/dist/cjs/core/server/string/loadable.js +34 -19
  19. package/dist/cjs/core/server/string/ssrData.js +5 -12
  20. package/dist/cjs/core/server/utils.js +1 -2
  21. package/dist/cjs/exports/head.js +7 -14
  22. package/dist/cjs/router/runtime/PrefetchLink.js +67 -123
  23. package/dist/cjs/router/runtime/hooks.js +13 -2
  24. package/dist/cjs/router/runtime/internal.js +7 -45
  25. package/dist/cjs/router/runtime/plugin.js +2 -8
  26. package/dist/cjs/router/runtime/plugin.node.js +2 -30
  27. package/dist/cjs/router/runtime/redirect.js +1 -1
  28. package/dist/esm/cli/ssr/index.mjs +3 -72
  29. package/dist/esm/core/context/index.mjs +2 -5
  30. package/dist/esm/core/context/public.mjs +1 -6
  31. package/dist/esm/core/context/runtime.mjs +12 -4
  32. package/dist/esm/core/react/wrapper.mjs +21 -67
  33. package/dist/esm/core/server/helmet.mjs +5 -4
  34. package/dist/esm/core/server/requestResponse.mjs +3 -3
  35. package/dist/esm/core/server/routerCleanup.mjs +1 -1
  36. package/dist/esm/core/server/shared.mjs +153 -1
  37. package/dist/esm/core/server/stream/afterTemplate.mjs +23 -18
  38. package/dist/esm/core/server/stream/beforeTemplate.mjs +37 -28
  39. package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +31 -24
  40. package/dist/esm/core/server/stream/createReadableStream.mjs +207 -122
  41. package/dist/esm/core/server/stream/createReadableStream.worker.mjs +149 -90
  42. package/dist/esm/core/server/stream/deferredScript.mjs +3 -3
  43. package/dist/esm/core/server/stream/shared.mjs +2 -2
  44. package/dist/esm/core/server/string/index.mjs +104 -68
  45. package/dist/esm/core/server/string/loadable.mjs +34 -19
  46. package/dist/esm/core/server/string/ssrData.mjs +5 -12
  47. package/dist/esm/core/server/utils.mjs +1 -2
  48. package/dist/esm/exports/head.mjs +7 -14
  49. package/dist/esm/router/runtime/PrefetchLink.mjs +67 -123
  50. package/dist/esm/router/runtime/hooks.mjs +9 -1
  51. package/dist/esm/router/runtime/internal.mjs +2 -33
  52. package/dist/esm/router/runtime/plugin.mjs +1 -7
  53. package/dist/esm/router/runtime/plugin.node.mjs +1 -29
  54. package/dist/esm/router/runtime/redirect.mjs +1 -1
  55. package/dist/esm-node/cli/ssr/index.mjs +3 -72
  56. package/dist/esm-node/core/context/index.mjs +2 -5
  57. package/dist/esm-node/core/context/public.mjs +1 -6
  58. package/dist/esm-node/core/context/runtime.mjs +12 -4
  59. package/dist/esm-node/core/react/wrapper.mjs +21 -67
  60. package/dist/esm-node/core/server/helmet.mjs +5 -4
  61. package/dist/esm-node/core/server/requestResponse.mjs +3 -3
  62. package/dist/esm-node/core/server/routerCleanup.mjs +1 -1
  63. package/dist/esm-node/core/server/shared.mjs +153 -1
  64. package/dist/esm-node/core/server/stream/afterTemplate.mjs +23 -18
  65. package/dist/esm-node/core/server/stream/beforeTemplate.mjs +37 -28
  66. package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +31 -24
  67. package/dist/esm-node/core/server/stream/createReadableStream.mjs +207 -122
  68. package/dist/esm-node/core/server/stream/createReadableStream.worker.mjs +149 -90
  69. package/dist/esm-node/core/server/stream/deferredScript.mjs +3 -3
  70. package/dist/esm-node/core/server/stream/shared.mjs +2 -2
  71. package/dist/esm-node/core/server/string/index.mjs +104 -68
  72. package/dist/esm-node/core/server/string/loadable.mjs +34 -19
  73. package/dist/esm-node/core/server/string/ssrData.mjs +5 -12
  74. package/dist/esm-node/core/server/utils.mjs +1 -2
  75. package/dist/esm-node/exports/head.mjs +7 -14
  76. package/dist/esm-node/router/runtime/PrefetchLink.mjs +67 -123
  77. package/dist/esm-node/router/runtime/hooks.mjs +9 -1
  78. package/dist/esm-node/router/runtime/internal.mjs +2 -33
  79. package/dist/esm-node/router/runtime/plugin.mjs +1 -7
  80. package/dist/esm-node/router/runtime/plugin.node.mjs +1 -29
  81. package/dist/esm-node/router/runtime/redirect.mjs +1 -1
  82. package/dist/types/cli/ssr/index.d.ts +0 -3
  83. package/dist/types/core/context/index.d.ts +4 -6
  84. package/dist/types/core/context/public.d.ts +1 -23
  85. package/dist/types/core/context/runtime.d.ts +26 -2
  86. package/dist/types/core/react/wrapper.d.ts +6 -0
  87. package/dist/types/core/server/helmet.d.ts +4 -5
  88. package/dist/types/core/server/shared.d.ts +23 -0
  89. package/dist/types/core/server/stream/afterTemplate.d.ts +2 -1
  90. package/dist/types/core/server/stream/beforeTemplate.d.ts +4 -1
  91. package/dist/types/core/server/stream/beforeTemplate.worker.d.ts +4 -1
  92. package/dist/types/core/server/stream/shared.d.ts +1 -1
  93. package/dist/types/core/server/string/loadable.d.ts +6 -3
  94. package/dist/types/core/server/string/ssrData.d.ts +2 -1
  95. package/dist/types/core/server/string/types.d.ts +1 -5
  96. package/dist/types/exports/head.d.ts +2 -2
  97. package/dist/types/router/runtime/PrefetchLink.d.ts +27 -2
  98. package/dist/types/router/runtime/hooks.d.ts +19 -2
  99. package/dist/types/router/runtime/internal.d.ts +4 -21
  100. package/dist/types/router/runtime/types.d.ts +2 -43
  101. package/package.json +9 -38
  102. package/rstest.config.mts +32 -2
  103. package/dist/cjs/boundary-debugger/index.js +0 -317
  104. package/dist/cjs/core/context/extensions.js +0 -74
  105. package/dist/cjs/core/context/helmetContext.js +0 -54
  106. package/dist/cjs/core/server/federatedCss.js +0 -58
  107. package/dist/cjs/core/server/scriptOrder.js +0 -140
  108. package/dist/cjs/module-federation/consume-surface.js +0 -199
  109. package/dist/cjs/module-federation/distributed-ssr.js +0 -135
  110. package/dist/cjs/module-federation/index.js +0 -316
  111. package/dist/cjs/module-federation/last-known-good.js +0 -157
  112. package/dist/cjs/module-federation/manifest-recovery-runtime-plugin.js +0 -129
  113. package/dist/cjs/module-federation/surface-resolution-types.js +0 -61
  114. package/dist/cjs/router/runtime/lifecycle.js +0 -167
  115. package/dist/cjs/router/runtime/provider.js +0 -153
  116. package/dist/esm/boundary-debugger/index.mjs +0 -277
  117. package/dist/esm/core/context/extensions.mjs +0 -33
  118. package/dist/esm/core/context/helmetContext.mjs +0 -13
  119. package/dist/esm/core/server/federatedCss.mjs +0 -20
  120. package/dist/esm/core/server/scriptOrder.mjs +0 -90
  121. package/dist/esm/module-federation/consume-surface.mjs +0 -158
  122. package/dist/esm/module-federation/distributed-ssr.mjs +0 -82
  123. package/dist/esm/module-federation/index.mjs +0 -115
  124. package/dist/esm/module-federation/last-known-good.mjs +0 -113
  125. package/dist/esm/module-federation/manifest-recovery-runtime-plugin.mjs +0 -89
  126. package/dist/esm/module-federation/surface-resolution-types.mjs +0 -8
  127. package/dist/esm/router/runtime/lifecycle.mjs +0 -105
  128. package/dist/esm/router/runtime/provider.mjs +0 -100
  129. package/dist/esm-node/boundary-debugger/index.mjs +0 -278
  130. package/dist/esm-node/core/context/extensions.mjs +0 -34
  131. package/dist/esm-node/core/context/helmetContext.mjs +0 -14
  132. package/dist/esm-node/core/server/federatedCss.mjs +0 -21
  133. package/dist/esm-node/core/server/scriptOrder.mjs +0 -91
  134. package/dist/esm-node/module-federation/consume-surface.mjs +0 -159
  135. package/dist/esm-node/module-federation/distributed-ssr.mjs +0 -83
  136. package/dist/esm-node/module-federation/index.mjs +0 -116
  137. package/dist/esm-node/module-federation/last-known-good.mjs +0 -114
  138. package/dist/esm-node/module-federation/manifest-recovery-runtime-plugin.mjs +0 -90
  139. package/dist/esm-node/module-federation/surface-resolution-types.mjs +0 -9
  140. package/dist/esm-node/router/runtime/lifecycle.mjs +0 -106
  141. package/dist/esm-node/router/runtime/provider.mjs +0 -101
  142. package/dist/types/boundary-debugger/index.d.ts +0 -28
  143. package/dist/types/core/context/extensions.d.ts +0 -35
  144. package/dist/types/core/context/helmetContext.d.ts +0 -10
  145. package/dist/types/core/server/federatedCss.d.ts +0 -5
  146. package/dist/types/core/server/scriptOrder.d.ts +0 -25
  147. package/dist/types/module-federation/consume-surface.d.ts +0 -104
  148. package/dist/types/module-federation/distributed-ssr.d.ts +0 -61
  149. package/dist/types/module-federation/index.d.ts +0 -71
  150. package/dist/types/module-federation/last-known-good.d.ts +0 -52
  151. package/dist/types/module-federation/manifest-recovery-runtime-plugin.d.ts +0 -25
  152. package/dist/types/module-federation/surface-resolution-types.d.ts +0 -23
  153. package/dist/types/router/runtime/lifecycle.d.ts +0 -27
  154. 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,
@@ -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 };
@@ -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,7 +1,2 @@
1
1
  import "node:module";
2
- import { getRuntimeReactContext } from "@modern-js/runtime-extensions/react-context";
3
- import { createContext, useContext } from "react";
4
- const RuntimeContext = getRuntimeReactContext('public', ()=>createContext({}));
5
- const ReactRuntimeContext = RuntimeContext;
6
- const useRuntimeContext = ()=>useContext(RuntimeContext);
7
- export { ReactRuntimeContext, RuntimeContext, useRuntimeContext };
2
+ export { ReactRuntimeContext, RuntimeContext, useRuntimeContext } from "./runtime.mjs";
@@ -1,8 +1,17 @@
1
1
  import "node:module";
2
- import { getRuntimeReactContext } from "@modern-js/runtime-extensions/react-context";
3
- import { createContext } from "react";
2
+ import { createContext, useContext } from "react";
4
3
  const ROUTE_MANIFEST = '_MODERNJS_ROUTE_MANIFEST';
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
+ }
5
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);
6
15
  const getInitialContext = (isBrowser = true, routeManifest)=>{
7
16
  const requestContext = {
8
17
  request: {
@@ -26,5 +35,4 @@ const getInitialContext = (isBrowser = true, routeManifest)=>{
26
35
  context: requestContext
27
36
  };
28
37
  };
29
- export { ReactRuntimeContext, RuntimeContext, useRuntimeContext } from "./public.mjs";
30
- 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 {
@@ -1,5 +1,157 @@
1
1
  import "node:module";
2
+ import { attributesToString, hasStylesheetLink, safeReplace } from "./utils.mjs";
2
3
  function buildHtml(template, callbacks) {
3
4
  return callbacks.reduce((promise, buildHtmlCb)=>promise.then((template)=>buildHtmlCb(template)), Promise.resolve(template));
4
5
  }
5
- export { buildHtml };
6
+ function createSSRRenderLifecycle(observers) {
7
+ let terminal;
8
+ return {
9
+ transformAssets (groups, info) {
10
+ let assets = groups.flatMap((group)=>group.assets);
11
+ for (const observer of observers)assets = observer.transformAssets?.(assets, {
12
+ ...info,
13
+ groups
14
+ }) ?? assets;
15
+ return assets;
16
+ },
17
+ transformTemplateChunk (chunk) {
18
+ for (const observer of observers)chunk = observer.transformTemplateChunk?.(chunk, {
19
+ attributesToString: attributesToString,
20
+ hasStylesheetLink: hasStylesheetLink
21
+ }) ?? chunk;
22
+ return chunk;
23
+ },
24
+ getRouterData () {
25
+ let data;
26
+ for (const observer of observers)data = observer.getRouterData?.() ?? data;
27
+ return data;
28
+ },
29
+ get terminal () {
30
+ return terminal;
31
+ },
32
+ beforeReact () {
33
+ for (const observer of observers)observer.beforeReact?.();
34
+ },
35
+ completedBody (html, phase) {
36
+ for (const observer of observers)html = observer.completedBody?.(html, {
37
+ phase
38
+ }) ?? html;
39
+ return html;
40
+ },
41
+ finish (result) {
42
+ if (void 0 !== terminal) return;
43
+ terminal = result;
44
+ for (const observer of observers)try {
45
+ observer.onTerminal?.(result);
46
+ } catch {}
47
+ }
48
+ };
49
+ }
50
+ function replaceSSRTemplateChunk(chunk, lifecycle, options = {}) {
51
+ const result = lifecycle?.transformTemplateChunk(chunk) ?? chunk;
52
+ if (true === options.preserveEmpty && '' === result.content) return result.template;
53
+ return safeReplace(result.template, result.placeholder, result.content);
54
+ }
55
+ function orderSSRStreamTransforms(extenders) {
56
+ return [
57
+ ...extenders.filter((extender)=>'body' !== extender.streamPhase),
58
+ ...extenders.filter((extender)=>'body' === extender.streamPhase)
59
+ ];
60
+ }
61
+ function createSSRStreamErrorReporter(onError) {
62
+ let reported = false;
63
+ return (error)=>{
64
+ if (reported) return;
65
+ reported = true;
66
+ try {
67
+ onError(error);
68
+ } catch {}
69
+ };
70
+ }
71
+ function observeSSRStream(source, options) {
72
+ const reader = source.getReader();
73
+ let controller;
74
+ let ended = false;
75
+ let cancellation;
76
+ const cleanup = ()=>{
77
+ options.signal.removeEventListener('abort', onAbort);
78
+ reader.releaseLock();
79
+ };
80
+ const cancel = (reason)=>{
81
+ if (void 0 !== cancellation) return cancellation;
82
+ if (ended) return Promise.resolve();
83
+ ended = true;
84
+ options.lifecycle.finish({
85
+ status: 'cancelled',
86
+ reason
87
+ });
88
+ cancellation = (async ()=>{
89
+ try {
90
+ const observer = Promise.withResolvers();
91
+ try {
92
+ observer.resolve(options.onCancel?.(reason));
93
+ } catch (error) {
94
+ observer.reject(error);
95
+ }
96
+ const results = await Promise.allSettled([
97
+ observer.promise,
98
+ reader.cancel(reason)
99
+ ]);
100
+ const rejected = results.find((result)=>'rejected' === result.status);
101
+ if (rejected?.status === 'rejected') throw rejected.reason;
102
+ } finally{
103
+ cleanup();
104
+ }
105
+ })();
106
+ return cancellation;
107
+ };
108
+ const onAbort = ()=>{
109
+ if (ended) return;
110
+ const reason = options.signal.reason;
111
+ cancel(reason).then(()=>controller.error(reason), (error)=>{
112
+ controller.error(reason);
113
+ return options.onError(error);
114
+ });
115
+ };
116
+ return new ReadableStream({
117
+ start (value) {
118
+ controller = value;
119
+ options.signal.addEventListener('abort', onAbort, {
120
+ once: true
121
+ });
122
+ if (options.signal.aborted) onAbort();
123
+ },
124
+ async pull (value) {
125
+ if (ended) return void await cancellation;
126
+ try {
127
+ const result = await reader.read();
128
+ if (ended) return void await cancellation;
129
+ if (result.done) {
130
+ await options.onComplete?.();
131
+ if (ended) return void await cancellation;
132
+ ended = true;
133
+ options.lifecycle.finish({
134
+ status: 'complete'
135
+ });
136
+ cleanup();
137
+ value.close();
138
+ } else value.enqueue(result.value);
139
+ } catch (error) {
140
+ if (ended) return void await cancellation;
141
+ ended = true;
142
+ options.lifecycle.finish({
143
+ status: 'error',
144
+ error
145
+ });
146
+ try {
147
+ await options.onError(error);
148
+ } finally{
149
+ cleanup();
150
+ value.error(error);
151
+ }
152
+ }
153
+ },
154
+ cancel
155
+ });
156
+ }
157
+ export { buildHtml, createSSRRenderLifecycle, createSSRStreamErrorReporter, observeSSRStream, orderSSRStreamTransforms, replaceSSRTemplateChunk };