@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,9 +1,8 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
- import { getNavigationWarmupCacheKey } from "@modern-js/runtime-extensions";
3
+ import { InternalRuntimeContext } from "@modern-js/runtime/context";
4
4
  import { Link as router_Link, NavLink, matchRoutes, useHref, useMatches, useResolvedPath } from "@modern-js/runtime-utils/router";
5
5
  import react, { useContext, useMemo } from "react";
6
- import { InternalRuntimeContext } from "../../core/context/index.mjs";
7
6
  import { __webpack_require__ } from "../../rslib-runtime~1.mjs";
8
7
  const getWebpackChunkLoader = ()=>__webpack_chunk_load__;
9
8
  const getWebpackPublicPath = ()=>{
@@ -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 };
@@ -1,12 +1,11 @@
1
1
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { InternalRuntimeContext, getGlobalEnableRsc, getGlobalIsRscClient, getGlobalLayoutApp, getGlobalRoutes } from "@modern-js/runtime/context";
2
3
  import { merge } from "@modern-js/runtime-utils/merge";
3
4
  import { RouterProvider, createBrowserRouter, createHashRouter, createRoutesFromElements, useHref, useInRouterContext, useLocation, useMatches, useNavigate, useParams } from "@modern-js/runtime-utils/router";
4
5
  import { normalizePathname } from "@modern-js/runtime-utils/url";
5
6
  import * as __rspack_external_react from "react";
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 = {
@@ -67,7 +66,6 @@ const routerPlugin = (userConfig = {})=>({
67
66
  const match = serverBase.find((baseUrl)=>isSegmentPrefix(pathname, baseUrl));
68
67
  return match || '/';
69
68
  };
70
- let cachedRouter = null;
71
69
  const RouterWrapper = (props)=>{
72
70
  const routerResult = useRouterCreation(("u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ : true === getGlobalEnableRsc()) ? {
73
71
  ...props,
@@ -79,12 +77,7 @@ const routerPlugin = (userConfig = {})=>({
79
77
  selectBasePath,
80
78
  basename
81
79
  });
82
- const router = (0, __rspack_external_react.useMemo)(()=>{
83
- if (cachedRouter) return cachedRouter;
84
- cachedRouter = routerResult.router;
85
- return cachedRouter;
86
- }, []);
87
- const { routes } = routerResult;
80
+ const { router, routes } = routerResult;
88
81
  routesContainer.current = routes;
89
82
  beforeCreateRouter = false;
90
83
  const routerContent = /*#__PURE__*/ jsxs(Fragment, {
@@ -128,7 +121,8 @@ function useRouterCreation(props, options) {
128
121
  const { unstable_getBlockNavState: getBlockNavState } = runtimeContext;
129
122
  const rscPayload = ("u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ : true === getGlobalEnableRsc()) && props?.rscPayload ? safeUse(props.rscPayload) : null;
130
123
  let hydrationData = "u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ ? window._ROUTER_DATA || rscPayload : window._ROUTER_DATA : true === getGlobalEnableRsc() ? window._ROUTER_DATA || rscPayload : window._ROUTER_DATA;
131
- return (0, __rspack_external_react.useMemo)(()=>{
124
+ const result = (0, __rspack_external_react.useRef)(null);
125
+ if (null === result.current) {
132
126
  if (hydrationData?.errors) hydrationData = {
133
127
  ...hydrationData,
134
128
  errors: deserializeErrors(hydrationData.errors)
@@ -144,10 +138,11 @@ function useRouterCreation(props, options) {
144
138
  const hooks = api.getHooks();
145
139
  if (("u" > typeof __MODERN_ENABLE_RSC__ ? __MODERN_ENABLE_RSC__ : true === getGlobalEnableRsc()) && rscPayload) try {
146
140
  const router = createClientRouterFromPayload(rscPayload, routes, _basename);
147
- return {
141
+ result.current = {
148
142
  router,
149
143
  routes: router.routes || []
150
144
  };
145
+ return result.current;
151
146
  } catch (e) {
152
147
  console.error('Failed to create router from RSC payload:', e);
153
148
  }
@@ -168,11 +163,6 @@ function useRouterCreation(props, options) {
168
163
  basename: _basename,
169
164
  hydrationData
170
165
  });
171
- applyRouterRuntimeState(runtimeContext, {
172
- framework: 'react-router',
173
- basename: _basename,
174
- instance: router
175
- });
176
166
  hooks.onAfterCreateRouter.call({
177
167
  ...routerLifecycleContext,
178
168
  router,
@@ -201,16 +191,11 @@ function useRouterCreation(props, options) {
201
191
  };
202
192
  return originSubscribe(wrappedListener);
203
193
  };
204
- return {
194
+ result.current = {
205
195
  router,
206
196
  routes: modifiedRoutes
207
197
  };
208
- }, [
209
- finalRouteConfig,
210
- props,
211
- _basename,
212
- hydrationData,
213
- getBlockNavState
214
- ]);
198
+ }
199
+ return result.current;
215
200
  }
216
201
  export { beforeCreateRouter, finalRouteConfig, modifyRoutes, routerPlugin };
@@ -1,16 +1,15 @@
1
1
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { InternalRuntimeContext, getGlobalEnableRsc, getGlobalLayoutApp, getGlobalRoutes } from "@modern-js/runtime/context";
2
3
  import { merge } from "@modern-js/runtime-utils/merge";
3
4
  import { createRequestContext } from "@modern-js/runtime-utils/node";
4
5
  import { StaticRouterProvider, createRoutesFromElements, createStaticHandler, createStaticRouter, useInRouterContext, useLocation, useNavigate, useParams } from "@modern-js/runtime-utils/router";
5
6
  import { time } from "@modern-js/runtime-utils/time";
6
7
  import { LOADER_REPORTER_NAME } from "@modern-js/utils/universal/constants";
7
8
  import { useContext } from "react";
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;
@@ -151,7 +123,7 @@ const routerPlugin = (userConfig = {})=>({
151
123
  }) : /*#__PURE__*/ jsx(RSCStaticRouter, {
152
124
  basename: basename
153
125
  });
154
- {
126
+ else {
155
127
  const { nonce, mode, useJsonScript } = context.ssrContext;
156
128
  const remixRouter = createStaticRouter(routes, routerContext);
157
129
  const routerWrapper = /*#__PURE__*/ jsxs(Fragment, {
@@ -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 };
@@ -3,6 +3,7 @@ import { fs } from "@modern-js/utils";
3
3
  import path_0 from "path";
4
4
  const normalizeChunkId = (id)=>'string' == typeof id && /^\d+$/.test(id) ? Number(id) : id;
5
5
  const DEFAULT_CHUNK_LOADING_GLOBAL = '__LOADABLE_LOADED_CHUNKS__';
6
+ const normalizeStatsPublicPath = (publicPath)=>'auto' === publicPath || 'auto/' === publicPath ? '/' : publicPath;
6
7
  const normalizeChunkGroup = (group)=>({
7
8
  ...group,
8
9
  chunks: (group.chunks || []).map(normalizeChunkId)
@@ -45,6 +46,7 @@ class LoadablePlugin {
45
46
  for (const [name, ep] of Object.entries(stats.entrypoints || {}))entrypoints[name] = normalizeChunkGroup(ep);
46
47
  const output = {
47
48
  ...stats,
49
+ publicPath: normalizeStatsPublicPath(stats.publicPath),
48
50
  namedChunkGroups,
49
51
  entrypoints,
50
52
  generator: 'loadable-components',
@@ -121,8 +121,7 @@ function genHandlerCode({ mode, metaName, customServerEntry, srcDirectory, inter
121
121
  return `
122
122
  export * from '${realEntryPath}';
123
123
  export { default as requestHandler } from '${realEntryPath}'`;
124
- }
125
- {
124
+ } else {
126
125
  const entrySource = enableRsc ? SERVER_ENTRY_RSC : SERVER_ENTRY;
127
126
  const serverEntry = transformServerEntry(entrySource, {
128
127
  metaName: metaName || 'modern-js',