@bleedingdev/modern-js-runtime 3.5.0-ultramodern.10 → 3.5.0-ultramodern.100

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 (151) hide show
  1. package/dist/cjs/boundary-debugger/index.js +13 -3
  2. package/dist/cjs/cli/index.js +1 -11
  3. package/dist/cjs/cli/registry.js +18 -0
  4. package/dist/cjs/cli/ssr/index.js +3 -2
  5. package/dist/cjs/cli/ssr/loadable-bundler-plugin.js +8 -4
  6. package/dist/cjs/core/browser/hydrate.js +16 -2
  7. package/dist/cjs/core/browser/index.js +19 -18
  8. package/dist/cjs/core/context/index.js +3 -0
  9. package/dist/cjs/core/context/public.js +49 -0
  10. package/dist/cjs/core/context/runtime.js +6 -8
  11. package/dist/cjs/core/react/wrapper.js +57 -0
  12. package/dist/cjs/core/server/federatedCss.js +7 -3
  13. package/dist/cjs/core/server/requestHandler.js +15 -45
  14. package/dist/cjs/core/server/requestResponse.js +83 -0
  15. package/dist/cjs/core/server/routerCleanup.js +16 -6
  16. package/dist/cjs/core/server/scriptOrder.js +13 -10
  17. package/dist/cjs/core/server/stream/afterTemplate.js +9 -5
  18. package/dist/cjs/core/server/stream/template.js +3 -3
  19. package/dist/cjs/core/server/string/index.js +3 -3
  20. package/dist/cjs/core/server/string/loadable.js +3 -11
  21. package/dist/cjs/index.js +7 -6
  22. package/dist/cjs/module-federation/consume-surface.js +199 -0
  23. package/dist/cjs/module-federation/distributed-ssr.js +134 -0
  24. package/dist/cjs/module-federation/index.js +258 -120
  25. package/dist/cjs/module-federation/last-known-good.js +124 -0
  26. package/dist/cjs/module-federation/manifest-recovery-runtime-plugin.js +140 -0
  27. package/dist/cjs/module-federation/surface-resolution-types.js +61 -0
  28. package/dist/cjs/router/cli/code/nestedRoutes.js +3 -0
  29. package/dist/cjs/router/cli/code/templates.js +3 -2
  30. package/dist/cjs/router/cli/constants.js +1 -0
  31. package/dist/cjs/router/cli/nestedRoutesSpec.js +3 -1
  32. package/dist/cjs/router/runtime/hooks.js +7 -6
  33. package/dist/cjs/router/runtime/internal.js +30 -16
  34. package/dist/cjs/router/runtime/plugin.js +6 -7
  35. package/dist/cjs/router/runtime/provider.js +58 -12
  36. package/dist/esm/boundary-debugger/index.mjs +13 -3
  37. package/dist/esm/cli/code.mjs +12 -12
  38. package/dist/esm/cli/index.mjs +2 -12
  39. package/dist/esm/cli/registry.mjs +0 -0
  40. package/dist/esm/cli/ssr/index.mjs +3 -2
  41. package/dist/esm/cli/ssr/loadable-bundler-plugin.mjs +8 -4
  42. package/dist/esm/core/browser/hydrate.mjs +15 -4
  43. package/dist/esm/core/browser/index.mjs +15 -17
  44. package/dist/esm/core/context/index.mjs +1 -1
  45. package/dist/esm/core/context/public.mjs +5 -0
  46. package/dist/esm/core/context/runtime.mjs +4 -6
  47. package/dist/esm/core/react/wrapper.mjs +58 -1
  48. package/dist/esm/core/server/federatedCss.mjs +7 -3
  49. package/dist/esm/core/server/requestHandler.mjs +15 -45
  50. package/dist/esm/core/server/requestResponse.mjs +39 -0
  51. package/dist/esm/core/server/routerCleanup.mjs +11 -4
  52. package/dist/esm/core/server/scriptOrder.mjs +11 -8
  53. package/dist/esm/core/server/stream/afterTemplate.mjs +10 -6
  54. package/dist/esm/core/server/stream/template.mjs +3 -3
  55. package/dist/esm/core/server/string/index.mjs +3 -3
  56. package/dist/esm/core/server/string/loadable.mjs +3 -8
  57. package/dist/esm/exports/loadable.mjs +3 -3
  58. package/dist/esm/index.mjs +2 -1
  59. package/dist/esm/module-federation/consume-surface.mjs +158 -0
  60. package/dist/esm/module-federation/distributed-ssr.mjs +81 -0
  61. package/dist/esm/module-federation/index.mjs +6 -0
  62. package/dist/esm/module-federation/last-known-good.mjs +80 -0
  63. package/dist/esm/module-federation/manifest-recovery-runtime-plugin.mjs +100 -0
  64. package/dist/esm/module-federation/surface-resolution-types.mjs +8 -0
  65. package/dist/esm/router/cli/code/index.mjs +5 -5
  66. package/dist/esm/router/cli/code/nestedRoutes.mjs +3 -0
  67. package/dist/esm/router/cli/code/templates.mjs +3 -2
  68. package/dist/esm/router/cli/constants.mjs +1 -0
  69. package/dist/esm/router/cli/handler.mjs +3 -3
  70. package/dist/esm/router/cli/nestedRoutesSpec.mjs +3 -1
  71. package/dist/esm/router/runtime/hooks.mjs +7 -6
  72. package/dist/esm/router/runtime/internal.mjs +26 -18
  73. package/dist/esm/router/runtime/plugin.mjs +6 -7
  74. package/dist/esm/router/runtime/provider.mjs +56 -13
  75. package/dist/esm-node/boundary-debugger/index.mjs +13 -3
  76. package/dist/esm-node/cli/code.mjs +12 -12
  77. package/dist/esm-node/cli/index.mjs +2 -12
  78. package/dist/esm-node/cli/registry.mjs +1 -0
  79. package/dist/esm-node/cli/ssr/index.mjs +3 -2
  80. package/dist/esm-node/cli/ssr/loadable-bundler-plugin.mjs +8 -4
  81. package/dist/esm-node/core/browser/hydrate.mjs +15 -4
  82. package/dist/esm-node/core/browser/index.mjs +15 -17
  83. package/dist/esm-node/core/context/index.mjs +1 -1
  84. package/dist/esm-node/core/context/public.mjs +6 -0
  85. package/dist/esm-node/core/context/runtime.mjs +4 -6
  86. package/dist/esm-node/core/react/wrapper.mjs +58 -1
  87. package/dist/esm-node/core/server/federatedCss.mjs +7 -3
  88. package/dist/esm-node/core/server/requestHandler.mjs +15 -45
  89. package/dist/esm-node/core/server/requestResponse.mjs +40 -0
  90. package/dist/esm-node/core/server/routerCleanup.mjs +11 -4
  91. package/dist/esm-node/core/server/scriptOrder.mjs +11 -8
  92. package/dist/esm-node/core/server/stream/afterTemplate.mjs +10 -6
  93. package/dist/esm-node/core/server/stream/template.mjs +3 -3
  94. package/dist/esm-node/core/server/string/index.mjs +3 -3
  95. package/dist/esm-node/core/server/string/loadable.mjs +3 -8
  96. package/dist/esm-node/exports/loadable.mjs +3 -3
  97. package/dist/esm-node/index.mjs +2 -1
  98. package/dist/esm-node/module-federation/consume-surface.mjs +159 -0
  99. package/dist/esm-node/module-federation/distributed-ssr.mjs +82 -0
  100. package/dist/esm-node/module-federation/index.mjs +6 -0
  101. package/dist/esm-node/module-federation/last-known-good.mjs +81 -0
  102. package/dist/esm-node/module-federation/manifest-recovery-runtime-plugin.mjs +101 -0
  103. package/dist/esm-node/module-federation/surface-resolution-types.mjs +9 -0
  104. package/dist/esm-node/router/cli/code/index.mjs +5 -5
  105. package/dist/esm-node/router/cli/code/nestedRoutes.mjs +3 -0
  106. package/dist/esm-node/router/cli/code/templates.mjs +3 -2
  107. package/dist/esm-node/router/cli/constants.mjs +1 -0
  108. package/dist/esm-node/router/cli/handler.mjs +3 -3
  109. package/dist/esm-node/router/cli/nestedRoutesSpec.mjs +3 -1
  110. package/dist/esm-node/router/runtime/hooks.mjs +7 -6
  111. package/dist/esm-node/router/runtime/internal.mjs +26 -18
  112. package/dist/esm-node/router/runtime/plugin.mjs +6 -7
  113. package/dist/esm-node/router/runtime/provider.mjs +56 -13
  114. package/dist/types/boundary-debugger/index.d.ts +1 -1
  115. package/dist/types/cli/registry.d.ts +2 -0
  116. package/dist/types/common.d.ts +8 -1
  117. package/dist/types/core/browser/hydrate.d.ts +2 -1
  118. package/dist/types/core/browser/index.d.ts +4 -1
  119. package/dist/types/core/context/index.d.ts +26 -10
  120. package/dist/types/core/context/monitors/default.d.ts +10 -2
  121. package/dist/types/core/context/monitors/index.d.ts +1 -1
  122. package/dist/types/core/context/monitors/index.server.d.ts +2 -2
  123. package/dist/types/core/context/public.d.ts +27 -0
  124. package/dist/types/core/context/runtime.d.ts +12 -22
  125. package/dist/types/core/react/index.d.ts +1 -1
  126. package/dist/types/core/server/requestResponse.d.ts +15 -0
  127. package/dist/types/core/server/routerCleanup.d.ts +2 -1
  128. package/dist/types/core/server/scriptOrder.d.ts +1 -1
  129. package/dist/types/core/server/stream/shared.d.ts +2 -2
  130. package/dist/types/core/server/string/loadable.d.ts +0 -2
  131. package/dist/types/exports/head.d.ts +1 -1
  132. package/dist/types/index.d.ts +5 -5
  133. package/dist/types/internal.d.ts +0 -1
  134. package/dist/types/module-federation/consume-surface.d.ts +104 -0
  135. package/dist/types/module-federation/distributed-ssr.d.ts +61 -0
  136. package/dist/types/module-federation/index.d.ts +6 -0
  137. package/dist/types/module-federation/last-known-good.d.ts +72 -0
  138. package/dist/types/module-federation/manifest-recovery-runtime-plugin.d.ts +25 -0
  139. package/dist/types/module-federation/surface-resolution-types.d.ts +23 -0
  140. package/dist/types/router/cli/constants.d.ts +1 -0
  141. package/dist/types/router/runtime/hooks.d.ts +10 -6
  142. package/dist/types/router/runtime/internal.d.ts +13 -3
  143. package/dist/types/router/runtime/plugin.d.ts +1 -1
  144. package/dist/types/router/runtime/plugin.node.d.ts +1 -1
  145. package/dist/types/router/runtime/provider.d.ts +28 -11
  146. package/dist/types/router/runtime/types.d.ts +27 -5
  147. package/package.json +47 -27
  148. package/dist/cjs/exports/tanstack-router.js +0 -83
  149. package/dist/esm/exports/tanstack-router.mjs +0 -30
  150. package/dist/esm-node/exports/tanstack-router.mjs +0 -31
  151. package/dist/types/exports/tanstack-router.d.ts +0 -88
@@ -0,0 +1,72 @@
1
+ /**
2
+ * G24a/b — last-known-good (LKG) provider wrapper.
3
+ *
4
+ * RESOLUTION-0001 §2.2: the LKG cache "wraps any provider; serves the last
5
+ * complete record on provider failure, marked `compatibility: 'degraded'`". It
6
+ * is universal — no DOM/fetch/framework coupling — so the same wrapper works in
7
+ * the browser, Node, and Cloudflare.
8
+ *
9
+ * Rollback semantics (ADR-0019 / CONTEXT.md Rollback): the delivery UNIT is
10
+ * the unit of rollback. The cache stores exactly ONE whole
11
+ * {@link ResolvedDeliveryUnit} per (unitId, env) key — never per (ref, env) —
12
+ * so every surface of a unit shares one snapshot and a fresh success swaps that
13
+ * snapshot atomically for all of them (two surfaces can never be served from
14
+ * different cached build markers). It never stores or serves a partial record,
15
+ * and it never mixes locations across build markers — a served degraded record
16
+ * is a byte-for-byte prior success with only its compatibility verdict flipped
17
+ * to `degraded`. An `incompatible` record is never good: it is neither cached
18
+ * as the last-known-good snapshot nor ever served. The ref's external-major
19
+ * participates in lookup validation but not in the storage key.
20
+ */
21
+ import { type ResolvedDeliveryUnit, type SurfaceResolutionProvider } from './surface-resolution-types';
22
+ export declare const LAST_KNOWN_GOOD_PROVIDER_NAME = "last-known-good";
23
+ /** One cached complete record plus the time it was stored. */
24
+ export type LkgRecord = {
25
+ resolved: ResolvedDeliveryUnit;
26
+ storedAt: number;
27
+ /**
28
+ * External-major selector the record was resolved against. Participates in
29
+ * lookup validation — a cached record is only served for a matching major —
30
+ * but never in the storage key, which is (unitId, env) so all surfaces of a
31
+ * unit share one atomically-swapped record.
32
+ */
33
+ major?: number;
34
+ };
35
+ /**
36
+ * Pluggable storage hook. The default is an in-memory Map; callers may supply a
37
+ * durable store (KV, disk, etc). Reads/writes may be async. A store only ever
38
+ * receives whole records.
39
+ */
40
+ export type LkgStorage = {
41
+ read(key: string): (LkgRecord | undefined) | Promise<LkgRecord | undefined>;
42
+ write(key: string, record: LkgRecord): void | Promise<void>;
43
+ };
44
+ export type LkgFreshnessPolicy = {
45
+ /**
46
+ * Maximum age, in ms, a stored record may be served after a provider
47
+ * failure. When omitted, a served record never expires by age. A record
48
+ * older than this yields a typed `stale-record` discovery error.
49
+ */
50
+ maxStaleMs?: number;
51
+ };
52
+ export type LastKnownGoodOptions = {
53
+ /** The wrapped provider (env/static, Zephyr, or any other). */
54
+ provider: SurfaceResolutionProvider;
55
+ /** Pluggable storage; defaults to a process-local in-memory Map. */
56
+ storage?: LkgStorage;
57
+ freshness?: LkgFreshnessPolicy;
58
+ /** Clock injection for deterministic freshness tests. */
59
+ now?: () => number;
60
+ };
61
+ /** Default process-local in-memory storage. */
62
+ export declare function createInMemoryLkgStorage(): LkgStorage;
63
+ /**
64
+ * Wrap a provider with a last-known-good cache. On success the whole record is
65
+ * cached (atomic swap). On provider failure (typed discovery error or a thrown
66
+ * error) the last complete record is served, marked degraded — unless it has
67
+ * expired per {@link LkgFreshnessPolicy}, in which case a typed `stale-record`
68
+ * error is returned. If there is no cached record, the original failure is
69
+ * passed through (a thrown error becomes a `provider-unavailable` discovery
70
+ * error).
71
+ */
72
+ export declare function createLastKnownGoodProvider(options: LastKnownGoodOptions): SurfaceResolutionProvider;
@@ -0,0 +1,25 @@
1
+ type ErrorLoadRemoteArgs = {
2
+ id?: string;
3
+ error?: unknown;
4
+ lifecycle?: string;
5
+ };
6
+ export type ModuleFederationManifestRecoveryPluginOptions = {
7
+ attempts?: number;
8
+ retryDelayMs?: number;
9
+ timeoutMs?: number;
10
+ fetchImpl?: typeof fetch;
11
+ waitImpl?: (milliseconds: number) => Promise<void>;
12
+ };
13
+ /**
14
+ * Gives server-side manifest loading a small, bounded recovery window.
15
+ *
16
+ * Returning `undefined` deliberately hands control back to Module Federation:
17
+ * its runtime preserves the original typed RUNTIME-003 error and invalidates
18
+ * the rejected manifest promise. Parsed manifests are returned without schema
19
+ * interpretation so runtime-core remains the authority for RUNTIME-013.
20
+ */
21
+ export declare const createModuleFederationManifestRecoveryPlugin: (options?: ModuleFederationManifestRecoveryPluginOptions) => {
22
+ name: string;
23
+ errorLoadRemote(args: ErrorLoadRemoteArgs): Promise<any>;
24
+ };
25
+ export default createModuleFederationManifestRecoveryPlugin;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Surface-resolution types for the module-federation runtime.
3
+ *
4
+ * Thin re-export of the canonical module in `@modern-js/utils/universal`
5
+ * (`packages/toolkit/utils/src/universal/surface-resolution/`,
6
+ * RESOLUTION-0001). Kept as a file so existing `./surface-resolution-types`
7
+ * imports stay stable. Only helpers the canonical module deliberately does not
8
+ * ship (the (ref, env) cache key) live here, implemented against canonical
9
+ * types.
10
+ */
11
+ import { type EnvironmentId, type ParsedSurfaceRef } from '@modern-js/utils/universal';
12
+ export { type CompatibilityStatus, type CompatibilityVerdict, createDiscoveryError, type DiscoveryError, type DiscoveryErrorCode, type DiscoveryResult, type EnvironmentId, formatSurfaceRef, type ParsedSurfaceRef, parseSurfaceRef, type ResolvedDeliveryUnit, type ResolvedSurface, type ResolvedSurfaceKind, type ResolvedSurfaceLocation, type ResolvedSurfaceLocationPlatform, type SurfaceRefParseError, type SurfaceRefParseResult, type SurfaceResolutionProvider, validateSurfaceRef, } from '@modern-js/utils/universal';
13
+ /** Stable cache/identity key for a (ref, env) pair. */
14
+ export declare function surfaceResolutionKey(ref: ParsedSurfaceRef, env: EnvironmentId): string;
15
+ /**
16
+ * Stable cache key for a (deliveryUnit, env) pair — ONE record per unit per
17
+ * env (ADR-0019 atomicity). All surfaces of a unit share this key so a refresh
18
+ * replaces the whole unit snapshot atomically for every surface, and two
19
+ * surfaces of the same unit can never be served from different cached
20
+ * snapshots. The ref's external-major participates in lookup validation (see
21
+ * the LKG provider), not in this key.
22
+ */
23
+ export declare function deliveryUnitResolutionKey(unitId: string, env: EnvironmentId): string;
@@ -18,6 +18,7 @@ export declare const NESTED_ROUTE: {
18
18
  PAGE_FILE: string;
19
19
  PAGE_CONFIG_FILE: string;
20
20
  PAGE_LOADER_FILE: string;
21
+ PAGE_SEARCH_FILE: string;
21
22
  PAGE_DATA_FILE: string;
22
23
  PAGE_CLIENT_LOADER: string;
23
24
  SPLATE_FILE: string;
@@ -1,12 +1,16 @@
1
1
  import type { RouteObject } from '@modern-js/runtime-utils/router';
2
2
  import type { TRuntimeContext } from '../../core/context/runtime';
3
3
  import type { RouterLifecycleContext } from './lifecycle';
4
- declare const modifyRoutes: import("@modern-js/plugin").SyncHook<(routes: RouteObject[]) => RouteObject[]>;
5
- declare const onBeforeCreateRoutes: import("@modern-js/plugin").SyncHook<(context: TRuntimeContext) => void>;
6
- declare const onBeforeCreateRouter: import("@modern-js/plugin").SyncHook<(context: RouterLifecycleContext) => void>;
7
- declare const onAfterCreateRouter: import("@modern-js/plugin").SyncHook<(context: RouterLifecycleContext) => void>;
8
- declare const onBeforeHydrateRouter: import("@modern-js/plugin").SyncHook<(context: RouterLifecycleContext) => void>;
9
- declare const onAfterHydrateRouter: import("@modern-js/plugin").SyncHook<(context: RouterLifecycleContext) => void>;
4
+ export type RouterSyncHook<Handler extends (...args: any[]) => any> = {
5
+ call: (...args: Parameters<Handler>) => ReturnType<Handler>;
6
+ [key: string]: unknown;
7
+ };
8
+ declare const modifyRoutes: RouterSyncHook<(routes: RouteObject[]) => RouteObject[]>;
9
+ declare const onBeforeCreateRoutes: RouterSyncHook<(context: TRuntimeContext) => void>;
10
+ declare const onBeforeCreateRouter: RouterSyncHook<(context: RouterLifecycleContext) => void>;
11
+ declare const onAfterCreateRouter: RouterSyncHook<(context: RouterLifecycleContext) => void>;
12
+ declare const onBeforeHydrateRouter: RouterSyncHook<(context: RouterLifecycleContext) => void>;
13
+ declare const onAfterHydrateRouter: RouterSyncHook<(context: RouterLifecycleContext) => void>;
10
14
  export { modifyRoutes, onAfterCreateRouter, onAfterHydrateRouter, onBeforeCreateRouter, onBeforeCreateRoutes, onBeforeHydrateRouter, };
11
15
  export type RouterExtendsHooks = {
12
16
  modifyRoutes: typeof modifyRoutes;
@@ -1,12 +1,22 @@
1
- import type { RuntimePlugin } from '../../core';
1
+ import type { RuntimePlugin } from '../../common';
2
2
  import type { RouterExtendsHooks } from './hooks';
3
+ import type { RouterProviderRegistration } from './provider';
3
4
  import type { RouterConfig, SingleRouteConfig } from './types';
4
- export declare const routerPlugin: (userConfig?: Partial<RouterConfig>) => RuntimePlugin<{
5
+ type LocalRouterProvider = Omit<RouterProviderRegistration, 'isDefault'>;
6
+ export type RouterPluginFactory = (userConfig?: Partial<RouterConfig>) => RuntimePlugin<{
5
7
  extendHooks: RouterExtendsHooks;
6
8
  }>;
9
+ /**
10
+ * Create one router wrapper and its provider realm for a runtime entry. Optional
11
+ * providers are supplied by the entry-owning integration (for example the
12
+ * TanStack runtime/router module), so independently bundled apps never resolve
13
+ * factories from another app's module graph.
14
+ */
15
+ export declare const createRouterPlugin: (localProviders?: readonly LocalRouterProvider[]) => RouterPluginFactory;
16
+ export declare const routerPlugin: RouterPluginFactory;
7
17
  export default routerPlugin;
8
18
  export type { RouterExtendsHooks } from './hooks';
9
19
  export { modifyRoutes } from './plugin';
10
- export { type RouterProviderFactory, type RouterProviderPlugin, registerRouterProvider, resolveRouterProvider, } from './provider';
20
+ export { createRouterProviderRealm, type RouterProviderFactory, type RouterProviderPlugin, type RouterProviderRealm, type RouterProviderRegistration, registerRouterProvider, resolveRouterProvider, } from './provider';
11
21
  export { renderRoutes } from './utils';
12
22
  export type { RouterConfig, SingleRouteConfig };
@@ -1,4 +1,4 @@
1
- import { type RuntimePlugin } from '../../core';
1
+ import type { RuntimePlugin } from '../../common';
2
2
  import type { RouterExtendsHooks } from './hooks';
3
3
  import type { RouterConfig, Routes } from './types';
4
4
  export declare let finalRouteConfig: RouterConfig['routesConfig'];
@@ -1,4 +1,4 @@
1
- import type { RuntimePlugin } from '../../core';
1
+ import type { RuntimePlugin } from '../../common';
2
2
  import type { RouterExtendsHooks } from './hooks';
3
3
  import type { RouterConfig } from './types';
4
4
  export declare const routerPlugin: (userConfig?: Partial<RouterConfig>) => RuntimePlugin<{
@@ -11,7 +11,7 @@
11
11
  * - `@modern-js/plugin-tanstack` registers the `tanstack` provider when its
12
12
  * runtime entry is imported.
13
13
  */
14
- import type { RuntimePlugin } from '../../core';
14
+ import type { RuntimePlugin } from '../../common';
15
15
  import type { RouterExtendsHooks } from './hooks';
16
16
  import type { RouterConfig } from './types';
17
17
  /**
@@ -35,19 +35,36 @@ export declare function reportUnsupportedProviderRegistryHooks(providerPlugin: {
35
35
  registryHooks?: Record<string, unknown>;
36
36
  }): string[];
37
37
  export type RouterProviderFactory = (userConfig: Partial<RouterConfig>) => RouterProviderPlugin;
38
+ export type RouterProviderRegistration = {
39
+ name: string;
40
+ factory: RouterProviderFactory;
41
+ isDefault?: boolean;
42
+ };
43
+ /**
44
+ * App-owned provider catalog. Provider factories close over their module graph,
45
+ * so they must be resolved from the runtime wrapper that owns the app instead
46
+ * of from a page-global first-registration winner.
47
+ */
48
+ export type RouterProviderRealm = Readonly<{
49
+ defaultProvider?: string;
50
+ get: (name: string) => RouterProviderFactory | undefined;
51
+ names: () => readonly string[];
52
+ }>;
53
+ export declare function createRouterProviderRealm(registrations: readonly RouterProviderRegistration[]): RouterProviderRealm;
38
54
  export declare function registerRouterProvider(name: string, factory: RouterProviderFactory, options?: {
39
55
  isDefault?: boolean;
40
56
  }): void;
41
57
  export declare function resolveRouterProvider(framework?: RouterConfig['framework'], options?: {
42
58
  /**
43
- * The resolving module's own copy of a provider. The registry is
44
- * realm-global with keep-first semantics, so in a page hosting several
45
- * independent Modern.js apps (Module Federation app-level remotes) the
46
- * first-loaded copy of a provider would otherwise win for *every* app —
47
- * a foreign factory closes over the foreign app's global context (routes,
48
- * App, runtime hooks) and renders the wrong app inside the resolving one.
49
- * When the resolved name matches `localDefault.name`, the local factory
50
- * is returned instead of whatever copy registered first.
59
+ * Provider factories owned by the resolving app/runtime wrapper. A realm
60
+ * is the exclusive provider source when supplied because its factories
61
+ * close over the correct app module graph.
62
+ */
63
+ realm?: RouterProviderRealm;
64
+ /**
65
+ * Legacy single-provider override retained for published wrappers. New
66
+ * integrations should pass an app-owned `realm`, which supports every
67
+ * provider rather than only the default.
51
68
  */
52
69
  localDefault?: {
53
70
  name: string;
@@ -55,7 +72,7 @@ export declare function resolveRouterProvider(framework?: RouterConfig['framewor
55
72
  };
56
73
  }): RouterProviderFactory;
57
74
  /**
58
- * Test-only escape hatch: the registry lives on `globalThis`, so unit tests
59
- * need a way to restore a pristine state between cases.
75
+ * Test-only escape hatch: compatibility registries live on `globalThis`, so
76
+ * unit tests need a way to restore a pristine state between cases.
60
77
  */
61
78
  export declare function unsafe_resetRouterProvidersForTesting(): void;
@@ -1,6 +1,12 @@
1
- import type { RequestContext } from '@modern-js/runtime-utils/node';
2
1
  import type { Params, RouteObject, RouteProps } from '@modern-js/runtime-utils/router';
3
- import type { NestedRoute, PageRoute } from '@modern-js/types';
2
+ export type ModernRoute = {
3
+ type: 'nested' | 'page';
4
+ path?: string;
5
+ id?: string;
6
+ component?: React.ComponentType | string;
7
+ children?: ModernRoute[];
8
+ [key: string]: any;
9
+ };
4
10
  export type SingleRouteConfig = RouteProps & {
5
11
  redirect?: string;
6
12
  routes?: SingleRouteConfig[];
@@ -19,13 +25,13 @@ export type RouterFramework = BuiltInRouterFramework | (string & {});
19
25
  export type RouterConfig = {
20
26
  /**
21
27
  * Select the router implementation used by Modern.js conventional routing.
22
- * - `react-router` (default): React Router v7 based integration
28
+ * - `react-router` (default): React Router based integration
23
29
  * - `tanstack`: TanStack Router integration
24
30
  */
25
31
  framework?: RouterFramework;
26
32
  routesConfig: {
27
33
  globalApp?: React.ComponentType<any>;
28
- routes?: (NestedRoute | PageRoute)[];
34
+ routes?: ModernRoute[];
29
35
  };
30
36
  /**
31
37
  * You should not use it
@@ -108,12 +114,28 @@ export type ModernRouteObject = RouteObject & {
108
114
  component?: React.ComponentType | LazyComponentDescriptor;
109
115
  entryCssFiles?: string[];
110
116
  };
117
+ type LoaderContextKey<T = unknown> = {
118
+ symbol: symbol;
119
+ getDefaultValue: () => T;
120
+ };
121
+ interface LoaderRequestGet<P extends Record<string, unknown>> {
122
+ <Key extends keyof P>(key: Key): P[Key];
123
+ <T>(key: LoaderContextKey<T>): T;
124
+ }
125
+ interface LoaderRequestSet<P extends Record<string, unknown>> {
126
+ <Key extends keyof P>(key: Key, value: P[Key]): void;
127
+ <T>(key: LoaderContextKey<T>, value: T): void;
128
+ }
129
+ type LoaderRequestContext<P extends Record<string, unknown> = {}> = {
130
+ get: LoaderRequestGet<P & Record<string, unknown>>;
131
+ set: LoaderRequestSet<P & Record<string, unknown>>;
132
+ };
111
133
  interface DataFunctionArgs<D = any> {
112
134
  request: Request;
113
135
  params: Params;
114
136
  context?: D;
115
137
  }
116
- export type LoaderFunctionArgs<P extends Record<string, unknown> = Record<string, unknown>> = DataFunctionArgs<RequestContext<P>>;
138
+ export type LoaderFunctionArgs<P extends Record<string, unknown> = Record<string, unknown>> = DataFunctionArgs<LoaderRequestContext<P>>;
117
139
  declare type DataFunctionValue = Response | NonNullable<unknown> | null;
118
140
  export type LoaderFunction = <P extends Record<string, unknown> = Record<string, unknown>>(args: LoaderFunctionArgs<P>) => Promise<DataFunctionValue> | DataFunctionValue;
119
141
  export {};
package/package.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "modern",
18
18
  "modern.js"
19
19
  ],
20
- "version": "3.5.0-ultramodern.10",
20
+ "version": "3.5.0-ultramodern.100",
21
21
  "engines": {
22
22
  "node": ">=20"
23
23
  },
@@ -55,6 +55,12 @@
55
55
  "types": "./dist/types/core/browser/index.d.ts",
56
56
  "default": "./dist/esm/core/browser/index.mjs"
57
57
  },
58
+ "./registry": {
59
+ "types": "./dist/types/cli/registry.d.ts"
60
+ },
61
+ "./registry/*": {
62
+ "types": "./dist/types/cli/registry.d.ts"
63
+ },
58
64
  "./loadable": {
59
65
  "types": "./dist/types/exports/loadable.d.ts",
60
66
  "default": "./dist/esm/exports/loadable.mjs"
@@ -71,6 +77,18 @@
71
77
  "types": "./dist/types/module-federation/index.d.ts",
72
78
  "default": "./dist/esm/module-federation/index.mjs"
73
79
  },
80
+ "./module-federation/distributed-ssr": {
81
+ "types": "./dist/types/module-federation/distributed-ssr.d.ts",
82
+ "default": "./dist/esm/module-federation/distributed-ssr.mjs"
83
+ },
84
+ "./module-federation/manifest-recovery-runtime-plugin": {
85
+ "types": "./dist/types/module-federation/manifest-recovery-runtime-plugin.d.ts",
86
+ "node": {
87
+ "import": "./dist/esm/module-federation/manifest-recovery-runtime-plugin.mjs",
88
+ "require": "./dist/cjs/module-federation/manifest-recovery-runtime-plugin.js"
89
+ },
90
+ "default": "./dist/esm/module-federation/manifest-recovery-runtime-plugin.mjs"
91
+ },
74
92
  "./ssr": {
75
93
  "types": "./dist/types/core/server/index.d.ts",
76
94
  "default": "./dist/esm/core/server/index.mjs"
@@ -99,10 +117,6 @@
99
117
  },
100
118
  "default": "./dist/esm/router/index.mjs"
101
119
  },
102
- "./tanstack-router": {
103
- "types": "./dist/types/exports/tanstack-router.d.ts",
104
- "default": "./dist/esm/exports/tanstack-router.mjs"
105
- },
106
120
  "./router/server": {
107
121
  "types": "./dist/types/router/runtime/server.d.ts",
108
122
  "default": "./dist/esm/router/runtime/server.mjs"
@@ -173,6 +187,12 @@
173
187
  "browser": [
174
188
  "./dist/types/core/browser/index.d.ts"
175
189
  ],
190
+ "registry": [
191
+ "./dist/types/cli/registry.d.ts"
192
+ ],
193
+ "registry/*": [
194
+ "./dist/types/cli/registry.d.ts"
195
+ ],
176
196
  "head": [
177
197
  "./dist/types/exports/head.d.ts"
178
198
  ],
@@ -182,6 +202,9 @@
182
202
  "module-federation": [
183
203
  "./dist/types/module-federation/index.d.ts"
184
204
  ],
205
+ "module-federation/manifest-recovery-runtime-plugin": [
206
+ "./dist/types/module-federation/manifest-recovery-runtime-plugin.d.ts"
207
+ ],
185
208
  "document": [
186
209
  "./dist/types/document/index.d.ts"
187
210
  ],
@@ -194,9 +217,6 @@
194
217
  "router": [
195
218
  "./dist/types/router/index.d.ts"
196
219
  ],
197
- "tanstack-router": [
198
- "./dist/types/exports/tanstack-router.d.ts"
199
- ],
200
220
  "router/server": [
201
221
  "./dist/types/router/runtime/server.d.ts"
202
222
  ],
@@ -226,51 +246,51 @@
226
246
  "dependencies": {
227
247
  "@loadable/component": "5.16.7",
228
248
  "@loadable/server": "5.16.7",
249
+ "@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.5.0-ultramodern.100",
250
+ "@modern-js/plugin-data-loader": "npm:@bleedingdev/modern-js-plugin-data-loader@3.5.0-ultramodern.100",
251
+ "@modern-js/render": "npm:@bleedingdev/modern-js-render@3.5.0-ultramodern.100",
252
+ "@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.5.0-ultramodern.100",
253
+ "@modern-js/types": "npm:@bleedingdev/modern-js-types@3.5.0-ultramodern.100",
254
+ "@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.5.0-ultramodern.100",
229
255
  "@swc/core": "1.15.43",
230
256
  "@swc/helpers": "^0.5.23",
231
- "@swc/plugin-loadable-components": "^11.14.0",
257
+ "@swc/plugin-loadable-components": "^11.15.0",
232
258
  "@types/loadable__component": "^5.13.10",
233
259
  "@types/react-helmet": "^6.1.11",
234
- "cookie": "2.0.0",
260
+ "cookie": "2.0.1",
235
261
  "entities": "^8.0.0",
236
- "es-module-lexer": "^2.1.0",
262
+ "es-module-lexer": "^2.3.0",
237
263
  "esbuild": "^0.28.1",
238
264
  "invariant": "^2.2.4",
239
- "isbot": "5.1.44",
265
+ "isbot": "5.2.0",
240
266
  "react-helmet": "^6.1.0",
241
267
  "react-helmet-async": "3.0.0",
242
- "react-is": "^19.2.7",
243
- "@modern-js/plugin": "npm:@bleedingdev/modern-js-plugin@3.5.0-ultramodern.10",
244
- "@modern-js/plugin-data-loader": "npm:@bleedingdev/modern-js-plugin-data-loader@3.5.0-ultramodern.10",
245
- "@modern-js/runtime-utils": "npm:@bleedingdev/modern-js-runtime-utils@3.5.0-ultramodern.10",
246
- "@modern-js/render": "npm:@bleedingdev/modern-js-render@3.5.0-ultramodern.10",
247
- "@modern-js/types": "npm:@bleedingdev/modern-js-types@3.5.0-ultramodern.10",
248
- "@modern-js/utils": "npm:@bleedingdev/modern-js-utils@3.5.0-ultramodern.10"
268
+ "react-is": "^19.2.7"
249
269
  },
250
270
  "peerDependencies": {
251
271
  "react": "^19.2.7",
252
272
  "react-dom": "^19.2.7"
253
273
  },
254
274
  "devDependencies": {
275
+ "@modern-js/app-tools": "npm:@bleedingdev/modern-js-app-tools@3.5.0-ultramodern.100",
255
276
  "@remix-run/web-fetch": "^4.4.2",
256
- "@rsbuild/core": "2.1.1",
257
- "@rslib/core": "0.23.1",
277
+ "@rsbuild/core": "2.1.5",
278
+ "@rslib/core": "0.23.2",
279
+ "@scripts/rstest-config": "2.66.0",
258
280
  "@testing-library/dom": "^10.4.1",
259
281
  "@testing-library/react": "^16.3.2",
282
+ "@types/cookie": "0.6.0",
260
283
  "@types/invariant": "^2.2.37",
261
284
  "@types/loadable__server": "5.12.11",
262
- "@types/node": "^26.0.1",
263
- "@typescript/native-preview": "7.0.0-dev.20260628.1",
285
+ "@types/node": "^26.1.1",
286
+ "@typescript/native-preview": "7.0.0-dev.20260707.2",
264
287
  "react": "^19.2.7",
265
288
  "react-dom": "^19.2.7",
266
289
  "ts-node": "^10.9.2",
267
- "typescript": "^6.0.3",
268
- "@modern-js/app-tools": "npm:@bleedingdev/modern-js-app-tools@3.5.0-ultramodern.10",
269
- "@scripts/rstest-config": "2.66.0"
290
+ "typescript": "^7.0.2"
270
291
  },
271
292
  "sideEffects": false,
272
293
  "publishConfig": {
273
- "registry": "https://registry.npmjs.org/",
274
294
  "access": "public"
275
295
  },
276
296
  "scripts": {
@@ -1,83 +0,0 @@
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
- Form: ()=>Form,
32
- Link: ()=>Link,
33
- NavLink: ()=>NavLink,
34
- Outlet: ()=>Outlet,
35
- RouteActionResponseError: ()=>RouteActionResponseError,
36
- useFetcher: ()=>useFetcher
37
- });
38
- const external_react_namespaceObject = require("react");
39
- const COMPAT_BINDINGS_SLOT = Symbol.for('@modern-js/plugin-tanstack:runtime-compat-bindings');
40
- function readCompatBindings() {
41
- return globalThis[COMPAT_BINDINGS_SLOT];
42
- }
43
- function resolveCompatBindings(exportName) {
44
- const bindings = readCompatBindings();
45
- if (void 0 === bindings) throw new Error(`[@modern-js/runtime] '${exportName}' from the deprecated '@modern-js/runtime/tanstack-router' alias is provided by @modern-js/plugin-tanstack. 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) before '${exportName}' is used. Prefer importing '${exportName}' from '@modern-js/plugin-tanstack/runtime' directly.`);
46
- return bindings;
47
- }
48
- const Link = (props)=>(0, external_react_namespaceObject.createElement)(resolveCompatBindings('Link').Link, props);
49
- const NavLink = (props)=>(0, external_react_namespaceObject.createElement)(resolveCompatBindings('NavLink').NavLink, props);
50
- const Outlet = ()=>(0, external_react_namespaceObject.createElement)(resolveCompatBindings('Outlet').Outlet);
51
- const Form = (props)=>(0, external_react_namespaceObject.createElement)(resolveCompatBindings('Form').Form, props);
52
- function useFetcher() {
53
- return resolveCompatBindings('useFetcher').useFetcher();
54
- }
55
- function RouteActionResponseErrorPlaceholder() {}
56
- const RouteActionResponseError = new Proxy(RouteActionResponseErrorPlaceholder, {
57
- construct (_target, args) {
58
- const RealError = resolveCompatBindings('RouteActionResponseError').RouteActionResponseError;
59
- return new RealError(...args);
60
- },
61
- get (target, property, receiver) {
62
- const RealError = readCompatBindings()?.RouteActionResponseError;
63
- if (void 0 !== RealError) return Reflect.get(RealError, property);
64
- return Reflect.get(target, property, receiver);
65
- }
66
- });
67
- exports.Form = __webpack_exports__.Form;
68
- exports.Link = __webpack_exports__.Link;
69
- exports.NavLink = __webpack_exports__.NavLink;
70
- exports.Outlet = __webpack_exports__.Outlet;
71
- exports.RouteActionResponseError = __webpack_exports__.RouteActionResponseError;
72
- exports.useFetcher = __webpack_exports__.useFetcher;
73
- for(var __rspack_i in __webpack_exports__)if (-1 === [
74
- "Form",
75
- "Link",
76
- "NavLink",
77
- "Outlet",
78
- "RouteActionResponseError",
79
- "useFetcher"
80
- ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
81
- Object.defineProperty(exports, '__esModule', {
82
- value: true
83
- });
@@ -1,30 +0,0 @@
1
- import { createElement } from "react";
2
- const COMPAT_BINDINGS_SLOT = Symbol.for('@modern-js/plugin-tanstack:runtime-compat-bindings');
3
- function readCompatBindings() {
4
- return globalThis[COMPAT_BINDINGS_SLOT];
5
- }
6
- function resolveCompatBindings(exportName) {
7
- const bindings = readCompatBindings();
8
- if (void 0 === bindings) throw new Error(`[@modern-js/runtime] '${exportName}' from the deprecated '@modern-js/runtime/tanstack-router' alias is provided by @modern-js/plugin-tanstack. 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) before '${exportName}' is used. Prefer importing '${exportName}' from '@modern-js/plugin-tanstack/runtime' directly.`);
9
- return bindings;
10
- }
11
- const Link = (props)=>createElement(resolveCompatBindings('Link').Link, props);
12
- const NavLink = (props)=>createElement(resolveCompatBindings('NavLink').NavLink, props);
13
- const Outlet = ()=>createElement(resolveCompatBindings('Outlet').Outlet);
14
- const Form = (props)=>createElement(resolveCompatBindings('Form').Form, props);
15
- function useFetcher() {
16
- return resolveCompatBindings('useFetcher').useFetcher();
17
- }
18
- function RouteActionResponseErrorPlaceholder() {}
19
- const RouteActionResponseError = new Proxy(RouteActionResponseErrorPlaceholder, {
20
- construct (_target, args) {
21
- const RealError = resolveCompatBindings('RouteActionResponseError').RouteActionResponseError;
22
- return new RealError(...args);
23
- },
24
- get (target, property, receiver) {
25
- const RealError = readCompatBindings()?.RouteActionResponseError;
26
- if (void 0 !== RealError) return Reflect.get(RealError, property);
27
- return Reflect.get(target, property, receiver);
28
- }
29
- });
30
- export { Form, Link, NavLink, Outlet, RouteActionResponseError, useFetcher };
@@ -1,31 +0,0 @@
1
- import "node:module";
2
- import { createElement } from "react";
3
- const COMPAT_BINDINGS_SLOT = Symbol.for('@modern-js/plugin-tanstack:runtime-compat-bindings');
4
- function readCompatBindings() {
5
- return globalThis[COMPAT_BINDINGS_SLOT];
6
- }
7
- function resolveCompatBindings(exportName) {
8
- const bindings = readCompatBindings();
9
- if (void 0 === bindings) throw new Error(`[@modern-js/runtime] '${exportName}' from the deprecated '@modern-js/runtime/tanstack-router' alias is provided by @modern-js/plugin-tanstack. 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) before '${exportName}' is used. Prefer importing '${exportName}' from '@modern-js/plugin-tanstack/runtime' directly.`);
10
- return bindings;
11
- }
12
- const Link = (props)=>createElement(resolveCompatBindings('Link').Link, props);
13
- const NavLink = (props)=>createElement(resolveCompatBindings('NavLink').NavLink, props);
14
- const Outlet = ()=>createElement(resolveCompatBindings('Outlet').Outlet);
15
- const Form = (props)=>createElement(resolveCompatBindings('Form').Form, props);
16
- function useFetcher() {
17
- return resolveCompatBindings('useFetcher').useFetcher();
18
- }
19
- function RouteActionResponseErrorPlaceholder() {}
20
- const RouteActionResponseError = new Proxy(RouteActionResponseErrorPlaceholder, {
21
- construct (_target, args) {
22
- const RealError = resolveCompatBindings('RouteActionResponseError').RouteActionResponseError;
23
- return new RealError(...args);
24
- },
25
- get (target, property, receiver) {
26
- const RealError = readCompatBindings()?.RouteActionResponseError;
27
- if (void 0 !== RealError) return Reflect.get(RealError, property);
28
- return Reflect.get(target, property, receiver);
29
- }
30
- });
31
- export { Form, Link, NavLink, Outlet, RouteActionResponseError, useFetcher };