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

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 (213) 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/document/cli/index.js +14 -5
  31. package/dist/cjs/exports/head.js +7 -14
  32. package/dist/cjs/internal.js +2 -2
  33. package/dist/cjs/router/cli/code/nestedRoutes.js +1 -2
  34. package/dist/cjs/router/cli/code/templates.js +1 -1
  35. package/dist/cjs/router/cli/code/utils.js +2 -2
  36. package/dist/cjs/router/runtime/DeferredDataScripts.node.js +10 -9
  37. package/dist/cjs/router/runtime/PrefetchLink.js +69 -125
  38. package/dist/cjs/router/runtime/hooks.js +13 -2
  39. package/dist/cjs/router/runtime/internal.js +7 -45
  40. package/dist/cjs/router/runtime/plugin.js +19 -34
  41. package/dist/cjs/router/runtime/plugin.node.js +9 -37
  42. package/dist/cjs/router/runtime/redirect.js +1 -1
  43. package/dist/esm/cli/code.mjs +3 -1
  44. package/dist/esm/cli/ssr/index.mjs +3 -72
  45. package/dist/esm/cli/ssr/loadable-bundler-plugin.mjs +2 -0
  46. package/dist/esm/cli/template.server.mjs +1 -2
  47. package/dist/esm/core/browser/hydrate.mjs +10 -11
  48. package/dist/esm/core/browser/index.mjs +1 -2
  49. package/dist/esm/core/context/index.mjs +2 -5
  50. package/dist/esm/core/context/public.mjs +1 -5
  51. package/dist/esm/core/context/runtime.mjs +6 -3
  52. package/dist/esm/core/index.mjs +1 -1
  53. package/dist/esm/core/plugin/index.mjs +1 -1
  54. package/dist/esm/core/react/index.mjs +1 -1
  55. package/dist/esm/core/react/wrapper.mjs +20 -67
  56. package/dist/esm/core/server/helmet.mjs +5 -4
  57. package/dist/esm/core/server/requestHandler.mjs +1 -2
  58. package/dist/esm/core/server/requestResponse.mjs +3 -3
  59. package/dist/esm/core/server/routerCleanup.mjs +1 -1
  60. package/dist/esm/core/server/shared.mjs +153 -1
  61. package/dist/esm/core/server/stream/afterTemplate.mjs +23 -18
  62. package/dist/esm/core/server/stream/beforeTemplate.mjs +40 -31
  63. package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +33 -26
  64. package/dist/esm/core/server/stream/createReadableStream.mjs +220 -123
  65. package/dist/esm/core/server/stream/createReadableStream.worker.mjs +161 -90
  66. package/dist/esm/core/server/stream/deferredScript.mjs +3 -3
  67. package/dist/esm/core/server/stream/shared.mjs +4 -3
  68. package/dist/esm/core/server/string/index.mjs +106 -68
  69. package/dist/esm/core/server/string/loadable.mjs +38 -23
  70. package/dist/esm/core/server/string/ssrData.mjs +5 -12
  71. package/dist/esm/core/server/utils.mjs +1 -2
  72. package/dist/esm/document/cli/index.mjs +12 -6
  73. package/dist/esm/exports/head.mjs +7 -14
  74. package/dist/esm/internal.mjs +1 -1
  75. package/dist/esm/router/cli/code/nestedRoutes.mjs +1 -2
  76. package/dist/esm/router/cli/code/templates.mjs +1 -1
  77. package/dist/esm/router/cli/code/utils.mjs +2 -2
  78. package/dist/esm/router/runtime/DeferredDataScripts.node.mjs +10 -9
  79. package/dist/esm/router/runtime/PrefetchLink.mjs +68 -124
  80. package/dist/esm/router/runtime/hooks.mjs +9 -1
  81. package/dist/esm/router/runtime/internal.mjs +2 -33
  82. package/dist/esm/router/runtime/plugin.mjs +10 -25
  83. package/dist/esm/router/runtime/plugin.node.mjs +3 -31
  84. package/dist/esm/router/runtime/redirect.mjs +1 -1
  85. package/dist/esm-node/cli/code.mjs +3 -1
  86. package/dist/esm-node/cli/ssr/index.mjs +3 -72
  87. package/dist/esm-node/cli/ssr/loadable-bundler-plugin.mjs +2 -0
  88. package/dist/esm-node/cli/template.server.mjs +1 -2
  89. package/dist/esm-node/core/browser/hydrate.mjs +10 -11
  90. package/dist/esm-node/core/browser/index.mjs +1 -2
  91. package/dist/esm-node/core/context/index.mjs +2 -5
  92. package/dist/esm-node/core/context/public.mjs +1 -5
  93. package/dist/esm-node/core/context/runtime.mjs +6 -3
  94. package/dist/esm-node/core/index.mjs +1 -1
  95. package/dist/esm-node/core/plugin/index.mjs +1 -1
  96. package/dist/esm-node/core/react/index.mjs +1 -1
  97. package/dist/esm-node/core/react/wrapper.mjs +20 -67
  98. package/dist/esm-node/core/server/helmet.mjs +5 -4
  99. package/dist/esm-node/core/server/requestHandler.mjs +1 -2
  100. package/dist/esm-node/core/server/requestResponse.mjs +3 -3
  101. package/dist/esm-node/core/server/routerCleanup.mjs +1 -1
  102. package/dist/esm-node/core/server/shared.mjs +153 -1
  103. package/dist/esm-node/core/server/stream/afterTemplate.mjs +23 -18
  104. package/dist/esm-node/core/server/stream/beforeTemplate.mjs +40 -31
  105. package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +33 -26
  106. package/dist/esm-node/core/server/stream/createReadableStream.mjs +220 -123
  107. package/dist/esm-node/core/server/stream/createReadableStream.worker.mjs +161 -90
  108. package/dist/esm-node/core/server/stream/deferredScript.mjs +3 -3
  109. package/dist/esm-node/core/server/stream/shared.mjs +4 -3
  110. package/dist/esm-node/core/server/string/index.mjs +106 -68
  111. package/dist/esm-node/core/server/string/loadable.mjs +38 -23
  112. package/dist/esm-node/core/server/string/ssrData.mjs +5 -12
  113. package/dist/esm-node/core/server/utils.mjs +1 -2
  114. package/dist/esm-node/document/cli/index.mjs +12 -6
  115. package/dist/esm-node/exports/head.mjs +7 -14
  116. package/dist/esm-node/internal.mjs +1 -1
  117. package/dist/esm-node/router/cli/code/nestedRoutes.mjs +1 -2
  118. package/dist/esm-node/router/cli/code/templates.mjs +1 -1
  119. package/dist/esm-node/router/cli/code/utils.mjs +2 -2
  120. package/dist/esm-node/router/runtime/DeferredDataScripts.node.mjs +10 -9
  121. package/dist/esm-node/router/runtime/PrefetchLink.mjs +68 -124
  122. package/dist/esm-node/router/runtime/hooks.mjs +9 -1
  123. package/dist/esm-node/router/runtime/internal.mjs +2 -33
  124. package/dist/esm-node/router/runtime/plugin.mjs +10 -25
  125. package/dist/esm-node/router/runtime/plugin.node.mjs +3 -31
  126. package/dist/esm-node/router/runtime/redirect.mjs +1 -1
  127. package/dist/types/cli/ssr/index.d.ts +0 -3
  128. package/dist/types/core/context/index.d.ts +4 -6
  129. package/dist/types/core/context/public.d.ts +1 -23
  130. package/dist/types/core/context/runtime.d.ts +26 -2
  131. package/dist/types/core/index.d.ts +1 -1
  132. package/dist/types/core/react/wrapper.d.ts +7 -1
  133. package/dist/types/core/server/helmet.d.ts +4 -5
  134. package/dist/types/core/server/requestHandler.d.ts +3 -3
  135. package/dist/types/core/server/requestResponse.d.ts +1 -1
  136. package/dist/types/core/server/routerCleanup.d.ts +1 -1
  137. package/dist/types/core/server/shared.d.ts +24 -1
  138. package/dist/types/core/server/stream/afterTemplate.d.ts +2 -1
  139. package/dist/types/core/server/stream/beforeTemplate.d.ts +4 -1
  140. package/dist/types/core/server/stream/beforeTemplate.worker.d.ts +4 -1
  141. package/dist/types/core/server/stream/shared.d.ts +16 -2
  142. package/dist/types/core/server/string/loadable.d.ts +6 -3
  143. package/dist/types/core/server/string/ssrData.d.ts +2 -1
  144. package/dist/types/core/server/string/types.d.ts +1 -5
  145. package/dist/types/core/server/tracer.d.ts +1 -1
  146. package/dist/types/core/server/utils.d.ts +1 -1
  147. package/dist/types/core/types.d.ts +1 -2
  148. package/dist/types/document/cli/index.d.ts +1 -0
  149. package/dist/types/exports/head.d.ts +2 -2
  150. package/dist/types/internal.d.ts +1 -1
  151. package/dist/types/router/runtime/PrefetchLink.d.ts +27 -2
  152. package/dist/types/router/runtime/hooks.d.ts +19 -2
  153. package/dist/types/router/runtime/internal.d.ts +4 -21
  154. package/dist/types/router/runtime/types.d.ts +2 -43
  155. package/package.json +18 -46
  156. package/rslib.config.mts +3 -0
  157. package/rstest.config.mts +28 -2
  158. package/dist/cjs/boundary-debugger/index.js +0 -317
  159. package/dist/cjs/core/context/extensions.js +0 -74
  160. package/dist/cjs/core/context/helmetContext.js +0 -54
  161. package/dist/cjs/core/server/federatedCss.js +0 -58
  162. package/dist/cjs/core/server/scriptOrder.js +0 -140
  163. package/dist/cjs/module-federation/consume-surface.js +0 -199
  164. package/dist/cjs/module-federation/distributed-ssr.js +0 -135
  165. package/dist/cjs/module-federation/index.js +0 -316
  166. package/dist/cjs/module-federation/last-known-good.js +0 -157
  167. package/dist/cjs/module-federation/manifest-recovery-runtime-plugin.js +0 -129
  168. package/dist/cjs/module-federation/surface-resolution-types.js +0 -61
  169. package/dist/cjs/router/runtime/lifecycle.js +0 -167
  170. package/dist/cjs/router/runtime/provider.js +0 -153
  171. package/dist/cjs/rsc/server.worker.js +0 -62
  172. package/dist/esm/boundary-debugger/index.mjs +0 -277
  173. package/dist/esm/core/context/extensions.mjs +0 -33
  174. package/dist/esm/core/context/helmetContext.mjs +0 -13
  175. package/dist/esm/core/server/federatedCss.mjs +0 -20
  176. package/dist/esm/core/server/scriptOrder.mjs +0 -90
  177. package/dist/esm/module-federation/consume-surface.mjs +0 -158
  178. package/dist/esm/module-federation/distributed-ssr.mjs +0 -82
  179. package/dist/esm/module-federation/index.mjs +0 -115
  180. package/dist/esm/module-federation/last-known-good.mjs +0 -113
  181. package/dist/esm/module-federation/manifest-recovery-runtime-plugin.mjs +0 -89
  182. package/dist/esm/module-federation/surface-resolution-types.mjs +0 -8
  183. package/dist/esm/router/runtime/lifecycle.mjs +0 -105
  184. package/dist/esm/router/runtime/provider.mjs +0 -100
  185. package/dist/esm/rsc/server.worker.mjs +0 -1
  186. package/dist/esm-node/boundary-debugger/index.mjs +0 -278
  187. package/dist/esm-node/core/context/extensions.mjs +0 -34
  188. package/dist/esm-node/core/context/helmetContext.mjs +0 -14
  189. package/dist/esm-node/core/server/federatedCss.mjs +0 -21
  190. package/dist/esm-node/core/server/scriptOrder.mjs +0 -91
  191. package/dist/esm-node/module-federation/consume-surface.mjs +0 -159
  192. package/dist/esm-node/module-federation/distributed-ssr.mjs +0 -83
  193. package/dist/esm-node/module-federation/index.mjs +0 -116
  194. package/dist/esm-node/module-federation/last-known-good.mjs +0 -114
  195. package/dist/esm-node/module-federation/manifest-recovery-runtime-plugin.mjs +0 -90
  196. package/dist/esm-node/module-federation/surface-resolution-types.mjs +0 -9
  197. package/dist/esm-node/router/runtime/lifecycle.mjs +0 -106
  198. package/dist/esm-node/router/runtime/provider.mjs +0 -101
  199. package/dist/esm-node/rsc/server.worker.mjs +0 -2
  200. package/dist/types/boundary-debugger/index.d.ts +0 -28
  201. package/dist/types/core/context/extensions.d.ts +0 -35
  202. package/dist/types/core/context/helmetContext.d.ts +0 -10
  203. package/dist/types/core/server/federatedCss.d.ts +0 -5
  204. package/dist/types/core/server/scriptOrder.d.ts +0 -25
  205. package/dist/types/module-federation/consume-surface.d.ts +0 -104
  206. package/dist/types/module-federation/distributed-ssr.d.ts +0 -61
  207. package/dist/types/module-federation/index.d.ts +0 -71
  208. package/dist/types/module-federation/last-known-good.d.ts +0 -52
  209. package/dist/types/module-federation/manifest-recovery-runtime-plugin.d.ts +0 -25
  210. package/dist/types/module-federation/surface-resolution-types.d.ts +0 -23
  211. package/dist/types/router/runtime/lifecycle.d.ts +0 -27
  212. package/dist/types/router/runtime/provider.d.ts +0 -78
  213. 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 };