@softarc/native-federation-orchestrator 4.8.0 → 4.10.0

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 (48) hide show
  1. package/README.md +2 -2
  2. package/fesm2022/@softarc/native-federation-orchestrator.mjs +874 -343
  3. package/fesm2022/@softarc/native-federation-orchestrator.mjs.map +4 -4
  4. package/fesm2022/module-federation.mjs +78 -21
  5. package/fesm2022/module-federation.mjs.map +3 -3
  6. package/fesm2022/node.mjs +949 -347
  7. package/fesm2022/node.mjs.map +4 -4
  8. package/fesm2022/options.mjs +27 -2
  9. package/fesm2022/options.mjs.map +3 -3
  10. package/package.json +3 -3
  11. package/quickstart.mjs +16 -14
  12. package/types/lib/core/1.domain/externals/basis.d.ts +2 -2
  13. package/types/lib/core/1.domain/externals/claims.d.ts +1 -2
  14. package/types/lib/core/1.domain/externals/serving.d.ts +2 -2
  15. package/types/lib/core/1.domain/externals/specifier.d.ts +11 -6
  16. package/types/lib/core/1.domain/externals/version.contract.d.ts +4 -0
  17. package/types/lib/core/1.domain/import-map/eager-preloads.d.ts +10 -0
  18. package/types/lib/core/1.domain/pooling/builds.d.ts +9 -3
  19. package/types/lib/core/1.domain/pooling/election.d.ts +2 -1
  20. package/types/lib/core/1.domain/pooling/gate.d.ts +4 -2
  21. package/types/lib/core/1.domain/pooling/membership.d.ts +4 -2
  22. package/types/lib/core/1.domain/pooling/plan.d.ts +2 -0
  23. package/types/lib/core/1.domain/remote/remote-module.contract.d.ts +1 -0
  24. package/types/lib/core/1.domain/remote-entry/mark-dense.d.ts +2 -0
  25. package/types/lib/core/1.domain/remote-entry/remote-entry.contract.d.ts +6 -3
  26. package/types/lib/core/2.app/config/import-map.contract.d.ts +4 -7
  27. package/types/lib/core/2.app/config/index.d.ts +2 -2
  28. package/types/lib/core/2.app/config/mode.contract.d.ts +2 -0
  29. package/types/lib/core/2.app/driver-ports/init/flow.contract.d.ts +2 -4
  30. package/types/lib/core/2.app/driver-ports/init/for-exposing-module-loader.port.d.ts +6 -2
  31. package/types/lib/core/2.app/driving-ports/for-browser-tasks.d.ts +1 -0
  32. package/types/lib/core/2.app/driving-ports/for-remote-info-storage.port.d.ts +1 -0
  33. package/types/lib/core/2.app/steps/collect-eager-preloads.d.ts +4 -0
  34. package/types/lib/core/2.app/steps/get-remote-entries.d.ts +1 -1
  35. package/types/lib/core/2.app/steps/preload-hint.d.ts +4 -0
  36. package/types/lib/core/2.app/steps/store-remote-entry.d.ts +0 -14
  37. package/types/lib/core/3.adapters/remote-entry/normalize-remote-entry.d.ts +4 -0
  38. package/types/lib/core/4.config/import-map/index.d.ts +2 -0
  39. package/types/lib/core/4.config/import-map/no-preload.d.ts +2 -0
  40. package/types/lib/core/4.config/import-map/preload-in-dom.d.ts +2 -0
  41. package/types/lib/core/4.config/storage/storage.config.d.ts +2 -1
  42. package/types/lib/core/5.di/federation-result.factory.d.ts +3 -2
  43. package/types/lib/core/init-federation.contract.d.ts +2 -0
  44. package/types/lib/index.d.ts +1 -1
  45. package/types/lib/node/adapters/fs-remote-entry-provider.d.ts +2 -1
  46. package/types/lib/node/init-federation.node.d.ts +2 -7
  47. package/types/lib/node.index.d.ts +1 -1
  48. package/types/lib/utils/union-find.d.ts +4 -0
@@ -1,7 +1,7 @@
1
1
  import type { DeepReadonly } from '../../../utils/deep-readonly';
2
2
  import type { SharedVersion, SharedVersionMeta } from './version.contract';
3
- export declare function isBetterBasis(candidate: SharedVersionMeta, basis: SharedVersionMeta): boolean;
4
- export declare function addRemoteToVersion(version: SharedVersion, remote: SharedVersionMeta, isHost?: boolean): void;
3
+ export declare function isBetterBasis(candidate: SharedVersionMeta, basis: SharedVersionMeta, preferDev?: boolean): boolean;
4
+ export declare function addRemoteToVersion(version: SharedVersion, remote: SharedVersionMeta, isHost?: boolean, preferDev?: boolean): void;
5
5
  export declare function versionDemands(version: SharedVersion): SharedVersionMeta[];
6
6
  export declare function forEachVersionEntry(version: DeepReadonly<SharedVersion>, accepts: ((remote: SharedVersionMeta) => boolean) | undefined, visit: (entrypoint: string, remote: SharedVersionMeta) => void): void;
7
7
  type Covered = Pick<ReadonlySet<string>, 'has'>;
@@ -2,7 +2,7 @@ import type { DeepReadonly } from '../../../utils/deep-readonly';
2
2
  import type { RemoteName } from '../remote/remote-info.contract';
3
3
  import { type ExternalName, type SharedExternal } from './external.contract';
4
4
  import type { SharedVersion, SharedVersionMeta, VersionName } from './version.contract';
5
- import { type Specifier } from './specifier';
5
+ import type { Specifier } from './specifier';
6
6
  export type Claim = {
7
7
  external: ExternalName;
8
8
  tag: VersionName;
@@ -18,5 +18,4 @@ export declare function committedClaims(externals: Iterable<readonly [ExternalNa
18
18
  shareScope: string;
19
19
  without?: RemoteName;
20
20
  }): Map<Specifier, Claim>;
21
- export declare const claimsByPackage: (claims: ReadonlyMap<Specifier, Claim>) => Map<ExternalName, [Specifier, Claim][]>;
22
21
  export declare function versionClaims(version: DeepReadonly<SharedVersion>, servingBuild: RemoteName | undefined): Map<Specifier, SharedVersionMeta>;
@@ -23,7 +23,7 @@ type Placed = {
23
23
  export declare const byServingRank: (a: ServingCandidate, b: ServingCandidate) => number;
24
24
  export declare const packagesOf: (scope: DeepReadonly<shareScope>) => Map<ExternalName, ExternalName[]>;
25
25
  export declare const isPooled: (externals: PackageExternals) => boolean;
26
- export declare function servingBuildOf(externals: PackageExternals, accepts: AcceptsTag): ServingBuild | undefined;
26
+ export declare function servingBuildOf(pkg: ExternalName, externals: PackageExternals, accepts: AcceptsTag): ServingBuild | undefined;
27
27
  export declare function shareServingCopies(external: SharedExternal, serving: ServingBuild): void;
28
28
  export type ServingObjector = {
29
29
  copy: SharedVersionMeta;
@@ -43,7 +43,7 @@ export declare function strictObjectorOf(externals: PackageExternals, serving: S
43
43
  external: ExternalName;
44
44
  }) | undefined;
45
45
  export declare const SCANNED_SURFACES_PER_TAG = 8;
46
- export declare function loadSplitsPackage(copies: readonly {
46
+ export declare function loadSplitsPackage(pkg: ExternalName, copies: readonly {
47
47
  tag: VersionName;
48
48
  copy: SharedVersionMeta;
49
49
  }[], claims: readonly (readonly [Specifier, {
@@ -1,13 +1,18 @@
1
- import type { ExternalName } from './external.contract';
2
- import type { VersionName } from './version.contract';
1
+ import type { DeepReadonly } from '../../../utils/deep-readonly';
2
+ import type { ExternalName, shareScope } from './external.contract';
3
+ import type { SharedVersionMeta, VersionName } from './version.contract';
3
4
  export type Specifier = string;
4
- export declare function owningPackage(name: ExternalName): ExternalName | undefined;
5
- export declare const packageOf: (name: ExternalName) => ExternalName;
5
+ export declare function npmPackageOf(name: ExternalName): ExternalName;
6
+ export type PackageOf = (specifier: Specifier) => ExternalName;
7
+ type StoredCopy = readonly [ExternalName, DeepReadonly<SharedVersionMeta>];
8
+ export declare function packageOfIn(scope: DeepReadonly<shareScope>, loading?: readonly StoredCopy[]): PackageOf;
6
9
  export declare class SpecifierTags extends Map<Specifier, VersionName> {
10
+ private readonly packageOf;
7
11
  private readonly packages;
8
- constructor(entries?: Iterable<readonly [Specifier, VersionName]>);
12
+ constructor(packageOf: PackageOf, entries?: Iterable<readonly [Specifier, VersionName]>);
9
13
  set(specifier: Specifier, tag: VersionName): this;
10
14
  clear(): void;
11
15
  pinnedTag(specifier: Specifier): VersionName | undefined;
12
16
  }
13
- export declare function groupByPackage<T>(items: Iterable<T>, nameOf: (item: T) => ExternalName): Map<ExternalName, T[]>;
17
+ export declare function groupByPackage<T>(items: Iterable<T>, nameOf: (item: T) => ExternalName, packageOf: PackageOf): Map<ExternalName, T[]>;
18
+ export {};
@@ -6,6 +6,7 @@ export type Version = {
6
6
  export type ScopedVersion = Version & {
7
7
  bundle?: string;
8
8
  entries: Record<string, string>;
9
+ preload?: true;
9
10
  };
10
11
  export type SharedVersion = Version & {
11
12
  host: boolean;
@@ -21,7 +22,10 @@ export type SharedVersionMeta = {
21
22
  name: RemoteName;
22
23
  bundle?: string;
23
24
  pool?: string;
25
+ dense?: true;
24
26
  entries: Record<string, string>;
25
27
  servedBy?: RemoteName;
26
28
  poolCause?: PoolCause;
29
+ preload?: true;
30
+ dev?: true;
27
31
  };
@@ -0,0 +1,10 @@
1
+ import type { ImportMap } from './import-map.contract';
2
+ export type PreloadCandidate = {
3
+ scopeUrl: string;
4
+ entryFiles: string[];
5
+ bundle?: {
6
+ name: string;
7
+ chunkFiles: string[];
8
+ };
9
+ };
10
+ export declare function eagerPreloadUrls(importMap: ImportMap, candidates: Iterable<PreloadCandidate>): string[];
@@ -1,5 +1,6 @@
1
- import type { ExternalName, RemoteName, VersionName } from '..';
2
- import { type Specifier, SpecifierTags } from '../externals/specifier';
1
+ import type { DeepReadonly } from '../../../utils/deep-readonly';
2
+ import type { ExternalName, RemoteName, SharedVersion, SharedVersionMeta, VersionName } from '..';
3
+ import { type PackageOf, type Specifier, SpecifierTags } from '../externals/specifier';
3
4
  import type { PoolMember } from './membership';
4
5
  export type Copy = {
5
6
  member: ExternalName;
@@ -16,5 +17,10 @@ export type Build = {
16
17
  host: boolean;
17
18
  };
18
19
  export declare function copiesByRemote(members: readonly PoolMember[]): Map<RemoteName, Copy[]>;
20
+ export type RemoteRecord = DeepReadonly<{
21
+ version: SharedVersion;
22
+ meta: SharedVersionMeta;
23
+ }>;
24
+ export declare function recordsByRemote(member: PoolMember): Map<RemoteName, RemoteRecord[]>;
19
25
  export declare const specifierCount: (copies: readonly Copy[]) => number;
20
- export declare function buildOf(owner: RemoteName, copies: readonly Copy[]): Build;
26
+ export declare function buildOf(owner: RemoteName, copies: readonly Copy[], packageOf: PackageOf): Build;
@@ -1,9 +1,10 @@
1
1
  import type { ExternalName, PoolCause, RemoteName, VersionName } from '..';
2
2
  import type { AcceptsTag } from '../externals/compatibility';
3
- import { type Specifier, SpecifierTags } from '../externals/specifier';
3
+ import { type PackageOf, type Specifier, SpecifierTags } from '../externals/specifier';
4
4
  import type { PoolMember } from './membership';
5
5
  type ElectionInput = {
6
6
  members: readonly PoolMember[];
7
+ packageOf: PackageOf;
7
8
  acceptsTag: AcceptsTag;
8
9
  compare: (a: VersionName, b: VersionName) => number;
9
10
  previousWinner?: RemoteName;
@@ -1,7 +1,7 @@
1
1
  import { type ExternalName, type RemoteName, type VersionName } from '..';
2
2
  import type { LoadActions } from '../remote-entry/load-actions.contract';
3
3
  import type { AcceptsTag } from '../externals/compatibility';
4
- import { type Specifier } from '../externals/specifier';
4
+ import { type PackageOf, type Specifier } from '../externals/specifier';
5
5
  import { type Build, type Copy } from './builds';
6
6
  import type { PoolMember } from './membership';
7
7
  type Served = {
@@ -10,6 +10,7 @@ type Served = {
10
10
  file: string;
11
11
  };
12
12
  type CommittedView = {
13
+ packageOf: PackageOf;
13
14
  builds: Map<RemoteName, Build>;
14
15
  global: Map<Specifier, Served>;
15
16
  runsOffMap: Map<RemoteName, Map<Specifier, Served>>;
@@ -39,9 +40,10 @@ type MapPolicy = {
39
40
  shareScope: string;
40
41
  scopeUrlOf: (remote: RemoteName) => string | undefined;
41
42
  };
42
- export declare function committedView(members: PoolMember[], shipped: ReadonlyMap<RemoteName, readonly Copy[]>, recordOrder: ExternalName[], { shareScope, without }: {
43
+ export declare function committedView(members: PoolMember[], shipped: ReadonlyMap<RemoteName, readonly Copy[]>, recordOrder: ExternalName[], { shareScope, without, packageOf, }: {
43
44
  shareScope: string;
44
45
  without?: RemoteName;
46
+ packageOf: PackageOf;
45
47
  }): CommittedView;
46
48
  export declare function judgeRemote(copies: readonly Copy[], view: CommittedView, accepts: AcceptsTag): 'global' | GateMiss;
47
49
  type Binding = {
@@ -1,4 +1,5 @@
1
1
  import type { ExternalName, SharedExternal, shareScope } from '..';
2
+ import { type PackageOf } from '../externals/specifier';
2
3
  import type { DeepReadonly } from '../../../utils/deep-readonly';
3
4
  export type PoolName = string;
4
5
  export type PoolMember = {
@@ -8,10 +9,11 @@ export type PoolMember = {
8
9
  export type Membership = {
9
10
  pools: Map<PoolName, PoolMember[]>;
10
11
  labelledAlone: ExternalName[];
12
+ packageOf: PackageOf;
11
13
  };
12
14
  export type LabelledCopy = {
13
15
  name: ExternalName;
14
16
  pool?: string;
15
17
  };
16
- export declare function buildPools(sharedExternals: DeepReadonly<shareScope>): Membership;
17
- export declare function pooledPackagesWith(sharedExternals: DeepReadonly<shareScope>, copies: readonly LabelledCopy[]): Set<ExternalName>;
18
+ export declare function buildPools(sharedExternals: DeepReadonly<shareScope>, packageOf?: PackageOf): Membership;
19
+ export declare function pooledPackagesWith(sharedExternals: DeepReadonly<shareScope>, copies: readonly LabelledCopy[], packageOf: PackageOf): Set<ExternalName>;
@@ -1,9 +1,11 @@
1
1
  import type { ExternalName, SharedExternal, shareScope } from '../externals/external.contract';
2
2
  import { type PoolMember, type PoolName } from './membership';
3
3
  import type { DeepReadonly } from '../../../utils/deep-readonly';
4
+ import { type PackageOf } from '../externals/specifier';
4
5
  export type ElectionPlan = {
5
6
  pools: Map<PoolName, PoolMember[]>;
6
7
  stripped: Map<ExternalName, SharedExternal>;
7
8
  labelledAlone: ExternalName[];
9
+ packageOf: PackageOf;
8
10
  };
9
11
  export declare function planElection(scope: DeepReadonly<shareScope>, poolable: boolean): ElectionPlan;
@@ -1,4 +1,5 @@
1
1
  export type RemoteModule = {
2
2
  moduleName: string;
3
3
  file: string;
4
+ chunks?: string[];
4
5
  };
@@ -0,0 +1,2 @@
1
+ import type { DenseSharedInfo, RemoteSharedInfo, SharedInfo } from './remote-entry.contract';
2
+ export declare function markDense(shared: (SharedInfo | DenseSharedInfo)[]): (SharedInfo | RemoteSharedInfo)[];
@@ -1,9 +1,12 @@
1
1
  import type { SharedVersionAction } from '../externals/version.contract';
2
2
  import type { RemoteEntryUrl } from './manifest.contract';
3
- import type { DenseSharedInfo, ExposesInfo, FederationInfo, SharedInfo } from '@softarc/native-federation/domain';
3
+ import type { ChunkMap, DenseSharedInfo, ExposesInfo, FederationInfo, SharedInfo } from '@softarc/native-federation/domain';
4
4
  type RawRemoteEntry = FederationInfo;
5
+ type RemoteSharedInfo = DenseSharedInfo & {
6
+ dense?: true;
7
+ };
5
8
  type RemoteEntry = Omit<FederationInfo, 'shared'> & {
6
- shared: DenseSharedInfo[];
9
+ shared: RemoteSharedInfo[];
7
10
  url: RemoteEntryUrl;
8
11
  host?: boolean;
9
12
  override?: boolean;
@@ -12,4 +15,4 @@ type SharedInfoActions = Record<string, {
12
15
  action: SharedVersionAction;
13
16
  override?: Record<string, string>;
14
17
  }>;
15
- export { RawRemoteEntry, RemoteEntry, FederationInfo, ExposesInfo, SharedInfo, DenseSharedInfo, SharedInfoActions, };
18
+ export { RawRemoteEntry, RemoteEntry, ChunkMap, FederationInfo, ExposesInfo, SharedInfo, DenseSharedInfo, RemoteSharedInfo, SharedInfoActions, };
@@ -3,19 +3,16 @@ export type ImportMapConfig = {
3
3
  loadModuleFn: (url: string) => Promise<unknown>;
4
4
  setImportMapFn: SetImportMap;
5
5
  reloadBrowserFn: () => void;
6
+ preloadModulesFn?: PreloadModules;
6
7
  };
8
+ export type PreloadModules = (urls: string[]) => void;
7
9
  export type SetImportMap = (importMap: ImportMap, opts?: {
8
10
  override?: boolean;
9
11
  }) => Promise<ImportMap>;
10
12
  export type ImportMapOptions = Partial<ImportMapConfig> & {
11
13
  /**
12
- * Name of the Trusted Types policy used to wrap import-map content and
13
- * dynamic-import URLs in the default `setImportMapFn` and `loadModuleFn`.
14
- * Pass `false` to disable the policy (e.g. when the host owns its own
15
- * Trusted Types pipeline). Defaults to `'nfo'`.
16
- *
17
- * Has no effect on browsers that do not support Trusted Types — the wrapper
18
- * falls back to a transparent pass-through in that case.
14
+ * Trusted Types policy wrapping the default `setImportMapFn` and `loadModuleFn`; `false` opts out.
15
+ * Defaults to `'nfo'`. No effect on browsers without Trusted Types.
19
16
  */
20
17
  trustedTypesPolicyName?: string | false;
21
18
  };
@@ -1,6 +1,6 @@
1
- export { ImportMapOptions, ImportMapConfig } from './import-map.contract';
1
+ export { ImportMapOptions, ImportMapConfig, PreloadModules } from './import-map.contract';
2
2
  export { LoggingOptions, LogLevel, LogType, LoggingConfig, LogHandler, Logger, } from './log.contract';
3
- export { StorageOptions, StorageEntry, StorageEntryKey, StorageConfig, StorageType, StorageKey, } from './storage.contract';
3
+ export { StorageOptions, StorageEntry, StorageEntryKey, StorageConfig, StorageEntryCreator, StorageEntryHandler, StorageType, StorageKey, } from './storage.contract';
4
4
  export { NFOrchestratorGlobal, NFOrchestratorStorageInfo } from './orchestrator-global.contract';
5
5
  export { ModeOptions, ModeConfig } from './mode.contract';
6
6
  export { HostOptions, HostConfig } from './host.contract';
@@ -4,6 +4,8 @@ export type ModeProfileConfig = {
4
4
  overrideCachedRemotes: 'always' | 'never' | 'init-only';
5
5
  overrideCachedRemotesIfURLMatches: boolean;
6
6
  cacheTag?: string;
7
+ mergeManifests?: boolean;
8
+ enableDebugging?: boolean;
7
9
  };
8
10
  export type ModeFeatureConfig = {
9
11
  convertFlatSharedInfo: boolean;
@@ -1,8 +1,6 @@
1
1
  import type { FederationManifest } from '../../../1.domain';
2
- import type { LoadRemoteModule } from '../../../init-federation.contract';
3
- export type InitResult = {
4
- loadRemoteModule: LoadRemoteModule;
5
- };
2
+ import type { RemoteModuleAccess } from './for-exposing-module-loader.port';
3
+ export type InitResult = RemoteModuleAccess;
6
4
  export type InitFlow = (remotesOrManifestUrl: string | FederationManifest) => Promise<InitResult>;
7
5
  export type RemoteRef = string | {
8
6
  name?: string;
@@ -1,2 +1,6 @@
1
- import type { LoadRemoteModule } from '../../../init-federation.contract';
2
- export type ForExposingModuleLoader = () => Promise<LoadRemoteModule>;
1
+ import type { LoadRemoteModule, PreloadRemoteModule } from '../../../init-federation.contract';
2
+ export type RemoteModuleAccess = {
3
+ loadRemoteModule: LoadRemoteModule;
4
+ preloadRemoteModule: PreloadRemoteModule;
5
+ };
6
+ export type ForExposingModuleLoader = () => Promise<RemoteModuleAccess>;
@@ -4,4 +4,5 @@ export type ForBrowserTasks = {
4
4
  override?: boolean;
5
5
  }) => Promise<ImportMap>;
6
6
  importModule: (url: string) => Promise<unknown>;
7
+ preloadModules?: (urls: string[]) => void;
7
8
  };
@@ -5,6 +5,7 @@ export type ForRemoteInfoStorage = {
5
5
  tryGet: (remoteName: RemoteName) => Optional<RemoteInfo>;
6
6
  remove: (remoteName: RemoteName) => ForRemoteInfoStorage;
7
7
  tryGetModule: (remoteName: RemoteName, exposedModule: string) => Optional<string>;
8
+ getModuleChunkUrls: (remoteName: RemoteName, exposedModule: string) => string[];
8
9
  addOrUpdate: (remoteName: string, remote: RemoteInfo) => ForRemoteInfoStorage;
9
10
  getAll: () => Remotes;
10
11
  commit: () => ForRemoteInfoStorage;
@@ -0,0 +1,4 @@
1
+ import type { DrivingContract } from '../driving-ports/driving.contract';
2
+ import type { ImportMap } from '../../1.domain';
3
+ export type CollectEagerPreloads = (importMap: ImportMap) => string[];
4
+ export declare function createCollectEagerPreloads(ports: Pick<DrivingContract, 'remoteInfoRepo' | 'scopedExternalsRepo' | 'sharedExternalsRepo' | 'sharedChunksRepo'>): CollectEagerPreloads;
@@ -3,4 +3,4 @@ import type { DrivingContract } from '../driving-ports/driving.contract';
3
3
  import type { LoggingConfig } from '../config/log.contract';
4
4
  import type { ModeConfig } from '../config/mode.contract';
5
5
  import type { HostConfig } from '../config/host.contract';
6
- export declare function createGetRemoteEntries(config: LoggingConfig & ModeConfig & HostConfig, ports: Pick<DrivingContract, 'remoteEntryProvider' | 'manifestProvider' | 'remoteInfoRepo' | 'sse'>): ForGettingRemoteEntries;
6
+ export declare function createGetRemoteEntries(config: LoggingConfig & ModeConfig & HostConfig, ports: Pick<DrivingContract, 'remoteEntryProvider' | 'manifestProvider' | 'remoteInfoRepo' | 'scopedExternalsRepo' | 'sharedExternalsRepo' | 'sharedChunksRepo' | 'sse'>): ForGettingRemoteEntries;
@@ -0,0 +1,4 @@
1
+ import type { Logger } from '../config/log.contract';
2
+ import type { ForBrowserTasks } from '../driving-ports/for-browser-tasks';
3
+ export type PreloadHint = (collectUrls: () => string[]) => void;
4
+ export declare function createPreloadHint(log: Logger, browser: Pick<ForBrowserTasks, 'preloadModules'>, logStep: number): PreloadHint;
@@ -4,11 +4,6 @@ import type { LoggingConfig } from '../config/log.contract';
4
4
  import type { ModeConfig } from '../config/mode.contract';
5
5
  export type StoreRemoteEntry = (remoteEntry: RemoteEntry, onSharedExternal: SharedExternalHandler) => void;
6
6
  export type RemoveCachedRemoteEntries = (remoteNames: ReadonlySet<RemoteName>) => void;
7
- /**
8
- * Evict overridden remotes before their replacements are merged in. Kept out of `storeRemoteEntry`
9
- * because `removeFromAllScopes` costs a full traversal of the shared-externals graph: the init
10
- * pipeline evicts its whole override set at once, the dynamic pipeline passes a single name.
11
- */
12
7
  export declare function createRemoveCachedRemoteEntries(ports: Pick<DrivingContract, 'remoteInfoRepo' | 'scopedExternalsRepo' | 'sharedExternalsRepo' | 'sharedChunksRepo'>): RemoveCachedRemoteEntries;
13
8
  export type SharedExternalHandler = (remoteEntry: RemoteEntry, external: DenseSharedInfo, ctx: SharedExternalContext) => void;
14
9
  export type SharedExternalContext = {
@@ -19,13 +14,4 @@ export type SharedExternalContext = {
19
14
  assertSameVersionCompatibility: (matchingVersion: SharedVersion) => void;
20
15
  write: () => void;
21
16
  };
22
- /**
23
- * Not a pipeline step but the template both storage steps specialize: it owns the merge sequence
24
- * for a remoteEntry, and only the resolution of a singleton external differs between the init
25
- * pipeline (process-remote-entries, step 2) and the dynamic pipeline (update-cache, step 8),
26
- * injected per call. Evicting an overridden remote is the caller's job, see
27
- * `createRemoveCachedRemoteEntries` — every entry reaching here is merged additively. The
28
- * pipelines must not be merged, see docs/version-resolver.md "Dynamic Init". If a change ever
29
- * needs a flag or parameter here to serve only one caller, inline this back into the steps instead.
30
- */
31
17
  export declare function createStoreRemoteEntry(config: LoggingConfig & ModeConfig, ports: Pick<DrivingContract, 'remoteInfoRepo' | 'scopedExternalsRepo' | 'sharedExternalsRepo' | 'sharedChunksRepo' | 'versionCheck'>, logStep: number): StoreRemoteEntry;
@@ -0,0 +1,4 @@
1
+ import type { RawRemoteEntry, RemoteEntry } from '../../1.domain/remote-entry/remote-entry.contract';
2
+ import type { ModeConfig } from '../../2.app/config/mode.contract';
3
+ declare const normalizeRemoteEntry: (raw: RawRemoteEntry, remoteEntryUrl: string, config: ModeConfig) => RemoteEntry;
4
+ export { normalizeRemoteEntry };
@@ -1,3 +1,5 @@
1
1
  export * from './use-import-shim';
2
2
  export * from './use-default';
3
3
  export * from './replace-in-dom';
4
+ export * from './preload-in-dom';
5
+ export * from './no-preload';
@@ -0,0 +1,2 @@
1
+ import type { PreloadModules } from '../../2.app/config/import-map.contract';
2
+ export declare const noPreload: PreloadModules;
@@ -0,0 +1,2 @@
1
+ import type { PreloadModules } from '../../2.app/config/import-map.contract';
2
+ export declare const preloadInDOM: (rel: "modulepreload" | "modulepreload-shim") => PreloadModules;
@@ -1,2 +1,3 @@
1
1
  import { type StorageConfig, type StorageOptions } from '../../2.app/config/storage.contract';
2
- export declare const createStorageConfig: (override: StorageOptions) => StorageConfig;
2
+ import type { LogHandler } from '../../2.app/config/log.contract';
3
+ export declare const createStorageConfig: (override: StorageOptions, log: LogHandler) => StorageConfig;
@@ -1,12 +1,13 @@
1
1
  import type { ConfigContract } from '../2.app/config/config.contract';
2
2
  import type { DrivingContract } from '../2.app/driving-ports/driving.contract';
3
3
  import type { InitRemoteEntryFlow } from '../2.app/driver-ports/init/flow.contract';
4
- import type { LoadRemoteModule, NativeFederationResult } from '../init-federation.contract';
4
+ import type { LoadRemoteModule, NativeFederationResult, PreloadRemoteModule } from '../init-federation.contract';
5
5
  export { createStateDump } from '../2.app/steps/rollback-changes';
6
- export declare const createFederationResult: ({ config, adapters, loadRemoteModule, initRemoteEntryFlow, afterInitRemoteEntry, }: {
6
+ export declare const createFederationResult: ({ config, adapters, loadRemoteModule, preloadRemoteModule, initRemoteEntryFlow, afterInitRemoteEntry, }: {
7
7
  config: ConfigContract;
8
8
  adapters: DrivingContract;
9
9
  loadRemoteModule: LoadRemoteModule;
10
+ preloadRemoteModule?: PreloadRemoteModule;
10
11
  initRemoteEntryFlow: InitRemoteEntryFlow;
11
12
  afterInitRemoteEntry?: () => Promise<unknown>;
12
13
  }) => NativeFederationResult;
@@ -2,12 +2,14 @@ import type { ConfigContract } from './2.app/config/config.contract';
2
2
  import type { DrivingContract } from './2.app/driving-ports/driving.contract';
3
3
  import type { DynamicInitResult } from './2.app/driver-ports/init/flow.contract';
4
4
  export type LoadRemoteModule = <TModule = unknown>(remoteName: string, exposedModule: string) => Promise<TModule>;
5
+ export type PreloadRemoteModule = (remoteName: string, exposedModule: string) => void;
5
6
  export type LoadRemoteModuleOf<TModule> = (remoteName: string, exposedModule: string) => Promise<TModule>;
6
7
  export type NativeFederationResult = DynamicInitResult<{
7
8
  config: ConfigContract;
8
9
  adapters: DrivingContract;
9
10
  loadRemoteModule: LoadRemoteModule;
10
11
  load: LoadRemoteModule;
12
+ preloadRemoteModule: PreloadRemoteModule;
11
13
  as: <TModule = unknown>() => {
12
14
  loadRemoteModule: LoadRemoteModuleOf<TModule>;
13
15
  load: LoadRemoteModuleOf<TModule>;
@@ -1,6 +1,6 @@
1
1
  export { initFederation } from './core/init-federation';
2
2
  export { NFError } from './core/native-federation.error';
3
- export { LoadRemoteModule, LoadRemoteModuleOf, NativeFederationResult, } from './core/init-federation.contract';
3
+ export { LoadRemoteModule, LoadRemoteModuleOf, NativeFederationResult, PreloadRemoteModule, } from './core/init-federation.contract';
4
4
  export { FederationManifest } from './core/1.domain/remote-entry/manifest.contract';
5
5
  export { createConfigHandlers } from './core/5.di/config.factory';
6
6
  export { createDriving } from './core/5.di/driving.factory';
@@ -1,3 +1,4 @@
1
+ import type { ModeConfig } from '../../core/2.app/config/mode.contract';
1
2
  import type { ForProvidingRemoteEntries } from '../../core/2.app/driving-ports/for-providing-remote-entries.port';
2
- declare const createFsRemoteEntryProvider: () => ForProvidingRemoteEntries;
3
+ declare const createFsRemoteEntryProvider: (config: ModeConfig) => ForProvidingRemoteEntries;
3
4
  export { createFsRemoteEntryProvider };
@@ -18,13 +18,8 @@ export type InitNodeFederationOptions = NFOptions & {
18
18
  * - **`{ include, exclude }`** — auto-derive, filtered by exact/prefix match,
19
19
  * e.g. `{ include: ['@angular/', 'rxjs', 'zone.js'] }`.
20
20
  *
21
- * This is an escape hatch that bypasses the version resolver, the import map,
22
- * and integrity checks entirely. Exports are value snapshots, not live
23
- * bindings — fine for packages whose exports are stable refs (Angular's
24
- * classes/functions), not for packages that reassign their exports after init.
25
- *
26
- * Omit in production: with no `hostInstances`, nothing is published and the
27
- * loader never routes to the bridge — resolution is import-map only.
21
+ * Bypasses the version resolver, the import map and integrity checks. Exports are value snapshots, not
22
+ * live bindings, so not for packages that reassign their exports after init. Omit in production.
28
23
  */
29
24
  hostInstances?: HostInstancesOption;
30
25
  };
@@ -1,5 +1,5 @@
1
1
  export { initNodeFederation } from './node/init-federation.node';
2
2
  export type { InitNodeFederationOptions, HostInstancesOption, HostInstancesAuto, } from './node/init-federation.node';
3
3
  export { NFError } from './core/native-federation.error';
4
- export type { LoadRemoteModule, LoadRemoteModuleOf, NativeFederationResult, } from './core/init-federation.contract';
4
+ export type { LoadRemoteModule, LoadRemoteModuleOf, NativeFederationResult, PreloadRemoteModule, } from './core/init-federation.contract';
5
5
  export type { FederationManifest } from './core/1.domain/remote-entry/manifest.contract';
@@ -0,0 +1,4 @@
1
+ export declare function unionFind(): {
2
+ find: (node: string) => string;
3
+ union: (a: string, b: string) => void;
4
+ };