{"version":3,"file":"index.cjs","names":["PluginSystem","SyncWaterfallHook","AsyncWaterfallHook","AsyncHook","SyncHook","matchRemoteWithNameAndExpose","getRemoteInfo","formatPreloadArgs","composeRemoteRequestId","preloadAssets","RUNTIME_004","runtimeDescMap","optionsToMFContext","Module","isBrowserEnvValue","DEFAULT_SCOPE","DEFAULT_REMOTE_TYPE","CurrentGlobal","getRemoteEntryUniqueKey","globalLoading","getGlobalShareScope","getGlobalRemoteInfo","getInfoWithoutType","Global"],"sources":["../../src/remote/index.ts"],"sourcesContent":["import {\n  isBrowserEnvValue,\n  warn,\n  composeKeyWithSeparator,\n  ModuleInfo,\n  GlobalModuleInfo,\n} from '@module-federation/sdk';\nimport { RUNTIME_004, runtimeDescMap } from '@module-federation/error-codes';\nimport {\n  Global,\n  getInfoWithoutType,\n  globalLoading,\n  CurrentGlobal,\n} from '../global';\nimport {\n  Options,\n  UserOptions,\n  PreloadAssets,\n  PreloadOptions,\n  PreloadRemoteArgs,\n  PreloadRemoteResult,\n  Remote,\n  RemoteInfo,\n  RemoteEntryExports,\n  CallFrom,\n} from '../type';\nimport { ModuleFederation } from '../core';\nimport {\n  PluginSystem,\n  AsyncHook,\n  AsyncWaterfallHook,\n  SyncHook,\n  SyncWaterfallHook,\n} from '../utils/hooks';\nimport {\n  assert,\n  error,\n  getRemoteInfo,\n  getRemoteEntryUniqueKey,\n  composeRemoteRequestId,\n  matchRemoteWithNameAndExpose,\n  optionsToMFContext,\n  logger,\n} from '../utils';\nimport { DEFAULT_REMOTE_TYPE, DEFAULT_SCOPE } from '../constant';\nimport { Module, ModuleOptions } from '../module';\nimport { formatPreloadArgs, preloadAssets } from '../utils/preload';\nimport { getGlobalShareScope } from '../utils/share';\nimport { getGlobalRemoteInfo } from '../plugins/snapshot/SnapshotHandler';\n\nexport interface LoadRemoteMatch {\n  id: string;\n  pkgNameOrAlias: string;\n  expose: string;\n  remote: Remote;\n  options: Options;\n  origin: ModuleFederation;\n  remoteInfo: RemoteInfo;\n  remoteSnapshot?: ModuleInfo;\n}\n\nexport class RemoteHandler {\n  host: ModuleFederation;\n  idToRemoteMap: Record<string, { name: string; expose: string }>;\n\n  hooks = new PluginSystem({\n    beforeRegisterRemote: new SyncWaterfallHook<{\n      remote: Remote;\n      origin: ModuleFederation;\n    }>('beforeRegisterRemote'),\n    registerRemote: new SyncWaterfallHook<{\n      remote: Remote;\n      origin: ModuleFederation;\n    }>('registerRemote'),\n    beforeRequest: new AsyncWaterfallHook<{\n      id: string;\n      options: Options;\n      origin: ModuleFederation;\n    }>('beforeRequest'),\n    afterMatchRemote: new AsyncHook<\n      [\n        {\n          id: string;\n          options: Options;\n          remote?: Remote;\n          expose?: string;\n          remoteInfo?: RemoteInfo;\n          error?: unknown;\n          origin: ModuleFederation;\n        },\n      ],\n      void\n    >('afterMatchRemote'),\n    onLoad: new AsyncHook<\n      [\n        {\n          id: string;\n          expose: string;\n          pkgNameOrAlias: string;\n          remote: Remote;\n          options: ModuleOptions;\n          origin: ModuleFederation;\n          exposeModule: any;\n          exposeModuleFactory: any;\n          moduleInstance: Module;\n        },\n      ],\n      unknown\n    >('onLoad'),\n    afterLoadRemote: new AsyncHook<\n      [\n        {\n          id: string;\n          expose?: string;\n          remote?: RemoteInfo;\n          options?: {\n            loadFactory?: boolean;\n            from?: CallFrom;\n          };\n          error?: unknown;\n          recovered?: boolean;\n          origin: ModuleFederation;\n        },\n      ],\n      void\n    >('afterLoadRemote'),\n    handlePreloadModule: new SyncHook<\n      [\n        {\n          id: string;\n          name: string;\n          remote: Remote;\n          remoteSnapshot: ModuleInfo;\n          preloadConfig: PreloadRemoteArgs;\n          origin: ModuleFederation;\n        },\n      ],\n      void\n    >('handlePreloadModule'),\n    errorLoadRemote: new AsyncHook<\n      [\n        {\n          id: string;\n          error: unknown;\n          options?: any;\n          from: CallFrom;\n          lifecycle:\n            | 'beforeRequest'\n            | 'beforeLoadShare'\n            | 'afterResolve'\n            | 'onLoad';\n          remote?: RemoteInfo;\n          expose?: string;\n          origin: ModuleFederation;\n        },\n      ],\n      void | unknown\n    >('errorLoadRemote'),\n    beforePreloadRemote: new AsyncHook<\n      [\n        {\n          preloadOps: Array<PreloadRemoteArgs>;\n          options: Options;\n          origin: ModuleFederation;\n        },\n      ]\n    >('beforePreloadRemote'),\n    generatePreloadAssets: new AsyncHook<\n      [\n        {\n          origin: ModuleFederation;\n          preloadOptions: PreloadOptions[number];\n          remote: Remote;\n          remoteInfo: RemoteInfo;\n          remoteSnapshot: ModuleInfo;\n          globalSnapshot: GlobalModuleInfo;\n        },\n      ],\n      Promise<PreloadAssets>\n    >('generatePreloadAssets'),\n    afterPreloadRemote: new AsyncHook<\n      [\n        {\n          preloadOps: Array<PreloadRemoteArgs>;\n          options: Options;\n          origin: ModuleFederation;\n          results: PreloadRemoteResult[];\n          error?: unknown;\n        },\n      ]\n    >('afterPreloadRemote'),\n    // TODO: Move to loaderHook\n    loadEntry: new AsyncHook<\n      [\n        {\n          origin: ModuleFederation;\n          loaderHook: ModuleFederation['loaderHook'];\n          remoteInfo: RemoteInfo;\n          remoteEntryExports?: RemoteEntryExports;\n        },\n      ],\n      Promise<RemoteEntryExports | void> | RemoteEntryExports | void\n    >(),\n  });\n\n  constructor(host: ModuleFederation) {\n    this.host = host;\n    this.idToRemoteMap = {};\n  }\n\n  formatAndRegisterRemote(globalOptions: Options, userOptions: UserOptions) {\n    const userRemotes = userOptions.remotes || [];\n\n    return userRemotes.reduce((res, remote) => {\n      this.registerRemote(remote, res, { force: false });\n      return res;\n    }, globalOptions.remotes);\n  }\n\n  setIdToRemoteMap(id: string, remoteMatchInfo: LoadRemoteMatch) {\n    const { remote, expose } = remoteMatchInfo;\n    const { name, alias } = remote;\n    this.idToRemoteMap[id] = { name: remote.name, expose };\n    if (alias && id.startsWith(name)) {\n      const idWithAlias = id.replace(name, alias);\n      this.idToRemoteMap[idWithAlias] = { name: remote.name, expose };\n      return;\n    }\n\n    if (alias && id.startsWith(alias)) {\n      const idWithName = id.replace(alias, name);\n      this.idToRemoteMap[idWithName] = { name: remote.name, expose };\n    }\n  }\n\n  // eslint-disable-next-line max-lines-per-function\n  // eslint-disable-next-line @typescript-eslint/member-ordering\n  async loadRemote<T>(\n    id: string,\n    options?: { loadFactory?: boolean; from: CallFrom },\n  ): Promise<T | null> {\n    const { host } = this;\n    const startMatchInfo = matchRemoteWithNameAndExpose(\n      host.options.remotes,\n      id,\n    );\n    let completeRequestId = id;\n    let completeExpose = startMatchInfo?.expose;\n    let completeRemote = startMatchInfo\n      ? getRemoteInfo(startMatchInfo.remote)\n      : undefined;\n    let afterLoadRemoteArgs:\n      | Parameters<\n          RemoteHandler['hooks']['lifecycle']['afterLoadRemote']['emit']\n        >[0]\n      | undefined;\n\n    try {\n      const { loadFactory = true } = options || {\n        loadFactory: true,\n      };\n      // 1. Validate the parameters of the retrieved module. There are two module request methods: pkgName + expose and alias + expose.\n      // 2. Request the snapshot information of the current host and globally store the obtained snapshot information. The retrieved module information is partially offline and partially online. The online module information will retrieve the modules used online.\n      // 3. Retrieve the detailed information of the current module from global (remoteEntry address, expose resource address)\n      // 4. After retrieving remoteEntry, call the init of the module, and then retrieve the exported content of the module through get\n      // id: pkgName(@federation/app1) + expose(button) = @federation/app1/button\n      // id: alias(app1) + expose(button) = app1/button\n      // id: alias(app1/utils) + expose(loadash/sort) = app1/utils/loadash/sort\n      const { module, moduleOptions, remoteMatchInfo } =\n        await this.getRemoteModuleAndOptions({\n          id,\n        });\n      const {\n        pkgNameOrAlias,\n        remote,\n        expose,\n        id: idRes,\n        remoteSnapshot,\n      } = remoteMatchInfo;\n      completeRequestId = idRes;\n      completeExpose = expose;\n      completeRemote = getRemoteInfo(remote);\n\n      const moduleOrFactory = (await module.get(\n        idRes,\n        expose,\n        options,\n        remoteSnapshot,\n      )) as T;\n\n      const moduleWrapper = await this.hooks.lifecycle.onLoad.emit({\n        id: idRes,\n        pkgNameOrAlias,\n        expose,\n        exposeModule: loadFactory ? moduleOrFactory : undefined,\n        exposeModuleFactory: loadFactory ? undefined : moduleOrFactory,\n        remote,\n        options: moduleOptions,\n        moduleInstance: module,\n        origin: host,\n      });\n\n      this.setIdToRemoteMap(id, remoteMatchInfo);\n      afterLoadRemoteArgs = {\n        id: completeRequestId,\n        expose: completeExpose,\n        remote: completeRemote,\n        options,\n        origin: host,\n      };\n\n      if (typeof moduleWrapper === 'function') {\n        return moduleWrapper as T;\n      }\n\n      return moduleOrFactory;\n    } catch (error) {\n      const { from = 'runtime' } = options || { from: 'runtime' };\n\n      let failOver;\n      try {\n        failOver = await this.hooks.lifecycle.errorLoadRemote.emit({\n          id,\n          error,\n          from,\n          lifecycle: 'onLoad',\n          expose: completeExpose,\n          remote: completeRemote,\n          origin: host,\n        });\n      } catch (hookError) {\n        afterLoadRemoteArgs = {\n          id: completeRequestId,\n          expose: completeExpose,\n          remote: completeRemote,\n          options,\n          error: hookError,\n          origin: host,\n        };\n        throw hookError;\n      }\n\n      if (!failOver) {\n        afterLoadRemoteArgs = {\n          id: completeRequestId,\n          expose: completeExpose,\n          remote: completeRemote,\n          options,\n          error,\n          origin: host,\n        };\n        throw error;\n      }\n\n      afterLoadRemoteArgs = {\n        id: completeRequestId,\n        expose: completeExpose,\n        remote: completeRemote,\n        options,\n        error,\n        origin: host,\n        recovered: true,\n      };\n\n      return failOver as T;\n    } finally {\n      if (afterLoadRemoteArgs) {\n        await this.hooks.lifecycle.afterLoadRemote.emit(afterLoadRemoteArgs);\n      }\n    }\n  }\n\n  // eslint-disable-next-line @typescript-eslint/member-ordering\n  async preloadRemote(preloadOptions: Array<PreloadRemoteArgs>): Promise<void> {\n    const { host } = this;\n    const preloadResults: PreloadRemoteResult[] = [];\n\n    await this.hooks.lifecycle.beforePreloadRemote.emit({\n      preloadOps: preloadOptions,\n      options: host.options,\n      origin: host,\n    });\n\n    const preloadOps: PreloadOptions = formatPreloadArgs(\n      host.options.remotes,\n      preloadOptions,\n    );\n\n    const createPreloadAssetOps = (ops: PreloadOptions[number]) => {\n      const { preloadConfig, remote } = ops;\n      const exposes = preloadConfig.exposes || [];\n\n      if (!exposes.length) {\n        return [\n          {\n            ops,\n            id: `${remote.name}/*`,\n          },\n        ];\n      }\n\n      return exposes.map((expose) => ({\n        ops: {\n          ...ops,\n          preloadConfig: {\n            ...preloadConfig,\n            exposes: [expose],\n          },\n        },\n        id: composeRemoteRequestId(remote.name, expose),\n      }));\n    };\n\n    let preloadError: Error | undefined;\n\n    await Promise.all(\n      preloadOps.flatMap(createPreloadAssetOps).map(async (assetOps) => {\n        const { ops, id: preloadId } = assetOps;\n        const { remote, preloadConfig } = ops;\n        const remoteInfo = getRemoteInfo(remote);\n        try {\n          const { globalSnapshot, remoteSnapshot } =\n            await host.snapshotHandler.loadRemoteSnapshotInfo({\n              moduleInfo: remote,\n              id: preloadId,\n              initiator: 'preloadRemote',\n            });\n\n          const assets = await this.hooks.lifecycle.generatePreloadAssets.emit({\n            origin: host,\n            preloadOptions: ops,\n            remote,\n            remoteInfo,\n            globalSnapshot,\n            remoteSnapshot,\n          });\n          if (!assets) {\n            return;\n          }\n          const results = await preloadAssets(remoteInfo, host, assets, true, {\n            initiator: 'preloadRemote',\n            id: preloadId,\n          });\n          preloadResults.push({\n            remote,\n            remoteInfo,\n            preloadConfig,\n            id: preloadId,\n            results,\n          });\n        } catch (error) {\n          preloadResults.push({\n            remote,\n            remoteInfo,\n            preloadConfig,\n            id: preloadId,\n            results: [\n              {\n                url: remoteInfo.entry,\n                status: 'error',\n                resourceType: /\\.json(?:$|[?#])/i.test(remoteInfo.entry)\n                  ? 'manifest'\n                  : 'remoteEntry',\n                initiator: 'preloadRemote',\n                id: preloadId,\n                error,\n              },\n            ],\n          });\n        }\n      }),\n    );\n\n    const failedResults = preloadResults.flatMap((preloadResult) =>\n      preloadResult.results.filter(\n        (result) => result.status === 'error' || result.status === 'timeout',\n      ),\n    );\n    if (failedResults.length > 0) {\n      preloadError = new Error(\n        `preloadRemote failed to load ${failedResults.length} resource(s).`,\n      );\n      Object.assign(preloadError, {\n        results: preloadResults,\n        failedResults,\n      });\n    }\n\n    await this.hooks.lifecycle.afterPreloadRemote.emit({\n      preloadOps: preloadOptions,\n      options: host.options,\n      origin: host,\n      results: preloadResults,\n      error: preloadError,\n    });\n\n    if (preloadError) {\n      throw preloadError;\n    }\n  }\n\n  registerRemotes(remotes: Remote[], options?: { force?: boolean }): void {\n    const { host } = this;\n    remotes.forEach((remote) => {\n      this.registerRemote(remote, host.options.remotes, {\n        force: options?.force,\n      });\n    });\n  }\n\n  async getRemoteModuleAndOptions(options: { id: string }): Promise<{\n    module: Module;\n    moduleOptions: ModuleOptions;\n    remoteMatchInfo: LoadRemoteMatch;\n  }> {\n    const { host } = this;\n    const { id } = options;\n    let loadRemoteArgs;\n\n    try {\n      loadRemoteArgs = await this.hooks.lifecycle.beforeRequest.emit({\n        id,\n        options: host.options,\n        origin: host,\n      });\n    } catch (error) {\n      loadRemoteArgs = (await this.hooks.lifecycle.errorLoadRemote.emit({\n        id,\n        options: host.options,\n        origin: host,\n        from: 'runtime',\n        error,\n        lifecycle: 'beforeRequest',\n      })) as {\n        id: string;\n        options: Options;\n        origin: ModuleFederation;\n      };\n\n      if (!loadRemoteArgs) {\n        throw error;\n      }\n    }\n\n    const { id: idRes } = loadRemoteArgs;\n\n    const remoteSplitInfo = matchRemoteWithNameAndExpose(\n      host.options.remotes,\n      idRes,\n    );\n    if (!remoteSplitInfo) {\n      try {\n        error(\n          RUNTIME_004,\n          runtimeDescMap,\n          {\n            hostName: host.options.name,\n            requestId: idRes,\n          },\n          undefined,\n          optionsToMFContext(host.options),\n        );\n      } catch (matchError) {\n        await this.hooks.lifecycle.afterMatchRemote.emit({\n          id: idRes,\n          options: host.options,\n          error: matchError,\n          origin: host,\n        });\n        throw matchError;\n      }\n    }\n\n    const { remote: rawRemote } = remoteSplitInfo;\n    const remoteInfo = getRemoteInfo(rawRemote);\n    await this.hooks.lifecycle.afterMatchRemote.emit({\n      id: idRes,\n      ...remoteSplitInfo,\n      options: host.options,\n      remoteInfo,\n      origin: host,\n    });\n    const matchInfo =\n      await host.sharedHandler.hooks.lifecycle.afterResolve.emit({\n        id: idRes,\n        ...remoteSplitInfo,\n        options: host.options,\n        origin: host,\n        remoteInfo,\n      });\n\n    const { remote, expose } = matchInfo;\n    assert(\n      remote && expose,\n      `The 'beforeRequest' hook was executed, but it failed to return the correct 'remote' and 'expose' values while loading ${idRes}.`,\n    );\n    let module: Module | undefined = host.moduleCache.get(remote.name);\n\n    const moduleOptions: ModuleOptions = {\n      host: host,\n      remoteInfo,\n    };\n\n    if (!module) {\n      module = new Module(moduleOptions);\n      host.moduleCache.set(remote.name, module);\n    }\n    return {\n      module,\n      moduleOptions,\n      remoteMatchInfo: matchInfo,\n    };\n  }\n\n  registerRemote(\n    remote: Remote,\n    targetRemotes: Remote[],\n    options?: { force?: boolean },\n  ): void {\n    const { host } = this;\n    const normalizeRemote = () => {\n      if (remote.alias) {\n        // Validate if alias equals the prefix of remote.name and remote.alias, if so, throw an error\n        // As multi-level path references cannot guarantee unique names, alias being a prefix of remote.name is not supported\n        const findEqual = targetRemotes.find(\n          (item) =>\n            remote.alias &&\n            (item.name.startsWith(remote.alias) ||\n              item.alias?.startsWith(remote.alias)),\n        );\n        assert(\n          !findEqual,\n          `The alias ${remote.alias} of remote ${\n            remote.name\n          } is not allowed to be the prefix of ${\n            findEqual && findEqual.name\n          } name or alias`,\n        );\n      }\n      // Set the remote entry to a complete path\n      if ('entry' in remote) {\n        if (\n          isBrowserEnvValue &&\n          typeof window !== 'undefined' &&\n          !remote.entry.startsWith('http')\n        ) {\n          remote.entry = new URL(remote.entry, window.location.origin).href;\n        }\n      }\n      if (!remote.shareScope) {\n        remote.shareScope = DEFAULT_SCOPE;\n      }\n      if (!remote.type) {\n        remote.type = DEFAULT_REMOTE_TYPE;\n      }\n    };\n    this.hooks.lifecycle.beforeRegisterRemote.emit({ remote, origin: host });\n    const registeredRemote = targetRemotes.find(\n      (item) => item.name === remote.name,\n    );\n    if (!registeredRemote) {\n      normalizeRemote();\n      targetRemotes.push(remote);\n      this.hooks.lifecycle.registerRemote.emit({ remote, origin: host });\n    } else {\n      const messages = [\n        `The remote \"${remote.name}\" is already registered.`,\n        'Please note that overriding it may cause unexpected errors.',\n      ];\n      if (options?.force) {\n        // remove registered remote\n        this.removeRemote(registeredRemote);\n        normalizeRemote();\n        targetRemotes.push(remote);\n        this.hooks.lifecycle.registerRemote.emit({ remote, origin: host });\n        warn(messages.join(' '));\n      }\n    }\n  }\n\n  private removeRemote(remote: Remote): void {\n    try {\n      const { host } = this;\n      const { name } = remote;\n      const remoteIndex = host.options.remotes.findIndex(\n        (item) => item.name === name,\n      );\n      if (remoteIndex !== -1) {\n        host.options.remotes.splice(remoteIndex, 1);\n      }\n      const loadedModule = host.moduleCache.get(remote.name);\n      if (loadedModule) {\n        const remoteInfo = loadedModule.remoteInfo;\n        const key = remoteInfo.entryGlobalName as keyof typeof CurrentGlobal;\n\n        if (CurrentGlobal[key]) {\n          if (\n            Object.getOwnPropertyDescriptor(CurrentGlobal, key)?.configurable\n          ) {\n            delete CurrentGlobal[key];\n          } else {\n            // @ts-ignore\n            CurrentGlobal[key] = undefined;\n          }\n        }\n        const remoteEntryUniqueKey = getRemoteEntryUniqueKey(\n          loadedModule.remoteInfo,\n        );\n\n        if (globalLoading[remoteEntryUniqueKey]) {\n          delete globalLoading[remoteEntryUniqueKey];\n        }\n\n        host.snapshotHandler.manifestCache.delete(remoteInfo.entry);\n\n        // delete unloaded shared and instance\n        let remoteInsId = remoteInfo.buildVersion\n          ? composeKeyWithSeparator(remoteInfo.name, remoteInfo.buildVersion)\n          : remoteInfo.name;\n        const remoteInsIndex =\n          CurrentGlobal.__FEDERATION__.__INSTANCES__.findIndex((ins) => {\n            if (remoteInfo.buildVersion) {\n              return ins.options.id === remoteInsId;\n            } else {\n              return ins.name === remoteInsId;\n            }\n          });\n        if (remoteInsIndex !== -1) {\n          const remoteIns =\n            CurrentGlobal.__FEDERATION__.__INSTANCES__[remoteInsIndex];\n          remoteInsId = remoteIns.options.id || remoteInsId;\n          const globalShareScopeMap = getGlobalShareScope();\n\n          let isAllSharedNotUsed = true;\n          const needDeleteKeys: Array<[string, string, string, string]> = [];\n          Object.keys(globalShareScopeMap).forEach((instId) => {\n            const shareScopeMap = globalShareScopeMap[instId];\n            shareScopeMap &&\n              Object.keys(shareScopeMap).forEach((shareScope) => {\n                const shareScopeVal = shareScopeMap[shareScope];\n                shareScopeVal &&\n                  Object.keys(shareScopeVal).forEach((shareName) => {\n                    const sharedPkgs = shareScopeVal[shareName];\n                    sharedPkgs &&\n                      Object.keys(sharedPkgs).forEach((shareVersion) => {\n                        const shared = sharedPkgs[shareVersion];\n                        if (\n                          shared &&\n                          typeof shared === 'object' &&\n                          shared.from === remoteInfo.name\n                        ) {\n                          if (shared.loaded || shared.loading) {\n                            shared.useIn = shared.useIn.filter(\n                              (usedHostName) =>\n                                usedHostName !== remoteInfo.name,\n                            );\n                            if (shared.useIn.length) {\n                              isAllSharedNotUsed = false;\n                            } else {\n                              needDeleteKeys.push([\n                                instId,\n                                shareScope,\n                                shareName,\n                                shareVersion,\n                              ]);\n                            }\n                          } else {\n                            needDeleteKeys.push([\n                              instId,\n                              shareScope,\n                              shareName,\n                              shareVersion,\n                            ]);\n                          }\n                        }\n                      });\n                  });\n              });\n          });\n\n          if (isAllSharedNotUsed) {\n            remoteIns.shareScopeMap = {};\n            delete globalShareScopeMap[remoteInsId];\n          }\n          needDeleteKeys.forEach(\n            ([insId, shareScope, shareName, shareVersion]) => {\n              delete globalShareScopeMap[insId]?.[shareScope]?.[shareName]?.[\n                shareVersion\n              ];\n            },\n          );\n          CurrentGlobal.__FEDERATION__.__INSTANCES__.splice(remoteInsIndex, 1);\n        }\n\n        const { hostGlobalSnapshot } = getGlobalRemoteInfo(remote, host);\n        if (hostGlobalSnapshot) {\n          const remoteKey =\n            hostGlobalSnapshot &&\n            'remotesInfo' in hostGlobalSnapshot &&\n            hostGlobalSnapshot.remotesInfo &&\n            getInfoWithoutType(hostGlobalSnapshot.remotesInfo, remote.name).key;\n          if (remoteKey) {\n            delete hostGlobalSnapshot.remotesInfo[remoteKey];\n            if (\n              //eslint-disable-next-line no-extra-boolean-cast\n              Boolean(Global.__FEDERATION__.__MANIFEST_LOADING__[remoteKey])\n            ) {\n              delete Global.__FEDERATION__.__MANIFEST_LOADING__[remoteKey];\n            }\n          }\n        }\n\n        host.moduleCache.delete(remote.name);\n      }\n    } catch (err) {\n      logger.error(\n        `removeRemote failed: ${err instanceof Error ? err.message : String(err)}`,\n      );\n    }\n  }\n}\n"],"mappings":"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"}