@bleedingdev/modern-js-runtime 3.5.0-ultramodern.6 → 3.5.0-ultramodern.75

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 (145) hide show
  1. package/dist/cjs/boundary-debugger/index.js +13 -3
  2. package/dist/cjs/cli/registry.js +18 -0
  3. package/dist/cjs/cli/ssr/index.js +3 -2
  4. package/dist/cjs/cli/ssr/loadable-bundler-plugin.js +8 -4
  5. package/dist/cjs/core/browser/hydrate.js +16 -2
  6. package/dist/cjs/core/browser/index.js +15 -3
  7. package/dist/cjs/core/context/index.js +3 -0
  8. package/dist/cjs/core/context/public.js +49 -0
  9. package/dist/cjs/core/context/runtime.js +6 -8
  10. package/dist/cjs/core/react/wrapper.js +57 -0
  11. package/dist/cjs/core/server/federatedCss.js +7 -3
  12. package/dist/cjs/core/server/requestHandler.js +15 -45
  13. package/dist/cjs/core/server/requestResponse.js +83 -0
  14. package/dist/cjs/core/server/routerCleanup.js +16 -6
  15. package/dist/cjs/core/server/scriptOrder.js +13 -10
  16. package/dist/cjs/core/server/stream/afterTemplate.js +9 -5
  17. package/dist/cjs/core/server/stream/template.js +3 -3
  18. package/dist/cjs/core/server/string/loadable.js +3 -11
  19. package/dist/cjs/index.js +7 -6
  20. package/dist/cjs/module-federation/consume-surface.js +199 -0
  21. package/dist/cjs/module-federation/distributed-ssr.js +134 -0
  22. package/dist/cjs/module-federation/index.js +258 -120
  23. package/dist/cjs/module-federation/last-known-good.js +124 -0
  24. package/dist/cjs/module-federation/manifest-recovery-runtime-plugin.js +140 -0
  25. package/dist/cjs/module-federation/surface-resolution-types.js +61 -0
  26. package/dist/cjs/router/cli/code/nestedRoutes.js +3 -0
  27. package/dist/cjs/router/cli/code/templates.js +3 -2
  28. package/dist/cjs/router/cli/constants.js +1 -0
  29. package/dist/cjs/router/cli/nestedRoutesSpec.js +3 -1
  30. package/dist/cjs/router/runtime/hooks.js +7 -6
  31. package/dist/cjs/router/runtime/internal.js +30 -16
  32. package/dist/cjs/router/runtime/plugin.js +6 -7
  33. package/dist/cjs/router/runtime/provider.js +58 -12
  34. package/dist/esm/boundary-debugger/index.mjs +13 -3
  35. package/dist/esm/cli/code.mjs +12 -12
  36. package/dist/esm/cli/registry.mjs +0 -0
  37. package/dist/esm/cli/ssr/index.mjs +3 -2
  38. package/dist/esm/cli/ssr/loadable-bundler-plugin.mjs +8 -4
  39. package/dist/esm/core/browser/hydrate.mjs +15 -4
  40. package/dist/esm/core/browser/index.mjs +11 -5
  41. package/dist/esm/core/context/index.mjs +1 -1
  42. package/dist/esm/core/context/public.mjs +5 -0
  43. package/dist/esm/core/context/runtime.mjs +4 -6
  44. package/dist/esm/core/react/wrapper.mjs +58 -1
  45. package/dist/esm/core/server/federatedCss.mjs +7 -3
  46. package/dist/esm/core/server/requestHandler.mjs +15 -45
  47. package/dist/esm/core/server/requestResponse.mjs +39 -0
  48. package/dist/esm/core/server/routerCleanup.mjs +11 -4
  49. package/dist/esm/core/server/scriptOrder.mjs +11 -8
  50. package/dist/esm/core/server/stream/afterTemplate.mjs +10 -6
  51. package/dist/esm/core/server/stream/template.mjs +3 -3
  52. package/dist/esm/core/server/string/loadable.mjs +3 -8
  53. package/dist/esm/exports/loadable.mjs +3 -3
  54. package/dist/esm/index.mjs +2 -1
  55. package/dist/esm/module-federation/consume-surface.mjs +158 -0
  56. package/dist/esm/module-federation/distributed-ssr.mjs +81 -0
  57. package/dist/esm/module-federation/index.mjs +6 -0
  58. package/dist/esm/module-federation/last-known-good.mjs +80 -0
  59. package/dist/esm/module-federation/manifest-recovery-runtime-plugin.mjs +100 -0
  60. package/dist/esm/module-federation/surface-resolution-types.mjs +8 -0
  61. package/dist/esm/router/cli/code/index.mjs +5 -5
  62. package/dist/esm/router/cli/code/nestedRoutes.mjs +3 -0
  63. package/dist/esm/router/cli/code/templates.mjs +3 -2
  64. package/dist/esm/router/cli/constants.mjs +1 -0
  65. package/dist/esm/router/cli/handler.mjs +3 -3
  66. package/dist/esm/router/cli/nestedRoutesSpec.mjs +3 -1
  67. package/dist/esm/router/runtime/hooks.mjs +7 -6
  68. package/dist/esm/router/runtime/internal.mjs +26 -18
  69. package/dist/esm/router/runtime/plugin.mjs +6 -7
  70. package/dist/esm/router/runtime/provider.mjs +56 -13
  71. package/dist/esm-node/boundary-debugger/index.mjs +13 -3
  72. package/dist/esm-node/cli/code.mjs +12 -12
  73. package/dist/esm-node/cli/registry.mjs +1 -0
  74. package/dist/esm-node/cli/ssr/index.mjs +3 -2
  75. package/dist/esm-node/cli/ssr/loadable-bundler-plugin.mjs +8 -4
  76. package/dist/esm-node/core/browser/hydrate.mjs +15 -4
  77. package/dist/esm-node/core/browser/index.mjs +11 -5
  78. package/dist/esm-node/core/context/index.mjs +1 -1
  79. package/dist/esm-node/core/context/public.mjs +6 -0
  80. package/dist/esm-node/core/context/runtime.mjs +4 -6
  81. package/dist/esm-node/core/react/wrapper.mjs +58 -1
  82. package/dist/esm-node/core/server/federatedCss.mjs +7 -3
  83. package/dist/esm-node/core/server/requestHandler.mjs +15 -45
  84. package/dist/esm-node/core/server/requestResponse.mjs +40 -0
  85. package/dist/esm-node/core/server/routerCleanup.mjs +11 -4
  86. package/dist/esm-node/core/server/scriptOrder.mjs +11 -8
  87. package/dist/esm-node/core/server/stream/afterTemplate.mjs +10 -6
  88. package/dist/esm-node/core/server/stream/template.mjs +3 -3
  89. package/dist/esm-node/core/server/string/loadable.mjs +3 -8
  90. package/dist/esm-node/exports/loadable.mjs +3 -3
  91. package/dist/esm-node/index.mjs +2 -1
  92. package/dist/esm-node/module-federation/consume-surface.mjs +159 -0
  93. package/dist/esm-node/module-federation/distributed-ssr.mjs +82 -0
  94. package/dist/esm-node/module-federation/index.mjs +6 -0
  95. package/dist/esm-node/module-federation/last-known-good.mjs +81 -0
  96. package/dist/esm-node/module-federation/manifest-recovery-runtime-plugin.mjs +101 -0
  97. package/dist/esm-node/module-federation/surface-resolution-types.mjs +9 -0
  98. package/dist/esm-node/router/cli/code/index.mjs +5 -5
  99. package/dist/esm-node/router/cli/code/nestedRoutes.mjs +3 -0
  100. package/dist/esm-node/router/cli/code/templates.mjs +3 -2
  101. package/dist/esm-node/router/cli/constants.mjs +1 -0
  102. package/dist/esm-node/router/cli/handler.mjs +3 -3
  103. package/dist/esm-node/router/cli/nestedRoutesSpec.mjs +3 -1
  104. package/dist/esm-node/router/runtime/hooks.mjs +7 -6
  105. package/dist/esm-node/router/runtime/internal.mjs +26 -18
  106. package/dist/esm-node/router/runtime/plugin.mjs +6 -7
  107. package/dist/esm-node/router/runtime/provider.mjs +56 -13
  108. package/dist/types/boundary-debugger/index.d.ts +1 -1
  109. package/dist/types/cli/registry.d.ts +2 -0
  110. package/dist/types/common.d.ts +8 -1
  111. package/dist/types/core/browser/hydrate.d.ts +2 -1
  112. package/dist/types/core/browser/index.d.ts +4 -0
  113. package/dist/types/core/context/index.d.ts +26 -10
  114. package/dist/types/core/context/monitors/default.d.ts +10 -2
  115. package/dist/types/core/context/monitors/index.d.ts +1 -1
  116. package/dist/types/core/context/monitors/index.server.d.ts +2 -2
  117. package/dist/types/core/context/public.d.ts +27 -0
  118. package/dist/types/core/context/runtime.d.ts +12 -22
  119. package/dist/types/core/react/index.d.ts +1 -1
  120. package/dist/types/core/server/requestResponse.d.ts +15 -0
  121. package/dist/types/core/server/routerCleanup.d.ts +2 -1
  122. package/dist/types/core/server/scriptOrder.d.ts +1 -1
  123. package/dist/types/core/server/stream/shared.d.ts +2 -2
  124. package/dist/types/core/server/string/loadable.d.ts +0 -2
  125. package/dist/types/exports/head.d.ts +1 -1
  126. package/dist/types/index.d.ts +5 -5
  127. package/dist/types/internal.d.ts +0 -1
  128. package/dist/types/module-federation/consume-surface.d.ts +104 -0
  129. package/dist/types/module-federation/distributed-ssr.d.ts +61 -0
  130. package/dist/types/module-federation/index.d.ts +6 -0
  131. package/dist/types/module-federation/last-known-good.d.ts +72 -0
  132. package/dist/types/module-federation/manifest-recovery-runtime-plugin.d.ts +25 -0
  133. package/dist/types/module-federation/surface-resolution-types.d.ts +23 -0
  134. package/dist/types/router/cli/constants.d.ts +1 -0
  135. package/dist/types/router/runtime/hooks.d.ts +10 -6
  136. package/dist/types/router/runtime/internal.d.ts +13 -3
  137. package/dist/types/router/runtime/plugin.d.ts +1 -1
  138. package/dist/types/router/runtime/plugin.node.d.ts +1 -1
  139. package/dist/types/router/runtime/provider.d.ts +28 -11
  140. package/dist/types/router/runtime/types.d.ts +27 -5
  141. package/package.json +46 -27
  142. package/dist/cjs/exports/tanstack-router.js +0 -83
  143. package/dist/esm/exports/tanstack-router.mjs +0 -30
  144. package/dist/esm-node/exports/tanstack-router.mjs +0 -31
  145. package/dist/types/exports/tanstack-router.d.ts +0 -88
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ const DEFAULT_ATTEMPTS = 3;
31
+ const DEFAULT_RETRY_DELAY_MS = 100;
32
+ const DEFAULT_TIMEOUT_MS = 1000;
33
+ const MAX_ATTEMPTS = 5;
34
+ const MAX_RETRY_DELAY_MS = 1000;
35
+ const MAX_TIMEOUT_MS = 5000;
36
+ const RETRYABLE_HTTP_STATUSES = new Set([
37
+ 408,
38
+ 425,
39
+ 429,
40
+ 500,
41
+ 502,
42
+ 503,
43
+ 504
44
+ ]);
45
+ const NON_RETRYABLE_ERROR_PATTERNS = [
46
+ /RUNTIME-013/i,
47
+ /invalid manifest/i,
48
+ /manifest (?:schema|contract|version|identity)/i,
49
+ /(?:incompatible|mismatch).*(?:manifest|remote)/i
50
+ ];
51
+ const clampInteger = (value, fallback, minimum, maximum)=>{
52
+ if (void 0 === value || !Number.isFinite(value)) return fallback;
53
+ return Math.min(maximum, Math.max(minimum, Math.floor(value)));
54
+ };
55
+ const getErrorMessage = (error)=>{
56
+ if (error instanceof Error) return error.message;
57
+ return 'string' == typeof error ? error : '';
58
+ };
59
+ const getErrorStatus = (error)=>{
60
+ if ('object' == typeof error && null !== error && 'status' in error && 'number' == typeof error.status) return error.status;
61
+ };
62
+ const isRetryableError = (error)=>{
63
+ if (error instanceof SyntaxError) return false;
64
+ const message = getErrorMessage(error);
65
+ if (NON_RETRYABLE_ERROR_PATTERNS.some((pattern)=>pattern.test(message))) return false;
66
+ const status = getErrorStatus(error);
67
+ if (void 0 !== status) return RETRYABLE_HTTP_STATUSES.has(status);
68
+ if (error instanceof Error && [
69
+ 'AbortError',
70
+ 'TimeoutError'
71
+ ].includes(error.name)) return true;
72
+ return error instanceof TypeError || /(?:fetch failed|network|ECONNREFUSED|ECONNRESET|ETIMEDOUT|EAI_AGAIN)/i.test(message);
73
+ };
74
+ const isHttpManifestUrl = (id)=>{
75
+ if (!id) return false;
76
+ try {
77
+ const url = new URL(id);
78
+ return ('http:' === url.protocol || 'https:' === url.protocol) && url.pathname.endsWith('.json');
79
+ } catch {
80
+ return false;
81
+ }
82
+ };
83
+ const defaultWait = (milliseconds)=>new Promise((resolve)=>{
84
+ setTimeout(resolve, milliseconds);
85
+ });
86
+ const fetchWithTimeout = async (fetchImpl, url, timeoutMs)=>{
87
+ const controller = new AbortController();
88
+ const timeout = setTimeout(()=>controller.abort(), timeoutMs);
89
+ try {
90
+ return await fetchImpl(url, {
91
+ signal: controller.signal
92
+ });
93
+ } finally{
94
+ clearTimeout(timeout);
95
+ }
96
+ };
97
+ const createModuleFederationManifestRecoveryPlugin = (options = {})=>{
98
+ const attempts = clampInteger(options.attempts, DEFAULT_ATTEMPTS, 1, MAX_ATTEMPTS);
99
+ const retryDelayMs = clampInteger(options.retryDelayMs, DEFAULT_RETRY_DELAY_MS, 0, MAX_RETRY_DELAY_MS);
100
+ const timeoutMs = clampInteger(options.timeoutMs, DEFAULT_TIMEOUT_MS, 1, MAX_TIMEOUT_MS);
101
+ const fetchImpl = options.fetchImpl ?? globalThis.fetch;
102
+ const waitImpl = options.waitImpl ?? defaultWait;
103
+ return {
104
+ name: 'modern-js-manifest-recovery-plugin',
105
+ async errorLoadRemote (args) {
106
+ if ('afterResolve' !== args.lifecycle || !isHttpManifestUrl(args.id) || !isRetryableError(args.error) || 'function' != typeof fetchImpl) return;
107
+ for(let attempt = 0; attempt < attempts; attempt++){
108
+ if (attempt > 0 && retryDelayMs > 0) await waitImpl(retryDelayMs);
109
+ try {
110
+ const response = await fetchWithTimeout(fetchImpl, args.id, timeoutMs);
111
+ if (!response.ok) {
112
+ if (!RETRYABLE_HTTP_STATUSES.has(response.status) || attempt === attempts - 1) return;
113
+ continue;
114
+ }
115
+ try {
116
+ return await response.json();
117
+ } catch {
118
+ break;
119
+ }
120
+ } catch (error) {
121
+ if (!isRetryableError(error) || attempt === attempts - 1) break;
122
+ }
123
+ }
124
+ }
125
+ };
126
+ };
127
+ const __rspack_default_export = createModuleFederationManifestRecoveryPlugin;
128
+ __webpack_require__.d(__webpack_exports__, {}, {
129
+ createModuleFederationManifestRecoveryPlugin: createModuleFederationManifestRecoveryPlugin,
130
+ default: __rspack_default_export
131
+ });
132
+ exports.createModuleFederationManifestRecoveryPlugin = __webpack_exports__.createModuleFederationManifestRecoveryPlugin;
133
+ exports["default"] = __webpack_exports__["default"];
134
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
135
+ "createModuleFederationManifestRecoveryPlugin",
136
+ "default"
137
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
138
+ Object.defineProperty(exports, '__esModule', {
139
+ value: true
140
+ });
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, getters, values)=>{
5
+ var define = (defs, kind)=>{
6
+ for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
+ enumerable: true,
8
+ [kind]: defs[key]
9
+ });
10
+ };
11
+ define(getters, "get");
12
+ define(values, "value");
13
+ };
14
+ })();
15
+ (()=>{
16
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
+ })();
18
+ (()=>{
19
+ __webpack_require__.r = (exports1)=>{
20
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
+ value: 'Module'
22
+ });
23
+ Object.defineProperty(exports1, '__esModule', {
24
+ value: true
25
+ });
26
+ };
27
+ })();
28
+ var __webpack_exports__ = {};
29
+ __webpack_require__.r(__webpack_exports__);
30
+ __webpack_require__.d(__webpack_exports__, {
31
+ createDiscoveryError: ()=>universal_namespaceObject.createDiscoveryError,
32
+ deliveryUnitResolutionKey: ()=>deliveryUnitResolutionKey,
33
+ formatSurfaceRef: ()=>universal_namespaceObject.formatSurfaceRef,
34
+ parseSurfaceRef: ()=>universal_namespaceObject.parseSurfaceRef,
35
+ surfaceResolutionKey: ()=>surfaceResolutionKey,
36
+ validateSurfaceRef: ()=>universal_namespaceObject.validateSurfaceRef
37
+ });
38
+ const universal_namespaceObject = require("@modern-js/utils/universal");
39
+ function surfaceResolutionKey(ref, env) {
40
+ return `${env}::${(0, universal_namespaceObject.formatSurfaceRef)(ref)}`;
41
+ }
42
+ function deliveryUnitResolutionKey(unitId, env) {
43
+ return `${env}::${unitId}`;
44
+ }
45
+ exports.createDiscoveryError = __webpack_exports__.createDiscoveryError;
46
+ exports.deliveryUnitResolutionKey = __webpack_exports__.deliveryUnitResolutionKey;
47
+ exports.formatSurfaceRef = __webpack_exports__.formatSurfaceRef;
48
+ exports.parseSurfaceRef = __webpack_exports__.parseSurfaceRef;
49
+ exports.surfaceResolutionKey = __webpack_exports__.surfaceResolutionKey;
50
+ exports.validateSurfaceRef = __webpack_exports__.validateSurfaceRef;
51
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
52
+ "createDiscoveryError",
53
+ "deliveryUnitResolutionKey",
54
+ "formatSurfaceRef",
55
+ "parseSurfaceRef",
56
+ "surfaceResolutionKey",
57
+ "validateSurfaceRef"
58
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
59
+ Object.defineProperty(exports, '__esModule', {
60
+ value: true
61
+ });
@@ -116,6 +116,7 @@ const walk = async (options)=>{
116
116
  let pageLoaderFile = '';
117
117
  let pageRoute = null;
118
118
  let pageConfigFile = '';
119
+ let pageSearchFile = '';
119
120
  let pageClientData = '';
120
121
  let pageData = '';
121
122
  let pageAction = '';
@@ -162,12 +163,14 @@ const walk = async (options)=>{
162
163
  if (await (0, external_utils_js_namespaceObject.hasAction)(itemPath)) pageAction = itemPathWithAlias;
163
164
  }
164
165
  if (itemWithoutExt === external_constants_js_namespaceObject.NESTED_ROUTE.PAGE_CONFIG_FILE) pageConfigFile = itemPathWithAlias;
166
+ if (itemWithoutExt === external_constants_js_namespaceObject.NESTED_ROUTE.PAGE_SEARCH_FILE) pageSearchFile = itemPathWithAlias;
165
167
  if (itemWithoutExt === external_constants_js_namespaceObject.NESTED_ROUTE.PAGE_FILE) {
166
168
  pageRoute = createIndexRoute({
167
169
  _component: itemPathWithAlias
168
170
  }, rootDir, itemPath, entryName, isMainEntry);
169
171
  if (pageLoaderFile) pageRoute.loader = pageLoaderFile;
170
172
  if (pageConfigFile) pageRoute.config = pageConfigFile;
173
+ if (pageSearchFile) pageRoute.validateSearch = pageSearchFile;
171
174
  if (pageData) pageRoute.data = pageData;
172
175
  if (pageClientData) pageRoute.clientData = pageClientData;
173
176
  if (pageAction) pageRoute.action = pageAction;
@@ -227,7 +227,8 @@ const fileSystemRoutes = async ({ metaName, routes, ssrMode, nestedRoutesEntry,
227
227
  component = `component_${components.length - 1}`;
228
228
  }
229
229
  const isClientComponent = 'nested' === route.type && Boolean(route._component) && Boolean(srcDirectory) && Boolean(internalSrcAlias) && await hasUseClientDirective(route._component, srcDirectory, internalSrcAlias);
230
- const shouldIncludeClientBundle = !isRscClientBundle || isClientComponent;
230
+ const shouldHydrateRscRoute = isRscClientBundle && !isClientComponent && !route.loader && !route.data;
231
+ const shouldIncludeClientBundle = !isRscClientBundle || isClientComponent || shouldHydrateRscRoute;
231
232
  const finalRoute = {
232
233
  ...route,
233
234
  loading,
@@ -330,7 +331,7 @@ const fileSystemRoutes = async ({ metaName, routes, ssrMode, nestedRoutesEntry,
330
331
  ${importLazyCode}
331
332
  ${!isRscClientBundle ? importComponentsCode : ''}
332
333
  ${importRuntimeRouterCode}
333
- ${!isRscClientBundle ? rootLayoutCode : ''}
334
+ ${rootLayoutCode}
334
335
  ${importLoadingCode}
335
336
  ${importErrorComponentsCode}
336
337
  ${importLoadersCode}
@@ -47,6 +47,7 @@ const NESTED_ROUTE = {
47
47
  PAGE_FILE: 'page',
48
48
  PAGE_CONFIG_FILE: 'page.config',
49
49
  PAGE_LOADER_FILE: 'page.loader',
50
+ PAGE_SEARCH_FILE: 'page.search',
50
51
  PAGE_DATA_FILE: 'page.data',
51
52
  PAGE_CLIENT_LOADER: 'page.data.client',
52
53
  SPLATE_FILE: '$',
@@ -43,6 +43,7 @@ const external_node_path_namespaceObject = require("node:path");
43
43
  var external_node_path_default = /*#__PURE__*/ __webpack_require__.n(external_node_path_namespaceObject);
44
44
  const promises_namespaceObject = require("node:timers/promises");
45
45
  const utils_namespaceObject = require("@modern-js/utils");
46
+ const lodash_namespaceObject = require("@modern-js/utils/lodash");
46
47
  const lockPollIntervalMs = 25;
47
48
  const staleLockAgeMs = 120000;
48
49
  const pendingUpdates = new Map();
@@ -85,6 +86,7 @@ async function writeJSONAtomically(filePath, value) {
85
86
  }
86
87
  async function updateNestedRoutesSpec(specPath, nextRoutes) {
87
88
  const resolvedSpecPath = external_node_path_default().resolve(specPath);
89
+ const nextRoutesSnapshot = (0, lodash_namespaceObject.cloneDeep)(nextRoutes);
88
90
  const previousUpdate = pendingUpdates.get(resolvedSpecPath) ?? Promise.resolve();
89
91
  const currentUpdate = previousUpdate.catch(()=>void 0).then(async ()=>{
90
92
  const releaseLock = await acquireSpecLock(resolvedSpecPath);
@@ -92,7 +94,7 @@ async function updateNestedRoutesSpec(specPath, nextRoutes) {
92
94
  const existingRoutes = await utils_namespaceObject.fs.pathExists(resolvedSpecPath) ? await utils_namespaceObject.fs.readJSON(resolvedSpecPath) : {};
93
95
  await writeJSONAtomically(resolvedSpecPath, {
94
96
  ...existingRoutes,
95
- ...nextRoutes
97
+ ...nextRoutesSnapshot
96
98
  });
97
99
  } finally{
98
100
  await releaseLock();
@@ -36,12 +36,13 @@ __webpack_require__.d(__webpack_exports__, {
36
36
  onBeforeHydrateRouter: ()=>onBeforeHydrateRouter
37
37
  });
38
38
  const plugin_namespaceObject = require("@modern-js/plugin");
39
- const modifyRoutes = (0, plugin_namespaceObject.createSyncHook)();
40
- const onBeforeCreateRoutes = (0, plugin_namespaceObject.createSyncHook)();
41
- const onBeforeCreateRouter = (0, plugin_namespaceObject.createSyncHook)();
42
- const onAfterCreateRouter = (0, plugin_namespaceObject.createSyncHook)();
43
- const onBeforeHydrateRouter = (0, plugin_namespaceObject.createSyncHook)();
44
- const onAfterHydrateRouter = (0, plugin_namespaceObject.createSyncHook)();
39
+ const createRouterSyncHook = ()=>(0, plugin_namespaceObject.createSyncHook)();
40
+ const modifyRoutes = createRouterSyncHook();
41
+ const onBeforeCreateRoutes = createRouterSyncHook();
42
+ const onBeforeCreateRouter = createRouterSyncHook();
43
+ const onAfterCreateRouter = createRouterSyncHook();
44
+ const onBeforeHydrateRouter = createRouterSyncHook();
45
+ const onAfterHydrateRouter = createRouterSyncHook();
45
46
  exports.modifyRoutes = __webpack_exports__.modifyRoutes;
46
47
  exports.onAfterCreateRouter = __webpack_exports__.onAfterCreateRouter;
47
48
  exports.onAfterHydrateRouter = __webpack_exports__.onAfterHydrateRouter;
@@ -28,6 +28,8 @@ var __webpack_require__ = {};
28
28
  var __webpack_exports__ = {};
29
29
  __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
+ createRouterPlugin: ()=>createRouterPlugin,
32
+ createRouterProviderRealm: ()=>external_provider_js_namespaceObject.createRouterProviderRealm,
31
33
  default: ()=>internal,
32
34
  modifyRoutes: ()=>external_plugin_js_namespaceObject.modifyRoutes,
33
35
  registerRouterProvider: ()=>external_provider_js_namespaceObject.registerRouterProvider,
@@ -42,23 +44,33 @@ const external_utils_js_namespaceObject = require("./utils.js");
42
44
  (0, external_provider_js_namespaceObject.registerRouterProvider)('react-router', external_plugin_js_namespaceObject.routerPlugin, {
43
45
  isDefault: true
44
46
  });
45
- const routerPlugin = (userConfig = {})=>({
46
- name: '@modern-js/plugin-router',
47
- registryHooks: external_provider_js_namespaceObject.routerProviderRegistryHooks,
48
- setup: (api)=>{
49
- const mergedConfig = (0, merge_namespaceObject.merge)(api.getRuntimeConfig().router || {}, userConfig);
50
- const pluginFactory = (0, external_provider_js_namespaceObject.resolveRouterProvider)(mergedConfig.framework, {
51
- localDefault: {
52
- name: 'react-router',
53
- factory: external_plugin_js_namespaceObject.routerPlugin
54
- }
55
- });
56
- const providerPlugin = pluginFactory(userConfig);
57
- (0, external_provider_js_namespaceObject.reportUnsupportedProviderRegistryHooks)(providerPlugin);
58
- providerPlugin.setup?.(api);
59
- }
60
- });
47
+ const createRouterPlugin = (localProviders = [])=>{
48
+ const providerRealm = (0, external_provider_js_namespaceObject.createRouterProviderRealm)([
49
+ {
50
+ name: 'react-router',
51
+ factory: external_plugin_js_namespaceObject.routerPlugin,
52
+ isDefault: true
53
+ },
54
+ ...localProviders
55
+ ]);
56
+ return (userConfig = {})=>({
57
+ name: '@modern-js/plugin-router',
58
+ registryHooks: external_provider_js_namespaceObject.routerProviderRegistryHooks,
59
+ setup: (api)=>{
60
+ const mergedConfig = (0, merge_namespaceObject.merge)(api.getRuntimeConfig().router || {}, userConfig);
61
+ const pluginFactory = (0, external_provider_js_namespaceObject.resolveRouterProvider)(mergedConfig.framework, {
62
+ realm: providerRealm
63
+ });
64
+ const providerPlugin = pluginFactory(userConfig);
65
+ (0, external_provider_js_namespaceObject.reportUnsupportedProviderRegistryHooks)(providerPlugin);
66
+ providerPlugin.setup?.(api);
67
+ }
68
+ });
69
+ };
70
+ const routerPlugin = createRouterPlugin();
61
71
  const internal = routerPlugin;
72
+ exports.createRouterPlugin = __webpack_exports__.createRouterPlugin;
73
+ exports.createRouterProviderRealm = __webpack_exports__.createRouterProviderRealm;
62
74
  exports["default"] = __webpack_exports__["default"];
63
75
  exports.modifyRoutes = __webpack_exports__.modifyRoutes;
64
76
  exports.registerRouterProvider = __webpack_exports__.registerRouterProvider;
@@ -66,6 +78,8 @@ exports.renderRoutes = __webpack_exports__.renderRoutes;
66
78
  exports.resolveRouterProvider = __webpack_exports__.resolveRouterProvider;
67
79
  exports.routerPlugin = __webpack_exports__.routerPlugin;
68
80
  for(var __rspack_i in __webpack_exports__)if (-1 === [
81
+ "createRouterPlugin",
82
+ "createRouterProviderRealm",
69
83
  "default",
70
84
  "modifyRoutes",
71
85
  "registerRouterProvider",
@@ -99,10 +99,10 @@ const routerPlugin = (userConfig = {})=>({
99
99
  };
100
100
  let cachedRouter = null;
101
101
  const RouterWrapper = (props)=>{
102
- const routerResult = useRouterCreation({
102
+ const routerResult = useRouterCreation(process.env.MODERN_ENABLE_RSC ? {
103
103
  ...props,
104
104
  rscPayload: props?.rscPayload
105
- }, {
105
+ } : props, {
106
106
  api: api,
107
107
  createRoutes,
108
108
  supportHtml5History,
@@ -156,16 +156,15 @@ function useRouterCreation(props, options) {
156
156
  const baseUrl = selectBasePath(location.pathname).replace(/^\/*/, '/');
157
157
  const _basename = '/' === baseUrl ? (0, external_utils_js_namespaceObject.urlJoin)(baseUrl, runtimeContext._internalRouterBaseName || basename || '') : baseUrl;
158
158
  const { unstable_getBlockNavState: getBlockNavState } = runtimeContext;
159
- const rscPayload = props?.rscPayload ? safeUse(props.rscPayload) : null;
160
- let hydrationData = window._ROUTER_DATA || rscPayload;
159
+ const rscPayload = process.env.MODERN_ENABLE_RSC && props?.rscPayload ? safeUse(props.rscPayload) : null;
160
+ let hydrationData = process.env.MODERN_ENABLE_RSC ? window._ROUTER_DATA || rscPayload : window._ROUTER_DATA;
161
161
  return (0, external_react_namespaceObject.useMemo)(()=>{
162
162
  if (hydrationData?.errors) hydrationData = {
163
163
  ...hydrationData,
164
164
  errors: (0, external_utils_js_namespaceObject.deserializeErrors)(hydrationData.errors)
165
165
  };
166
- const isRscClient = (0, index_js_namespaceObject.getGlobalIsRscClient)();
167
166
  let routes = null;
168
- routes = isRscClient ? createRoutes ? createRoutes() : (0, external_utils_js_namespaceObject.createRouteObjectsFromConfig)({
167
+ routes = process.env.MODERN_ENABLE_RSC && (0, index_js_namespaceObject.getGlobalIsRscClient)() ? createRoutes ? createRoutes() : (0, external_utils_js_namespaceObject.createRouteObjectsFromConfig)({
169
168
  routesConfig: finalRouteConfig
170
169
  }) : createRoutes ? createRoutes() : (0, router_namespaceObject.createRoutesFromElements)((0, external_utils_js_namespaceObject.renderRoutes)({
171
170
  routesConfig: finalRouteConfig,
@@ -173,7 +172,7 @@ function useRouterCreation(props, options) {
173
172
  }));
174
173
  if (!routes) routes = [];
175
174
  const hooks = api.getHooks();
176
- if (rscPayload) try {
175
+ if (process.env.MODERN_ENABLE_RSC && rscPayload) try {
177
176
  const router = (0, external_rsc_router_js_namespaceObject.createClientRouterFromPayload)(rscPayload, routes, _basename);
178
177
  return {
179
178
  router,
@@ -28,6 +28,7 @@ var __webpack_require__ = {};
28
28
  var __webpack_exports__ = {};
29
29
  __webpack_require__.r(__webpack_exports__);
30
30
  __webpack_require__.d(__webpack_exports__, {
31
+ createRouterProviderRealm: ()=>createRouterProviderRealm,
31
32
  registerRouterProvider: ()=>registerRouterProvider,
32
33
  reportUnsupportedProviderRegistryHooks: ()=>reportUnsupportedProviderRegistryHooks,
33
34
  resolveRouterProvider: ()=>resolveRouterProvider,
@@ -48,54 +49,99 @@ function reportUnsupportedProviderRegistryHooks(providerPlugin) {
48
49
  if (unsupportedHookNames.length > 0) console.warn(`[@modern-js/runtime] The router provider "${providerPlugin.name}" declares registry hooks outside the router hook contract: ${unsupportedHookNames.join(', ')}. These hooks are not registered when the provider is resolved through \`runtime.router.framework\` — declare them on a separate runtime plugin instead.`);
49
50
  return unsupportedHookNames;
50
51
  }
51
- const REGISTRY_SLOT = Symbol.for('@modern-js/runtime:router-providers:v2');
52
+ function createRouterProviderRealm(registrations) {
53
+ const providers = new Map();
54
+ let defaultProvider;
55
+ for (const registration of registrations){
56
+ if (!registration.name) throw new Error('[@modern-js/runtime] A router provider realm cannot contain an unnamed provider.');
57
+ if (providers.has(registration.name)) throw new Error(`[@modern-js/runtime] Router provider "${registration.name}" is declared more than once in the same runtime realm.`);
58
+ if (true === registration.isDefault && void 0 !== defaultProvider && defaultProvider !== registration.name) throw new Error(`[@modern-js/runtime] Router provider realm declares both "${defaultProvider}" and "${registration.name}" as defaults.`);
59
+ providers.set(registration.name, registration.factory);
60
+ if (true === registration.isDefault) defaultProvider = registration.name;
61
+ }
62
+ const providerNames = Object.freeze([
63
+ ...providers.keys()
64
+ ]);
65
+ return Object.freeze({
66
+ ...defaultProvider ? {
67
+ defaultProvider
68
+ } : {},
69
+ get: (name)=>providers.get(name),
70
+ names: ()=>providerNames
71
+ });
72
+ }
73
+ const REGISTRY_SLOT = Symbol.for('@modern-js/runtime:router-providers:v3');
74
+ const LEGACY_V2_REGISTRY_SLOT = Symbol.for('@modern-js/runtime:router-providers:v2');
52
75
  function getRegistry() {
53
76
  const host = globalThis;
54
77
  host[REGISTRY_SLOT] ??= {
55
78
  providers: new Map(),
79
+ duplicateProviders: new Set(),
56
80
  warnedDuplicates: new Set()
57
81
  };
82
+ host[REGISTRY_SLOT].duplicateProviders ??= new Set();
58
83
  host[REGISTRY_SLOT].warnedDuplicates ??= new Set();
59
84
  return host[REGISTRY_SLOT];
60
85
  }
86
+ function getLegacyV2Registry() {
87
+ const host = globalThis;
88
+ return host[LEGACY_V2_REGISTRY_SLOT];
89
+ }
61
90
  function registerRouterProvider(name, factory, options = {}) {
62
91
  const registry = getRegistry();
63
92
  const existing = registry.providers.get(name);
64
93
  if (void 0 !== existing) {
65
- if (existing !== factory && !registry.warnedDuplicates.has(name)) {
66
- registry.warnedDuplicates.add(name);
67
- console.warn(`[@modern-js/runtime] The router provider "${name}" was registered more than once with different module instances; keeping the first registration. This usually means two copies of the providing plugin were bundled — for Module Federation, add the provider runtime (e.g. '@modern-js/plugin-tanstack/runtime') to the shared modules of both the host and the remote to deduplicate it.`);
68
- }
94
+ if (existing !== factory) registry.duplicateProviders.add(name);
69
95
  return;
70
96
  }
71
- if (true !== options.isDefault) {
72
- if (void 0 !== registry.nonDefaultProvider && registry.nonDefaultProvider !== name) throw new Error(`[@modern-js/runtime] Cannot register router provider "${name}": the competing router provider "${registry.nonDefaultProvider}" is already registered. Only one non-default router provider may be installed at a time — remove one of the router plugins.`);
73
- registry.nonDefaultProvider = name;
74
- } else registry.defaultProvider = name;
97
+ if (true === options.isDefault) registry.defaultProvider = name;
75
98
  registry.providers.set(name, factory);
76
99
  }
77
100
  function resolveRouterProvider(framework, options = {}) {
101
+ if (void 0 !== options.realm) {
102
+ const name = framework || options.realm.defaultProvider;
103
+ const realmProviderNames = options.realm.names();
104
+ if (void 0 === name) throw new Error(`[@modern-js/runtime] The app-owned router provider realm does not declare a default provider. Available realm providers: ${realmProviderNames.join(', ') || '(none)'}.`);
105
+ const factory = options.realm.get(name);
106
+ if (void 0 === factory) throw new Error(`[@modern-js/runtime] Router provider "${name}" is not registered in the app-owned router provider realm. Available realm providers: ${realmProviderNames.join(', ') || '(none)'}. Compatibility registry fallback is disabled for app-owned realms.`);
107
+ return factory;
108
+ }
78
109
  const registry = getRegistry();
79
- const name = framework || registry.defaultProvider || options.localDefault?.name;
110
+ const legacyV2Registry = getLegacyV2Registry();
111
+ const name = framework || options.localDefault?.name || registry.defaultProvider || legacyV2Registry?.defaultProvider;
80
112
  if (void 0 === name) throw new Error('[@modern-js/runtime] No default router provider is registered. This is a bug in the runtime setup.');
81
113
  if (void 0 !== options.localDefault && name === options.localDefault.name) return options.localDefault.factory;
82
114
  const factory = registry.providers.get(name);
83
- if (void 0 !== factory) return factory;
115
+ if (void 0 !== factory) {
116
+ if (registry.duplicateProviders.has(name) && !registry.warnedDuplicates.has(name)) {
117
+ registry.warnedDuplicates.add(name);
118
+ console.warn(`[@modern-js/runtime] The router provider "${name}" was registered more than once with different module instances, and a router wrapper without an app-owned provider realm is resolving the mixed-version compatibility fallback. The fallback is keeping the first registration. Modern router wrappers isolate app-owned realms automatically. For an older wrapper, share the provider runtime between Module Federation host and remotes or upgrade every app to a realm-aware runtime.`);
119
+ }
120
+ return factory;
121
+ }
122
+ const legacyV2Factory = legacyV2Registry?.providers.get(name);
123
+ if (void 0 !== legacyV2Factory) return legacyV2Factory;
84
124
  if ('tanstack' === name) throw new Error("[@modern-js/runtime] `runtime.router.framework` is set to \"tanstack\", but no TanStack router provider is registered. Install @modern-js/plugin-tanstack, add `tanstackRouterPlugin()` to the `plugins` array in modern.config.ts, and make sure '@modern-js/plugin-tanstack/runtime' is imported (e.g. in modern.runtime.ts).");
85
125
  throw new Error(`[@modern-js/runtime] Unknown router framework "${name}". Registered providers: ${[
86
- ...registry.providers.keys()
126
+ ...new Set([
127
+ ...registry.providers.keys(),
128
+ ...legacyV2Registry?.providers.keys() ?? []
129
+ ])
87
130
  ].join(', ') || '(none)'}. Install and register the plugin that provides this router framework.`);
88
131
  }
89
132
  function unsafe_resetRouterProvidersForTesting() {
90
133
  const host = globalThis;
91
134
  delete host[REGISTRY_SLOT];
135
+ delete host[LEGACY_V2_REGISTRY_SLOT];
92
136
  }
137
+ exports.createRouterProviderRealm = __webpack_exports__.createRouterProviderRealm;
93
138
  exports.registerRouterProvider = __webpack_exports__.registerRouterProvider;
94
139
  exports.reportUnsupportedProviderRegistryHooks = __webpack_exports__.reportUnsupportedProviderRegistryHooks;
95
140
  exports.resolveRouterProvider = __webpack_exports__.resolveRouterProvider;
96
141
  exports.routerProviderRegistryHooks = __webpack_exports__.routerProviderRegistryHooks;
97
142
  exports.unsafe_resetRouterProvidersForTesting = __webpack_exports__.unsafe_resetRouterProvidersForTesting;
98
143
  for(var __rspack_i in __webpack_exports__)if (-1 === [
144
+ "createRouterProviderRealm",
99
145
  "registerRouterProvider",
100
146
  "reportUnsupportedProviderRegistryHooks",
101
147
  "resolveRouterProvider",
@@ -109,9 +109,20 @@ function BoundaryDebugger({ controlMode = 'visible', enabledByDefault = false, l
109
109
  ]);
110
110
  useEffect(()=>{
111
111
  if (!enabled) return void setBoxes([]);
112
+ let resizeObserver;
113
+ const observedElements = new Set();
114
+ const observeBoundaryElements = (elements)=>{
115
+ if (void 0 === resizeObserver) return;
116
+ for (const element of elements)if (!observedElements.has(element)) {
117
+ observedElements.add(element);
118
+ resizeObserver.observe(element);
119
+ }
120
+ };
112
121
  const readBoxes = ()=>{
122
+ const elements = collectBoundaryElements(legacySelector);
123
+ observeBoundaryElements(elements);
113
124
  const seenBoxes = new Set();
114
- const nextBoxes = collectBoundaryElements(legacySelector).map((element)=>{
125
+ const nextBoxes = elements.map((element)=>{
115
126
  const boundaryId = getBoundaryId(element);
116
127
  if (void 0 === boundaryId || '' === boundaryId) return;
117
128
  const rect = element.getBoundingClientRect();
@@ -139,9 +150,8 @@ function BoundaryDebugger({ controlMode = 'visible', enabledByDefault = false, l
139
150
  }).filter((box)=>void 0 !== box);
140
151
  setBoxes(nextBoxes);
141
152
  };
153
+ resizeObserver = "u" < typeof ResizeObserver ? void 0 : new ResizeObserver(readBoxes);
142
154
  readBoxes();
143
- const resizeObserver = "u" < typeof ResizeObserver ? void 0 : new ResizeObserver(readBoxes);
144
- for (const element of collectBoundaryElements(legacySelector))resizeObserver?.observe(element);
145
155
  const mutationObserver = new MutationObserver(readBoxes);
146
156
  mutationObserver.observe(document.body, {
147
157
  childList: true,