@softarc/native-federation-runtime 3.4.2 → 3.5.1

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.
@@ -20,6 +20,7 @@ function getShared(options = defaultShareOptions) {
20
20
  const shareObj = {
21
21
  version,
22
22
  get: async () => {
23
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
23
24
  const lib = await window.importShim(path);
24
25
  return () => lib;
25
26
  },
@@ -37,13 +38,13 @@ function getShared(options = defaultShareOptions) {
37
38
  }
38
39
 
39
40
  const nfNamespace = '__NATIVE_FEDERATION__';
40
- const global = globalThis;
41
- global[nfNamespace] ??= {
41
+ const global$1 = globalThis;
42
+ global$1[nfNamespace] ??= {
42
43
  externals: new Map(),
43
44
  remoteNamesToRemote: new Map(),
44
45
  baseUrlToRemoteNames: new Map(),
45
46
  };
46
- const globalCache = global[nfNamespace];
47
+ const globalCache = global$1[nfNamespace];
47
48
 
48
49
  const externals = globalCache.externals;
49
50
  function getExternalKey(shared) {
@@ -84,18 +85,53 @@ function hasRemote(remoteName) {
84
85
  return remoteNamesToRemote.has(remoteName);
85
86
  }
86
87
 
88
+ const global = globalThis;
89
+ let policy;
90
+ function createPolicy() {
91
+ if (policy === undefined) {
92
+ policy = null;
93
+ if (global.trustedTypes) {
94
+ try {
95
+ policy = global.trustedTypes.createPolicy('native-federation', {
96
+ createHTML: (html) => html,
97
+ createScript: (script) => script,
98
+ createScriptURL: (url) => url,
99
+ });
100
+ }
101
+ catch {
102
+ // trustedTypes.createPolicy may throw an exception if called with a name that is already registered, even in report-only mode.
103
+ }
104
+ }
105
+ }
106
+ return policy;
107
+ }
108
+ function tryCreateTrustedScript(script) {
109
+ return createPolicy()?.createScript(script) ?? script;
110
+ }
111
+
87
112
  function appendImportMap(importMap) {
88
113
  document.head.appendChild(Object.assign(document.createElement('script'), {
89
- type: 'importmap-shim',
90
- innerHTML: JSON.stringify(importMap),
114
+ type: tryCreateTrustedScript('importmap-shim'),
115
+ textContent: tryCreateTrustedScript(JSON.stringify(importMap)),
91
116
  }));
92
117
  }
93
118
 
119
+ /**
120
+ * Returns the full directory of a given path.
121
+ * @param url - The path to get the directory of.
122
+ * @returns The full directory of the path.
123
+ */
94
124
  function getDirectory(url) {
95
125
  const parts = url.split('/');
96
126
  parts.pop();
97
127
  return parts.join('/');
98
128
  }
129
+ /**
130
+ * Joins two paths together taking into account trailing slashes and "./" prefixes.
131
+ * @param path1 - The first path to join.
132
+ * @param path2 - The second path to join.
133
+ * @returns The joined path.
134
+ */
99
135
  function joinPaths(path1, path2) {
100
136
  while (path1.endsWith('/')) {
101
137
  path1 = path1.substring(0, path1.length - 1);
@@ -137,102 +173,306 @@ function watchFederationBuildCompletion(endpoint) {
137
173
  }
138
174
 
139
175
  /**
140
- * Initialize the federation runtime
141
- * @param remotesOrManifestUrl
142
- * @param options The cacheTag allows you to invalidate the cache of the remoteEntry.json files, pass a new value with every release (f.ex. the version number)
176
+ * Initializes the Native Federation runtime for the host application.
177
+ *
178
+ * This is the main entry point for setting up federation. It performs the following:
179
+ * 1. Loads the host's remoteEntry.json to discover shared dependencies
180
+ * 2. Loads each remote's remoteEntry.json to discover exposed modules
181
+ * 3. Creates an ES Module import map with proper scoping
182
+ * 4. Injects the import map into the DOM as a <script type="importmap-shim">
183
+ *
184
+ * The import map allows dynamic imports to resolve correctly:
185
+ * - Host shared deps go in root imports (e.g., "angular": "./angular.js")
186
+ * - Remote exposed modules go in root imports (e.g., "mfe1/Component": "http://...")
187
+ * - Remote shared deps go in scoped imports for proper resolution
188
+ *
189
+ * @param remotesOrManifestUrl - Either:
190
+ * - A record of remote names to their remoteEntry.json URLs
191
+ * Example: { mfe1: 'http://localhost:3000/remoteEntry.json' }
192
+ * - A URL to a manifest.json that contains the remotes record
193
+ * Example: 'http://localhost:3000/federation-manifest.json'
194
+ *
195
+ * @param options - Configuration options:
196
+ * - cacheTag: A version string to append as query param for cache busting
197
+ * Example: { cacheTag: 'v1.0.0' } results in '?t=v1.0.0' on all requests
198
+ *
199
+ * @returns The final merged ImportMap that was injected into the DOM
200
+ *
143
201
  */
144
202
  async function initFederation(remotesOrManifestUrl = {}, options) {
145
- const cacheOption = options?.cacheTag ? `?t=${options.cacheTag}` : '';
146
- const remotes = typeof remotesOrManifestUrl === 'string'
147
- ? await loadManifest(remotesOrManifestUrl + cacheOption)
203
+ const cacheTag = options?.cacheTag ? `?t=${options.cacheTag}` : '';
204
+ const normalizedRemotes = typeof remotesOrManifestUrl === 'string'
205
+ ? await loadManifest(remotesOrManifestUrl + cacheTag)
148
206
  : remotesOrManifestUrl;
149
- const url = './remoteEntry.json' + cacheOption;
150
- const hostInfo = await loadFederationInfo(url);
207
+ const hostInfo = await loadFederationInfo(`./remoteEntry.json${cacheTag}`);
151
208
  const hostImportMap = await processHostInfo(hostInfo);
152
- const remotesImportMap = await processRemoteInfos(remotes, {
209
+ // Host application is fully loaded, now we can process the remotes
210
+ // Each remote contributes:
211
+ // - Exposed modules to root imports
212
+ // - Shared dependencies to scoped imports
213
+ const remotesImportMap = await processRemoteInfos(normalizedRemotes, {
153
214
  throwIfRemoteNotFound: false,
154
215
  ...options,
155
216
  });
156
- const importMap = mergeImportMaps(hostImportMap, remotesImportMap);
157
- appendImportMap(importMap);
158
- return importMap;
217
+ const mergedImportMap = mergeImportMaps(hostImportMap, remotesImportMap);
218
+ // Inject the final import map into the DOM with importmap-shim
219
+ appendImportMap(mergedImportMap);
220
+ return mergedImportMap;
159
221
  }
160
- async function loadManifest(remotes) {
161
- return (await fetch(remotes).then((r) => r.json()));
222
+ /**
223
+ * Loads a federation manifest file (JSON) from the given URL.
224
+ *
225
+ * The manifest should map remote names to their remoteEntry.json URLs.
226
+ *
227
+ * @param manifestUrl - The URL to the manifest.json file.
228
+ * @returns A promise resolving to an object mapping remote names to their remoteEntry.json URLs.
229
+ */
230
+ async function loadManifest(manifestUrl) {
231
+ const manifest = (await fetch(manifestUrl).then((r) => r.json()));
232
+ return manifest;
162
233
  }
234
+ /**
235
+ * Adds cache busting query parameter to a URL if cacheTag is provided.
236
+ */
237
+ function applyCacheTag(url, cacheTag) {
238
+ if (!cacheTag)
239
+ return url;
240
+ const separator = url.includes('?') ? '&' : '?';
241
+ return `${url}${separator}t=${cacheTag}`;
242
+ }
243
+ /**
244
+ * Handles errors when loading a remote entry.
245
+ * Either throws or logs based on options.
246
+ */
247
+ function handleRemoteLoadError(remoteName, remoteUrl, options, originalError) {
248
+ const errorMessage = `Error loading remote entry for ${remoteName} from file ${remoteUrl}`;
249
+ if (options.throwIfRemoteNotFound) {
250
+ throw new Error(errorMessage);
251
+ }
252
+ console.error(errorMessage);
253
+ console.error(originalError);
254
+ return null;
255
+ }
256
+ /**
257
+ * Fetches and registers multiple remote applications in parallel and merges their import maps.
258
+ *
259
+ * This function is the orchestrator for loading all remotes. It:
260
+ * 1. Creates a promise for each remote to load its remoteEntry.json
261
+ * 2. Applies cache busting to each remote URL
262
+ * 3. Handles errors gracefully (logs or throws based on options)
263
+ * 4. Merges all successful remote import maps into one
264
+ *
265
+ * Each remote contributes:
266
+ * - Its exposed modules to the root imports
267
+ * - Its shared dependencies to scoped imports
268
+ *
269
+ * @param remotes - Record of remote names to their remoteEntry.json URLs
270
+ * @param options - Processing options including:
271
+ * - throwIfRemoteNotFound: Whether to throw or log on remote load failure
272
+ * - cacheTag: Cache busting tag to append to URLs
273
+ *
274
+ * @returns Merged import map containing all remotes' contributions
275
+ *
276
+ */
163
277
  async function processRemoteInfos(remotes, options = { throwIfRemoteNotFound: false }) {
164
- const processRemoteInfoPromises = Object.keys(remotes).map(async (remoteName) => {
278
+ // Each promise will independently fetch and process its remoteEntry.json
279
+ const fetchAndRegisterRemotePromises = Object.entries(remotes).map(async ([remoteName, remoteUrl]) => {
165
280
  try {
166
- let url = remotes[remoteName];
167
- if (options.cacheTag) {
168
- const addAppend = remotes[remoteName].includes('?') ? '&' : '?';
169
- url += `${addAppend}t=${options.cacheTag}`;
170
- }
171
- return await processRemoteInfo(url, remoteName);
281
+ const urlWithCache = applyCacheTag(remoteUrl, options.cacheTag);
282
+ return await fetchAndRegisterRemote(urlWithCache, remoteName);
172
283
  }
173
284
  catch (e) {
174
- const error = `Error loading remote entry for ${remoteName} from file ${remotes[remoteName]}`;
175
- if (options.throwIfRemoteNotFound) {
176
- throw new Error(error);
177
- }
178
- console.error(error);
179
- return null;
285
+ return handleRemoteLoadError(remoteName, remoteUrl, options, e);
180
286
  }
181
287
  });
182
- const remoteImportMaps = await Promise.all(processRemoteInfoPromises);
288
+ const remoteImportMaps = await Promise.all(fetchAndRegisterRemotePromises);
289
+ // Filter out failed remotes (null values) and merge successful ones
183
290
  const importMap = remoteImportMaps.reduce((acc, remoteImportMap) => remoteImportMap ? mergeImportMaps(acc, remoteImportMap) : acc, { imports: {}, scopes: {} });
184
291
  return importMap;
185
292
  }
186
- async function processRemoteInfo(federationInfoUrl, remoteName) {
293
+ /**
294
+ * Fetches a single remote application's remoteEntry.json file and registers it in the system (global registry).
295
+ *
296
+ * This function handles everything needed to integrate one remote:
297
+ * 1. Fetches the remote's remoteEntry.json file
298
+ * 2. Extracts the base URL from the remoteEntry path
299
+ * 3. Creates import map entries for exposed modules and shared deps
300
+ * 4. Registers the remote in the global remotes registry
301
+ * 5. Sets up hot reload watching if configured (development mode)
302
+ *
303
+ * @param federationInfoUrl - Full URL to the remote's remoteEntry.json
304
+ * @param remoteName - Name to use for this remote (optional, uses info.name if not provided)
305
+ *
306
+ * @returns Import map containing this remote's exposed modules and shared dependencies
307
+ *
308
+ * @example
309
+ * ```typescript
310
+ * const importMap = await fetchAndRegisterRemote(
311
+ * 'http://localhost:3000/mfe1/remoteEntry.json',
312
+ * 'mfe1'
313
+ * );
314
+ * // Result: {
315
+ * // imports: { 'mfe1/Component': 'http://localhost:3000/mfe1/Component.js' },
316
+ * // scopes: { 'http://localhost:3000/mfe1/': { 'lodash': '...' } }
317
+ * // }
318
+ * ```
319
+ */
320
+ async function fetchAndRegisterRemote(federationInfoUrl, remoteName) {
187
321
  const baseUrl = getDirectory(federationInfoUrl);
188
322
  const remoteInfo = await loadFederationInfo(federationInfoUrl);
323
+ // Uses the name from the remote's remoteEntry.json if not explicitly provided
189
324
  if (!remoteName) {
190
325
  remoteName = remoteInfo.name;
191
326
  }
327
+ // Setup hot reload watching for development mode and in case it has a build notifications endpoint
192
328
  if (remoteInfo.buildNotificationsEndpoint) {
193
329
  watchFederationBuildCompletion(baseUrl + remoteInfo.buildNotificationsEndpoint);
194
330
  }
195
331
  const importMap = createRemoteImportMap(remoteInfo, remoteName, baseUrl);
332
+ // Register this remote in the global registry
196
333
  addRemote(remoteName, { ...remoteInfo, baseUrl });
197
334
  return importMap;
198
335
  }
336
+ /**
337
+ * Creates an import map for a remote application.
338
+ *
339
+ * The import map has two parts:
340
+ * 1. Imports (root level): Maps remote's exposed modules
341
+ * Example: "mfe1/Component" -> "http://localhost:3000/mfe1/Component.js"
342
+ *
343
+ * 2. Scopes: Maps remote's shared dependencies within its scope
344
+ * Example: "http://localhost:3000/mfe1/": { "lodash": "http://localhost:3000/mfe1/lodash.js" }
345
+ *
346
+ * Scoping ensures that when a module from this remote imports 'lodash',
347
+ * it gets the version from this remote's bundle, not another version.
348
+ *
349
+ * @param remoteInfo - Federation info from the remote's remoteEntry.json
350
+ * @param remoteName - Name used to prefix exposed module keys
351
+ * @param baseUrl - Base URL where the remote is hosted
352
+ *
353
+ * @returns Import map with imports and scopes for this remote
354
+ */
199
355
  function createRemoteImportMap(remoteInfo, remoteName, baseUrl) {
200
356
  const imports = processExposed(remoteInfo, remoteName, baseUrl);
201
357
  const scopes = processRemoteImports(remoteInfo, baseUrl);
202
358
  return { imports, scopes };
203
359
  }
204
- async function loadFederationInfo(url) {
205
- const info = (await fetch(url).then((r) => r.json()));
360
+ /**
361
+ * Fetches and parses a remoteEntry.json file.
362
+ *
363
+ * The remoteEntry.json contains metadata about a federated module:
364
+ * - name: The application name
365
+ * - exposes: Array of modules this app exposes to others
366
+ * - shared: Array of dependencies this app shares
367
+ * - buildNotificationsEndpoint: Optional SSE endpoint for hot reload (development mode)
368
+ *
369
+ * @param remoteEntryUrl - URL to the remoteEntry.json file (can be relative or absolute)
370
+ * @returns Parsed federation info object
371
+ */
372
+ async function loadFederationInfo(remoteEntryUrl) {
373
+ const info = (await fetch(remoteEntryUrl).then((r) => r.json()));
206
374
  return info;
207
375
  }
376
+ /**
377
+ * Processes a remote's shared dependencies into scoped import map entries.
378
+ *
379
+ * Shared dependencies need to be scoped to avoid version conflicts.
380
+ * When a module from "http://localhost:3000/mfe1/" imports "lodash",
381
+ * the import map scope ensures it gets the correct version.
382
+ *
383
+ * Scope structure:
384
+ * {
385
+ * "http://localhost:3000/mfe1/": {
386
+ * "lodash": "http://localhost:3000/mfe1/lodash.js",
387
+ * "rxjs": "http://localhost:3000/mfe1/rxjs.js"
388
+ * }
389
+ * }
390
+ *
391
+ * This function also manages external URLs - if a shared dependency
392
+ * has already been loaded from another location, it can reuse that URL.
393
+ *
394
+ * @param remoteInfo - Federation info containing shared dependencies
395
+ * @param baseUrl - Base URL of the remote (used as the scope key)
396
+ *
397
+ * @returns Scopes object mapping baseUrl to its shared dependencies
398
+ */
208
399
  function processRemoteImports(remoteInfo, baseUrl) {
209
400
  const scopes = {};
210
401
  const scopedImports = {};
211
402
  for (const shared of remoteInfo.shared) {
403
+ // Check if this dependency already has an external URL registered
404
+ // If not, construct the URL from the base path and output filename
212
405
  const outFileName = getExternalUrl(shared) ?? joinPaths(baseUrl, shared.outFileName);
406
+ // Register this URL as the external location for this shared dependency
407
+ // This allows other remotes to potentially reuse this version
213
408
  setExternalUrl(shared, outFileName);
409
+ // Add to the scoped imports: package name -> full URL
214
410
  scopedImports[shared.packageName] = outFileName;
215
411
  }
216
412
  scopes[baseUrl + '/'] = scopedImports;
217
413
  return scopes;
218
414
  }
415
+ /**
416
+ * Processes a remote's exposed modules into root-level import map entries.
417
+ *
418
+ * Exposed modules are what the remote makes available to other applications.
419
+ * They go in the root imports (not scoped) so any app can import them.
420
+ *
421
+ * Example exposed module:
422
+ * - Remote 'mfe1' exposes './Component' from file 'Component.js'
423
+ * - Results in: "mfe1/Component" -> "http://localhost:3000/mfe1/Component.js"
424
+ *
425
+ * This allows other apps to do:
426
+ * ```typescript
427
+ * import { Component } from 'mfe1/Component';
428
+ * ```
429
+ *
430
+ * @param remoteInfo - Federation info containing exposed modules
431
+ * @param remoteName - Name to prefix the exposed keys with
432
+ * @param baseUrl - Base URL where the remote's files are hosted
433
+ *
434
+ * @returns Imports object mapping remote module keys to their URLs
435
+ */
219
436
  function processExposed(remoteInfo, remoteName, baseUrl) {
220
437
  const imports = {};
221
438
  for (const exposed of remoteInfo.exposes) {
439
+ // Create the import key by joining remote name with the exposed key
440
+ // Example: 'mfe1' + './Component' -> 'mfe1/Component'
222
441
  const key = joinPaths(remoteName, exposed.key);
442
+ // Create the full URL to the exposed module's output file
443
+ // Example: 'http://localhost:3000/mfe1' + 'Component.js' -> 'http://localhost:3000/mfe1/Component.js'
223
444
  const value = joinPaths(baseUrl, exposed.outFileName);
224
445
  imports[key] = value;
225
446
  }
226
447
  return imports;
227
448
  }
449
+ /**
450
+ * Processes the host application's federation info into an import map.
451
+ *
452
+ * The host app typically doesn't expose modules (it's the consumer),
453
+ * but it does share dependencies that should be available to remotes.
454
+ *
455
+ * Host shared dependencies go in root-level imports (not scoped) because:
456
+ * 1. The host loads first and establishes the base environment
457
+ * 2. Remotes should prefer host versions to avoid duplication
458
+ *
459
+ * @param hostInfo - Federation info from the host's remoteEntry.json
460
+ * @param relBundlesPath - Relative path to the host's bundle directory (default: './')
461
+ *
462
+ * @returns Import map with host's shared dependencies in root imports
463
+ */
228
464
  async function processHostInfo(hostInfo, relBundlesPath = './') {
465
+ // Transform shared array into imports object
229
466
  const imports = hostInfo.shared.reduce((acc, cur) => ({
230
467
  ...acc,
231
468
  [cur.packageName]: relBundlesPath + cur.outFileName,
232
469
  }), {});
470
+ // Register external URLs for host's shared dependencies
471
+ // This allows remotes to discover and potentially reuse these versions
233
472
  for (const shared of hostInfo.shared) {
234
473
  setExternalUrl(shared, relBundlesPath + shared.outFileName);
235
474
  }
475
+ // Host doesn't have scopes - its shared deps are at root level
236
476
  return { imports, scopes: {} };
237
477
  }
238
478
 
@@ -243,31 +483,32 @@ async function loadRemoteModule(optionsOrRemoteName, exposedModule) {
243
483
  const remoteName = getRemoteNameByOptions(options);
244
484
  const remote = getRemote(remoteName);
245
485
  const fallback = options.fallback;
486
+ // Handles errors when the remote is missing
246
487
  const remoteError = !remote ? 'unknown remote ' + remoteName : '';
247
- if (!remote && !fallback) {
488
+ if (!remote && !fallback)
248
489
  throw new Error(remoteError);
249
- }
250
- else if (!remote) {
490
+ if (!remote) {
251
491
  logClientError(remoteError);
252
492
  return Promise.resolve(fallback);
253
493
  }
254
- const exposed = remote.exposes.find((e) => e.key === options.exposedModule);
255
- const exposedError = !exposed
494
+ const exposedModuleInfo = remote.exposes.find((e) => e.key === options.exposedModule);
495
+ // Handles errors when the exposed module is missing
496
+ const exposedError = !exposedModuleInfo
256
497
  ? `Unknown exposed module ${options.exposedModule} in remote ${remoteName}`
257
498
  : '';
258
- if (!exposed && !fallback) {
499
+ if (!exposedModuleInfo && !fallback)
259
500
  throw new Error(exposedError);
260
- }
261
- else if (!exposed) {
501
+ if (!exposedModuleInfo) {
262
502
  logClientError(exposedError);
263
503
  return Promise.resolve(fallback);
264
504
  }
265
- const url = joinPaths(remote.baseUrl, exposed.outFileName);
505
+ const moduleUrl = joinPaths(remote.baseUrl, exposedModuleInfo.outFileName);
266
506
  try {
267
- const module = _import(url);
507
+ const module = _import(moduleUrl);
268
508
  return module;
269
509
  }
270
510
  catch (e) {
511
+ // Handles errors when the module import fails
271
512
  if (fallback) {
272
513
  console.error('error loading remote module', e);
273
514
  return fallback;
@@ -275,11 +516,32 @@ async function loadRemoteModule(optionsOrRemoteName, exposedModule) {
275
516
  throw e;
276
517
  }
277
518
  }
278
- function _import(url) {
519
+ /**
520
+ * Internal helper function to perform the dynamic import.
521
+ *
522
+ * @template T - The expected type of the module's exports
523
+ * @param moduleUrl - Full URL to the module file to import
524
+ * @returns Promise resolving to the imported module
525
+ */
526
+ function _import(moduleUrl) {
279
527
  return typeof importShim !== 'undefined'
280
- ? importShim(url)
281
- : import(/* @vite-ignore */ url);
528
+ ? importShim(moduleUrl)
529
+ : import(/* @vite-ignore */ moduleUrl);
282
530
  }
531
+ /**
532
+ * Resolves the remote name from the provided options.
533
+ *
534
+ * The remote name can be determined in two ways:
535
+ * 1. If options.remoteName is provided, use it directly
536
+ * 2. If only remoteEntry is provided, extract the baseUrl
537
+ * and look up the remote name from the registry using that baseUrl
538
+ *
539
+ * @param options - Load options containing remoteName and/or remoteEntry
540
+ * @returns The resolved remote name
541
+ *
542
+ * @throws Error if neither remoteName nor remoteEntry is provided
543
+ * @throws Error if the remote name cannot be determined
544
+ */
283
545
  function getRemoteNameByOptions(options) {
284
546
  let remoteName;
285
547
  if (options.remoteName) {
@@ -297,13 +559,42 @@ function getRemoteNameByOptions(options) {
297
559
  }
298
560
  return remoteName;
299
561
  }
562
+ /**
563
+ * Ensures that the remote is initialized before attempting to load a module from it.
564
+ *
565
+ * This function enables lazy-loading of remotes that weren't registered during
566
+ * the initial `initFederation()` call. It checks if:
567
+ * 1. A remoteEntry URL is provided in the options
568
+ * 2. The remote at that URL hasn't been initialized yet
569
+ *
570
+ * If both conditions are true, it:
571
+ * 1. Fetches the remote's remoteEntry.json file
572
+ * 2. Registers the remote in the global registry
573
+ * 3. Creates and appends the remote's import map to the DOM
574
+ *
575
+ * @param options - Load options containing optional remoteEntry URL
576
+ * @returns Promise that resolves when the remote is initialized (or immediately if already initialized)
577
+ *
578
+ */
300
579
  async function ensureRemoteInitialized(options) {
301
580
  if (options.remoteEntry &&
302
581
  !isRemoteInitialized(getDirectory(options.remoteEntry))) {
303
- const importMap = await processRemoteInfo(options.remoteEntry);
582
+ const importMap = await fetchAndRegisterRemote(options.remoteEntry);
304
583
  appendImportMap(importMap);
305
584
  }
306
585
  }
586
+ /**
587
+ * Normalizes the function arguments into a standard LoadRemoteModuleOptions object.
588
+ *
589
+ * The function detects which pattern is being used and converts it to the
590
+ * standard options object format for consistent internal processing.
591
+ *
592
+ * @param optionsOrRemoteName - Either an options object or the remote name string
593
+ * @param exposedModule - The exposed module key
594
+ * @returns Normalized options object
595
+ *
596
+ * @throws Error if arguments don't match either supported pattern
597
+ */
307
598
  function normalizeOptions(optionsOrRemoteName, exposedModule) {
308
599
  let options;
309
600
  if (typeof optionsOrRemoteName === 'string' && exposedModule) {
@@ -320,6 +611,12 @@ function normalizeOptions(optionsOrRemoteName, exposedModule) {
320
611
  }
321
612
  return options;
322
613
  }
614
+ /**
615
+ * Logs an error message to the console, but only in browser environments.
616
+ *
617
+ * @param error - The error message to log
618
+ *
619
+ */
323
620
  function logClientError(error) {
324
621
  if (typeof window !== 'undefined') {
325
622
  console.error(error);
@@ -330,5 +627,5 @@ function logClientError(error) {
330
627
  * Generated bundle index. Do not edit.
331
628
  */
332
629
 
333
- export { BUILD_NOTIFICATIONS_ENDPOINT, BuildNotificationType, getShared, initFederation, loadRemoteModule, mergeImportMaps, processHostInfo, processRemoteInfo, processRemoteInfos };
630
+ export { BUILD_NOTIFICATIONS_ENDPOINT, BuildNotificationType, fetchAndRegisterRemote, getShared, initFederation, loadRemoteModule, mergeImportMaps, processHostInfo, processRemoteInfos };
334
631
  //# sourceMappingURL=softarc-native-federation-runtime.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"softarc-native-federation-runtime.mjs","sources":["../tmp-esm2022/lib/get-shared.js","../tmp-esm2022/lib/model/global-cache.js","../tmp-esm2022/lib/model/externals.js","../tmp-esm2022/lib/model/import-map.js","../tmp-esm2022/lib/model/remotes.js","../tmp-esm2022/lib/utils/add-import-map.js","../tmp-esm2022/lib/utils/path-utils.js","../tmp-esm2022/lib/model/build-notifications-options.js","../tmp-esm2022/lib/watch-federation-build.js","../tmp-esm2022/lib/init-federation.js","../tmp-esm2022/lib/load-remote-module.js","../tmp-esm2022/softarc-native-federation-runtime.js"],"sourcesContent":["const defaultShareOptions = {\n singleton: false,\n requiredVersionPrefix: '',\n};\nexport function getShared(options = defaultShareOptions) {\n const nfc = window;\n const externals = nfc.__NATIVE_FEDERATION__.externals;\n const shared = {};\n const allKeys = [...externals.keys()];\n const keys = allKeys\n .filter((k) => !k.startsWith('/@id/') &&\n !k.startsWith('@angular-architects/module-federation') &&\n !k.endsWith('@'))\n .sort();\n for (const key of keys) {\n const idx = key.lastIndexOf('@');\n const pkgName = key.substring(0, idx);\n const version = key.substring(idx + 1);\n const path = externals.get(key) ?? '';\n const shareObj = {\n version,\n get: async () => {\n const lib = await window.importShim(path);\n return () => lib;\n },\n shareConfig: {\n singleton: options.singleton,\n requiredVersion: options.requiredVersionPrefix + version,\n },\n };\n if (!shared[pkgName]) {\n shared[pkgName] = [];\n }\n shared[pkgName].push(shareObj);\n }\n return shared;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXNoYXJlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL2dldC1zaGFyZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBNEJBLE1BQU0sbUJBQW1CLEdBQWlCO0lBQ3hDLFNBQVMsRUFBRSxLQUFLO0lBQ2hCLHFCQUFxQixFQUFFLEVBQUU7Q0FDMUIsQ0FBQztBQUVGLE1BQU0sVUFBVSxTQUFTLENBQUMsT0FBTyxHQUFHLG1CQUFtQjtJQUNyRCxNQUFNLEdBQUcsR0FBRyxNQUE4QyxDQUFDO0lBQzNELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUM7SUFDdEQsTUFBTSxNQUFNLEdBQWdCLEVBQUUsQ0FBQztJQUUvQixNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEMsTUFBTSxJQUFJLEdBQUcsT0FBTztTQUNqQixNQUFNLENBQ0wsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNKLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLHVDQUF1QyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FDbkI7U0FDQSxJQUFJLEVBQUUsQ0FBQztJQUVWLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQyxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN0QyxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2QyxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV0QyxNQUFNLFFBQVEsR0FBZ0I7WUFDNUIsT0FBTztZQUNQLEdBQUcsRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDZCxNQUFNLEdBQUcsR0FBRyxNQUFPLE1BQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ25ELE9BQU8sR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO1lBQ25CLENBQUM7WUFDRCxXQUFXLEVBQUU7Z0JBQ1gsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO2dCQUM1QixlQUFlLEVBQUUsT0FBTyxDQUFDLHFCQUFxQixHQUFHLE9BQU87YUFDekQ7U0FDRixDQUFDO1FBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUVELE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJ0eXBlIFR5cGU8VD4gPSBuZXcgKCkgPT4gVDtcblxudHlwZSBOYXRpdmVGZWRlcmF0aW9uQ29udGFpbmVyID0ge1xuICBfX05BVElWRV9GRURFUkFUSU9OX186IHtcbiAgICBiYXNlVXJsVG9SZW1vdGVOYW1lczogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgICBleHRlcm5hbHM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBTaGFyZU9iamVjdCA9IHtcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBzY29wZT86IHN0cmluZztcbiAgZ2V0OiAoKSA9PiBQcm9taXNlPCgpID0+IFR5cGU8dW5rbm93bj4+O1xuICBzaGFyZUNvbmZpZz86IHtcbiAgICBzaW5nbGV0b24/OiBib29sZWFuO1xuICAgIHJlcXVpcmVkVmVyc2lvbjogc3RyaW5nO1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgU2hhcmVDb25maWcgPSB7XG4gIFtwa2dOYW1lOiBzdHJpbmddOiBBcnJheTxTaGFyZU9iamVjdD47XG59O1xuXG5leHBvcnQgdHlwZSBTaGFyZU9wdGlvbnMgPSB7XG4gIHNpbmdsZXRvbjogYm9vbGVhbjtcbiAgcmVxdWlyZWRWZXJzaW9uUHJlZml4OiAnXicgfCAnficgfCAnPicgfCAnPj0nIHwgJyc7XG59O1xuXG5jb25zdCBkZWZhdWx0U2hhcmVPcHRpb25zOiBTaGFyZU9wdGlvbnMgPSB7XG4gIHNpbmdsZXRvbjogZmFsc2UsXG4gIHJlcXVpcmVkVmVyc2lvblByZWZpeDogJycsXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2hhcmVkKG9wdGlvbnMgPSBkZWZhdWx0U2hhcmVPcHRpb25zKSB7XG4gIGNvbnN0IG5mYyA9IHdpbmRvdyBhcyB1bmtub3duIGFzIE5hdGl2ZUZlZGVyYXRpb25Db250YWluZXI7XG4gIGNvbnN0IGV4dGVybmFscyA9IG5mYy5fX05BVElWRV9GRURFUkFUSU9OX18uZXh0ZXJuYWxzO1xuICBjb25zdCBzaGFyZWQ6IFNoYXJlQ29uZmlnID0ge307XG5cbiAgY29uc3QgYWxsS2V5cyA9IFsuLi5leHRlcm5hbHMua2V5cygpXTtcbiAgY29uc3Qga2V5cyA9IGFsbEtleXNcbiAgICAuZmlsdGVyKFxuICAgICAgKGspID0+XG4gICAgICAgICFrLnN0YXJ0c1dpdGgoJy9AaWQvJykgJiZcbiAgICAgICAgIWsuc3RhcnRzV2l0aCgnQGFuZ3VsYXItYXJjaGl0ZWN0cy9tb2R1bGUtZmVkZXJhdGlvbicpICYmXG4gICAgICAgICFrLmVuZHNXaXRoKCdAJyksXG4gICAgKVxuICAgIC5zb3J0KCk7XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IGlkeCA9IGtleS5sYXN0SW5kZXhPZignQCcpO1xuICAgIGNvbnN0IHBrZ05hbWUgPSBrZXkuc3Vic3RyaW5nKDAsIGlkeCk7XG4gICAgY29uc3QgdmVyc2lvbiA9IGtleS5zdWJzdHJpbmcoaWR4ICsgMSk7XG4gICAgY29uc3QgcGF0aCA9IGV4dGVybmFscy5nZXQoa2V5KSA/PyAnJztcblxuICAgIGNvbnN0IHNoYXJlT2JqOiBTaGFyZU9iamVjdCA9IHtcbiAgICAgIHZlcnNpb24sXG4gICAgICBnZXQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgbGliID0gYXdhaXQgKHdpbmRvdyBhcyBhbnkpLmltcG9ydFNoaW0ocGF0aCk7XG4gICAgICAgIHJldHVybiAoKSA9PiBsaWI7XG4gICAgICB9LFxuICAgICAgc2hhcmVDb25maWc6IHtcbiAgICAgICAgc2luZ2xldG9uOiBvcHRpb25zLnNpbmdsZXRvbixcbiAgICAgICAgcmVxdWlyZWRWZXJzaW9uOiBvcHRpb25zLnJlcXVpcmVkVmVyc2lvblByZWZpeCArIHZlcnNpb24sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBpZiAoIXNoYXJlZFtwa2dOYW1lXSkge1xuICAgICAgc2hhcmVkW3BrZ05hbWVdID0gW107XG4gICAgfVxuXG4gICAgc2hhcmVkW3BrZ05hbWVdLnB1c2goc2hhcmVPYmopO1xuICB9XG4gIHJldHVybiBzaGFyZWQ7XG59XG4iXX0=","export const nfNamespace = '__NATIVE_FEDERATION__';\nconst global = globalThis;\nglobal[nfNamespace] ??= {\n externals: new Map(),\n remoteNamesToRemote: new Map(),\n baseUrlToRemoteNames: new Map(),\n};\nexport const globalCache = global[nfNamespace];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvbW9kZWwvZ2xvYmFsLWNhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyx1QkFBdUIsQ0FBQztBQVluRCxNQUFNLE1BQU0sR0FBRyxVQUErQixDQUFDO0FBRS9DLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSztJQUN0QixTQUFTLEVBQUUsSUFBSSxHQUFHLEVBQWtCO0lBQ3BDLG1CQUFtQixFQUFFLElBQUksR0FBRyxFQUFrQjtJQUM5QyxvQkFBb0IsRUFBRSxJQUFJLEdBQUcsRUFBa0I7Q0FDaEQsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZW1vdGUgfSBmcm9tICcuL3JlbW90ZXMnO1xuXG5leHBvcnQgY29uc3QgbmZOYW1lc3BhY2UgPSAnX19OQVRJVkVfRkVERVJBVElPTl9fJztcblxuZXhwb3J0IHR5cGUgTmZDYWNoZSA9IHtcbiAgZXh0ZXJuYWxzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICByZW1vdGVOYW1lc1RvUmVtb3RlOiBNYXA8c3RyaW5nLCBSZW1vdGU+O1xuICBiYXNlVXJsVG9SZW1vdGVOYW1lczogTWFwPHN0cmluZywgc3RyaW5nPjtcbn07XG5cbmV4cG9ydCB0eXBlIEdsb2JhbCA9IHtcbiAgW25mTmFtZXNwYWNlXTogTmZDYWNoZTtcbn07XG5cbmNvbnN0IGdsb2JhbCA9IGdsb2JhbFRoaXMgYXMgdW5rbm93biBhcyBHbG9iYWw7XG5cbmdsb2JhbFtuZk5hbWVzcGFjZV0gPz89IHtcbiAgZXh0ZXJuYWxzOiBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpLFxuICByZW1vdGVOYW1lc1RvUmVtb3RlOiBuZXcgTWFwPHN0cmluZywgUmVtb3RlPigpLFxuICBiYXNlVXJsVG9SZW1vdGVOYW1lczogbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKSxcbn07XG5cbmV4cG9ydCBjb25zdCBnbG9iYWxDYWNoZSA9IGdsb2JhbFtuZk5hbWVzcGFjZV07XG4iXX0=","import { globalCache } from './global-cache';\nconst externals = globalCache.externals;\nfunction getExternalKey(shared) {\n return `${shared.packageName}@${shared.version}`;\n}\nexport function getExternalUrl(shared) {\n const packageKey = getExternalKey(shared);\n return externals.get(packageKey);\n}\nexport function setExternalUrl(shared, url) {\n const packageKey = getExternalKey(shared);\n externals.set(packageKey, url);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZXJuYWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvbW9kZWwvZXh0ZXJuYWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDO0FBRXhDLFNBQVMsY0FBYyxDQUFDLE1BQWtCO0lBQ3hDLE9BQU8sR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUNuRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxNQUFrQjtJQUMvQyxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUMsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLE1BQWtCLEVBQUUsR0FBVztJQUM1RCxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNoYXJlZEluZm8gfSBmcm9tICcuL2ZlZGVyYXRpb24taW5mbyc7XG5pbXBvcnQgeyBnbG9iYWxDYWNoZSB9IGZyb20gJy4vZ2xvYmFsLWNhY2hlJztcblxuY29uc3QgZXh0ZXJuYWxzID0gZ2xvYmFsQ2FjaGUuZXh0ZXJuYWxzO1xuXG5mdW5jdGlvbiBnZXRFeHRlcm5hbEtleShzaGFyZWQ6IFNoYXJlZEluZm8pIHtcbiAgcmV0dXJuIGAke3NoYXJlZC5wYWNrYWdlTmFtZX1AJHtzaGFyZWQudmVyc2lvbn1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXh0ZXJuYWxVcmwoc2hhcmVkOiBTaGFyZWRJbmZvKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGFja2FnZUtleSA9IGdldEV4dGVybmFsS2V5KHNoYXJlZCk7XG4gIHJldHVybiBleHRlcm5hbHMuZ2V0KHBhY2thZ2VLZXkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RXh0ZXJuYWxVcmwoc2hhcmVkOiBTaGFyZWRJbmZvLCB1cmw6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBwYWNrYWdlS2V5ID0gZ2V0RXh0ZXJuYWxLZXkoc2hhcmVkKTtcbiAgZXh0ZXJuYWxzLnNldChwYWNrYWdlS2V5LCB1cmwpO1xufVxuIl19","export function mergeImportMaps(map1, map2) {\n return {\n imports: { ...map1.imports, ...map2.imports },\n scopes: { ...map1.scopes, ...map2.scopes },\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LW1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL21vZGVsL2ltcG9ydC1tYXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0EsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUFlLEVBQUUsSUFBZTtJQUM5RCxPQUFPO1FBQ0wsT0FBTyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTtRQUM3QyxNQUFNLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFO0tBQzNDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgSW1wb3J0cyA9IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbmV4cG9ydCB0eXBlIFNjb3BlcyA9IFJlY29yZDxzdHJpbmcsIEltcG9ydHM+O1xuXG5leHBvcnQgdHlwZSBJbXBvcnRNYXAgPSB7XG4gIGltcG9ydHM6IEltcG9ydHM7XG4gIHNjb3BlczogU2NvcGVzO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSW1wb3J0TWFwcyhtYXAxOiBJbXBvcnRNYXAsIG1hcDI6IEltcG9ydE1hcCk6IEltcG9ydE1hcCB7XG4gIHJldHVybiB7XG4gICAgaW1wb3J0czogeyAuLi5tYXAxLmltcG9ydHMsIC4uLm1hcDIuaW1wb3J0cyB9LFxuICAgIHNjb3BlczogeyAuLi5tYXAxLnNjb3BlcywgLi4ubWFwMi5zY29wZXMgfSxcbiAgfTtcbn1cbiJdfQ==","import { globalCache } from './global-cache';\nconst remoteNamesToRemote = globalCache.remoteNamesToRemote;\nconst baseUrlToRemoteNames = globalCache.baseUrlToRemoteNames;\nexport function addRemote(remoteName, remote) {\n remoteNamesToRemote.set(remoteName, remote);\n baseUrlToRemoteNames.set(remote.baseUrl, remoteName);\n}\nexport function getRemoteNameByBaseUrl(baseUrl) {\n return baseUrlToRemoteNames.get(baseUrl);\n}\nexport function isRemoteInitialized(baseUrl) {\n return baseUrlToRemoteNames.has(baseUrl);\n}\nexport function getRemote(remoteName) {\n return remoteNamesToRemote.get(remoteName);\n}\nexport function hasRemote(remoteName) {\n return remoteNamesToRemote.has(remoteName);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3Rlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL21vZGVsL3JlbW90ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBTTdDLE1BQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUFDLG1CQUFtQixDQUFDO0FBQzVELE1BQU0sb0JBQW9CLEdBQUcsV0FBVyxDQUFDLG9CQUFvQixDQUFDO0FBRTlELE1BQU0sVUFBVSxTQUFTLENBQUMsVUFBa0IsRUFBRSxNQUFjO0lBQzFELG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxPQUFlO0lBQ3BELE9BQU8sb0JBQW9CLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsT0FBZTtJQUNqRCxPQUFPLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxVQUFrQjtJQUMxQyxPQUFPLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxVQUFrQjtJQUMxQyxPQUFPLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmVkZXJhdGlvbkluZm8gfSBmcm9tICcuL2ZlZGVyYXRpb24taW5mbyc7XG5pbXBvcnQgeyBnbG9iYWxDYWNoZSB9IGZyb20gJy4vZ2xvYmFsLWNhY2hlJztcblxuZXhwb3J0IHR5cGUgUmVtb3RlID0gRmVkZXJhdGlvbkluZm8gJiB7XG4gIGJhc2VVcmw6IHN0cmluZztcbn07XG5cbmNvbnN0IHJlbW90ZU5hbWVzVG9SZW1vdGUgPSBnbG9iYWxDYWNoZS5yZW1vdGVOYW1lc1RvUmVtb3RlO1xuY29uc3QgYmFzZVVybFRvUmVtb3RlTmFtZXMgPSBnbG9iYWxDYWNoZS5iYXNlVXJsVG9SZW1vdGVOYW1lcztcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFJlbW90ZShyZW1vdGVOYW1lOiBzdHJpbmcsIHJlbW90ZTogUmVtb3RlKTogdm9pZCB7XG4gIHJlbW90ZU5hbWVzVG9SZW1vdGUuc2V0KHJlbW90ZU5hbWUsIHJlbW90ZSk7XG4gIGJhc2VVcmxUb1JlbW90ZU5hbWVzLnNldChyZW1vdGUuYmFzZVVybCwgcmVtb3RlTmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZW1vdGVOYW1lQnlCYXNlVXJsKGJhc2VVcmw6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBiYXNlVXJsVG9SZW1vdGVOYW1lcy5nZXQoYmFzZVVybCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlbW90ZUluaXRpYWxpemVkKGJhc2VVcmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gYmFzZVVybFRvUmVtb3RlTmFtZXMuaGFzKGJhc2VVcmwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVtb3RlKHJlbW90ZU5hbWU6IHN0cmluZyk6IFJlbW90ZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiByZW1vdGVOYW1lc1RvUmVtb3RlLmdldChyZW1vdGVOYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc1JlbW90ZShyZW1vdGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlbW90ZU5hbWVzVG9SZW1vdGUuaGFzKHJlbW90ZU5hbWUpO1xufVxuIl19","export function appendImportMap(importMap) {\n document.head.appendChild(Object.assign(document.createElement('script'), {\n type: 'importmap-shim',\n innerHTML: JSON.stringify(importMap),\n }));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWltcG9ydC1tYXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25hdGl2ZS1mZWRlcmF0aW9uLXJ1bnRpbWUvc3JjL2xpYi91dGlscy9hZGQtaW1wb3J0LW1hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLFVBQVUsZUFBZSxDQUFDLFNBQW9CO0lBQ2xELFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUN2QixNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUU7UUFDOUMsSUFBSSxFQUFFLGdCQUFnQjtRQUN0QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7S0FDckMsQ0FBQyxDQUNILENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW1wb3J0TWFwIH0gZnJvbSAnLi4vbW9kZWwvaW1wb3J0LW1hcCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRJbXBvcnRNYXAoaW1wb3J0TWFwOiBJbXBvcnRNYXApIHtcbiAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChcbiAgICBPYmplY3QuYXNzaWduKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpLCB7XG4gICAgICB0eXBlOiAnaW1wb3J0bWFwLXNoaW0nLFxuICAgICAgaW5uZXJIVE1MOiBKU09OLnN0cmluZ2lmeShpbXBvcnRNYXApLFxuICAgIH0pLFxuICApO1xufVxuIl19","export function getDirectory(url) {\n const parts = url.split('/');\n parts.pop();\n return parts.join('/');\n}\nexport function joinPaths(path1, path2) {\n while (path1.endsWith('/')) {\n path1 = path1.substring(0, path1.length - 1);\n }\n if (path2.startsWith('./')) {\n path2 = path2.substring(2, path2.length);\n }\n return `${path1}/${path2}`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aC11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL3V0aWxzL3BhdGgtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLFlBQVksQ0FBQyxHQUFXO0lBQ3RDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1osT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQWEsRUFBRSxLQUFhO0lBQ3BELE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzNCLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMzQixLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxPQUFPLEdBQUcsS0FBSyxJQUFJLEtBQUssRUFBRSxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZ2V0RGlyZWN0b3J5KHVybDogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcnRzID0gdXJsLnNwbGl0KCcvJyk7XG4gIHBhcnRzLnBvcCgpO1xuICByZXR1cm4gcGFydHMuam9pbignLycpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gam9pblBhdGhzKHBhdGgxOiBzdHJpbmcsIHBhdGgyOiBzdHJpbmcpOiBzdHJpbmcge1xuICB3aGlsZSAocGF0aDEuZW5kc1dpdGgoJy8nKSkge1xuICAgIHBhdGgxID0gcGF0aDEuc3Vic3RyaW5nKDAsIHBhdGgxLmxlbmd0aCAtIDEpO1xuICB9XG4gIGlmIChwYXRoMi5zdGFydHNXaXRoKCcuLycpKSB7XG4gICAgcGF0aDIgPSBwYXRoMi5zdWJzdHJpbmcoMiwgcGF0aDIubGVuZ3RoKTtcbiAgfVxuXG4gIHJldHVybiBgJHtwYXRoMX0vJHtwYXRoMn1gO1xufVxuIl19","export const BUILD_NOTIFICATIONS_ENDPOINT = '/@angular-architects/native-federation:build-notifications';\nexport var BuildNotificationType;\n(function (BuildNotificationType) {\n BuildNotificationType[\"COMPLETED\"] = \"federation-rebuild-complete\";\n BuildNotificationType[\"ERROR\"] = \"federation-rebuild-error\";\n BuildNotificationType[\"CANCELLED\"] = \"federation-rebuild-cancelled\";\n})(BuildNotificationType || (BuildNotificationType = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtbm90aWZpY2F0aW9ucy1vcHRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvbW9kZWwvYnVpbGQtbm90aWZpY2F0aW9ucy1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUN2Qyw0REFBNEQsQ0FBQztBQUUvRCxNQUFNLENBQU4sSUFBWSxxQkFJWDtBQUpELFdBQVkscUJBQXFCO0lBQy9CLGtFQUF5QyxDQUFBO0lBQ3pDLDJEQUFrQyxDQUFBO0lBQ2xDLG1FQUEwQyxDQUFBO0FBQzVDLENBQUMsRUFKVyxxQkFBcUIsS0FBckIscUJBQXFCLFFBSWhDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBCdWlsZE5vdGlmaWNhdGlvbk9wdGlvbnMge1xuICBlbmFibGU6IGJvb2xlYW47XG4gIGVuZHBvaW50OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBCVUlMRF9OT1RJRklDQVRJT05TX0VORFBPSU5UID1cbiAgJy9AYW5ndWxhci1hcmNoaXRlY3RzL25hdGl2ZS1mZWRlcmF0aW9uOmJ1aWxkLW5vdGlmaWNhdGlvbnMnO1xuXG5leHBvcnQgZW51bSBCdWlsZE5vdGlmaWNhdGlvblR5cGUge1xuICBDT01QTEVURUQgPSAnZmVkZXJhdGlvbi1yZWJ1aWxkLWNvbXBsZXRlJyxcbiAgRVJST1IgPSAnZmVkZXJhdGlvbi1yZWJ1aWxkLWVycm9yJyxcbiAgQ0FOQ0VMTEVEID0gJ2ZlZGVyYXRpb24tcmVidWlsZC1jYW5jZWxsZWQnLFxufVxuIl19","import { BuildNotificationType } from './model/build-notifications-options';\n/**\n * Watches for federation build completion events and automatically reloads the page.\n *\n * This function establishes a Server-Sent Events (SSE) connection to listen for\n * 'federation-rebuild-complete' notifications. When a build completes successfully,\n * it triggers a page reload to reflect the latest changes.\n * @param endpoint - The SSE endpoint URL to watch for build notifications.\n */\nexport function watchFederationBuildCompletion(endpoint) {\n const eventSource = new EventSource(endpoint);\n eventSource.onmessage = function (event) {\n const data = JSON.parse(event.data);\n if (data.type === BuildNotificationType.COMPLETED) {\n console.log('[Federation] Rebuild completed, reloading...');\n window.location.reload();\n }\n };\n eventSource.onerror = function (event) {\n console.warn('[Federation] SSE connection error:', event);\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2gtZmVkZXJhdGlvbi1idWlsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvbmF0aXZlLWZlZGVyYXRpb24tcnVudGltZS9zcmMvbGliL3dhdGNoLWZlZGVyYXRpb24tYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFNUU7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSw4QkFBOEIsQ0FBQyxRQUFnQjtJQUM3RCxNQUFNLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUU5QyxXQUFXLENBQUMsU0FBUyxHQUFHLFVBQVUsS0FBSztRQUNyQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUsscUJBQXFCLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1lBQzVELE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0IsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLFdBQVcsQ0FBQyxPQUFPLEdBQUcsVUFBVSxLQUFLO1FBQ25DLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUQsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1aWxkTm90aWZpY2F0aW9uVHlwZSB9IGZyb20gJy4vbW9kZWwvYnVpbGQtbm90aWZpY2F0aW9ucy1vcHRpb25zJztcblxuLyoqXG4gKiBXYXRjaGVzIGZvciBmZWRlcmF0aW9uIGJ1aWxkIGNvbXBsZXRpb24gZXZlbnRzIGFuZCBhdXRvbWF0aWNhbGx5IHJlbG9hZHMgdGhlIHBhZ2UuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBlc3RhYmxpc2hlcyBhIFNlcnZlci1TZW50IEV2ZW50cyAoU1NFKSBjb25uZWN0aW9uIHRvIGxpc3RlbiBmb3JcbiAqICdmZWRlcmF0aW9uLXJlYnVpbGQtY29tcGxldGUnIG5vdGlmaWNhdGlvbnMuIFdoZW4gYSBidWlsZCBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LFxuICogaXQgdHJpZ2dlcnMgYSBwYWdlIHJlbG9hZCB0byByZWZsZWN0IHRoZSBsYXRlc3QgY2hhbmdlcy5cbiAqIEBwYXJhbSBlbmRwb2ludCAtIFRoZSBTU0UgZW5kcG9pbnQgVVJMIHRvIHdhdGNoIGZvciBidWlsZCBub3RpZmljYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2F0Y2hGZWRlcmF0aW9uQnVpbGRDb21wbGV0aW9uKGVuZHBvaW50OiBzdHJpbmcpIHtcbiAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoZW5kcG9pbnQpO1xuXG4gIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xuICAgIGlmIChkYXRhLnR5cGUgPT09IEJ1aWxkTm90aWZpY2F0aW9uVHlwZS5DT01QTEVURUQpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbRmVkZXJhdGlvbl0gUmVidWlsZCBjb21wbGV0ZWQsIHJlbG9hZGluZy4uLicpO1xuICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH1cbiAgfTtcblxuICBldmVudFNvdXJjZS5vbmVycm9yID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgY29uc29sZS53YXJuKCdbRmVkZXJhdGlvbl0gU1NFIGNvbm5lY3Rpb24gZXJyb3I6JywgZXZlbnQpO1xuICB9O1xufVxuIl19","import { getExternalUrl, setExternalUrl } from './model/externals';\nimport { mergeImportMaps, } from './model/import-map';\nimport { addRemote } from './model/remotes';\nimport { appendImportMap } from './utils/add-import-map';\nimport { getDirectory, joinPaths } from './utils/path-utils';\nimport { watchFederationBuildCompletion } from './watch-federation-build';\n/**\n * Initialize the federation runtime\n * @param remotesOrManifestUrl\n * @param options The cacheTag allows you to invalidate the cache of the remoteEntry.json files, pass a new value with every release (f.ex. the version number)\n */\nexport async function initFederation(remotesOrManifestUrl = {}, options) {\n const cacheOption = options?.cacheTag ? `?t=${options.cacheTag}` : '';\n const remotes = typeof remotesOrManifestUrl === 'string'\n ? await loadManifest(remotesOrManifestUrl + cacheOption)\n : remotesOrManifestUrl;\n const url = './remoteEntry.json' + cacheOption;\n const hostInfo = await loadFederationInfo(url);\n const hostImportMap = await processHostInfo(hostInfo);\n const remotesImportMap = await processRemoteInfos(remotes, {\n throwIfRemoteNotFound: false,\n ...options,\n });\n const importMap = mergeImportMaps(hostImportMap, remotesImportMap);\n appendImportMap(importMap);\n return importMap;\n}\nasync function loadManifest(remotes) {\n return (await fetch(remotes).then((r) => r.json()));\n}\nexport async function processRemoteInfos(remotes, options = { throwIfRemoteNotFound: false }) {\n const processRemoteInfoPromises = Object.keys(remotes).map(async (remoteName) => {\n try {\n let url = remotes[remoteName];\n if (options.cacheTag) {\n const addAppend = remotes[remoteName].includes('?') ? '&' : '?';\n url += `${addAppend}t=${options.cacheTag}`;\n }\n return await processRemoteInfo(url, remoteName);\n }\n catch (e) {\n const error = `Error loading remote entry for ${remoteName} from file ${remotes[remoteName]}`;\n if (options.throwIfRemoteNotFound) {\n throw new Error(error);\n }\n console.error(error);\n return null;\n }\n });\n const remoteImportMaps = await Promise.all(processRemoteInfoPromises);\n const importMap = remoteImportMaps.reduce((acc, remoteImportMap) => remoteImportMap ? mergeImportMaps(acc, remoteImportMap) : acc, { imports: {}, scopes: {} });\n return importMap;\n}\nexport async function processRemoteInfo(federationInfoUrl, remoteName) {\n const baseUrl = getDirectory(federationInfoUrl);\n const remoteInfo = await loadFederationInfo(federationInfoUrl);\n if (!remoteName) {\n remoteName = remoteInfo.name;\n }\n if (remoteInfo.buildNotificationsEndpoint) {\n watchFederationBuildCompletion(baseUrl + remoteInfo.buildNotificationsEndpoint);\n }\n const importMap = createRemoteImportMap(remoteInfo, remoteName, baseUrl);\n addRemote(remoteName, { ...remoteInfo, baseUrl });\n return importMap;\n}\nfunction createRemoteImportMap(remoteInfo, remoteName, baseUrl) {\n const imports = processExposed(remoteInfo, remoteName, baseUrl);\n const scopes = processRemoteImports(remoteInfo, baseUrl);\n return { imports, scopes };\n}\nasync function loadFederationInfo(url) {\n const info = (await fetch(url).then((r) => r.json()));\n return info;\n}\nfunction processRemoteImports(remoteInfo, baseUrl) {\n const scopes = {};\n const scopedImports = {};\n for (const shared of remoteInfo.shared) {\n const outFileName = getExternalUrl(shared) ?? joinPaths(baseUrl, shared.outFileName);\n setExternalUrl(shared, outFileName);\n scopedImports[shared.packageName] = outFileName;\n }\n scopes[baseUrl + '/'] = scopedImports;\n return scopes;\n}\nfunction processExposed(remoteInfo, remoteName, baseUrl) {\n const imports = {};\n for (const exposed of remoteInfo.exposes) {\n const key = joinPaths(remoteName, exposed.key);\n const value = joinPaths(baseUrl, exposed.outFileName);\n imports[key] = value;\n }\n return imports;\n}\nexport async function processHostInfo(hostInfo, relBundlesPath = './') {\n const imports = hostInfo.shared.reduce((acc, cur) => ({\n ...acc,\n [cur.packageName]: relBundlesPath + cur.outFileName,\n }), {});\n for (const shared of hostInfo.shared) {\n setExternalUrl(shared, relBundlesPath + shared.outFileName);\n }\n return { imports, scopes: {} };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC1mZWRlcmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvaW5pdC1mZWRlcmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFNbkUsT0FBTyxFQUdMLGVBQWUsR0FFaEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDN0QsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFMUU7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsY0FBYyxDQUNsQyx1QkFBd0QsRUFBRSxFQUMxRCxPQUErQjtJQUUvQixNQUFNLFdBQVcsR0FBRyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3RFLE1BQU0sT0FBTyxHQUNYLE9BQU8sb0JBQW9CLEtBQUssUUFBUTtRQUN0QyxDQUFDLENBQUMsTUFBTSxZQUFZLENBQUMsb0JBQW9CLEdBQUcsV0FBVyxDQUFDO1FBQ3hELENBQUMsQ0FBQyxvQkFBb0IsQ0FBQztJQUUzQixNQUFNLEdBQUcsR0FBRyxvQkFBb0IsR0FBRyxXQUFXLENBQUM7SUFDL0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQyxNQUFNLGFBQWEsR0FBRyxNQUFNLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sa0JBQWtCLENBQUMsT0FBTyxFQUFFO1FBQ3pELHFCQUFxQixFQUFFLEtBQUs7UUFDNUIsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0lBRUgsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ25FLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUUzQixPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQsS0FBSyxVQUFVLFlBQVksQ0FBQyxPQUFlO0lBQ3pDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUEyQixDQUFDO0FBQ2hGLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxPQUErQixFQUMvQixVQUFvQyxFQUFFLHFCQUFxQixFQUFFLEtBQUssRUFBRTtJQUVwRSxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUN4RCxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUU7UUFDbkIsSUFBSSxDQUFDO1lBQ0gsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzlCLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNyQixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDaEUsR0FBRyxJQUFJLEdBQUcsU0FBUyxLQUFLLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM3QyxDQUFDO1lBRUQsT0FBTyxNQUFNLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE1BQU0sS0FBSyxHQUFHLGtDQUFrQyxVQUFVLGNBQWMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFFOUYsSUFBSSxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixDQUFDO1lBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDLENBQ0YsQ0FBQztJQUVGLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFFdEUsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUN2QyxDQUFDLEdBQUcsRUFBRSxlQUFlLEVBQUUsRUFBRSxDQUN2QixlQUFlLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFDL0QsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FDNUIsQ0FBQztJQUVGLE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUNyQyxpQkFBeUIsRUFDekIsVUFBbUI7SUFFbkIsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDaEQsTUFBTSxVQUFVLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBRS9ELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUMxQyw4QkFBOEIsQ0FDNUIsT0FBTyxHQUFHLFVBQVUsQ0FBQywwQkFBMEIsQ0FDaEQsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxHQUFHLFVBQVUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBRWxELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUM1QixVQUEwQixFQUMxQixVQUFrQixFQUNsQixPQUFlO0lBRWYsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsb0JBQW9CLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDN0IsQ0FBQztBQUVELEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxHQUFXO0lBQzNDLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBbUIsQ0FBQztJQUN4RSxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUMzQixVQUEwQixFQUMxQixPQUFlO0lBRWYsTUFBTSxNQUFNLEdBQVcsRUFBRSxDQUFDO0lBQzFCLE1BQU0sYUFBYSxHQUFZLEVBQUUsQ0FBQztJQUVsQyxLQUFLLE1BQU0sTUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN2QyxNQUFNLFdBQVcsR0FDZixjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkUsY0FBYyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNwQyxhQUFhLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFdBQVcsQ0FBQztJQUNsRCxDQUFDO0lBRUQsTUFBTSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUM7SUFDdEMsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUNyQixVQUEwQixFQUMxQixVQUFrQixFQUNsQixPQUFlO0lBRWYsTUFBTSxPQUFPLEdBQVksRUFBRSxDQUFDO0lBRTVCLEtBQUssTUFBTSxPQUFPLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pDLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLGVBQWUsQ0FDbkMsUUFBd0IsRUFDeEIsY0FBYyxHQUFHLElBQUk7SUFFckIsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQ3BDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNiLEdBQUcsR0FBRztRQUNOLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLGNBQWMsR0FBRyxHQUFHLENBQUMsV0FBVztLQUNwRCxDQUFDLEVBQ0YsRUFBRSxDQUNRLENBQUM7SUFFYixLQUFLLE1BQU0sTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyQyxjQUFjLENBQUMsTUFBTSxFQUFFLGNBQWMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRFeHRlcm5hbFVybCwgc2V0RXh0ZXJuYWxVcmwgfSBmcm9tICcuL21vZGVsL2V4dGVybmFscyc7XG5pbXBvcnQge1xuICBGZWRlcmF0aW9uSW5mbyxcbiAgSW5pdEZlZGVyYXRpb25PcHRpb25zLFxuICBQcm9jZXNzUmVtb3RlSW5mb09wdGlvbnMsXG59IGZyb20gJy4vbW9kZWwvZmVkZXJhdGlvbi1pbmZvJztcbmltcG9ydCB7XG4gIEltcG9ydE1hcCxcbiAgSW1wb3J0cyxcbiAgbWVyZ2VJbXBvcnRNYXBzLFxuICBTY29wZXMsXG59IGZyb20gJy4vbW9kZWwvaW1wb3J0LW1hcCc7XG5pbXBvcnQgeyBhZGRSZW1vdGUgfSBmcm9tICcuL21vZGVsL3JlbW90ZXMnO1xuaW1wb3J0IHsgYXBwZW5kSW1wb3J0TWFwIH0gZnJvbSAnLi91dGlscy9hZGQtaW1wb3J0LW1hcCc7XG5pbXBvcnQgeyBnZXREaXJlY3RvcnksIGpvaW5QYXRocyB9IGZyb20gJy4vdXRpbHMvcGF0aC11dGlscyc7XG5pbXBvcnQgeyB3YXRjaEZlZGVyYXRpb25CdWlsZENvbXBsZXRpb24gfSBmcm9tICcuL3dhdGNoLWZlZGVyYXRpb24tYnVpbGQnO1xuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIGZlZGVyYXRpb24gcnVudGltZVxuICogQHBhcmFtIHJlbW90ZXNPck1hbmlmZXN0VXJsXG4gKiBAcGFyYW0gb3B0aW9ucyBUaGUgY2FjaGVUYWcgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIHRoZSBjYWNoZSBvZiB0aGUgcmVtb3RlRW50cnkuanNvbiBmaWxlcywgcGFzcyBhIG5ldyB2YWx1ZSB3aXRoIGV2ZXJ5IHJlbGVhc2UgKGYuZXguIHRoZSB2ZXJzaW9uIG51bWJlcilcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRGZWRlcmF0aW9uKFxuICByZW1vdGVzT3JNYW5pZmVzdFVybDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZyA9IHt9LFxuICBvcHRpb25zPzogSW5pdEZlZGVyYXRpb25PcHRpb25zXG4pOiBQcm9taXNlPEltcG9ydE1hcD4ge1xuICBjb25zdCBjYWNoZU9wdGlvbiA9IG9wdGlvbnM/LmNhY2hlVGFnID8gYD90PSR7b3B0aW9ucy5jYWNoZVRhZ31gIDogJyc7XG4gIGNvbnN0IHJlbW90ZXMgPVxuICAgIHR5cGVvZiByZW1vdGVzT3JNYW5pZmVzdFVybCA9PT0gJ3N0cmluZydcbiAgICAgID8gYXdhaXQgbG9hZE1hbmlmZXN0KHJlbW90ZXNPck1hbmlmZXN0VXJsICsgY2FjaGVPcHRpb24pXG4gICAgICA6IHJlbW90ZXNPck1hbmlmZXN0VXJsO1xuXG4gIGNvbnN0IHVybCA9ICcuL3JlbW90ZUVudHJ5Lmpzb24nICsgY2FjaGVPcHRpb247XG4gIGNvbnN0IGhvc3RJbmZvID0gYXdhaXQgbG9hZEZlZGVyYXRpb25JbmZvKHVybCk7XG4gIGNvbnN0IGhvc3RJbXBvcnRNYXAgPSBhd2FpdCBwcm9jZXNzSG9zdEluZm8oaG9zdEluZm8pO1xuICBjb25zdCByZW1vdGVzSW1wb3J0TWFwID0gYXdhaXQgcHJvY2Vzc1JlbW90ZUluZm9zKHJlbW90ZXMsIHtcbiAgICB0aHJvd0lmUmVtb3RlTm90Rm91bmQ6IGZhbHNlLFxuICAgIC4uLm9wdGlvbnMsXG4gIH0pO1xuXG4gIGNvbnN0IGltcG9ydE1hcCA9IG1lcmdlSW1wb3J0TWFwcyhob3N0SW1wb3J0TWFwLCByZW1vdGVzSW1wb3J0TWFwKTtcbiAgYXBwZW5kSW1wb3J0TWFwKGltcG9ydE1hcCk7XG5cbiAgcmV0dXJuIGltcG9ydE1hcDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZE1hbmlmZXN0KHJlbW90ZXM6IHN0cmluZyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICByZXR1cm4gKGF3YWl0IGZldGNoKHJlbW90ZXMpLnRoZW4oKHIpID0+IHIuanNvbigpKSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NSZW1vdGVJbmZvcyhcbiAgcmVtb3RlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgb3B0aW9uczogUHJvY2Vzc1JlbW90ZUluZm9PcHRpb25zID0geyB0aHJvd0lmUmVtb3RlTm90Rm91bmQ6IGZhbHNlIH1cbik6IFByb21pc2U8SW1wb3J0TWFwPiB7XG4gIGNvbnN0IHByb2Nlc3NSZW1vdGVJbmZvUHJvbWlzZXMgPSBPYmplY3Qua2V5cyhyZW1vdGVzKS5tYXAoXG4gICAgYXN5bmMgKHJlbW90ZU5hbWUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCB1cmwgPSByZW1vdGVzW3JlbW90ZU5hbWVdO1xuICAgICAgICBpZiAob3B0aW9ucy5jYWNoZVRhZykge1xuICAgICAgICAgIGNvbnN0IGFkZEFwcGVuZCA9IHJlbW90ZXNbcmVtb3RlTmFtZV0uaW5jbHVkZXMoJz8nKSA/ICcmJyA6ICc/JztcbiAgICAgICAgICB1cmwgKz0gYCR7YWRkQXBwZW5kfXQ9JHtvcHRpb25zLmNhY2hlVGFnfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgcHJvY2Vzc1JlbW90ZUluZm8odXJsLCByZW1vdGVOYW1lKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBgRXJyb3IgbG9hZGluZyByZW1vdGUgZW50cnkgZm9yICR7cmVtb3RlTmFtZX0gZnJvbSBmaWxlICR7cmVtb3Rlc1tyZW1vdGVOYW1lXX1gO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnRocm93SWZSZW1vdGVOb3RGb3VuZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICApO1xuXG4gIGNvbnN0IHJlbW90ZUltcG9ydE1hcHMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9jZXNzUmVtb3RlSW5mb1Byb21pc2VzKTtcblxuICBjb25zdCBpbXBvcnRNYXAgPSByZW1vdGVJbXBvcnRNYXBzLnJlZHVjZTxJbXBvcnRNYXA+KFxuICAgIChhY2MsIHJlbW90ZUltcG9ydE1hcCkgPT5cbiAgICAgIHJlbW90ZUltcG9ydE1hcCA/IG1lcmdlSW1wb3J0TWFwcyhhY2MsIHJlbW90ZUltcG9ydE1hcCkgOiBhY2MsXG4gICAgeyBpbXBvcnRzOiB7fSwgc2NvcGVzOiB7fSB9XG4gICk7XG5cbiAgcmV0dXJuIGltcG9ydE1hcDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NSZW1vdGVJbmZvKFxuICBmZWRlcmF0aW9uSW5mb1VybDogc3RyaW5nLFxuICByZW1vdGVOYW1lPzogc3RyaW5nXG4pOiBQcm9taXNlPEltcG9ydE1hcD4ge1xuICBjb25zdCBiYXNlVXJsID0gZ2V0RGlyZWN0b3J5KGZlZGVyYXRpb25JbmZvVXJsKTtcbiAgY29uc3QgcmVtb3RlSW5mbyA9IGF3YWl0IGxvYWRGZWRlcmF0aW9uSW5mbyhmZWRlcmF0aW9uSW5mb1VybCk7XG5cbiAgaWYgKCFyZW1vdGVOYW1lKSB7XG4gICAgcmVtb3RlTmFtZSA9IHJlbW90ZUluZm8ubmFtZTtcbiAgfVxuXG4gIGlmIChyZW1vdGVJbmZvLmJ1aWxkTm90aWZpY2F0aW9uc0VuZHBvaW50KSB7XG4gICAgd2F0Y2hGZWRlcmF0aW9uQnVpbGRDb21wbGV0aW9uKFxuICAgICAgYmFzZVVybCArIHJlbW90ZUluZm8uYnVpbGROb3RpZmljYXRpb25zRW5kcG9pbnRcbiAgICApO1xuICB9XG5cbiAgY29uc3QgaW1wb3J0TWFwID0gY3JlYXRlUmVtb3RlSW1wb3J0TWFwKHJlbW90ZUluZm8sIHJlbW90ZU5hbWUsIGJhc2VVcmwpO1xuICBhZGRSZW1vdGUocmVtb3RlTmFtZSwgeyAuLi5yZW1vdGVJbmZvLCBiYXNlVXJsIH0pO1xuXG4gIHJldHVybiBpbXBvcnRNYXA7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlbW90ZUltcG9ydE1hcChcbiAgcmVtb3RlSW5mbzogRmVkZXJhdGlvbkluZm8sXG4gIHJlbW90ZU5hbWU6IHN0cmluZyxcbiAgYmFzZVVybDogc3RyaW5nXG4pOiBJbXBvcnRNYXAge1xuICBjb25zdCBpbXBvcnRzID0gcHJvY2Vzc0V4cG9zZWQocmVtb3RlSW5mbywgcmVtb3RlTmFtZSwgYmFzZVVybCk7XG4gIGNvbnN0IHNjb3BlcyA9IHByb2Nlc3NSZW1vdGVJbXBvcnRzKHJlbW90ZUluZm8sIGJhc2VVcmwpO1xuICByZXR1cm4geyBpbXBvcnRzLCBzY29wZXMgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZEZlZGVyYXRpb25JbmZvKHVybDogc3RyaW5nKTogUHJvbWlzZTxGZWRlcmF0aW9uSW5mbz4ge1xuICBjb25zdCBpbmZvID0gKGF3YWl0IGZldGNoKHVybCkudGhlbigocikgPT4gci5qc29uKCkpKSBhcyBGZWRlcmF0aW9uSW5mbztcbiAgcmV0dXJuIGluZm87XG59XG5cbmZ1bmN0aW9uIHByb2Nlc3NSZW1vdGVJbXBvcnRzKFxuICByZW1vdGVJbmZvOiBGZWRlcmF0aW9uSW5mbyxcbiAgYmFzZVVybDogc3RyaW5nXG4pOiBTY29wZXMge1xuICBjb25zdCBzY29wZXM6IFNjb3BlcyA9IHt9O1xuICBjb25zdCBzY29wZWRJbXBvcnRzOiBJbXBvcnRzID0ge307XG5cbiAgZm9yIChjb25zdCBzaGFyZWQgb2YgcmVtb3RlSW5mby5zaGFyZWQpIHtcbiAgICBjb25zdCBvdXRGaWxlTmFtZSA9XG4gICAgICBnZXRFeHRlcm5hbFVybChzaGFyZWQpID8/IGpvaW5QYXRocyhiYXNlVXJsLCBzaGFyZWQub3V0RmlsZU5hbWUpO1xuICAgIHNldEV4dGVybmFsVXJsKHNoYXJlZCwgb3V0RmlsZU5hbWUpO1xuICAgIHNjb3BlZEltcG9ydHNbc2hhcmVkLnBhY2thZ2VOYW1lXSA9IG91dEZpbGVOYW1lO1xuICB9XG5cbiAgc2NvcGVzW2Jhc2VVcmwgKyAnLyddID0gc2NvcGVkSW1wb3J0cztcbiAgcmV0dXJuIHNjb3Blcztcbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0V4cG9zZWQoXG4gIHJlbW90ZUluZm86IEZlZGVyYXRpb25JbmZvLFxuICByZW1vdGVOYW1lOiBzdHJpbmcsXG4gIGJhc2VVcmw6IHN0cmluZ1xuKTogSW1wb3J0cyB7XG4gIGNvbnN0IGltcG9ydHM6IEltcG9ydHMgPSB7fTtcblxuICBmb3IgKGNvbnN0IGV4cG9zZWQgb2YgcmVtb3RlSW5mby5leHBvc2VzKSB7XG4gICAgY29uc3Qga2V5ID0gam9pblBhdGhzKHJlbW90ZU5hbWUsIGV4cG9zZWQua2V5KTtcbiAgICBjb25zdCB2YWx1ZSA9IGpvaW5QYXRocyhiYXNlVXJsLCBleHBvc2VkLm91dEZpbGVOYW1lKTtcbiAgICBpbXBvcnRzW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBpbXBvcnRzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0hvc3RJbmZvKFxuICBob3N0SW5mbzogRmVkZXJhdGlvbkluZm8sXG4gIHJlbEJ1bmRsZXNQYXRoID0gJy4vJ1xuKTogUHJvbWlzZTxJbXBvcnRNYXA+IHtcbiAgY29uc3QgaW1wb3J0cyA9IGhvc3RJbmZvLnNoYXJlZC5yZWR1Y2UoXG4gICAgKGFjYywgY3VyKSA9PiAoe1xuICAgICAgLi4uYWNjLFxuICAgICAgW2N1ci5wYWNrYWdlTmFtZV06IHJlbEJ1bmRsZXNQYXRoICsgY3VyLm91dEZpbGVOYW1lLFxuICAgIH0pLFxuICAgIHt9XG4gICkgYXMgSW1wb3J0cztcblxuICBmb3IgKGNvbnN0IHNoYXJlZCBvZiBob3N0SW5mby5zaGFyZWQpIHtcbiAgICBzZXRFeHRlcm5hbFVybChzaGFyZWQsIHJlbEJ1bmRsZXNQYXRoICsgc2hhcmVkLm91dEZpbGVOYW1lKTtcbiAgfVxuICByZXR1cm4geyBpbXBvcnRzLCBzY29wZXM6IHt9IH07XG59XG4iXX0=","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { appendImportMap } from './utils/add-import-map';\nimport { processRemoteInfo } from './init-federation';\nimport { getRemote, getRemoteNameByBaseUrl, isRemoteInitialized, } from './model/remotes';\nimport { getDirectory, joinPaths } from './utils/path-utils';\nexport async function loadRemoteModule(optionsOrRemoteName, exposedModule) {\n const options = normalizeOptions(optionsOrRemoteName, exposedModule);\n await ensureRemoteInitialized(options);\n const remoteName = getRemoteNameByOptions(options);\n const remote = getRemote(remoteName);\n const fallback = options.fallback;\n const remoteError = !remote ? 'unknown remote ' + remoteName : '';\n if (!remote && !fallback) {\n throw new Error(remoteError);\n }\n else if (!remote) {\n logClientError(remoteError);\n return Promise.resolve(fallback);\n }\n const exposed = remote.exposes.find((e) => e.key === options.exposedModule);\n const exposedError = !exposed\n ? `Unknown exposed module ${options.exposedModule} in remote ${remoteName}`\n : '';\n if (!exposed && !fallback) {\n throw new Error(exposedError);\n }\n else if (!exposed) {\n logClientError(exposedError);\n return Promise.resolve(fallback);\n }\n const url = joinPaths(remote.baseUrl, exposed.outFileName);\n try {\n const module = _import(url);\n return module;\n }\n catch (e) {\n if (fallback) {\n console.error('error loading remote module', e);\n return fallback;\n }\n throw e;\n }\n}\nfunction _import(url) {\n return typeof importShim !== 'undefined'\n ? importShim(url)\n : import(/* @vite-ignore */ url);\n}\nfunction getRemoteNameByOptions(options) {\n let remoteName;\n if (options.remoteName) {\n remoteName = options.remoteName;\n }\n else if (options.remoteEntry) {\n const baseUrl = getDirectory(options.remoteEntry);\n remoteName = getRemoteNameByBaseUrl(baseUrl);\n }\n else {\n throw new Error('unexpected arguments: Please pass remoteName or remoteEntry');\n }\n if (!remoteName) {\n throw new Error('unknown remoteName ' + remoteName);\n }\n return remoteName;\n}\nasync function ensureRemoteInitialized(options) {\n if (options.remoteEntry &&\n !isRemoteInitialized(getDirectory(options.remoteEntry))) {\n const importMap = await processRemoteInfo(options.remoteEntry);\n appendImportMap(importMap);\n }\n}\nfunction normalizeOptions(optionsOrRemoteName, exposedModule) {\n let options;\n if (typeof optionsOrRemoteName === 'string' && exposedModule) {\n options = {\n remoteName: optionsOrRemoteName,\n exposedModule,\n };\n }\n else if (typeof optionsOrRemoteName === 'object' && !exposedModule) {\n options = optionsOrRemoteName;\n }\n else {\n throw new Error('unexpected arguments: please pass options or a remoteName/exposedModule-pair');\n }\n return options;\n}\nfunction logClientError(error) {\n if (typeof window !== 'undefined') {\n console.error(error);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1yZW1vdGUtbW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9saWIvbG9hZC1yZW1vdGUtbW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUNMLFNBQVMsRUFDVCxzQkFBc0IsRUFDdEIsbUJBQW1CLEdBQ3BCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQWtCN0QsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsbUJBQXdELEVBQ3hELGFBQXNCO0lBRXRCLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRXJFLE1BQU0sdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFdkMsTUFBTSxVQUFVLEdBQUcsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFFbEMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBRWxFLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7U0FBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENB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Q0FBQztJQUVyQyxJQUFJLE9BQU8sbUJBQW1CLEtBQUssUUFBUSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQzdELE9BQU8sR0FBRztZQUNSLFVBQVUsRUFBRSxtQkFBbUI7WUFDL0IsYUFBYTtTQUNkLENBQUM7SUFDSixDQUFDO1NBQU0sSUFBSSxPQUFPLG1CQUFtQixLQUFLLFFBQVEsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JFLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQztJQUNoQyxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxLQUFLLENBQ2IsOEVBQThFLENBQy9FLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLEtBQWE7SUFDbkMsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUNsQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgYXBwZW5kSW1wb3J0TWFwIH0gZnJvbSAnLi91dGlscy9hZGQtaW1wb3J0LW1hcCc7XG5pbXBvcnQgeyBwcm9jZXNzUmVtb3RlSW5mbyB9IGZyb20gJy4vaW5pdC1mZWRlcmF0aW9uJztcbmltcG9ydCB7XG4gIGdldFJlbW90ZSxcbiAgZ2V0UmVtb3RlTmFtZUJ5QmFzZVVybCxcbiAgaXNSZW1vdGVJbml0aWFsaXplZCxcbn0gZnJvbSAnLi9tb2RlbC9yZW1vdGVzJztcbmltcG9ydCB7IGdldERpcmVjdG9yeSwgam9pblBhdGhzIH0gZnJvbSAnLi91dGlscy9wYXRoLXV0aWxzJztcblxuZGVjbGFyZSBmdW5jdGlvbiBpbXBvcnRTaGltPFQ+KHVybDogc3RyaW5nKTogVDtcblxuZXhwb3J0IHR5cGUgTG9hZFJlbW90ZU1vZHVsZU9wdGlvbnM8VCA9IGFueT4gPSB7XG4gIHJlbW90ZUVudHJ5Pzogc3RyaW5nO1xuICByZW1vdGVOYW1lPzogc3RyaW5nO1xuICBleHBvc2VkTW9kdWxlOiBzdHJpbmc7XG4gIGZhbGxiYWNrPzogVDtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkUmVtb3RlTW9kdWxlPFQgPSBhbnk+KFxuICBvcHRpb25zOiBMb2FkUmVtb3RlTW9kdWxlT3B0aW9ucyxcbik6IFByb21pc2U8VD47XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFJlbW90ZU1vZHVsZTxUID0gYW55PihcbiAgcmVtb3RlTmFtZTogc3RyaW5nLFxuICBleHBvc2VkTW9kdWxlOiBzdHJpbmcsXG4pOiBQcm9taXNlPFQ+O1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRSZW1vdGVNb2R1bGU8VCA9IGFueT4oXG4gIG9wdGlvbnNPclJlbW90ZU5hbWU6IExvYWRSZW1vdGVNb2R1bGVPcHRpb25zPFQ+IHwgc3RyaW5nLFxuICBleHBvc2VkTW9kdWxlPzogc3RyaW5nLFxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBub3JtYWxpemVPcHRpb25zKG9wdGlvbnNPclJlbW90ZU5hbWUsIGV4cG9zZWRNb2R1bGUpO1xuXG4gIGF3YWl0IGVuc3VyZVJlbW90ZUluaXRpYWxpemVkKG9wdGlvbnMpO1xuXG4gIGNvbnN0IHJlbW90ZU5hbWUgPSBnZXRSZW1vdGVOYW1lQnlPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCByZW1vdGUgPSBnZXRSZW1vdGUocmVtb3RlTmFtZSk7XG4gIGNvbnN0IGZhbGxiYWNrID0gb3B0aW9ucy5mYWxsYmFjaztcblxuICBjb25zdCByZW1vdGVFcnJvciA9ICFyZW1vdGUgPyAndW5rbm93biByZW1vdGUgJyArIHJlbW90ZU5hbWUgOiAnJztcblxuICBpZiAoIXJlbW90ZSAmJiAhZmFsbGJhY2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IocmVtb3RlRXJyb3IpO1xuICB9IGVsc2UgaWYgKCFyZW1vdGUpIHtcbiAgICBsb2dDbGllbnRFcnJvcihyZW1vdGVFcnJvcik7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxsYmFjayk7XG4gIH1cblxuICBjb25zdCBleHBvc2VkID0gcmVtb3RlLmV4cG9zZXMuZmluZCgoZSkgPT4gZS5rZXkgPT09IG9wdGlvbnMuZXhwb3NlZE1vZHVsZSk7XG5cbiAgY29uc3QgZXhwb3NlZEVycm9yID0gIWV4cG9zZWRcbiAgICA/IGBVbmtub3duIGV4cG9zZWQgbW9kdWxlICR7b3B0aW9ucy5leHBvc2VkTW9kdWxlfSBpbiByZW1vdGUgJHtyZW1vdGVOYW1lfWBcbiAgICA6ICcnO1xuXG4gIGlmICghZXhwb3NlZCAmJiAhZmFsbGJhY2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXhwb3NlZEVycm9yKTtcbiAgfSBlbHNlIGlmICghZXhwb3NlZCkge1xuICAgIGxvZ0NsaWVudEVycm9yKGV4cG9zZWRFcnJvcik7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxsYmFjayk7XG4gIH1cblxuICBjb25zdCB1cmwgPSBqb2luUGF0aHMocmVtb3RlLmJhc2VVcmwsIGV4cG9zZWQub3V0RmlsZU5hbWUpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgbW9kdWxlID0gX2ltcG9ydDxUPih1cmwpO1xuICAgIHJldHVybiBtb2R1bGU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZmFsbGJhY2spIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2Vycm9yIGxvYWRpbmcgcmVtb3RlIG1vZHVsZScsIGUpO1xuICAgICAgcmV0dXJuIGZhbGxiYWNrO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9pbXBvcnQ8VCA9IGFueT4odXJsOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBpbXBvcnRTaGltICE9PSAndW5kZWZpbmVkJ1xuICAgID8gaW1wb3J0U2hpbTxUPih1cmwpXG4gICAgOiAoaW1wb3J0KC8qIEB2aXRlLWlnbm9yZSAqLyB1cmwpIGFzIFQpO1xufVxuXG5mdW5jdGlvbiBnZXRSZW1vdGVOYW1lQnlPcHRpb25zKG9wdGlvbnM6IExvYWRSZW1vdGVNb2R1bGVPcHRpb25zKSB7XG4gIGxldCByZW1vdGVOYW1lO1xuXG4gIGlmIChvcHRpb25zLnJlbW90ZU5hbWUpIHtcbiAgICByZW1vdGVOYW1lID0gb3B0aW9ucy5yZW1vdGVOYW1lO1xuICB9IGVsc2UgaWYgKG9wdGlvbnMucmVtb3RlRW50cnkpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gZ2V0RGlyZWN0b3J5KG9wdGlvbnMucmVtb3RlRW50cnkpO1xuICAgIHJlbW90ZU5hbWUgPSBnZXRSZW1vdGVOYW1lQnlCYXNlVXJsKGJhc2VVcmwpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICd1bmV4cGVjdGVkIGFyZ3VtZW50czogUGxlYXNlIHBhc3MgcmVtb3RlTmFtZSBvciByZW1vdGVFbnRyeScsXG4gICAgKTtcbiAgfVxuXG4gIGlmICghcmVtb3RlTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biByZW1vdGVOYW1lICcgKyByZW1vdGVOYW1lKTtcbiAgfVxuICByZXR1cm4gcmVtb3RlTmFtZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZW5zdXJlUmVtb3RlSW5pdGlhbGl6ZWQoXG4gIG9wdGlvbnM6IExvYWRSZW1vdGVNb2R1bGVPcHRpb25zLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChcbiAgICBvcHRpb25zLnJlbW90ZUVudHJ5ICYmXG4gICAgIWlzUmVtb3RlSW5pdGlhbGl6ZWQoZ2V0RGlyZWN0b3J5KG9wdGlvbnMucmVtb3RlRW50cnkpKVxuICApIHtcbiAgICBjb25zdCBpbXBvcnRNYXAgPSBhd2FpdCBwcm9jZXNzUmVtb3RlSW5mbyhvcHRpb25zLnJlbW90ZUVudHJ5KTtcbiAgICBhcHBlbmRJbXBvcnRNYXAoaW1wb3J0TWFwKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVPcHRpb25zKFxuICBvcHRpb25zT3JSZW1vdGVOYW1lOiBzdHJpbmcgfCBMb2FkUmVtb3RlTW9kdWxlT3B0aW9ucyxcbiAgZXhwb3NlZE1vZHVsZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogTG9hZFJlbW90ZU1vZHVsZU9wdGlvbnMge1xuICBsZXQgb3B0aW9uczogTG9hZFJlbW90ZU1vZHVsZU9wdGlvbnM7XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zT3JSZW1vdGVOYW1lID09PSAnc3RyaW5nJyAmJiBleHBvc2VkTW9kdWxlKSB7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIHJlbW90ZU5hbWU6IG9wdGlvbnNPclJlbW90ZU5hbWUsXG4gICAgICBleHBvc2VkTW9kdWxlLFxuICAgIH07XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnNPclJlbW90ZU5hbWUgPT09ICdvYmplY3QnICYmICFleHBvc2VkTW9kdWxlKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnNPclJlbW90ZU5hbWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ3VuZXhwZWN0ZWQgYXJndW1lbnRzOiBwbGVhc2UgcGFzcyBvcHRpb25zIG9yIGEgcmVtb3RlTmFtZS9leHBvc2VkTW9kdWxlLXBhaXInLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbmZ1bmN0aW9uIGxvZ0NsaWVudEVycm9yKGVycm9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gIH1cbn1cbiJdfQ==","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdGFyYy1uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy9uYXRpdmUtZmVkZXJhdGlvbi1ydW50aW1lL3NyYy9zb2Z0YXJjLW5hdGl2ZS1mZWRlcmF0aW9uLXJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0="],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"softarc-native-federation-runtime.mjs","sources":["../../../../libs/native-federation-runtime/src/lib/get-shared.ts","../../../../libs/native-federation-runtime/src/lib/model/global-cache.ts","../../../../libs/native-federation-runtime/src/lib/model/externals.ts","../../../../libs/native-federation-runtime/src/lib/model/import-map.ts","../../../../libs/native-federation-runtime/src/lib/model/remotes.ts","../../../../libs/native-federation-runtime/src/lib/utils/trusted-types.ts","../../../../libs/native-federation-runtime/src/lib/utils/add-import-map.ts","../../../../libs/native-federation-runtime/src/lib/utils/path-utils.ts","../../../../libs/native-federation-runtime/src/lib/model/build-notifications-options.ts","../../../../libs/native-federation-runtime/src/lib/watch-federation-build.ts","../../../../libs/native-federation-runtime/src/lib/init-federation.ts","../../../../libs/native-federation-runtime/src/lib/load-remote-module.ts","../../../../libs/native-federation-runtime/src/softarc-native-federation-runtime.ts"],"sourcesContent":["type Type<T> = new () => T;\n\ntype NativeFederationContainer = {\n __NATIVE_FEDERATION__: {\n baseUrlToRemoteNames: Map<string, string>;\n externals: Map<string, string>;\n };\n};\n\nexport type ShareObject = {\n version: string;\n scope?: string;\n get: () => Promise<() => Type<unknown>>;\n shareConfig?: {\n singleton?: boolean;\n requiredVersion: string;\n };\n};\n\nexport type ShareConfig = {\n [pkgName: string]: Array<ShareObject>;\n};\n\nexport type ShareOptions = {\n singleton: boolean;\n requiredVersionPrefix: '^' | '~' | '>' | '>=' | '';\n};\n\nconst defaultShareOptions: ShareOptions = {\n singleton: false,\n requiredVersionPrefix: '',\n};\n\nexport function getShared(options = defaultShareOptions) {\n const nfc = window as unknown as NativeFederationContainer;\n const externals = nfc.__NATIVE_FEDERATION__.externals;\n const shared: ShareConfig = {};\n\n const allKeys = [...externals.keys()];\n const keys = allKeys\n .filter(\n (k) =>\n !k.startsWith('/@id/') &&\n !k.startsWith('@angular-architects/module-federation') &&\n !k.endsWith('@'),\n )\n .sort();\n\n for (const key of keys) {\n const idx = key.lastIndexOf('@');\n const pkgName = key.substring(0, idx);\n const version = key.substring(idx + 1);\n const path = externals.get(key) ?? '';\n\n const shareObj: ShareObject = {\n version,\n get: async () => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const lib = await (window as any).importShim(path);\n return () => lib;\n },\n shareConfig: {\n singleton: options.singleton,\n requiredVersion: options.requiredVersionPrefix + version,\n },\n };\n\n if (!shared[pkgName]) {\n shared[pkgName] = [];\n }\n\n shared[pkgName].push(shareObj);\n }\n return shared;\n}\n","import { Remote } from './remotes';\n\nexport const nfNamespace = '__NATIVE_FEDERATION__';\n\nexport type NfCache = {\n externals: Map<string, string>;\n remoteNamesToRemote: Map<string, Remote>;\n baseUrlToRemoteNames: Map<string, string>;\n};\n\nexport type Global = {\n [nfNamespace]: NfCache;\n};\n\nconst global = globalThis as unknown as Global;\n\nglobal[nfNamespace] ??= {\n externals: new Map<string, string>(),\n remoteNamesToRemote: new Map<string, Remote>(),\n baseUrlToRemoteNames: new Map<string, string>(),\n};\n\nexport const globalCache = global[nfNamespace];\n","import { SharedInfo } from './federation-info';\nimport { globalCache } from './global-cache';\n\nconst externals = globalCache.externals;\n\nfunction getExternalKey(shared: SharedInfo) {\n return `${shared.packageName}@${shared.version}`;\n}\n\nexport function getExternalUrl(shared: SharedInfo): string | undefined {\n const packageKey = getExternalKey(shared);\n return externals.get(packageKey);\n}\n\nexport function setExternalUrl(shared: SharedInfo, url: string): void {\n const packageKey = getExternalKey(shared);\n externals.set(packageKey, url);\n}\n","export type Imports = Record<string, string>;\n\nexport type Scopes = Record<string, Imports>;\n\nexport type ImportMap = {\n imports: Imports;\n scopes: Scopes;\n};\n\nexport function mergeImportMaps(map1: ImportMap, map2: ImportMap): ImportMap {\n return {\n imports: { ...map1.imports, ...map2.imports },\n scopes: { ...map1.scopes, ...map2.scopes },\n };\n}\n","import { FederationInfo } from './federation-info';\nimport { globalCache } from './global-cache';\n\nexport type Remote = FederationInfo & {\n baseUrl: string;\n};\n\nconst remoteNamesToRemote = globalCache.remoteNamesToRemote;\nconst baseUrlToRemoteNames = globalCache.baseUrlToRemoteNames;\n\nexport function addRemote(remoteName: string, remote: Remote): void {\n remoteNamesToRemote.set(remoteName, remote);\n baseUrlToRemoteNames.set(remote.baseUrl, remoteName);\n}\n\nexport function getRemoteNameByBaseUrl(baseUrl: string): string | undefined {\n return baseUrlToRemoteNames.get(baseUrl);\n}\n\nexport function isRemoteInitialized(baseUrl: string): boolean {\n return baseUrlToRemoteNames.has(baseUrl);\n}\n\nexport function getRemote(remoteName: string): Remote | undefined {\n return remoteNamesToRemote.get(remoteName);\n}\n\nexport function hasRemote(remoteName: string): boolean {\n return remoteNamesToRemote.has(remoteName);\n}\n","import { TrustedTypePolicy, TrustedTypePolicyFactory } from 'trusted-types';\n\nconst global: any = globalThis;\n\nlet policy: TrustedTypePolicy | null | undefined;\n\nfunction createPolicy(): TrustedTypePolicy | null {\n if (policy === undefined) {\n policy = null;\n if (global.trustedTypes) {\n try {\n policy = (global.trustedTypes as TrustedTypePolicyFactory).createPolicy(\n 'native-federation',\n {\n createHTML: (html: string) => html,\n createScript: (script: string) => script,\n createScriptURL: (url: string) => url,\n },\n );\n } catch {\n // trustedTypes.createPolicy may throw an exception if called with a name that is already registered, even in report-only mode.\n }\n }\n }\n return policy;\n}\n\nexport function tryCreateTrustedScript(script: string): string | TrustedScript {\n return createPolicy()?.createScript(script) ?? script;\n}\n","import { ImportMap } from '../model/import-map';\nimport { tryCreateTrustedScript } from './trusted-types';\n\nexport function appendImportMap(importMap: ImportMap) {\n document.head.appendChild(\n Object.assign(document.createElement('script'), {\n type: tryCreateTrustedScript('importmap-shim'),\n textContent: tryCreateTrustedScript(JSON.stringify(importMap)),\n }),\n );\n}\n","/**\n * Returns the full directory of a given path.\n * @param url - The path to get the directory of.\n * @returns The full directory of the path.\n */\nexport function getDirectory(url: string) {\n const parts = url.split('/');\n parts.pop();\n return parts.join('/');\n}\n\n/**\n * Joins two paths together taking into account trailing slashes and \"./\" prefixes.\n * @param path1 - The first path to join.\n * @param path2 - The second path to join.\n * @returns The joined path.\n */\nexport function joinPaths(path1: string, path2: string) {\n while (path1.endsWith('/')) {\n path1 = path1.substring(0, path1.length - 1);\n }\n if (path2.startsWith('./')) {\n path2 = path2.substring(2, path2.length);\n }\n\n return `${path1}/${path2}`;\n}\n","export interface BuildNotificationOptions {\n enable: boolean;\n endpoint: string;\n}\n\nexport const BUILD_NOTIFICATIONS_ENDPOINT =\n '/@angular-architects/native-federation:build-notifications';\n\nexport enum BuildNotificationType {\n COMPLETED = 'federation-rebuild-complete',\n ERROR = 'federation-rebuild-error',\n CANCELLED = 'federation-rebuild-cancelled',\n}\n","import { BuildNotificationType } from './model/build-notifications-options';\n\n/**\n * Watches for federation build completion events and automatically reloads the page.\n *\n * This function establishes a Server-Sent Events (SSE) connection to listen for\n * 'federation-rebuild-complete' notifications. When a build completes successfully,\n * it triggers a page reload to reflect the latest changes.\n * @param endpoint - The SSE endpoint URL to watch for build notifications.\n */\nexport function watchFederationBuildCompletion(endpoint: string) {\n const eventSource = new EventSource(endpoint);\n\n eventSource.onmessage = function (event) {\n const data = JSON.parse(event.data);\n if (data.type === BuildNotificationType.COMPLETED) {\n console.log('[Federation] Rebuild completed, reloading...');\n window.location.reload();\n }\n };\n\n eventSource.onerror = function (event) {\n console.warn('[Federation] SSE connection error:', event);\n };\n}\n","import { getExternalUrl, setExternalUrl } from './model/externals';\nimport {\n FederationInfo,\n InitFederationOptions,\n ProcessRemoteInfoOptions,\n} from './model/federation-info';\nimport {\n ImportMap,\n Imports,\n mergeImportMaps,\n Scopes,\n} from './model/import-map';\nimport { addRemote } from './model/remotes';\nimport { appendImportMap } from './utils/add-import-map';\nimport { getDirectory, joinPaths } from './utils/path-utils';\nimport { watchFederationBuildCompletion } from './watch-federation-build';\n\n/**\n * Initializes the Native Federation runtime for the host application.\n *\n * This is the main entry point for setting up federation. It performs the following:\n * 1. Loads the host's remoteEntry.json to discover shared dependencies\n * 2. Loads each remote's remoteEntry.json to discover exposed modules\n * 3. Creates an ES Module import map with proper scoping\n * 4. Injects the import map into the DOM as a <script type=\"importmap-shim\">\n *\n * The import map allows dynamic imports to resolve correctly:\n * - Host shared deps go in root imports (e.g., \"angular\": \"./angular.js\")\n * - Remote exposed modules go in root imports (e.g., \"mfe1/Component\": \"http://...\")\n * - Remote shared deps go in scoped imports for proper resolution\n *\n * @param remotesOrManifestUrl - Either:\n * - A record of remote names to their remoteEntry.json URLs\n * Example: { mfe1: 'http://localhost:3000/remoteEntry.json' }\n * - A URL to a manifest.json that contains the remotes record\n * Example: 'http://localhost:3000/federation-manifest.json'\n *\n * @param options - Configuration options:\n * - cacheTag: A version string to append as query param for cache busting\n * Example: { cacheTag: 'v1.0.0' } results in '?t=v1.0.0' on all requests\n *\n * @returns The final merged ImportMap that was injected into the DOM\n *\n */\nexport async function initFederation(\n remotesOrManifestUrl: Record<string, string> | string = {},\n options?: InitFederationOptions,\n): Promise<ImportMap> {\n const cacheTag = options?.cacheTag ? `?t=${options.cacheTag}` : '';\n\n const normalizedRemotes =\n typeof remotesOrManifestUrl === 'string'\n ? await loadManifest(remotesOrManifestUrl + cacheTag)\n : remotesOrManifestUrl;\n\n const hostInfo = await loadFederationInfo(`./remoteEntry.json${cacheTag}`);\n\n const hostImportMap = await processHostInfo(hostInfo);\n\n // Host application is fully loaded, now we can process the remotes\n\n // Each remote contributes:\n // - Exposed modules to root imports\n // - Shared dependencies to scoped imports\n const remotesImportMap = await processRemoteInfos(normalizedRemotes, {\n throwIfRemoteNotFound: false,\n ...options,\n });\n\n const mergedImportMap = mergeImportMaps(hostImportMap, remotesImportMap);\n\n // Inject the final import map into the DOM with importmap-shim\n appendImportMap(mergedImportMap);\n\n return mergedImportMap;\n}\n\n/**\n * Loads a federation manifest file (JSON) from the given URL.\n *\n * The manifest should map remote names to their remoteEntry.json URLs.\n *\n * @param manifestUrl - The URL to the manifest.json file.\n * @returns A promise resolving to an object mapping remote names to their remoteEntry.json URLs.\n */\nasync function loadManifest(\n manifestUrl: string,\n): Promise<Record<string, string>> {\n const manifest = (await fetch(manifestUrl).then((r) => r.json())) as Record<\n string,\n string\n >;\n return manifest;\n}\n\n/**\n * Adds cache busting query parameter to a URL if cacheTag is provided.\n */\nfunction applyCacheTag(url: string, cacheTag?: string): string {\n if (!cacheTag) return url;\n\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}t=${cacheTag}`;\n}\n\n/**\n * Handles errors when loading a remote entry.\n * Either throws or logs based on options.\n */\nfunction handleRemoteLoadError(\n remoteName: string,\n remoteUrl: string,\n options: ProcessRemoteInfoOptions,\n originalError: Error,\n): null {\n const errorMessage = `Error loading remote entry for ${remoteName} from file ${remoteUrl}`;\n\n if (options.throwIfRemoteNotFound) {\n throw new Error(errorMessage);\n }\n\n console.error(errorMessage);\n console.error(originalError);\n return null;\n}\n\n/**\n * Fetches and registers multiple remote applications in parallel and merges their import maps.\n *\n * This function is the orchestrator for loading all remotes. It:\n * 1. Creates a promise for each remote to load its remoteEntry.json\n * 2. Applies cache busting to each remote URL\n * 3. Handles errors gracefully (logs or throws based on options)\n * 4. Merges all successful remote import maps into one\n *\n * Each remote contributes:\n * - Its exposed modules to the root imports\n * - Its shared dependencies to scoped imports\n *\n * @param remotes - Record of remote names to their remoteEntry.json URLs\n * @param options - Processing options including:\n * - throwIfRemoteNotFound: Whether to throw or log on remote load failure\n * - cacheTag: Cache busting tag to append to URLs\n *\n * @returns Merged import map containing all remotes' contributions\n *\n */\n\nexport async function processRemoteInfos(\n remotes: Record<string, string>,\n options: ProcessRemoteInfoOptions = { throwIfRemoteNotFound: false },\n): Promise<ImportMap> {\n // Each promise will independently fetch and process its remoteEntry.json\n const fetchAndRegisterRemotePromises = Object.entries(remotes).map(\n async ([remoteName, remoteUrl]): Promise<ImportMap | null> => {\n try {\n const urlWithCache = applyCacheTag(remoteUrl, options.cacheTag);\n\n return await fetchAndRegisterRemote(urlWithCache, remoteName);\n } catch (e) {\n return handleRemoteLoadError(\n remoteName,\n remoteUrl,\n options,\n e as Error,\n );\n }\n },\n );\n\n const remoteImportMaps = await Promise.all(fetchAndRegisterRemotePromises);\n\n // Filter out failed remotes (null values) and merge successful ones\n const importMap = remoteImportMaps.reduce<ImportMap>(\n (acc, remoteImportMap) =>\n remoteImportMap ? mergeImportMaps(acc, remoteImportMap) : acc,\n { imports: {}, scopes: {} },\n );\n\n return importMap;\n}\n\n/**\n * Fetches a single remote application's remoteEntry.json file and registers it in the system (global registry).\n *\n * This function handles everything needed to integrate one remote:\n * 1. Fetches the remote's remoteEntry.json file\n * 2. Extracts the base URL from the remoteEntry path\n * 3. Creates import map entries for exposed modules and shared deps\n * 4. Registers the remote in the global remotes registry\n * 5. Sets up hot reload watching if configured (development mode)\n *\n * @param federationInfoUrl - Full URL to the remote's remoteEntry.json\n * @param remoteName - Name to use for this remote (optional, uses info.name if not provided)\n *\n * @returns Import map containing this remote's exposed modules and shared dependencies\n *\n * @example\n * ```typescript\n * const importMap = await fetchAndRegisterRemote(\n * 'http://localhost:3000/mfe1/remoteEntry.json',\n * 'mfe1'\n * );\n * // Result: {\n * // imports: { 'mfe1/Component': 'http://localhost:3000/mfe1/Component.js' },\n * // scopes: { 'http://localhost:3000/mfe1/': { 'lodash': '...' } }\n * // }\n * ```\n */\nexport async function fetchAndRegisterRemote(\n federationInfoUrl: string,\n remoteName?: string,\n): Promise<ImportMap> {\n const baseUrl = getDirectory(federationInfoUrl);\n\n const remoteInfo = await loadFederationInfo(federationInfoUrl);\n\n // Uses the name from the remote's remoteEntry.json if not explicitly provided\n if (!remoteName) {\n remoteName = remoteInfo.name;\n }\n\n // Setup hot reload watching for development mode and in case it has a build notifications endpoint\n if (remoteInfo.buildNotificationsEndpoint) {\n watchFederationBuildCompletion(\n baseUrl + remoteInfo.buildNotificationsEndpoint,\n );\n }\n\n const importMap = createRemoteImportMap(remoteInfo, remoteName, baseUrl);\n\n // Register this remote in the global registry\n addRemote(remoteName, { ...remoteInfo, baseUrl });\n\n return importMap;\n}\n\n/**\n * Creates an import map for a remote application.\n *\n * The import map has two parts:\n * 1. Imports (root level): Maps remote's exposed modules\n * Example: \"mfe1/Component\" -> \"http://localhost:3000/mfe1/Component.js\"\n *\n * 2. Scopes: Maps remote's shared dependencies within its scope\n * Example: \"http://localhost:3000/mfe1/\": { \"lodash\": \"http://localhost:3000/mfe1/lodash.js\" }\n *\n * Scoping ensures that when a module from this remote imports 'lodash',\n * it gets the version from this remote's bundle, not another version.\n *\n * @param remoteInfo - Federation info from the remote's remoteEntry.json\n * @param remoteName - Name used to prefix exposed module keys\n * @param baseUrl - Base URL where the remote is hosted\n *\n * @returns Import map with imports and scopes for this remote\n */\nfunction createRemoteImportMap(\n remoteInfo: FederationInfo,\n remoteName: string,\n baseUrl: string,\n): ImportMap {\n const imports = processExposed(remoteInfo, remoteName, baseUrl);\n const scopes = processRemoteImports(remoteInfo, baseUrl);\n\n return { imports, scopes };\n}\n\n/**\n * Fetches and parses a remoteEntry.json file.\n *\n * The remoteEntry.json contains metadata about a federated module:\n * - name: The application name\n * - exposes: Array of modules this app exposes to others\n * - shared: Array of dependencies this app shares\n * - buildNotificationsEndpoint: Optional SSE endpoint for hot reload (development mode)\n *\n * @param remoteEntryUrl - URL to the remoteEntry.json file (can be relative or absolute)\n * @returns Parsed federation info object\n */\nasync function loadFederationInfo(\n remoteEntryUrl: string,\n): Promise<FederationInfo> {\n const info = (await fetch(remoteEntryUrl).then((r) =>\n r.json(),\n )) as FederationInfo;\n return info;\n}\n\n/**\n * Processes a remote's shared dependencies into scoped import map entries.\n *\n * Shared dependencies need to be scoped to avoid version conflicts.\n * When a module from \"http://localhost:3000/mfe1/\" imports \"lodash\",\n * the import map scope ensures it gets the correct version.\n *\n * Scope structure:\n * {\n * \"http://localhost:3000/mfe1/\": {\n * \"lodash\": \"http://localhost:3000/mfe1/lodash.js\",\n * \"rxjs\": \"http://localhost:3000/mfe1/rxjs.js\"\n * }\n * }\n *\n * This function also manages external URLs - if a shared dependency\n * has already been loaded from another location, it can reuse that URL.\n *\n * @param remoteInfo - Federation info containing shared dependencies\n * @param baseUrl - Base URL of the remote (used as the scope key)\n *\n * @returns Scopes object mapping baseUrl to its shared dependencies\n */\nfunction processRemoteImports(\n remoteInfo: FederationInfo,\n baseUrl: string,\n): Scopes {\n const scopes: Scopes = {};\n const scopedImports: Imports = {};\n\n for (const shared of remoteInfo.shared) {\n // Check if this dependency already has an external URL registered\n // If not, construct the URL from the base path and output filename\n const outFileName =\n getExternalUrl(shared) ?? joinPaths(baseUrl, shared.outFileName);\n\n // Register this URL as the external location for this shared dependency\n // This allows other remotes to potentially reuse this version\n setExternalUrl(shared, outFileName);\n\n // Add to the scoped imports: package name -> full URL\n scopedImports[shared.packageName] = outFileName;\n }\n\n scopes[baseUrl + '/'] = scopedImports;\n\n return scopes;\n}\n\n/**\n * Processes a remote's exposed modules into root-level import map entries.\n *\n * Exposed modules are what the remote makes available to other applications.\n * They go in the root imports (not scoped) so any app can import them.\n *\n * Example exposed module:\n * - Remote 'mfe1' exposes './Component' from file 'Component.js'\n * - Results in: \"mfe1/Component\" -> \"http://localhost:3000/mfe1/Component.js\"\n *\n * This allows other apps to do:\n * ```typescript\n * import { Component } from 'mfe1/Component';\n * ```\n *\n * @param remoteInfo - Federation info containing exposed modules\n * @param remoteName - Name to prefix the exposed keys with\n * @param baseUrl - Base URL where the remote's files are hosted\n *\n * @returns Imports object mapping remote module keys to their URLs\n */\nfunction processExposed(\n remoteInfo: FederationInfo,\n remoteName: string,\n baseUrl: string,\n): Imports {\n const imports: Imports = {};\n\n for (const exposed of remoteInfo.exposes) {\n // Create the import key by joining remote name with the exposed key\n // Example: 'mfe1' + './Component' -> 'mfe1/Component'\n const key = joinPaths(remoteName, exposed.key);\n\n // Create the full URL to the exposed module's output file\n // Example: 'http://localhost:3000/mfe1' + 'Component.js' -> 'http://localhost:3000/mfe1/Component.js'\n const value = joinPaths(baseUrl, exposed.outFileName);\n\n imports[key] = value;\n }\n\n return imports;\n}\n\n/**\n * Processes the host application's federation info into an import map.\n *\n * The host app typically doesn't expose modules (it's the consumer),\n * but it does share dependencies that should be available to remotes.\n *\n * Host shared dependencies go in root-level imports (not scoped) because:\n * 1. The host loads first and establishes the base environment\n * 2. Remotes should prefer host versions to avoid duplication\n *\n * @param hostInfo - Federation info from the host's remoteEntry.json\n * @param relBundlesPath - Relative path to the host's bundle directory (default: './')\n *\n * @returns Import map with host's shared dependencies in root imports\n */\nexport async function processHostInfo(\n hostInfo: FederationInfo,\n relBundlesPath = './',\n): Promise<ImportMap> {\n // Transform shared array into imports object\n const imports = hostInfo.shared.reduce(\n (acc, cur) => ({\n ...acc,\n [cur.packageName]: relBundlesPath + cur.outFileName,\n }),\n {},\n ) as Imports;\n\n // Register external URLs for host's shared dependencies\n // This allows remotes to discover and potentially reuse these versions\n for (const shared of hostInfo.shared) {\n setExternalUrl(shared, relBundlesPath + shared.outFileName);\n }\n\n // Host doesn't have scopes - its shared deps are at root level\n return { imports, scopes: {} };\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { fetchAndRegisterRemote } from './init-federation';\nimport {\n getRemote,\n getRemoteNameByBaseUrl,\n isRemoteInitialized,\n} from './model/remotes';\nimport { appendImportMap } from './utils/add-import-map';\nimport { getDirectory, joinPaths } from './utils/path-utils';\n\ndeclare function importShim<T>(url: string): T;\n\n/**\n * Options for loading a remote module.\n *\n * @template T - The expected type of the module's exports\n *\n * @property remoteEntry - Optional URL to the remote's remoteEntry.json file.\n * Used for lazy-loading remotes that weren't registered during initFederation\n * Example: 'http://localhost:3000/remoteEntry.json'\n *\n * @property remoteName - Optional name of the remote application.\n * Should match the name used during initFederation or the name in remoteEntry.json.\n * Example: 'mfe1'\n *\n * @property exposedModule - The key of the exposed module to load (required).\n * Must match the key defined in the remote's federation config.\n * Example: './Component' or './Dashboard'\n *\n * @property fallback - Optional fallback value to return if the remote or module cannot be loaded.\n * Prevents throwing errors and provides graceful degradation.\n * Example: A default component or null\n */\nexport type LoadRemoteModuleOptions<T = any> = {\n remoteEntry?: string;\n remoteName?: string;\n exposedModule: string;\n fallback?: T;\n};\n\n/**\n * Dynamically loads a remote module at runtime from a federated application.\n *\n * This is the primary API for consuming remote modules after federation has been initialized.\n * It supports two calling patterns:\n *\n * **Pattern 1: Using options object**\n * ```typescript\n * const module = await loadRemoteModule({\n * remoteName: 'mfe1',\n * exposedModule: './Component',\n * fallback: DefaultComponent\n * });\n * ```\n *\n * **Pattern 2: Using positional arguments**\n * ```typescript\n * const module = await loadRemoteModule('mfe1', './Component');\n * ```\n *\n * ## Loading Process\n *\n * 1. **Normalize Options**: Converts arguments into a standard options object\n * 2. **Ensure Remote Initialized**: If remoteEntry is provided and remote isn't loaded,\n * fetches and registers it dynamically\n * 3. **Resolve Remote Name**: Determines remote name from options or remoteEntry URL\n * 4. **Validate Remote**: Checks if remote exists in the registry\n * 5. **Validate Exposed Module**: Verifies the requested module is exposed by the remote\n * 6. **Import Module**: Uses dynamic import or import-shim to load the module\n * 7. **Handle Errors**: Returns fallback if provided, otherwise throws\n *\n * ## Lazy Loading Support\n *\n * If you provide a `remoteEntry` URL for a remote that wasn't initialized during\n * `initFederation()`, this function will automatically:\n * - Fetch the remote's remoteEntry.json\n * - Register it in the global registry\n * - Update the import map\n * - Then load the requested module\n *\n * This enables on-demand loading of remotes based on user interactions.\n *\n *\n * @template T - The expected type of the module's exports\n *\n * @param options - Configuration object for loading the remote module\n * @returns Promise resolving to the loaded module or fallback value\n *\n * @throws Error if remote is not found and no fallback is provided\n * @throws Error if exposed module doesn't exist and no fallback is provided\n * @throws Error if module import fails and no fallback is provided\n *\n */\nexport async function loadRemoteModule<T = any>(\n options: LoadRemoteModuleOptions,\n): Promise<T>;\nexport async function loadRemoteModule<T = any>(\n remoteName: string,\n exposedModule: string,\n): Promise<T>;\nexport async function loadRemoteModule<T = any>(\n optionsOrRemoteName: LoadRemoteModuleOptions<T> | string,\n exposedModule?: string,\n): Promise<T> {\n const options = normalizeOptions(optionsOrRemoteName, exposedModule);\n\n await ensureRemoteInitialized(options);\n\n const remoteName = getRemoteNameByOptions(options);\n\n const remote = getRemote(remoteName);\n const fallback = options.fallback;\n\n // Handles errors when the remote is missing\n const remoteError = !remote ? 'unknown remote ' + remoteName : '';\n if (!remote && !fallback) throw new Error(remoteError);\n if (!remote) {\n logClientError(remoteError);\n return Promise.resolve(fallback);\n }\n\n const exposedModuleInfo = remote.exposes.find(\n (e) => e.key === options.exposedModule,\n );\n\n // Handles errors when the exposed module is missing\n const exposedError = !exposedModuleInfo\n ? `Unknown exposed module ${options.exposedModule} in remote ${remoteName}`\n : '';\n if (!exposedModuleInfo && !fallback) throw new Error(exposedError);\n if (!exposedModuleInfo) {\n logClientError(exposedError);\n return Promise.resolve(fallback);\n }\n\n const moduleUrl = joinPaths(remote.baseUrl, exposedModuleInfo.outFileName);\n\n try {\n const module = _import<T>(moduleUrl);\n return module;\n } catch (e) {\n // Handles errors when the module import fails\n if (fallback) {\n console.error('error loading remote module', e);\n return fallback;\n }\n throw e;\n }\n}\n\n/**\n * Internal helper function to perform the dynamic import.\n *\n * @template T - The expected type of the module's exports\n * @param moduleUrl - Full URL to the module file to import\n * @returns Promise resolving to the imported module\n */\nfunction _import<T = any>(moduleUrl: string) {\n return typeof importShim !== 'undefined'\n ? importShim<T>(moduleUrl)\n : (import(/* @vite-ignore */ moduleUrl) as T);\n}\n\n/**\n * Resolves the remote name from the provided options.\n *\n * The remote name can be determined in two ways:\n * 1. If options.remoteName is provided, use it directly\n * 2. If only remoteEntry is provided, extract the baseUrl\n * and look up the remote name from the registry using that baseUrl\n *\n * @param options - Load options containing remoteName and/or remoteEntry\n * @returns The resolved remote name\n *\n * @throws Error if neither remoteName nor remoteEntry is provided\n * @throws Error if the remote name cannot be determined\n */\nfunction getRemoteNameByOptions(options: LoadRemoteModuleOptions) {\n let remoteName: string | undefined;\n\n if (options.remoteName) {\n remoteName = options.remoteName;\n } else if (options.remoteEntry) {\n const baseUrl = getDirectory(options.remoteEntry);\n remoteName = getRemoteNameByBaseUrl(baseUrl);\n } else {\n throw new Error(\n 'unexpected arguments: Please pass remoteName or remoteEntry',\n );\n }\n\n if (!remoteName) {\n throw new Error('unknown remoteName ' + remoteName);\n }\n return remoteName;\n}\n\n/**\n * Ensures that the remote is initialized before attempting to load a module from it.\n *\n * This function enables lazy-loading of remotes that weren't registered during\n * the initial `initFederation()` call. It checks if:\n * 1. A remoteEntry URL is provided in the options\n * 2. The remote at that URL hasn't been initialized yet\n *\n * If both conditions are true, it:\n * 1. Fetches the remote's remoteEntry.json file\n * 2. Registers the remote in the global registry\n * 3. Creates and appends the remote's import map to the DOM\n *\n * @param options - Load options containing optional remoteEntry URL\n * @returns Promise that resolves when the remote is initialized (or immediately if already initialized)\n *\n */\nasync function ensureRemoteInitialized(\n options: LoadRemoteModuleOptions,\n): Promise<void> {\n if (\n options.remoteEntry &&\n !isRemoteInitialized(getDirectory(options.remoteEntry))\n ) {\n const importMap = await fetchAndRegisterRemote(options.remoteEntry);\n appendImportMap(importMap);\n }\n}\n\n/**\n * Normalizes the function arguments into a standard LoadRemoteModuleOptions object.\n *\n * The function detects which pattern is being used and converts it to the\n * standard options object format for consistent internal processing.\n *\n * @param optionsOrRemoteName - Either an options object or the remote name string\n * @param exposedModule - The exposed module key\n * @returns Normalized options object\n *\n * @throws Error if arguments don't match either supported pattern\n */\nfunction normalizeOptions(\n optionsOrRemoteName: string | LoadRemoteModuleOptions,\n exposedModule: string | undefined,\n): LoadRemoteModuleOptions {\n let options: LoadRemoteModuleOptions;\n\n if (typeof optionsOrRemoteName === 'string' && exposedModule) {\n options = {\n remoteName: optionsOrRemoteName,\n exposedModule,\n };\n } else if (typeof optionsOrRemoteName === 'object' && !exposedModule) {\n options = optionsOrRemoteName;\n } else {\n throw new Error(\n 'unexpected arguments: please pass options or a remoteName/exposedModule-pair',\n );\n }\n return options;\n}\n\n/**\n * Logs an error message to the console, but only in browser environments.\n *\n * @param error - The error message to log\n *\n */\nfunction logClientError(error: string): void {\n if (typeof window !== 'undefined') {\n console.error(error);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["global"],"mappings":"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"}
package/index.d.ts CHANGED
@@ -57,21 +57,180 @@ type ImportMap = {
57
57
  declare function mergeImportMaps(map1: ImportMap, map2: ImportMap): ImportMap;
58
58
 
59
59
  /**
60
- * Initialize the federation runtime
61
- * @param remotesOrManifestUrl
62
- * @param options The cacheTag allows you to invalidate the cache of the remoteEntry.json files, pass a new value with every release (f.ex. the version number)
60
+ * Initializes the Native Federation runtime for the host application.
61
+ *
62
+ * This is the main entry point for setting up federation. It performs the following:
63
+ * 1. Loads the host's remoteEntry.json to discover shared dependencies
64
+ * 2. Loads each remote's remoteEntry.json to discover exposed modules
65
+ * 3. Creates an ES Module import map with proper scoping
66
+ * 4. Injects the import map into the DOM as a <script type="importmap-shim">
67
+ *
68
+ * The import map allows dynamic imports to resolve correctly:
69
+ * - Host shared deps go in root imports (e.g., "angular": "./angular.js")
70
+ * - Remote exposed modules go in root imports (e.g., "mfe1/Component": "http://...")
71
+ * - Remote shared deps go in scoped imports for proper resolution
72
+ *
73
+ * @param remotesOrManifestUrl - Either:
74
+ * - A record of remote names to their remoteEntry.json URLs
75
+ * Example: { mfe1: 'http://localhost:3000/remoteEntry.json' }
76
+ * - A URL to a manifest.json that contains the remotes record
77
+ * Example: 'http://localhost:3000/federation-manifest.json'
78
+ *
79
+ * @param options - Configuration options:
80
+ * - cacheTag: A version string to append as query param for cache busting
81
+ * Example: { cacheTag: 'v1.0.0' } results in '?t=v1.0.0' on all requests
82
+ *
83
+ * @returns The final merged ImportMap that was injected into the DOM
84
+ *
63
85
  */
64
86
  declare function initFederation(remotesOrManifestUrl?: Record<string, string> | string, options?: InitFederationOptions): Promise<ImportMap>;
87
+ /**
88
+ * Fetches and registers multiple remote applications in parallel and merges their import maps.
89
+ *
90
+ * This function is the orchestrator for loading all remotes. It:
91
+ * 1. Creates a promise for each remote to load its remoteEntry.json
92
+ * 2. Applies cache busting to each remote URL
93
+ * 3. Handles errors gracefully (logs or throws based on options)
94
+ * 4. Merges all successful remote import maps into one
95
+ *
96
+ * Each remote contributes:
97
+ * - Its exposed modules to the root imports
98
+ * - Its shared dependencies to scoped imports
99
+ *
100
+ * @param remotes - Record of remote names to their remoteEntry.json URLs
101
+ * @param options - Processing options including:
102
+ * - throwIfRemoteNotFound: Whether to throw or log on remote load failure
103
+ * - cacheTag: Cache busting tag to append to URLs
104
+ *
105
+ * @returns Merged import map containing all remotes' contributions
106
+ *
107
+ */
65
108
  declare function processRemoteInfos(remotes: Record<string, string>, options?: ProcessRemoteInfoOptions): Promise<ImportMap>;
66
- declare function processRemoteInfo(federationInfoUrl: string, remoteName?: string): Promise<ImportMap>;
109
+ /**
110
+ * Fetches a single remote application's remoteEntry.json file and registers it in the system (global registry).
111
+ *
112
+ * This function handles everything needed to integrate one remote:
113
+ * 1. Fetches the remote's remoteEntry.json file
114
+ * 2. Extracts the base URL from the remoteEntry path
115
+ * 3. Creates import map entries for exposed modules and shared deps
116
+ * 4. Registers the remote in the global remotes registry
117
+ * 5. Sets up hot reload watching if configured (development mode)
118
+ *
119
+ * @param federationInfoUrl - Full URL to the remote's remoteEntry.json
120
+ * @param remoteName - Name to use for this remote (optional, uses info.name if not provided)
121
+ *
122
+ * @returns Import map containing this remote's exposed modules and shared dependencies
123
+ *
124
+ * @example
125
+ * ```typescript
126
+ * const importMap = await fetchAndRegisterRemote(
127
+ * 'http://localhost:3000/mfe1/remoteEntry.json',
128
+ * 'mfe1'
129
+ * );
130
+ * // Result: {
131
+ * // imports: { 'mfe1/Component': 'http://localhost:3000/mfe1/Component.js' },
132
+ * // scopes: { 'http://localhost:3000/mfe1/': { 'lodash': '...' } }
133
+ * // }
134
+ * ```
135
+ */
136
+ declare function fetchAndRegisterRemote(federationInfoUrl: string, remoteName?: string): Promise<ImportMap>;
137
+ /**
138
+ * Processes the host application's federation info into an import map.
139
+ *
140
+ * The host app typically doesn't expose modules (it's the consumer),
141
+ * but it does share dependencies that should be available to remotes.
142
+ *
143
+ * Host shared dependencies go in root-level imports (not scoped) because:
144
+ * 1. The host loads first and establishes the base environment
145
+ * 2. Remotes should prefer host versions to avoid duplication
146
+ *
147
+ * @param hostInfo - Federation info from the host's remoteEntry.json
148
+ * @param relBundlesPath - Relative path to the host's bundle directory (default: './')
149
+ *
150
+ * @returns Import map with host's shared dependencies in root imports
151
+ */
67
152
  declare function processHostInfo(hostInfo: FederationInfo, relBundlesPath?: string): Promise<ImportMap>;
68
153
 
154
+ /**
155
+ * Options for loading a remote module.
156
+ *
157
+ * @template T - The expected type of the module's exports
158
+ *
159
+ * @property remoteEntry - Optional URL to the remote's remoteEntry.json file.
160
+ * Used for lazy-loading remotes that weren't registered during initFederation
161
+ * Example: 'http://localhost:3000/remoteEntry.json'
162
+ *
163
+ * @property remoteName - Optional name of the remote application.
164
+ * Should match the name used during initFederation or the name in remoteEntry.json.
165
+ * Example: 'mfe1'
166
+ *
167
+ * @property exposedModule - The key of the exposed module to load (required).
168
+ * Must match the key defined in the remote's federation config.
169
+ * Example: './Component' or './Dashboard'
170
+ *
171
+ * @property fallback - Optional fallback value to return if the remote or module cannot be loaded.
172
+ * Prevents throwing errors and provides graceful degradation.
173
+ * Example: A default component or null
174
+ */
69
175
  type LoadRemoteModuleOptions<T = any> = {
70
176
  remoteEntry?: string;
71
177
  remoteName?: string;
72
178
  exposedModule: string;
73
179
  fallback?: T;
74
180
  };
181
+ /**
182
+ * Dynamically loads a remote module at runtime from a federated application.
183
+ *
184
+ * This is the primary API for consuming remote modules after federation has been initialized.
185
+ * It supports two calling patterns:
186
+ *
187
+ * **Pattern 1: Using options object**
188
+ * ```typescript
189
+ * const module = await loadRemoteModule({
190
+ * remoteName: 'mfe1',
191
+ * exposedModule: './Component',
192
+ * fallback: DefaultComponent
193
+ * });
194
+ * ```
195
+ *
196
+ * **Pattern 2: Using positional arguments**
197
+ * ```typescript
198
+ * const module = await loadRemoteModule('mfe1', './Component');
199
+ * ```
200
+ *
201
+ * ## Loading Process
202
+ *
203
+ * 1. **Normalize Options**: Converts arguments into a standard options object
204
+ * 2. **Ensure Remote Initialized**: If remoteEntry is provided and remote isn't loaded,
205
+ * fetches and registers it dynamically
206
+ * 3. **Resolve Remote Name**: Determines remote name from options or remoteEntry URL
207
+ * 4. **Validate Remote**: Checks if remote exists in the registry
208
+ * 5. **Validate Exposed Module**: Verifies the requested module is exposed by the remote
209
+ * 6. **Import Module**: Uses dynamic import or import-shim to load the module
210
+ * 7. **Handle Errors**: Returns fallback if provided, otherwise throws
211
+ *
212
+ * ## Lazy Loading Support
213
+ *
214
+ * If you provide a `remoteEntry` URL for a remote that wasn't initialized during
215
+ * `initFederation()`, this function will automatically:
216
+ * - Fetch the remote's remoteEntry.json
217
+ * - Register it in the global registry
218
+ * - Update the import map
219
+ * - Then load the requested module
220
+ *
221
+ * This enables on-demand loading of remotes based on user interactions.
222
+ *
223
+ *
224
+ * @template T - The expected type of the module's exports
225
+ *
226
+ * @param options - Configuration object for loading the remote module
227
+ * @returns Promise resolving to the loaded module or fallback value
228
+ *
229
+ * @throws Error if remote is not found and no fallback is provided
230
+ * @throws Error if exposed module doesn't exist and no fallback is provided
231
+ * @throws Error if module import fails and no fallback is provided
232
+ *
233
+ */
75
234
  declare function loadRemoteModule<T = any>(options: LoadRemoteModuleOptions): Promise<T>;
76
235
  declare function loadRemoteModule<T = any>(remoteName: string, exposedModule: string): Promise<T>;
77
236
 
@@ -86,5 +245,5 @@ declare enum BuildNotificationType {
86
245
  CANCELLED = "federation-rebuild-cancelled"
87
246
  }
88
247
 
89
- export { BUILD_NOTIFICATIONS_ENDPOINT, BuildNotificationType, getShared, initFederation, loadRemoteModule, mergeImportMaps, processHostInfo, processRemoteInfo, processRemoteInfos };
248
+ export { BUILD_NOTIFICATIONS_ENDPOINT, BuildNotificationType, fetchAndRegisterRemote, getShared, initFederation, loadRemoteModule, mergeImportMaps, processHostInfo, processRemoteInfos };
90
249
  export type { BuildNotificationOptions, ExposesInfo, FederationInfo, ImportMap, Imports, InitFederationOptions, LoadRemoteModuleOptions, ProcessRemoteInfoOptions, Scopes, ShareConfig, ShareObject, ShareOptions, SharedInfo };
package/package.json CHANGED
@@ -1,9 +1,15 @@
1
1
  {
2
2
  "name": "@softarc/native-federation-runtime",
3
- "version": "3.4.2",
3
+ "version": "3.5.1",
4
+ "license": "MIT",
4
5
  "dependencies": {
5
6
  "tslib": "^2.3.0"
6
7
  },
8
+ "msw": {
9
+ "workerDirectory": [
10
+ "public"
11
+ ]
12
+ },
7
13
  "module": "fesm2022/softarc-native-federation-runtime.mjs",
8
14
  "typings": "index.d.ts",
9
15
  "exports": {