@bleedingdev/modern-js-runtime 3.9.0-ultramodern.2 → 3.9.0-ultramodern.20

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 (209) 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/cli/ssr/loadable-bundler-plugin.js +2 -0
  4. package/dist/cjs/cli/template.server.js +1 -2
  5. package/dist/cjs/core/browser/hydrate.js +9 -10
  6. package/dist/cjs/core/browser/index.js +4 -5
  7. package/dist/cjs/core/context/index.js +12 -45
  8. package/dist/cjs/core/context/public.js +4 -7
  9. package/dist/cjs/core/context/runtime.js +10 -4
  10. package/dist/cjs/core/index.js +3 -3
  11. package/dist/cjs/core/plugin/index.js +2 -2
  12. package/dist/cjs/core/react/index.js +3 -3
  13. package/dist/cjs/core/react/wrapper.js +23 -67
  14. package/dist/cjs/core/server/helmet.js +5 -4
  15. package/dist/cjs/core/server/requestHandler.js +6 -7
  16. package/dist/cjs/core/server/requestResponse.js +4 -4
  17. package/dist/cjs/core/server/routerCleanup.js +2 -2
  18. package/dist/cjs/core/server/shared.js +171 -4
  19. package/dist/cjs/core/server/stream/afterTemplate.js +21 -16
  20. package/dist/cjs/core/server/stream/beforeTemplate.js +37 -28
  21. package/dist/cjs/core/server/stream/beforeTemplate.worker.js +30 -23
  22. package/dist/cjs/core/server/stream/createReadableStream.js +222 -125
  23. package/dist/cjs/core/server/stream/createReadableStream.worker.js +171 -90
  24. package/dist/cjs/core/server/stream/deferredScript.js +3 -3
  25. package/dist/cjs/core/server/stream/shared.js +6 -2
  26. package/dist/cjs/core/server/string/index.js +104 -66
  27. package/dist/cjs/core/server/string/loadable.js +38 -23
  28. package/dist/cjs/core/server/string/ssrData.js +5 -12
  29. package/dist/cjs/core/server/utils.js +1 -2
  30. package/dist/cjs/exports/head.js +7 -14
  31. package/dist/cjs/internal.js +2 -2
  32. package/dist/cjs/router/cli/code/nestedRoutes.js +1 -2
  33. package/dist/cjs/router/cli/code/templates.js +1 -1
  34. package/dist/cjs/router/cli/code/utils.js +2 -2
  35. package/dist/cjs/router/runtime/DeferredDataScripts.node.js +10 -9
  36. package/dist/cjs/router/runtime/PrefetchLink.js +69 -125
  37. package/dist/cjs/router/runtime/hooks.js +13 -2
  38. package/dist/cjs/router/runtime/internal.js +7 -45
  39. package/dist/cjs/router/runtime/plugin.js +19 -34
  40. package/dist/cjs/router/runtime/plugin.node.js +9 -37
  41. package/dist/cjs/router/runtime/redirect.js +1 -1
  42. package/dist/esm/cli/code.mjs +3 -1
  43. package/dist/esm/cli/ssr/index.mjs +3 -72
  44. package/dist/esm/cli/ssr/loadable-bundler-plugin.mjs +2 -0
  45. package/dist/esm/cli/template.server.mjs +1 -2
  46. package/dist/esm/core/browser/hydrate.mjs +10 -11
  47. package/dist/esm/core/browser/index.mjs +1 -2
  48. package/dist/esm/core/context/index.mjs +2 -5
  49. package/dist/esm/core/context/public.mjs +1 -5
  50. package/dist/esm/core/context/runtime.mjs +6 -3
  51. package/dist/esm/core/index.mjs +1 -1
  52. package/dist/esm/core/plugin/index.mjs +1 -1
  53. package/dist/esm/core/react/index.mjs +1 -1
  54. package/dist/esm/core/react/wrapper.mjs +20 -67
  55. package/dist/esm/core/server/helmet.mjs +5 -4
  56. package/dist/esm/core/server/requestHandler.mjs +1 -2
  57. package/dist/esm/core/server/requestResponse.mjs +3 -3
  58. package/dist/esm/core/server/routerCleanup.mjs +1 -1
  59. package/dist/esm/core/server/shared.mjs +153 -1
  60. package/dist/esm/core/server/stream/afterTemplate.mjs +23 -18
  61. package/dist/esm/core/server/stream/beforeTemplate.mjs +40 -31
  62. package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +33 -26
  63. package/dist/esm/core/server/stream/createReadableStream.mjs +220 -123
  64. package/dist/esm/core/server/stream/createReadableStream.worker.mjs +161 -90
  65. package/dist/esm/core/server/stream/deferredScript.mjs +3 -3
  66. package/dist/esm/core/server/stream/shared.mjs +4 -3
  67. package/dist/esm/core/server/string/index.mjs +106 -68
  68. package/dist/esm/core/server/string/loadable.mjs +38 -23
  69. package/dist/esm/core/server/string/ssrData.mjs +5 -12
  70. package/dist/esm/core/server/utils.mjs +1 -2
  71. package/dist/esm/exports/head.mjs +7 -14
  72. package/dist/esm/internal.mjs +1 -1
  73. package/dist/esm/router/cli/code/nestedRoutes.mjs +1 -2
  74. package/dist/esm/router/cli/code/templates.mjs +1 -1
  75. package/dist/esm/router/cli/code/utils.mjs +2 -2
  76. package/dist/esm/router/runtime/DeferredDataScripts.node.mjs +10 -9
  77. package/dist/esm/router/runtime/PrefetchLink.mjs +68 -124
  78. package/dist/esm/router/runtime/hooks.mjs +9 -1
  79. package/dist/esm/router/runtime/internal.mjs +2 -33
  80. package/dist/esm/router/runtime/plugin.mjs +10 -25
  81. package/dist/esm/router/runtime/plugin.node.mjs +3 -31
  82. package/dist/esm/router/runtime/redirect.mjs +1 -1
  83. package/dist/esm-node/cli/code.mjs +3 -1
  84. package/dist/esm-node/cli/ssr/index.mjs +3 -72
  85. package/dist/esm-node/cli/ssr/loadable-bundler-plugin.mjs +2 -0
  86. package/dist/esm-node/cli/template.server.mjs +1 -2
  87. package/dist/esm-node/core/browser/hydrate.mjs +10 -11
  88. package/dist/esm-node/core/browser/index.mjs +1 -2
  89. package/dist/esm-node/core/context/index.mjs +2 -5
  90. package/dist/esm-node/core/context/public.mjs +1 -5
  91. package/dist/esm-node/core/context/runtime.mjs +6 -3
  92. package/dist/esm-node/core/index.mjs +1 -1
  93. package/dist/esm-node/core/plugin/index.mjs +1 -1
  94. package/dist/esm-node/core/react/index.mjs +1 -1
  95. package/dist/esm-node/core/react/wrapper.mjs +20 -67
  96. package/dist/esm-node/core/server/helmet.mjs +5 -4
  97. package/dist/esm-node/core/server/requestHandler.mjs +1 -2
  98. package/dist/esm-node/core/server/requestResponse.mjs +3 -3
  99. package/dist/esm-node/core/server/routerCleanup.mjs +1 -1
  100. package/dist/esm-node/core/server/shared.mjs +153 -1
  101. package/dist/esm-node/core/server/stream/afterTemplate.mjs +23 -18
  102. package/dist/esm-node/core/server/stream/beforeTemplate.mjs +40 -31
  103. package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +33 -26
  104. package/dist/esm-node/core/server/stream/createReadableStream.mjs +220 -123
  105. package/dist/esm-node/core/server/stream/createReadableStream.worker.mjs +161 -90
  106. package/dist/esm-node/core/server/stream/deferredScript.mjs +3 -3
  107. package/dist/esm-node/core/server/stream/shared.mjs +4 -3
  108. package/dist/esm-node/core/server/string/index.mjs +106 -68
  109. package/dist/esm-node/core/server/string/loadable.mjs +38 -23
  110. package/dist/esm-node/core/server/string/ssrData.mjs +5 -12
  111. package/dist/esm-node/core/server/utils.mjs +1 -2
  112. package/dist/esm-node/exports/head.mjs +7 -14
  113. package/dist/esm-node/internal.mjs +1 -1
  114. package/dist/esm-node/router/cli/code/nestedRoutes.mjs +1 -2
  115. package/dist/esm-node/router/cli/code/templates.mjs +1 -1
  116. package/dist/esm-node/router/cli/code/utils.mjs +2 -2
  117. package/dist/esm-node/router/runtime/DeferredDataScripts.node.mjs +10 -9
  118. package/dist/esm-node/router/runtime/PrefetchLink.mjs +68 -124
  119. package/dist/esm-node/router/runtime/hooks.mjs +9 -1
  120. package/dist/esm-node/router/runtime/internal.mjs +2 -33
  121. package/dist/esm-node/router/runtime/plugin.mjs +10 -25
  122. package/dist/esm-node/router/runtime/plugin.node.mjs +3 -31
  123. package/dist/esm-node/router/runtime/redirect.mjs +1 -1
  124. package/dist/types/cli/ssr/index.d.ts +0 -3
  125. package/dist/types/core/context/index.d.ts +4 -6
  126. package/dist/types/core/context/public.d.ts +1 -23
  127. package/dist/types/core/context/runtime.d.ts +26 -2
  128. package/dist/types/core/index.d.ts +1 -1
  129. package/dist/types/core/react/wrapper.d.ts +7 -1
  130. package/dist/types/core/server/helmet.d.ts +4 -5
  131. package/dist/types/core/server/requestHandler.d.ts +3 -3
  132. package/dist/types/core/server/requestResponse.d.ts +1 -1
  133. package/dist/types/core/server/routerCleanup.d.ts +1 -1
  134. package/dist/types/core/server/shared.d.ts +24 -1
  135. package/dist/types/core/server/stream/afterTemplate.d.ts +2 -1
  136. package/dist/types/core/server/stream/beforeTemplate.d.ts +4 -1
  137. package/dist/types/core/server/stream/beforeTemplate.worker.d.ts +4 -1
  138. package/dist/types/core/server/stream/shared.d.ts +16 -2
  139. package/dist/types/core/server/string/loadable.d.ts +6 -3
  140. package/dist/types/core/server/string/ssrData.d.ts +2 -1
  141. package/dist/types/core/server/string/types.d.ts +1 -5
  142. package/dist/types/core/server/tracer.d.ts +1 -1
  143. package/dist/types/core/server/utils.d.ts +1 -1
  144. package/dist/types/core/types.d.ts +1 -2
  145. package/dist/types/exports/head.d.ts +2 -2
  146. package/dist/types/internal.d.ts +1 -1
  147. package/dist/types/router/runtime/PrefetchLink.d.ts +27 -2
  148. package/dist/types/router/runtime/hooks.d.ts +19 -2
  149. package/dist/types/router/runtime/internal.d.ts +4 -21
  150. package/dist/types/router/runtime/types.d.ts +2 -43
  151. package/package.json +18 -46
  152. package/rslib.config.mts +3 -0
  153. package/rstest.config.mts +28 -2
  154. package/dist/cjs/boundary-debugger/index.js +0 -317
  155. package/dist/cjs/core/context/extensions.js +0 -74
  156. package/dist/cjs/core/context/helmetContext.js +0 -54
  157. package/dist/cjs/core/server/federatedCss.js +0 -58
  158. package/dist/cjs/core/server/scriptOrder.js +0 -140
  159. package/dist/cjs/module-federation/consume-surface.js +0 -199
  160. package/dist/cjs/module-federation/distributed-ssr.js +0 -135
  161. package/dist/cjs/module-federation/index.js +0 -316
  162. package/dist/cjs/module-federation/last-known-good.js +0 -157
  163. package/dist/cjs/module-federation/manifest-recovery-runtime-plugin.js +0 -129
  164. package/dist/cjs/module-federation/surface-resolution-types.js +0 -61
  165. package/dist/cjs/router/runtime/lifecycle.js +0 -167
  166. package/dist/cjs/router/runtime/provider.js +0 -153
  167. package/dist/cjs/rsc/server.worker.js +0 -62
  168. package/dist/esm/boundary-debugger/index.mjs +0 -277
  169. package/dist/esm/core/context/extensions.mjs +0 -33
  170. package/dist/esm/core/context/helmetContext.mjs +0 -13
  171. package/dist/esm/core/server/federatedCss.mjs +0 -20
  172. package/dist/esm/core/server/scriptOrder.mjs +0 -90
  173. package/dist/esm/module-federation/consume-surface.mjs +0 -158
  174. package/dist/esm/module-federation/distributed-ssr.mjs +0 -82
  175. package/dist/esm/module-federation/index.mjs +0 -115
  176. package/dist/esm/module-federation/last-known-good.mjs +0 -113
  177. package/dist/esm/module-federation/manifest-recovery-runtime-plugin.mjs +0 -89
  178. package/dist/esm/module-federation/surface-resolution-types.mjs +0 -8
  179. package/dist/esm/router/runtime/lifecycle.mjs +0 -105
  180. package/dist/esm/router/runtime/provider.mjs +0 -100
  181. package/dist/esm/rsc/server.worker.mjs +0 -1
  182. package/dist/esm-node/boundary-debugger/index.mjs +0 -278
  183. package/dist/esm-node/core/context/extensions.mjs +0 -34
  184. package/dist/esm-node/core/context/helmetContext.mjs +0 -14
  185. package/dist/esm-node/core/server/federatedCss.mjs +0 -21
  186. package/dist/esm-node/core/server/scriptOrder.mjs +0 -91
  187. package/dist/esm-node/module-federation/consume-surface.mjs +0 -159
  188. package/dist/esm-node/module-federation/distributed-ssr.mjs +0 -83
  189. package/dist/esm-node/module-federation/index.mjs +0 -116
  190. package/dist/esm-node/module-federation/last-known-good.mjs +0 -114
  191. package/dist/esm-node/module-federation/manifest-recovery-runtime-plugin.mjs +0 -90
  192. package/dist/esm-node/module-federation/surface-resolution-types.mjs +0 -9
  193. package/dist/esm-node/router/runtime/lifecycle.mjs +0 -106
  194. package/dist/esm-node/router/runtime/provider.mjs +0 -101
  195. package/dist/esm-node/rsc/server.worker.mjs +0 -2
  196. package/dist/types/boundary-debugger/index.d.ts +0 -28
  197. package/dist/types/core/context/extensions.d.ts +0 -35
  198. package/dist/types/core/context/helmetContext.d.ts +0 -10
  199. package/dist/types/core/server/federatedCss.d.ts +0 -5
  200. package/dist/types/core/server/scriptOrder.d.ts +0 -25
  201. package/dist/types/module-federation/consume-surface.d.ts +0 -104
  202. package/dist/types/module-federation/distributed-ssr.d.ts +0 -61
  203. package/dist/types/module-federation/index.d.ts +0 -71
  204. package/dist/types/module-federation/last-known-good.d.ts +0 -52
  205. package/dist/types/module-federation/manifest-recovery-runtime-plugin.d.ts +0 -25
  206. package/dist/types/module-federation/surface-resolution-types.d.ts +0 -23
  207. package/dist/types/router/runtime/lifecycle.d.ts +0 -27
  208. package/dist/types/router/runtime/provider.d.ts +0 -78
  209. package/dist/types/rsc/server.worker.d.ts +0 -1
@@ -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";
@@ -30,18 +30,23 @@ function hydrate_hydrateRoot(App, context, ModernRender, ModernHydrate) {
30
30
  if ('stream' === renderMode) return streamSSRHydrate();
31
31
  function streamSSRHydrate() {
32
32
  if (renderLevel !== RenderLevel.SERVER_RENDER) return ModernRender(wrapRuntimeContextProvider(App, context));
33
- {
33
+ else {
34
34
  const SSRApp = ()=>/*#__PURE__*/ jsx(WithCallback, {
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
47
  function stringSSRHydrate() {
43
48
  if (renderLevel === RenderLevel.CLIENT_RENDER) return ModernRender(wrapRuntimeContextProvider(App, context));
44
- {
49
+ else {
45
50
  if (renderLevel === RenderLevel.SERVER_RENDER) return loadableReady(()=>void 0, loadableReadyOptions).then(()=>{
46
51
  const SSRApp = ()=>/*#__PURE__*/ jsx(WithCallback, {
47
52
  callback: callback,
@@ -49,13 +54,7 @@ function hydrate_hydrateRoot(App, context, ModernRender, ModernHydrate) {
49
54
  });
50
55
  return ModernHydrate(wrapRuntimeContextProvider(/*#__PURE__*/ jsx(SSRApp, {}), hydrateContext));
51
56
  });
52
- const runtimeConsole = Reflect.get(globalThis, 'console');
53
- if (null !== runtimeConsole && 'object' == typeof runtimeConsole) {
54
- const warn = Reflect.get(runtimeConsole, 'warn');
55
- if ('function' == typeof warn) Reflect.apply(warn, runtimeConsole, [
56
- `unknow render level: ${renderLevel}, execute render()`
57
- ]);
58
- }
57
+ console.warn(`unknow render level: ${renderLevel}, execute render()`);
59
58
  return ModernRender(wrapRuntimeContextProvider(App, context));
60
59
  }
61
60
  }
@@ -1,8 +1,7 @@
1
1
  import "node:module";
2
+ import { getGlobalInternalRuntimeContext, getInitialContext } from "@modern-js/runtime/context";
2
3
  import { parseCookie } from "cookie";
3
4
  import { createRoot } from "react-dom/client";
4
- import { getGlobalInternalRuntimeContext } from "../context/index.mjs";
5
- import { getInitialContext } from "../context/runtime.mjs";
6
5
  import { wrapRuntimeContextProvider } from "../react/wrapper.mjs";
7
6
  import { hydrateRoot, hydrateWithReact } from "./hydrate.mjs";
8
7
  const IS_REACT18 = 'true' === process.env.IS_REACT18;
@@ -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, ReactRuntimeContext, RuntimeComponentResolverContext, RuntimeContext, getInitialContext, useRuntimeContext } 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 "@modern-js/runtime/context";
@@ -1,7 +1,11 @@
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
4
  const InternalRuntimeContext = createContext({});
5
+ const RuntimeContext = createContext({});
6
+ const RuntimeComponentResolverContext = createContext(void 0);
7
+ const ReactRuntimeContext = RuntimeContext;
8
+ const useRuntimeContext = ()=>useContext(RuntimeContext);
5
9
  const getInitialContext = (isBrowser = true, routeManifest)=>{
6
10
  const requestContext = {
7
11
  request: {
@@ -25,5 +29,4 @@ const getInitialContext = (isBrowser = true, routeManifest)=>{
25
29
  context: requestContext
26
30
  };
27
31
  };
28
- export { ReactRuntimeContext, RuntimeContext, useRuntimeContext } from "./public.mjs";
29
- export { InternalRuntimeContext, getInitialContext };
32
+ export { InternalRuntimeContext, ReactRuntimeContext, RuntimeComponentResolverContext, RuntimeContext, getInitialContext, useRuntimeContext };
@@ -1,3 +1,3 @@
1
1
  import "node:module";
2
+ export { RuntimeContext, useRuntimeContext } from "@modern-js/runtime/context";
2
3
  export { defineRuntimeConfig } from "./config.mjs";
3
- export { RuntimeContext, useRuntimeContext } from "./context/runtime.mjs";
@@ -1,10 +1,10 @@
1
1
  import "node:module";
2
2
  import { runtime } from "@modern-js/plugin/runtime";
3
+ import { setGlobalInternalRuntimeContext } from "@modern-js/runtime/context";
3
4
  import { merge } from "@modern-js/runtime-utils/merge";
4
5
  import { compatPlugin } from "../compat/index.mjs";
5
6
  import { handleSetupResult } from "../compat/hooks.mjs";
6
7
  import { requestContextPlugin } from "../compat/requestContext.mjs";
7
- import { setGlobalInternalRuntimeContext } from "../context/index.mjs";
8
8
  function registerPlugin(internalPlugins, runtimeConfig) {
9
9
  const { plugins = [] } = runtimeConfig || {};
10
10
  const { runtimeContext } = runtime.run({
@@ -1,8 +1,8 @@
1
1
  import "node:module";
2
+ import { getGlobalApp, getGlobalInternalRuntimeContext } from "@modern-js/runtime/context";
2
3
  import { parsedJSONFromElement } from "@modern-js/runtime-utils/parsed";
3
4
  import { isBrowser } from "../../common.mjs";
4
5
  import { ROUTER_DATA_JSON_ID, SSR_DATA_JSON_ID } from "../constants.mjs";
5
- import { getGlobalApp, getGlobalInternalRuntimeContext } from "../context/index.mjs";
6
6
  function createRoot(UserApp) {
7
7
  const App = UserApp || getGlobalApp();
8
8
  if (isBrowser()) {
@@ -1,46 +1,14 @@
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, RuntimeComponentResolverContext, RuntimeContext, getGlobalEnableRsc, getGlobalInternalRuntimeContext } from "@modern-js/runtime/context";
4
+ function wrapRuntimeComponentResolver(root, hooks = getGlobalInternalRuntimeContext()?.hooks) {
5
+ return /*#__PURE__*/ jsx(RuntimeComponentResolverContext.Provider, {
6
+ value: hooks?.resolveComponent?.call,
7
+ children: root
11
8
  });
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
9
  }
40
10
  function wrapRuntimeContextProvider(App, contextValue) {
41
11
  const { isBrowser, initialData, routes, context, routeManifest, routerContext, unstable_getBlockNavState, ssrContext, _internalContext, _internalRouterBaseName, ...rest } = contextValue;
42
- const internalContextValue = contextValue;
43
- const helmetContext = ensureHelmetContext(internalContextValue);
44
12
  const runtimeContextValue = {
45
13
  isBrowser,
46
14
  initialData,
@@ -48,37 +16,22 @@ function wrapRuntimeContextProvider(App, contextValue) {
48
16
  context,
49
17
  ...rest
50
18
  };
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,
19
+ const isRsc = true === getGlobalEnableRsc();
20
+ const projection = {
21
+ internalContext: contextValue,
22
+ publicContext: runtimeContextValue
23
+ };
24
+ const values = getGlobalInternalRuntimeContext()?.hooks.transformRuntimeContext?.call(projection, {
25
+ context: contextValue,
26
+ isRsc
27
+ }) ?? projection;
28
+ const root = /*#__PURE__*/ jsx(InternalRuntimeContext.Provider, {
29
+ value: values.internalContext,
75
30
  children: /*#__PURE__*/ jsx(RuntimeContext.Provider, {
76
- value: runtimeContextValue,
77
- children: /*#__PURE__*/ jsx(HelmetProvider, {
78
- context: helmetContext,
79
- children: App
80
- })
31
+ value: values.publicContext,
32
+ children: App
81
33
  })
82
34
  });
35
+ return isRsc && false === isBrowser ? root : wrapRuntimeComponentResolver(root);
83
36
  }
84
- export { wrapRuntimeContextProvider };
37
+ 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,10 +1,9 @@
1
1
  import "node:module";
2
2
  import { jsx } from "react/jsx-runtime";
3
+ import { getGlobalInternalRuntimeContext, getGlobalRSCRoot, getInitialContext } from "@modern-js/runtime/context";
3
4
  import { storage } from "@modern-js/runtime-utils/node";
4
5
  import { getPathname, parseCookie, parseHeaders, parseQuery } from "@modern-js/runtime-utils/universal/request";
5
6
  import react, { Fragment } from "react";
6
- import { getGlobalInternalRuntimeContext, getGlobalRSCRoot } from "../context/index.mjs";
7
- import { getInitialContext } from "../context/runtime.mjs";
8
7
  import { getServerPayload } from "../context/serverPayload/index.mjs";
9
8
  import { createRoot } from "../react/index.mjs";
10
9
  import { CHUNK_CSS_PLACEHOLDER } from "./constants.mjs";
@@ -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 };
@@ -1,13 +1,11 @@
1
1
  import "node:module";
2
2
  import { serializeJson } from "@modern-js/runtime-utils/node";
3
- import { getRouterHydrationScripts } from "../../../router/runtime/lifecycle.mjs";
4
3
  import { SSR_DATA_JSON_ID } from "../../constants.mjs";
5
- import { SSR_DATA_PLACEHOLDER } from "../constants.mjs";
6
- import { createRouteHydrationScriptTags, replaceChunkJsPlaceholder } from "../scriptOrder.mjs";
7
- import { buildHtml } from "../shared.mjs";
4
+ import { CHUNK_JS_PLACEHOLDER, SSR_DATA_PLACEHOLDER } from "../constants.mjs";
5
+ import { buildHtml, replaceSSRTemplateChunk } from "../shared.mjs";
8
6
  import { attributesToString } from "../utils.mjs";
9
7
  function buildShellAfterTemplate(afterAppTemplate, options) {
10
- const { request, config, ssrConfig, runtimeContext, renderLevel, entryName } = options;
8
+ const { request, config, ssrConfig, runtimeContext, renderLevel, entryName, lifecycle } = options;
11
9
  const callbacks = [
12
10
  (template)=>injectJs(template, entryName, config.nonce),
13
11
  createReplaceSSRData({
@@ -17,21 +15,28 @@ function buildShellAfterTemplate(afterAppTemplate, options) {
17
15
  useJsonScript: config.useJsonScript,
18
16
  runtimeContext,
19
17
  renderLevel,
20
- entryName
18
+ lifecycle
21
19
  })
22
20
  ];
23
21
  async function injectJs(template, entryName, nonce) {
24
- const jsChunkStr = createRouteHydrationScriptTags(runtimeContext, entryName, {
25
- nonce,
26
- template
22
+ const assets = runtimeContext.routeManifest?.routeAssets?.[`async-${entryName}`]?.assets ?? [];
23
+ const jsChunkStr = assets.filter((asset)=>asset.endsWith('.js')).map((asset)=>`<script${attributesToString({
24
+ src: asset,
25
+ nonce
26
+ })}></script>`).join(' ');
27
+ return replaceSSRTemplateChunk({
28
+ name: "scripts",
29
+ template,
30
+ placeholder: CHUNK_JS_PLACEHOLDER,
31
+ content: jsChunkStr
32
+ }, lifecycle, {
33
+ preserveEmpty: true
27
34
  });
28
- if (!jsChunkStr) return template;
29
- return replaceChunkJsPlaceholder(template, jsChunkStr, entryName);
30
35
  }
31
36
  return buildHtml(afterAppTemplate, callbacks);
32
37
  }
33
38
  function createReplaceSSRData(options) {
34
- const { runtimeContext, nonce, renderLevel, useJsonScript, ssrConfig, entryName } = options;
39
+ const { runtimeContext, nonce, renderLevel, useJsonScript, ssrConfig, lifecycle } = options;
35
40
  const { request, reporter } = runtimeContext.ssrContext;
36
41
  const headers = 'object' == typeof ssrConfig && ssrConfig.unsafeHeaders ? Object.fromEntries(Object.entries(request.headers).filter(([key, _])=>ssrConfig.unsafeHeaders?.map((header)=>header.toLowerCase())?.includes(key.toLowerCase()))) : void 0;
37
42
  const ssrData = {
@@ -60,11 +65,11 @@ function createReplaceSSRData(options) {
60
65
  });
61
66
  const serializeSSRData = serializeJson(ssrData);
62
67
  const ssrDataScript = useJsonScript ? `<script type="application/json" id="${SSR_DATA_JSON_ID}">${serializeSSRData}</script>` : `<script${attrsStr}>window._SSR_DATA = ${serializeSSRData}</script>`;
63
- const hydrationScripts = getRouterHydrationScripts(runtimeContext);
64
- const ssrScripts = hydrationScripts.length ? `${ssrDataScript}\n${hydrationScripts.join('\n')}` : ssrDataScript;
65
- return (template)=>{
66
- if (!template.includes(SSR_DATA_PLACEHOLDER)) return template;
67
- return replaceChunkJsPlaceholder(template, ssrScripts, entryName, SSR_DATA_PLACEHOLDER);
68
- };
68
+ return (template)=>replaceSSRTemplateChunk({
69
+ name: 'data',
70
+ template,
71
+ placeholder: SSR_DATA_PLACEHOLDER,
72
+ content: ssrDataScript
73
+ }, lifecycle);
69
74
  }
70
75
  export { buildShellAfterTemplate };