From d682baea67dbb80af18a86a3a035e5c2dc7746db Mon Sep 17 00:00:00 2001 From: Colum Ferry Date: Mon, 16 Sep 2024 14:47:31 +0100 Subject: [PATCH] fix(angular): dynamic module federation should not reset remoteUrlDefinitions #27793 (#27927) ## Current Behavior When the `@nx/angular/mf` file is loaded, it sets `remoteUrlDefinitions = {}`. As this is a global, this can lead to erroneous behaviour by resetting existing definitions. It is also always truthy, breaking logic on whether urls need to be set or not. ## Expected Behavior The object should be conditionally set if undefined when calling `setRemoteDefinition` ## Related Issue(s) Fixes #27793, #27842 --- packages/angular/mf/mf.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/angular/mf/mf.ts b/packages/angular/mf/mf.ts index a1d65b1926..8184174b9e 100644 --- a/packages/angular/mf/mf.ts +++ b/packages/angular/mf/mf.ts @@ -6,23 +6,27 @@ declare const __webpack_init_sharing__: (scope: 'default') => Promise; declare const __webpack_share_scopes__: { default: unknown }; let resolveRemoteUrl: ResolveRemoteUrlFunction; + export function setRemoteUrlResolver( _resolveRemoteUrl: ResolveRemoteUrlFunction ) { resolveRemoteUrl = _resolveRemoteUrl; } -let remoteUrlDefinitions: Record = {}; +let remoteUrlDefinitions: Record; + export function setRemoteDefinitions(definitions: Record) { remoteUrlDefinitions = definitions; } export function setRemoteDefinition(remoteName: string, remoteUrl: string) { + remoteUrlDefinitions ??= {}; remoteUrlDefinitions[remoteName] = remoteUrl; } let remoteModuleMap = new Map(); let remoteContainerMap = new Map(); + export async function loadRemoteModule(remoteName: string, moduleName: string) { const remoteModuleKey = `${remoteName}:${moduleName}`; if (remoteModuleMap.has(remoteModuleKey)) { @@ -46,6 +50,7 @@ function loadModule(url: string) { } let initialSharingScopeCreated = false; + async function loadRemoteContainer(remoteName: string) { if (!resolveRemoteUrl && !remoteUrlDefinitions) { throw new Error(