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

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 (207) hide show
  1. package/dist/cjs/cli/code.js +3 -1
  2. package/dist/cjs/cli/ssr/index.js +2 -74
  3. package/dist/cjs/core/browser/hydrate.js +6 -1
  4. package/dist/cjs/core/context/index.js +4 -43
  5. package/dist/cjs/core/context/public.js +4 -7
  6. package/dist/cjs/core/context/runtime.js +17 -5
  7. package/dist/cjs/core/react/wrapper.js +22 -65
  8. package/dist/cjs/core/server/helmet.js +5 -4
  9. package/dist/cjs/core/server/requestResponse.js +4 -4
  10. package/dist/cjs/core/server/routerCleanup.js +2 -2
  11. package/dist/cjs/core/server/shared.js +171 -4
  12. package/dist/cjs/core/server/stream/afterTemplate.js +21 -16
  13. package/dist/cjs/core/server/stream/beforeTemplate.js +34 -25
  14. package/dist/cjs/core/server/stream/beforeTemplate.worker.js +28 -21
  15. package/dist/cjs/core/server/stream/createReadableStream.js +208 -123
  16. package/dist/cjs/core/server/stream/createReadableStream.worker.js +159 -90
  17. package/dist/cjs/core/server/stream/deferredScript.js +3 -3
  18. package/dist/cjs/core/server/stream/shared.js +2 -2
  19. package/dist/cjs/core/server/string/index.js +100 -64
  20. package/dist/cjs/core/server/string/loadable.js +34 -19
  21. package/dist/cjs/core/server/string/ssrData.js +5 -12
  22. package/dist/cjs/core/server/utils.js +1 -2
  23. package/dist/cjs/document/cli/index.js +1 -2
  24. package/dist/cjs/exports/head.js +7 -14
  25. package/dist/cjs/router/runtime/PrefetchLink.js +67 -123
  26. package/dist/cjs/router/runtime/hooks.js +13 -2
  27. package/dist/cjs/router/runtime/internal.js +7 -45
  28. package/dist/cjs/router/runtime/plugin.js +2 -8
  29. package/dist/cjs/router/runtime/plugin.node.js +2 -30
  30. package/dist/cjs/router/runtime/redirect.js +1 -1
  31. package/dist/esm/cli/code.mjs +3 -1
  32. package/dist/esm/cli/ssr/index.mjs +3 -72
  33. package/dist/esm/core/browser/hydrate.mjs +7 -2
  34. package/dist/esm/core/context/index.mjs +2 -5
  35. package/dist/esm/core/context/public.mjs +1 -5
  36. package/dist/esm/core/context/runtime.mjs +13 -4
  37. package/dist/esm/core/react/wrapper.mjs +21 -67
  38. package/dist/esm/core/server/helmet.mjs +5 -4
  39. package/dist/esm/core/server/requestResponse.mjs +3 -3
  40. package/dist/esm/core/server/routerCleanup.mjs +1 -1
  41. package/dist/esm/core/server/shared.mjs +153 -1
  42. package/dist/esm/core/server/stream/afterTemplate.mjs +23 -18
  43. package/dist/esm/core/server/stream/beforeTemplate.mjs +37 -28
  44. package/dist/esm/core/server/stream/beforeTemplate.worker.mjs +31 -24
  45. package/dist/esm/core/server/stream/createReadableStream.mjs +207 -122
  46. package/dist/esm/core/server/stream/createReadableStream.worker.mjs +149 -90
  47. package/dist/esm/core/server/stream/deferredScript.mjs +3 -3
  48. package/dist/esm/core/server/stream/shared.mjs +2 -2
  49. package/dist/esm/core/server/string/index.mjs +104 -68
  50. package/dist/esm/core/server/string/loadable.mjs +34 -19
  51. package/dist/esm/core/server/string/ssrData.mjs +5 -12
  52. package/dist/esm/core/server/utils.mjs +1 -2
  53. package/dist/esm/document/cli/index.mjs +2 -3
  54. package/dist/esm/exports/head.mjs +7 -14
  55. package/dist/esm/router/runtime/PrefetchLink.mjs +68 -124
  56. package/dist/esm/router/runtime/hooks.mjs +9 -1
  57. package/dist/esm/router/runtime/internal.mjs +2 -33
  58. package/dist/esm/router/runtime/plugin.mjs +1 -7
  59. package/dist/esm/router/runtime/plugin.node.mjs +1 -29
  60. package/dist/esm/router/runtime/redirect.mjs +1 -1
  61. package/dist/esm-node/cli/code.mjs +3 -1
  62. package/dist/esm-node/cli/ssr/index.mjs +3 -72
  63. package/dist/esm-node/core/browser/hydrate.mjs +7 -2
  64. package/dist/esm-node/core/context/index.mjs +2 -5
  65. package/dist/esm-node/core/context/public.mjs +1 -5
  66. package/dist/esm-node/core/context/runtime.mjs +13 -4
  67. package/dist/esm-node/core/react/wrapper.mjs +21 -67
  68. package/dist/esm-node/core/server/helmet.mjs +5 -4
  69. package/dist/esm-node/core/server/requestResponse.mjs +3 -3
  70. package/dist/esm-node/core/server/routerCleanup.mjs +1 -1
  71. package/dist/esm-node/core/server/shared.mjs +153 -1
  72. package/dist/esm-node/core/server/stream/afterTemplate.mjs +23 -18
  73. package/dist/esm-node/core/server/stream/beforeTemplate.mjs +37 -28
  74. package/dist/esm-node/core/server/stream/beforeTemplate.worker.mjs +31 -24
  75. package/dist/esm-node/core/server/stream/createReadableStream.mjs +207 -122
  76. package/dist/esm-node/core/server/stream/createReadableStream.worker.mjs +149 -90
  77. package/dist/esm-node/core/server/stream/deferredScript.mjs +3 -3
  78. package/dist/esm-node/core/server/stream/shared.mjs +2 -2
  79. package/dist/esm-node/core/server/string/index.mjs +104 -68
  80. package/dist/esm-node/core/server/string/loadable.mjs +34 -19
  81. package/dist/esm-node/core/server/string/ssrData.mjs +5 -12
  82. package/dist/esm-node/core/server/utils.mjs +1 -2
  83. package/dist/esm-node/document/cli/index.mjs +2 -3
  84. package/dist/esm-node/exports/head.mjs +7 -14
  85. package/dist/esm-node/router/runtime/PrefetchLink.mjs +68 -124
  86. package/dist/esm-node/router/runtime/hooks.mjs +9 -1
  87. package/dist/esm-node/router/runtime/internal.mjs +2 -33
  88. package/dist/esm-node/router/runtime/plugin.mjs +1 -7
  89. package/dist/esm-node/router/runtime/plugin.node.mjs +1 -29
  90. package/dist/esm-node/router/runtime/redirect.mjs +1 -1
  91. package/dist/types/cli/index.d.ts +7 -7
  92. package/dist/types/cli/ssr/index.d.ts +0 -3
  93. package/dist/types/core/browser/hydrate.d.ts +1 -1
  94. package/dist/types/core/browser/index.d.ts +1 -1
  95. package/dist/types/core/compat/hooks.d.ts +1 -1
  96. package/dist/types/core/compat/index.d.ts +1 -1
  97. package/dist/types/core/compat/requestContext.d.ts +3 -3
  98. package/dist/types/core/config.d.ts +1 -1
  99. package/dist/types/core/context/index.d.ts +8 -10
  100. package/dist/types/core/context/monitors/index.d.ts +1 -1
  101. package/dist/types/core/context/monitors/index.server.d.ts +1 -1
  102. package/dist/types/core/context/public.d.ts +1 -23
  103. package/dist/types/core/context/runtime.d.ts +27 -3
  104. package/dist/types/core/context/serverPayload/index.d.ts +1 -1
  105. package/dist/types/core/index.d.ts +5 -5
  106. package/dist/types/core/plugin/index.d.ts +1 -1
  107. package/dist/types/core/plugin/types.d.ts +2 -2
  108. package/dist/types/core/react/wrapper.d.ts +7 -1
  109. package/dist/types/core/server/helmet.d.ts +4 -5
  110. package/dist/types/core/server/index.d.ts +2 -2
  111. package/dist/types/core/server/react/index.d.ts +2 -2
  112. package/dist/types/core/server/requestHandler.d.ts +3 -3
  113. package/dist/types/core/server/requestResponse.d.ts +3 -3
  114. package/dist/types/core/server/routerCleanup.d.ts +2 -2
  115. package/dist/types/core/server/server.d.ts +4 -4
  116. package/dist/types/core/server/shared.d.ts +25 -2
  117. package/dist/types/core/server/stream/afterTemplate.d.ts +5 -4
  118. package/dist/types/core/server/stream/beforeTemplate.d.ts +6 -3
  119. package/dist/types/core/server/stream/beforeTemplate.worker.d.ts +6 -3
  120. package/dist/types/core/server/stream/createReadableStream.d.ts +1 -1
  121. package/dist/types/core/server/stream/createReadableStream.worker.d.ts +1 -1
  122. package/dist/types/core/server/stream/index.d.ts +1 -1
  123. package/dist/types/core/server/stream/shared.d.ts +5 -5
  124. package/dist/types/core/server/stream/template.d.ts +2 -2
  125. package/dist/types/core/server/string/index.d.ts +1 -1
  126. package/dist/types/core/server/string/loadable.d.ts +7 -4
  127. package/dist/types/core/server/string/ssrData.d.ts +5 -4
  128. package/dist/types/core/server/string/types.d.ts +2 -6
  129. package/dist/types/core/server/tracer.d.ts +1 -1
  130. package/dist/types/core/server/utils.d.ts +2 -2
  131. package/dist/types/core/types.d.ts +2 -3
  132. package/dist/types/document/index.d.ts +12 -12
  133. package/dist/types/exports/config-routes.d.ts +1 -1
  134. package/dist/types/exports/head.d.ts +2 -2
  135. package/dist/types/index.d.ts +9 -9
  136. package/dist/types/internal.d.ts +1 -1
  137. package/dist/types/react-server.d.ts +3 -3
  138. package/dist/types/router/cli/code/getClientRoutes/index.d.ts +1 -1
  139. package/dist/types/router/cli/handler.d.ts +1 -1
  140. package/dist/types/router/cli/index.d.ts +3 -3
  141. package/dist/types/router/index.d.ts +1 -1
  142. package/dist/types/router/internal.d.ts +2 -2
  143. package/dist/types/router/runtime/PrefetchLink.d.ts +27 -2
  144. package/dist/types/router/runtime/hooks.d.ts +19 -2
  145. package/dist/types/router/runtime/index.d.ts +4 -4
  146. package/dist/types/router/runtime/internal.d.ts +5 -22
  147. package/dist/types/router/runtime/plugin.d.ts +3 -3
  148. package/dist/types/router/runtime/plugin.node.d.ts +3 -3
  149. package/dist/types/router/runtime/rsc-router.d.ts +3 -3
  150. package/dist/types/router/runtime/types.d.ts +2 -43
  151. package/dist/types/router/runtime/utils.d.ts +1 -1
  152. package/package.json +19 -47
  153. package/rstest.config.mts +32 -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/esm/boundary-debugger/index.mjs +0 -277
  168. package/dist/esm/core/context/extensions.mjs +0 -33
  169. package/dist/esm/core/context/helmetContext.mjs +0 -13
  170. package/dist/esm/core/server/federatedCss.mjs +0 -20
  171. package/dist/esm/core/server/scriptOrder.mjs +0 -90
  172. package/dist/esm/module-federation/consume-surface.mjs +0 -158
  173. package/dist/esm/module-federation/distributed-ssr.mjs +0 -82
  174. package/dist/esm/module-federation/index.mjs +0 -115
  175. package/dist/esm/module-federation/last-known-good.mjs +0 -113
  176. package/dist/esm/module-federation/manifest-recovery-runtime-plugin.mjs +0 -89
  177. package/dist/esm/module-federation/surface-resolution-types.mjs +0 -8
  178. package/dist/esm/router/runtime/lifecycle.mjs +0 -105
  179. package/dist/esm/router/runtime/provider.mjs +0 -100
  180. package/dist/esm-node/boundary-debugger/index.mjs +0 -278
  181. package/dist/esm-node/core/context/extensions.mjs +0 -34
  182. package/dist/esm-node/core/context/helmetContext.mjs +0 -14
  183. package/dist/esm-node/core/server/federatedCss.mjs +0 -21
  184. package/dist/esm-node/core/server/scriptOrder.mjs +0 -91
  185. package/dist/esm-node/module-federation/consume-surface.mjs +0 -159
  186. package/dist/esm-node/module-federation/distributed-ssr.mjs +0 -83
  187. package/dist/esm-node/module-federation/index.mjs +0 -116
  188. package/dist/esm-node/module-federation/last-known-good.mjs +0 -114
  189. package/dist/esm-node/module-federation/manifest-recovery-runtime-plugin.mjs +0 -90
  190. package/dist/esm-node/module-federation/surface-resolution-types.mjs +0 -9
  191. package/dist/esm-node/router/runtime/lifecycle.mjs +0 -106
  192. package/dist/esm-node/router/runtime/provider.mjs +0 -101
  193. package/dist/types/boundary-debugger/index.d.ts +0 -28
  194. package/dist/types/core/context/extensions.d.ts +0 -35
  195. package/dist/types/core/context/helmetContext.d.ts +0 -10
  196. package/dist/types/core/server/federatedCss.d.ts +0 -5
  197. package/dist/types/core/server/scriptOrder.d.ts +0 -25
  198. package/dist/types/module-federation/consume-surface.d.ts +0 -104
  199. package/dist/types/module-federation/distributed-ssr.d.ts +0 -61
  200. package/dist/types/module-federation/index.d.ts +0 -71
  201. package/dist/types/module-federation/last-known-good.d.ts +0 -52
  202. package/dist/types/module-federation/manifest-recovery-runtime-plugin.d.ts +0 -25
  203. package/dist/types/module-federation/surface-resolution-types.d.ts +0 -23
  204. package/dist/types/router/runtime/lifecycle.d.ts +0 -27
  205. package/dist/types/router/runtime/provider.d.ts +0 -78
  206. /package/dist/esm/{rslib-runtime.mjs → rslib-runtime~1.mjs} +0 -0
  207. /package/dist/esm-node/{rslib-runtime.mjs → rslib-runtime~0.mjs} +0 -0
@@ -1,10 +1,9 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
- import { getNavigationWarmupCacheKey } from "@modern-js/runtime-extensions";
4
3
  import { Link as router_Link, NavLink, matchRoutes, useHref, useMatches, useResolvedPath } from "@modern-js/runtime-utils/router";
5
4
  import react, { useContext, useMemo } from "react";
6
5
  import { InternalRuntimeContext } from "../../core/context/index.mjs";
7
- import { __webpack_require__ } from "../../rslib-runtime.mjs";
6
+ import { __webpack_require__ } from "../../rslib-runtime~1.mjs";
8
7
  const getWebpackChunkLoader = ()=>__webpack_chunk_load__;
9
8
  const getWebpackPublicPath = ()=>{
10
9
  try {
@@ -20,62 +19,6 @@ function composeEventHandlers(theirHandler, ourHandler) {
20
19
  };
21
20
  }
22
21
  const ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
23
- const DEFAULT_PREFETCH_BEHAVIOR = 'render';
24
- const INTENT_DELAY = 100;
25
- const VIEWPORT_ROOT_MARGIN = '200px';
26
- const MAX_CONCURRENT_WARMUPS = 4;
27
- const WARMUP_TTL = 30000;
28
- const SLOW_EFFECTIVE_TYPES = new Set([
29
- 'slow-2g',
30
- '2g'
31
- ]);
32
- const warmupCache = new Map();
33
- const warmupQueue = [];
34
- let activeWarmups = 0;
35
- const getWarmupTimestamp = ()=>performance.now();
36
- const getConnection = ()=>{
37
- const nav = globalThis.navigator;
38
- return nav?.connection || nav?.mozConnection || nav?.webkitConnection;
39
- };
40
- const shouldWarmupOnCurrentNetwork = ()=>{
41
- const connection = getConnection();
42
- if (connection?.saveData) return false;
43
- if ('string' == typeof connection?.effectiveType && SLOW_EFFECTIVE_TYPES.has(connection.effectiveType)) return false;
44
- return true;
45
- };
46
- const pruneWarmupCache = (now = getWarmupTimestamp())=>{
47
- for (const [key, timestamp] of warmupCache)if (now - timestamp > WARMUP_TTL) warmupCache.delete(key);
48
- };
49
- const runNextWarmup = ()=>{
50
- while(activeWarmups < MAX_CONCURRENT_WARMUPS && warmupQueue.length > 0){
51
- const task = warmupQueue.shift();
52
- if (task.cancelled) continue;
53
- activeWarmups += 1;
54
- task.run().catch(()=>{
55
- warmupCache.delete(task.key);
56
- }).finally(()=>{
57
- activeWarmups -= 1;
58
- runNextWarmup();
59
- });
60
- }
61
- };
62
- const scheduleWarmup = (key, run)=>{
63
- if (!shouldWarmupOnCurrentNetwork()) return ()=>{};
64
- pruneWarmupCache();
65
- if (warmupCache.has(key)) return ()=>{};
66
- warmupCache.set(key, getWarmupTimestamp());
67
- const task = {
68
- key,
69
- run,
70
- cancelled: false
71
- };
72
- warmupQueue.push(task);
73
- runNextWarmup();
74
- return ()=>{
75
- task.cancelled = true;
76
- if (warmupQueue.includes(task)) warmupCache.delete(task.key);
77
- };
78
- };
79
22
  const setRef = (ref, value)=>{
80
23
  if (!ref) return;
81
24
  if ('function' == typeof ref) return void ref(value);
@@ -83,70 +26,65 @@ const setRef = (ref, value)=>{
83
26
  ref.current = value;
84
27
  } catch {}
85
28
  };
86
- const isDataWarmupEnabled = (route)=>{
87
- const handle = route.handle;
88
- return handle?.navigationWarmup?.data !== false;
89
- };
90
- function usePrefetchBehavior(prefetch, preload, theirElementProps) {
91
- const [maybeWarmup, setMaybeWarmup] = react.useState(false);
92
- const [shouldPrefetch, setShouldPrefetch] = react.useState(false);
93
- const [shouldPreload, setShouldPreload] = react.useState(false);
94
- const [viewportElement, setViewportElement] = react.useState(null);
29
+ function usePrefetchBehavior(prefetch, preload, theirElementProps, policy) {
30
+ const [maybePrefetch, setMaybePrefetch] = react.useState(false);
31
+ const [state, setState] = react.useState({
32
+ code: false,
33
+ data: false
34
+ });
35
+ const [element, setElement] = react.useState(null);
36
+ const observerRef = react.useRef(void 0);
95
37
  const { onFocus, onBlur, onMouseEnter, onMouseLeave, onTouchStart } = theirElementProps;
96
38
  react.useEffect(()=>{
97
- if ('render' === prefetch) setShouldPrefetch(true);
98
- if ('render' === preload) setShouldPreload(true);
39
+ if (!policy) return void setState({
40
+ code: 'render' === prefetch,
41
+ data: 'render' === prefetch
42
+ });
43
+ const observer = policy.observe({
44
+ element,
45
+ prefetch,
46
+ preload,
47
+ notify: (next)=>setState((previous)=>previous.code === next.code && previous.data === next.data ? previous : next)
48
+ });
49
+ observerRef.current = observer;
50
+ return ()=>{
51
+ observerRef.current = void 0;
52
+ observer.dispose();
53
+ };
99
54
  }, [
55
+ policy,
100
56
  prefetch,
101
- preload
57
+ preload,
58
+ element
59
+ ]);
60
+ react.useEffect(()=>{
61
+ if (policy || !maybePrefetch) return;
62
+ const timer = setTimeout(()=>setState({
63
+ code: true,
64
+ data: true
65
+ }), 100);
66
+ return ()=>clearTimeout(timer);
67
+ }, [
68
+ policy,
69
+ maybePrefetch
102
70
  ]);
103
71
  const setIntent = ()=>{
104
- if ('intent' === prefetch || 'intent' === preload) setMaybeWarmup(true);
72
+ if (policy) observerRef.current?.onIntent();
73
+ else if ('intent' === prefetch) setMaybePrefetch(true);
105
74
  };
106
75
  const cancelIntent = ()=>{
107
- if ('intent' === prefetch || 'intent' === preload) {
108
- setMaybeWarmup(false);
109
- setShouldPrefetch(false);
110
- setShouldPreload(false);
76
+ if (policy) observerRef.current?.onCancel();
77
+ else if ('intent' === prefetch) {
78
+ setMaybePrefetch(false);
79
+ setState({
80
+ code: false,
81
+ data: false
82
+ });
111
83
  }
112
84
  };
113
- react.useEffect(()=>{
114
- if (maybeWarmup) {
115
- const id = setTimeout(()=>{
116
- if ('intent' === prefetch) setShouldPrefetch(true);
117
- if ('intent' === preload) setShouldPreload(true);
118
- }, INTENT_DELAY);
119
- return ()=>{
120
- clearTimeout(id);
121
- };
122
- }
123
- }, [
124
- maybeWarmup,
125
- prefetch,
126
- preload
127
- ]);
128
- react.useEffect(()=>{
129
- if (!viewportElement || 'viewport' !== prefetch && 'viewport' !== preload || "u" < typeof IntersectionObserver) return;
130
- const observer = new IntersectionObserver((entries)=>{
131
- if (!entries.some((entry)=>entry.isIntersecting)) return;
132
- if ('viewport' === prefetch) setShouldPrefetch(true);
133
- if ('viewport' === preload) setShouldPreload(true);
134
- observer.disconnect();
135
- }, {
136
- rootMargin: VIEWPORT_ROOT_MARGIN
137
- });
138
- observer.observe(viewportElement);
139
- return ()=>{
140
- observer.disconnect();
141
- };
142
- }, [
143
- prefetch,
144
- preload,
145
- viewportElement
146
- ]);
147
85
  return [
148
- shouldPrefetch,
149
- shouldPreload,
86
+ state.data,
87
+ state.code,
150
88
  {
151
89
  onFocus: composeEventHandlers(onFocus, setIntent),
152
90
  onBlur: composeEventHandlers(onBlur, cancelIntent),
@@ -154,7 +92,7 @@ function usePrefetchBehavior(prefetch, preload, theirElementProps) {
154
92
  onMouseLeave: composeEventHandlers(onMouseLeave, cancelIntent),
155
93
  onTouchStart: composeEventHandlers(onTouchStart, setIntent)
156
94
  },
157
- setViewportElement
95
+ setElement
158
96
  ];
159
97
  }
160
98
  async function loadRouteModule(route, routeAssets, chunkLoader) {
@@ -195,7 +133,8 @@ const PrefetchPageLinks = ({ path, includeData })=>{
195
133
  const context = useContext(InternalRuntimeContext);
196
134
  const { routeManifest, routes } = context;
197
135
  const { routeAssets } = routeManifest || {};
198
- const allowNetworkWarmup = shouldWarmupOnCurrentNetwork();
136
+ const policy = context.linkPrefetchPolicy;
137
+ const allowNetworkWarmup = policy?.canWarmup() ?? true;
199
138
  const matches = useMemo(()=>Array.isArray(routes) ? matchRoutes(routes, pathname) : [], [
200
139
  pathname,
201
140
  routes
@@ -215,7 +154,16 @@ const PrefetchPageLinks = ({ path, includeData })=>{
215
154
  const routeAsset = routeId ? routeAssets[routeId] : void 0;
216
155
  const chunkIds = routeAsset?.chunkIds;
217
156
  if (!routeId || !Array.isArray(chunkIds) || 0 === chunkIds.length) return ()=>{};
218
- return scheduleWarmup(getNavigationWarmupCacheKey(context, chunkLoader, getWebpackPublicPath(), `route-module:${routeId}:${chunkIds.join(',')}`), ()=>loadRouteModule(match.route, routeAssets, chunkLoader));
157
+ const run = ()=>loadRouteModule(match.route, routeAssets, chunkLoader);
158
+ if (policy) return policy.schedule({
159
+ runtimeContext: context,
160
+ chunkLoader,
161
+ publicPath: getWebpackPublicPath(),
162
+ key: `route-module:${routeId}:${chunkIds.join(',')}`,
163
+ run
164
+ });
165
+ run().catch(()=>{});
166
+ return ()=>{};
219
167
  });
220
168
  return ()=>{
221
169
  cancellations.forEach((cancel)=>cancel());
@@ -224,6 +172,7 @@ const PrefetchPageLinks = ({ path, includeData })=>{
224
172
  allowNetworkWarmup,
225
173
  chunkLoader,
226
174
  context,
175
+ policy,
227
176
  routeAssetGeneration
228
177
  ]);
229
178
  if (!allowNetworkWarmup || !includeData || !window._SSR_DATA) return null;
@@ -235,10 +184,11 @@ const PrefetchPageLinks = ({ path, includeData })=>{
235
184
  };
236
185
  const PrefetchDataLinks = ({ matches, path, routeManifest })=>{
237
186
  const { pathname, search, hash } = path;
187
+ const policy = useContext(InternalRuntimeContext).linkPrefetchPolicy;
238
188
  const currentMatches = useMatches();
239
189
  const basename = useHref('/');
240
190
  const dataHrefs = useMemo(()=>matches?.filter((match, index)=>{
241
- if (!isDataWarmupEnabled(match.route) || !match.route.loader || 'function' != typeof match.route.loader || 0 === match.route.loader.length) return false;
191
+ if (policy?.allowData(match.route) === false || !match.route.loader || 'function' != typeof match.route.loader || 0 === match.route.loader.length) return false;
242
192
  if (match.route.shouldRevalidate) {
243
193
  const currentUrl = new URL(location.pathname + location.search + location.hash, window.origin);
244
194
  const nextUrl = new URL(pathname + search + hash, window.origin);
@@ -265,16 +215,10 @@ const PrefetchDataLinks = ({ matches, path, routeManifest })=>{
265
215
  children: dataHrefs
266
216
  });
267
217
  };
268
- const normalizePreloadBehavior = (preload, prefetch)=>{
269
- if (false === preload || 'none' === preload) return 'none';
270
- if (void 0 !== preload) return preload;
271
- if ('none' === prefetch) return 'none';
272
- return prefetch;
273
- };
274
- const createPrefetchLink = (Link)=>/*#__PURE__*/ react.forwardRef(({ to, prefetch = DEFAULT_PREFETCH_BEHAVIOR, preload, ...props }, forwardedRef)=>{
218
+ const createPrefetchLink = (Link)=>/*#__PURE__*/ react.forwardRef(({ to, prefetch, preload, ...props }, forwardedRef)=>{
275
219
  const isAbsolute = 'string' == typeof to && ABSOLUTE_URL_REGEX.test(to);
276
- const resolvedPreload = normalizePreloadBehavior(preload, prefetch);
277
- const [shouldPrefetch, shouldPreload, prefetchHandlers, setViewportElement] = usePrefetchBehavior(prefetch, resolvedPreload, props);
220
+ const policy = useContext(InternalRuntimeContext).linkPrefetchPolicy;
221
+ const [shouldPrefetch, shouldPreload, prefetchHandlers, setViewportElement] = usePrefetchBehavior(prefetch, preload, props, policy);
278
222
  const setAnchorRef = react.useCallback((element)=>{
279
223
  setViewportElement(element);
280
224
  setRef(forwardedRef, element);
@@ -6,4 +6,12 @@ const onBeforeCreateRouter = createRouterSyncHook();
6
6
  const onAfterCreateRouter = createRouterSyncHook();
7
7
  const onBeforeHydrateRouter = createRouterSyncHook();
8
8
  const onAfterHydrateRouter = createRouterSyncHook();
9
- export { modifyRoutes, onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeCreateRoutes, onBeforeHydrateRouter };
9
+ const routerProviderRegistryHooks = {
10
+ modifyRoutes: modifyRoutes,
11
+ onBeforeCreateRoutes: onBeforeCreateRoutes,
12
+ onBeforeCreateRouter: onBeforeCreateRouter,
13
+ onAfterCreateRouter: onAfterCreateRouter,
14
+ onBeforeHydrateRouter: onBeforeHydrateRouter,
15
+ onAfterHydrateRouter: onAfterHydrateRouter
16
+ };
17
+ export { modifyRoutes, onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeCreateRoutes, onBeforeHydrateRouter, routerProviderRegistryHooks };
@@ -1,34 +1,3 @@
1
- import { merge } from "@modern-js/runtime-utils/merge";
2
- import { modifyRoutes, routerPlugin } from "./plugin.mjs";
3
- import { createRouterProviderRealm, registerRouterProvider, reportUnsupportedProviderRegistryHooks, resolveRouterProvider, routerProviderRegistryHooks } from "./provider.mjs";
4
- registerRouterProvider('react-router', routerPlugin, {
5
- isDefault: true
6
- });
7
- const createRouterPlugin = (localProviders = [])=>{
8
- const providerRealm = createRouterProviderRealm([
9
- {
10
- name: 'react-router',
11
- factory: routerPlugin,
12
- isDefault: true
13
- },
14
- ...localProviders
15
- ]);
16
- return (userConfig = {})=>({
17
- name: '@modern-js/plugin-router',
18
- registryHooks: routerProviderRegistryHooks,
19
- setup: (api)=>{
20
- const mergedConfig = merge(api.getRuntimeConfig().router || {}, userConfig);
21
- const pluginFactory = resolveRouterProvider(mergedConfig.framework, {
22
- realm: providerRealm
23
- });
24
- const providerPlugin = pluginFactory(userConfig);
25
- reportUnsupportedProviderRegistryHooks(providerPlugin);
26
- providerPlugin.setup?.(api);
27
- }
28
- });
29
- };
30
- const internal_routerPlugin = createRouterPlugin();
31
- const internal = internal_routerPlugin;
1
+ export { routerProviderRegistryHooks } from "./hooks.mjs";
2
+ export { modifyRoutes, routerPlugin as default, routerPlugin } from "./plugin.mjs";
32
3
  export { renderRoutes } from "./utils.mjs";
33
- export default internal;
34
- export { createRouterPlugin, createRouterProviderRealm, internal_routerPlugin as routerPlugin, modifyRoutes, registerRouterProvider, resolveRouterProvider };
@@ -4,9 +4,8 @@ import { RouterProvider, createBrowserRouter, createHashRouter, createRoutesFrom
4
4
  import { normalizePathname } from "@modern-js/runtime-utils/url";
5
5
  import * as __rspack_external_react from "react";
6
6
  import { InternalRuntimeContext, getGlobalEnableRsc, getGlobalIsRscClient, getGlobalLayoutApp, getGlobalRoutes } from "../../core/context/index.mjs";
7
- import { applyRouterRuntimeState } from "./lifecycle.mjs";
7
+ import { routerProviderRegistryHooks } from "./hooks.mjs";
8
8
  import { Link } from "./PrefetchLink.mjs";
9
- import { routerProviderRegistryHooks } from "./provider.mjs";
10
9
  import { createClientRouterFromPayload } from "./rsc-router.mjs";
11
10
  import { createRouteObjectsFromConfig, deserializeErrors, renderRoutes, urlJoin } from "./utils.mjs";
12
11
  let finalRouteConfig = {
@@ -168,11 +167,6 @@ function useRouterCreation(props, options) {
168
167
  basename: _basename,
169
168
  hydrationData
170
169
  });
171
- applyRouterRuntimeState(runtimeContext, {
172
- framework: 'react-router',
173
- basename: _basename,
174
- instance: router
175
- });
176
170
  hooks.onAfterCreateRouter.call({
177
171
  ...routerLifecycleContext,
178
172
  router,
@@ -8,9 +8,8 @@ import { useContext } from "react";
8
8
  import { InternalRuntimeContext, getGlobalEnableRsc, getGlobalLayoutApp, getGlobalRoutes } from "../../core/context/index.mjs";
9
9
  import { setServerPayload } from "../../core/context/serverPayload/index.server.mjs";
10
10
  import DeferredDataScripts_node from "./DeferredDataScripts.node.mjs";
11
- import { applyRouterRuntimeState, createRouterServerSnapshot } from "./lifecycle.mjs";
11
+ import { routerProviderRegistryHooks } from "./hooks.mjs";
12
12
  import { Link } from "./PrefetchLink.mjs";
13
- import { routerProviderRegistryHooks } from "./provider.mjs";
14
13
  import { RSCStaticRouter, createServerPayload, handleRSCRedirect, prepareRSCRoutes } from "./rsc-router.mjs";
15
14
  import { createRouteObjectsFromConfig, renderRoutes, urlJoin } from "./utils.mjs";
16
15
  function createRemixRequest(request) {
@@ -23,24 +22,6 @@ function createRemixRequest(request) {
23
22
  signal: controller.signal
24
23
  });
25
24
  }
26
- function createReactRouterServerSnapshot(routerContext, basename) {
27
- return createRouterServerSnapshot({
28
- framework: 'react-router',
29
- basename,
30
- statusCode: routerContext.statusCode,
31
- errors: routerContext.errors,
32
- routerData: {
33
- loaderData: routerContext.loaderData,
34
- errors: routerContext.errors
35
- },
36
- matches: routerContext.matches.map((match)=>{
37
- const routeId = match.route.id;
38
- return 'string' == typeof routeId ? {
39
- routeId
40
- } : void 0;
41
- }).filter((match)=>void 0 !== match)
42
- });
43
- }
44
25
  const routerPlugin = (userConfig = {})=>({
45
26
  name: '@modern-js/plugin-router',
46
27
  registryHooks: routerProviderRegistryHooks,
@@ -107,18 +88,9 @@ const routerPlugin = (userConfig = {})=>({
107
88
  throw errors[0];
108
89
  }
109
90
  context.routerContext = routerContext;
110
- const routerServerSnapshot = createReactRouterServerSnapshot(routerContext, _basename);
111
- applyRouterRuntimeState(context, {
112
- framework: 'react-router',
113
- basename: _basename,
114
- instance: routerContext,
115
- matchedRouteIds: routerServerSnapshot.matchedRouteIds,
116
- serverSnapshot: routerServerSnapshot
117
- });
118
91
  hooks.onAfterCreateRouter.call({
119
92
  ...routerLifecycleContext,
120
93
  router: routerContext,
121
- serverSnapshot: routerServerSnapshot,
122
94
  runtimeContext: context
123
95
  });
124
96
  let payload;
@@ -1,7 +1,7 @@
1
1
  const handleRSCRedirect = (headers, basename, status)=>{
2
2
  const newHeaders = new Headers(headers);
3
3
  let redirectUrl = headers.get('Location');
4
- if (!redirectUrl || ![
4
+ if (null === redirectUrl || '' === redirectUrl || ![
5
5
  301,
6
6
  302,
7
7
  303,
@@ -74,7 +74,9 @@ const generateCode = async (entrypoints, appContext, config, hooks)=>{
74
74
  const bootstrapFile = path.resolve(internalDirectory, `./${entryName}/${ENTRY_BOOTSTRAP_FILE_NAME}`);
75
75
  await fs.outputFile(bootstrapFile, `import(/* webpackChunkName: "async-${entryName}" */ './${INDEX_FILE_NAME}');`, 'utf8');
76
76
  const bootstrapServerFile = path.resolve(internalDirectory, `./${entryName}/${ENTRY_SERVER_BOOTSTRAP_FILE_NAME}`);
77
- if (ssrMode) await fs.outputFile(bootstrapServerFile, `export const requestHandler = import('./${SERVER_ENTRY_POINT_FILE_NAME}').then((m) => m.requestHandler)`, 'utf8');
77
+ if (ssrMode) await fs.outputFile(bootstrapServerFile, `export const requestHandler = import('./${SERVER_ENTRY_POINT_FILE_NAME}').then((m) => m.requestHandler);
78
+ // The renderer awaits this promise later; retain its rejection without an early unhandled rejection.
79
+ requestHandler.catch(() => {});`, 'utf8');
78
80
  }
79
81
  if (ssrMode) {
80
82
  const indexServerCode = __rspack_external__template_server_mjs_f98cfe58.serverIndex({
@@ -4,51 +4,6 @@ import { LOADABLE_STATS_FILE, isUseSSRBundle } from "@modern-js/utils";
4
4
  import path from "path";
5
5
  import loadable_bundler_plugin from "./loadable-bundler-plugin.mjs";
6
6
  import { resolveSSRMode } from "./mode.mjs";
7
- const getRspackPlugins = (rspackConfig)=>{
8
- if (!rspackConfig) return [];
9
- const rspackEntries = Array.isArray(rspackConfig) ? rspackConfig : [
10
- rspackConfig
11
- ];
12
- const plugins = [];
13
- for (const entry of rspackEntries){
14
- if (!entry || 'function' == typeof entry || 'object' != typeof entry) continue;
15
- const maybePlugins = entry.plugins;
16
- if (Array.isArray(maybePlugins)) {
17
- for (const plugin of maybePlugins)if (plugin) plugins.push(plugin);
18
- }
19
- }
20
- return plugins;
21
- };
22
- const getRspackPluginName = (plugin)=>{
23
- if ('string' == typeof plugin) return plugin;
24
- if ('function' == typeof plugin) return plugin.name;
25
- if (Array.isArray(plugin)) {
26
- const [first] = plugin;
27
- if (!first) return;
28
- if ('string' == typeof first) return first;
29
- if ('function' == typeof first) return first.name;
30
- if ('object' == typeof first) return first.name || first.constructor?.name;
31
- return;
32
- }
33
- return plugin.name || plugin.constructor?.name;
34
- };
35
- const hasServerRenderingConfig = (userConfig)=>{
36
- const { output, server } = userConfig;
37
- if (output?.ssg) return true;
38
- if (output?.ssgByEntries && Object.keys(output.ssgByEntries).length > 0) return true;
39
- if (server?.ssr) return true;
40
- if (server?.ssrByEntries && Object.keys(server.ssrByEntries).length > 0) return true;
41
- return false;
42
- };
43
- const isModuleFederationAppSSREnabledInConfig = (ssr)=>{
44
- if (!ssr || 'object' != typeof ssr) return false;
45
- return true === ssr.moduleFederationAppSSR;
46
- };
47
- const isModuleFederationAppSSREnabled = (userConfig)=>{
48
- if (isModuleFederationAppSSREnabledInConfig(userConfig.server?.ssr)) return true;
49
- if (userConfig.server?.ssrByEntries && 'object' == typeof userConfig.server.ssrByEntries) return Object.values(userConfig.server.ssrByEntries).some(isModuleFederationAppSSREnabledInConfig);
50
- return false;
51
- };
52
7
  const checkUseStringSSR = (config, appDirectory, entrypoints)=>{
53
8
  if (entrypoints && entrypoints.length > 0) {
54
9
  for (const entrypoint of entrypoints){
@@ -64,41 +19,19 @@ const checkUseStringSSR = (config, appDirectory, entrypoints)=>{
64
19
  }
65
20
  return true;
66
21
  };
67
- const isModuleFederationRspackPlugin = (plugin)=>{
68
- const candidate = getRspackPluginName(plugin);
69
- return 'string' == typeof candidate && /modulefederation/i.test(candidate);
70
- };
71
- const hasModuleFederationMarker = (config)=>{
72
- if ('true' === process.env.MF_SSR_PRJ) return true;
73
- const define = config.source?.define || {};
74
- if ('REMOTE_IP_STRATEGY' in define || 'FEDERATION_IPV4' in define) return true;
75
- const plugins = getRspackPlugins(config.tools?.rspack);
76
- return plugins.some(isModuleFederationRspackPlugin);
77
- };
78
22
  const isNodeEnvironmentTarget = (target)=>'string' == typeof target && ('node' === target || 'async-node' === target || target.startsWith('node'));
79
- const shouldUseModuleFederationNodeOutput = (config)=>isNodeEnvironmentTarget(config.output?.target) && hasModuleFederationMarker(config);
80
23
  const ssrBuilderPlugin = (modernAPI, outputModule, exportLoadablePath)=>({
81
24
  name: '@modern-js/builder-plugin-ssr',
82
25
  setup (api) {
83
26
  api.modifyEnvironmentConfig((config, { name, mergeEnvironmentConfig })=>{
84
27
  const isServerEnvironment = isNodeEnvironmentTarget(config.output.target) || 'workerSSR' === name;
85
28
  const userConfig = modernAPI.getNormalizedConfig();
86
- const hasServerRendering = hasServerRenderingConfig(userConfig);
87
- const hasModuleFederationRuntimeMarker = hasServerRendering && shouldUseModuleFederationNodeOutput(config);
88
- const hasExplicitMfSsrFlag = isModuleFederationAppSSREnabled(userConfig);
89
- const requireExplicitMfSsrFlag = 'true' === process.env.MODERN_MF_APP_SSR_REQUIRE_EXPLICIT;
90
- if (hasServerRendering && hasModuleFederationRuntimeMarker && !hasExplicitMfSsrFlag) {
91
- const warningMessage = '[modernjs][mf-ssr] Module Federation SSR was auto-detected from runtime markers. Set server.ssr.moduleFederationAppSSR=true explicitly in host and remotes to avoid heuristic drift.';
92
- if (requireExplicitMfSsrFlag) throw new Error(`${warningMessage} (enforced by MODERN_MF_APP_SSR_REQUIRE_EXPLICIT=true)`);
93
- console.warn(warningMessage);
94
- }
95
- const isModuleFederationAppSSR = hasServerRendering && hasExplicitMfSsrFlag;
96
29
  const ssrEnv = userConfig.deploy?.worker?.ssr || userConfig.server?.rsc ? 'edge' : 'node';
97
30
  const appContext = modernAPI.getAppContext();
98
31
  const { appDirectory, entrypoints } = appContext;
99
32
  const useLoadablePlugin = isUseSSRBundle(userConfig) && !isServerEnvironment && checkUseStringSSR(userConfig, appDirectory, entrypoints);
100
33
  const outputConfig = {
101
- module: isServerEnvironment && (outputModule || 'workerSSR' === name && userConfig.deploy?.target === 'cloudflare')
34
+ module: isServerEnvironment && outputModule
102
35
  };
103
36
  const useLoadableComponents = isUseSSRBundle(userConfig) && checkUseStringSSR(userConfig, appDirectory, entrypoints);
104
37
  return mergeEnvironmentConfig(config, {
@@ -108,12 +41,10 @@ const ssrBuilderPlugin = (modernAPI, outputModule, exportLoadablePath)=>({
108
41
  'process.env.MODERN_SSR_ENV': JSON.stringify(ssrEnv),
109
42
  'process.env.MODERN_ENABLE_HYDRATION': JSON.stringify(isUseSSRBundle(userConfig)),
110
43
  'process.env.MODERN_ENABLE_RSC': JSON.stringify(Boolean(userConfig.server?.rsc)),
111
- __MODERN_ENABLE_RSC__: JSON.stringify(Boolean(userConfig.server?.rsc)),
112
- 'process.env.MODERN_MF_APP_SSR': JSON.stringify(String(isModuleFederationAppSSR))
44
+ __MODERN_ENABLE_RSC__: JSON.stringify(Boolean(userConfig.server?.rsc))
113
45
  }
114
46
  },
115
47
  output: outputConfig,
116
- splitChunks: isServerEnvironment && (hasModuleFederationRuntimeMarker || hasExplicitMfSsrFlag) ? false : void 0,
117
48
  tools: {
118
49
  bundlerChain: useLoadablePlugin ? (chain)=>{
119
50
  chain.plugin('loadable').use(loadable_bundler_plugin, [
@@ -182,4 +113,4 @@ const ssrPlugin = ()=>({
182
113
  });
183
114
  const cli_ssr = ssrPlugin;
184
115
  export default cli_ssr;
185
- export { shouldUseModuleFederationNodeOutput, ssrPlugin };
116
+ export { ssrPlugin };
@@ -1,5 +1,5 @@
1
1
  import "node:module";
2
- import { jsx } from "react/jsx-runtime";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { loadableReady } from "@loadable/component";
4
4
  import { SSR_HYDRATION_ID_PREFIX } from "@modern-js/utils/universal/constants";
5
5
  import { hydrateRoot } from "react-dom/client";
@@ -35,7 +35,12 @@ function hydrate_hydrateRoot(App, context, ModernRender, ModernHydrate) {
35
35
  callback: callback,
36
36
  children: App
37
37
  });
38
- return ModernHydrate(wrapRuntimeContextProvider(/*#__PURE__*/ jsx(SSRApp, {}), hydrateContext));
38
+ return ModernHydrate(/*#__PURE__*/ jsxs(Fragment, {
39
+ children: [
40
+ wrapRuntimeContextProvider(/*#__PURE__*/ jsx(SSRApp, {}), hydrateContext),
41
+ null
42
+ ]
43
+ }));
39
44
  }
40
45
  }
41
46
  return stringSSRHydrate();
@@ -42,10 +42,7 @@ function getGlobalBasename() {
42
42
  return globalContext.basename;
43
43
  }
44
44
  export { DefaultNotFound } from "../../router/runtime/DefaultNotFound.mjs";
45
- export { modifyRoutes, onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeCreateRoutes, onBeforeHydrateRouter } from "../../router/runtime/hooks.mjs";
46
- export { applyRouterRuntimeState, applyRouterServerPrepareResult, cleanupRouterRuntimeState, createRouterRuntimeState, createRouterServerSnapshot, getRouterHydrationScripts, getRouterMatchedRouteIds, getRouterRuntimeState, getRouterServerSnapshot } from "../../router/runtime/lifecycle.mjs";
47
- export { createRouterProviderRealm, registerRouterProvider, resolveRouterProvider, routerProviderRegistryHooks } from "../../router/runtime/provider.mjs";
48
- export { createRuntimeContextExtension } from "./extensions.mjs";
49
- export { InternalRuntimeContext, RuntimeContext, getInitialContext } from "./runtime.mjs";
45
+ export { modifyRoutes, onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeCreateRoutes, onBeforeHydrateRouter, routerProviderRegistryHooks } from "../../router/runtime/hooks.mjs";
46
+ export { InternalRuntimeContext, RuntimeComponentResolverContext, RuntimeContext, getInitialContext } from "./runtime.mjs";
50
47
  export { getServerPayload, setServerPayload } from "./serverPayload/index.mjs";
51
48
  export { getCurrentEntryName, getGlobalApp, getGlobalBasename, getGlobalEnableRsc, getGlobalInternalRuntimeContext, getGlobalIsRscClient, getGlobalLayoutApp, getGlobalRSCRoot, getGlobalRoutes, setGlobalContext, setGlobalInternalRuntimeContext };
@@ -1,6 +1,2 @@
1
1
  import "node:module";
2
- import { createContext, useContext } from "react";
3
- const RuntimeContext = createContext({});
4
- const ReactRuntimeContext = RuntimeContext;
5
- const useRuntimeContext = ()=>useContext(RuntimeContext);
6
- export { ReactRuntimeContext, RuntimeContext, useRuntimeContext };
2
+ export { ReactRuntimeContext, RuntimeContext, useRuntimeContext } from "./runtime.mjs";
@@ -1,7 +1,17 @@
1
1
  import "node:module";
2
- import { createContext } from "react";
2
+ import { createContext, useContext } from "react";
3
3
  const ROUTE_MANIFEST = '_MODERNJS_ROUTE_MANIFEST';
4
- const InternalRuntimeContext = createContext({});
4
+ function getRuntimeReactContext(kind, create) {
5
+ const key = Symbol.for(`@modern-js/runtime:react-context:v1:${kind}`);
6
+ const contexts = globalThis;
7
+ contexts[key] ??= create();
8
+ return contexts[key];
9
+ }
10
+ const InternalRuntimeContext = getRuntimeReactContext('internal', ()=>createContext({}));
11
+ const RuntimeContext = getRuntimeReactContext('public', ()=>createContext({}));
12
+ const RuntimeComponentResolverContext = getRuntimeReactContext('component-resolver', ()=>createContext(void 0));
13
+ const ReactRuntimeContext = RuntimeContext;
14
+ const useRuntimeContext = ()=>useContext(RuntimeContext);
5
15
  const getInitialContext = (isBrowser = true, routeManifest)=>{
6
16
  const requestContext = {
7
17
  request: {
@@ -25,5 +35,4 @@ const getInitialContext = (isBrowser = true, routeManifest)=>{
25
35
  context: requestContext
26
36
  };
27
37
  };
28
- export { ReactRuntimeContext, RuntimeContext, useRuntimeContext } from "./public.mjs";
29
- export { InternalRuntimeContext, getInitialContext };
38
+ export { InternalRuntimeContext, ReactRuntimeContext, RuntimeComponentResolverContext, RuntimeContext, getInitialContext, useRuntimeContext };