{"version":3,"file":"index.cjs","names":["PluginSystem","SyncWaterfallHook","AsyncWaterfallHook","AsyncHook","SyncHook","formatShareConfigs","getTargetSharedOptions","getRegisteredShare","directShare","shouldUseTreeShaking","DEFAULT_SCOPE","RUNTIME_005","RUNTIME_006","runtimeDescMap","optionsToMFContext","getGlobalShareScope"],"sources":["../../src/shared/index.ts"],"sourcesContent":["import {\n  RUNTIME_005,\n  RUNTIME_006,\n  runtimeDescMap,\n} from '@module-federation/error-codes';\nimport { Federation } from '../global';\nimport {\n  Options,\n  ShareScopeMap,\n  ShareInfos,\n  Shared,\n  RemoteEntryExports,\n  UserOptions,\n  ShareStrategy,\n  InitScope,\n  InitTokens,\n  CallFrom,\n  TreeShakingArgs,\n} from '../type';\nimport { ModuleFederation } from '../core';\nimport {\n  PluginSystem,\n  AsyncHook,\n  AsyncWaterfallHook,\n  SyncWaterfallHook,\n  SyncHook,\n} from '../utils/hooks';\nimport {\n  formatShareConfigs,\n  getRegisteredShare,\n  getTargetSharedOptions,\n  getGlobalShareScope,\n  directShare,\n  shouldUseTreeShaking,\n  addUseIn,\n} from '../utils/share';\nimport {\n  assert,\n  error,\n  addUniqueItem,\n  optionsToMFContext,\n  warn,\n} from '../utils';\nimport { DEFAULT_SCOPE } from '../constant';\nimport { LoadRemoteMatch } from '../remote';\nimport { createRemoteEntryInitOptions } from '../module';\n\nexport class SharedHandler {\n  host: ModuleFederation;\n  shareScopeMap: ShareScopeMap;\n  hooks = new PluginSystem({\n    beforeRegisterShare: new SyncWaterfallHook<{\n      pkgName: string;\n      shared: Shared;\n      origin: ModuleFederation;\n    }>('beforeRegisterShare'),\n    afterResolve: new AsyncWaterfallHook<LoadRemoteMatch>('afterResolve'),\n    beforeLoadShare: new AsyncWaterfallHook<{\n      pkgName: string;\n      shareInfo?: Shared;\n      shared: Options['shared'];\n      origin: ModuleFederation;\n    }>('beforeLoadShare'),\n    // not used yet\n    loadShare: new AsyncHook<[ModuleFederation, string, ShareInfos]>(),\n    afterLoadShare: new SyncHook<\n      [\n        {\n          pkgName: string;\n          shareInfo?: Partial<Shared>;\n          selectedShared?: Partial<Shared>;\n          shared: Options['shared'];\n          shareScopeMap: ShareScopeMap;\n          lifecycle: 'loadShare' | 'loadShareSync';\n          origin: ModuleFederation;\n        },\n      ],\n      void\n    >('afterLoadShare'),\n    errorLoadShare: new SyncHook<\n      [\n        {\n          pkgName: string;\n          shareInfo?: Partial<Shared>;\n          shared: Options['shared'];\n          shareScopeMap: ShareScopeMap;\n          lifecycle: 'loadShare' | 'loadShareSync';\n          origin: ModuleFederation;\n          error?: unknown;\n          recovered?: boolean;\n        },\n      ],\n      void\n    >('errorLoadShare'),\n    resolveShare: new SyncWaterfallHook<{\n      shareScopeMap: ShareScopeMap;\n      scope: string;\n      pkgName: string;\n      version: string;\n      shareInfo: Shared;\n      GlobalFederation: Federation;\n      resolver: () => { shared: Shared; useTreesShaking: boolean } | undefined;\n    }>('resolveShare'),\n    // maybe will change, temporarily for internal use only\n    initContainerShareScopeMap: new SyncWaterfallHook<{\n      shareScope: ShareScopeMap[string];\n      options: Options;\n      origin: ModuleFederation;\n      scopeName: string;\n      hostShareScopeMap?: ShareScopeMap;\n    }>('initContainerShareScopeMap'),\n  });\n  initTokens: InitTokens;\n  constructor(host: ModuleFederation) {\n    this.host = host;\n    this.shareScopeMap = {};\n    this.initTokens = {};\n    this._setGlobalShareScopeMap(host.options);\n  }\n\n  private emitAfterLoadShare({\n    lifecycle,\n    pkgName,\n    shareInfo,\n    selectedShared,\n  }: {\n    lifecycle: 'loadShare' | 'loadShareSync';\n    pkgName: string;\n    shareInfo?: Partial<Shared>;\n    selectedShared?: Partial<Shared>;\n  }): void {\n    try {\n      this.hooks.lifecycle.afterLoadShare.emit({\n        pkgName,\n        shareInfo,\n        selectedShared,\n        shared: this.host.options.shared,\n        shareScopeMap: this.shareScopeMap,\n        lifecycle,\n        origin: this.host,\n      });\n    } catch (error) {\n      warn(error);\n    }\n  }\n\n  private emitErrorLoadShare({\n    lifecycle,\n    pkgName,\n    shareInfo,\n    error,\n    recovered,\n  }: {\n    lifecycle: 'loadShare' | 'loadShareSync';\n    pkgName: string;\n    shareInfo?: Partial<Shared>;\n    error?: unknown;\n    recovered?: boolean;\n  }): void {\n    try {\n      this.hooks.lifecycle.errorLoadShare.emit({\n        pkgName,\n        shareInfo,\n        shared: this.host.options.shared,\n        shareScopeMap: this.shareScopeMap,\n        lifecycle,\n        origin: this.host,\n        error,\n        recovered,\n      });\n    } catch (hookError) {\n      warn(hookError);\n    }\n  }\n\n  // register shared in shareScopeMap\n  registerShared(globalOptions: Options, userOptions: UserOptions) {\n    const { newShareInfos, allShareInfos } = formatShareConfigs(\n      globalOptions,\n      userOptions,\n    );\n\n    const sharedKeys = Object.keys(newShareInfos);\n    sharedKeys.forEach((sharedKey) => {\n      const sharedVals = newShareInfos[sharedKey];\n      sharedVals.forEach((sharedVal) => {\n        sharedVal.scope.forEach((sc) => {\n          this.hooks.lifecycle.beforeRegisterShare.emit({\n            origin: this.host,\n            pkgName: sharedKey,\n            shared: sharedVal,\n          });\n          const registeredShared = this.shareScopeMap[sc]?.[sharedKey];\n          if (!registeredShared) {\n            this.setShared({\n              pkgName: sharedKey,\n              lib: sharedVal.lib,\n              get: sharedVal.get,\n              loaded: sharedVal.loaded || Boolean(sharedVal.lib),\n              shared: sharedVal,\n              from: userOptions.name,\n            });\n          }\n        });\n      });\n    });\n\n    return {\n      newShareInfos,\n      allShareInfos,\n    };\n  }\n\n  async loadShare<T>(\n    pkgName: string,\n    extraOptions?: {\n      customShareInfo?: Partial<Shared>;\n      resolver?: (sharedOptions: ShareInfos[string]) => Shared;\n    },\n  ): Promise<false | (() => T | undefined)> {\n    const { host } = this;\n    // This function performs the following steps:\n    // 1. Checks if the currently loaded share already exists, if not, it throws an error\n    // 2. Searches globally for a matching share, if found, it uses it directly\n    // 3. If not found, it retrieves it from the current share and stores the obtained share globally.\n\n    const shareOptions = getTargetSharedOptions({\n      pkgName,\n      extraOptions,\n      shareInfos: host.options.shared,\n    });\n    let shareOptionsRes: Shared | undefined = shareOptions;\n\n    try {\n      if (shareOptions?.scope) {\n        await Promise.all(\n          shareOptions.scope.map(async (shareScope) => {\n            await Promise.all(\n              this.initializeSharing(shareScope, {\n                strategy: shareOptions.strategy,\n              }),\n            );\n            return;\n          }),\n        );\n      }\n      const loadShareRes = await this.hooks.lifecycle.beforeLoadShare.emit({\n        pkgName,\n        shareInfo: shareOptions,\n        shared: host.options.shared,\n        origin: host,\n      });\n\n      shareOptionsRes = loadShareRes.shareInfo;\n\n      // Assert that shareInfoRes exists, if not, throw an error\n      assert(\n        shareOptionsRes,\n        `Cannot find shared \"${pkgName}\" in host \"${host.options.name}\". Ensure the shared config for \"${pkgName}\" is declared in the federation plugin options and the host has been initialized before loading shares.`,\n      );\n      const resolvedShareOptions = shareOptionsRes;\n\n      const { shared: registeredShared, useTreesShaking } =\n        getRegisteredShare(\n          this.shareScopeMap,\n          pkgName,\n          shareOptionsRes,\n          this.hooks.lifecycle.resolveShare,\n        ) || {};\n\n      if (registeredShared) {\n        const targetShared = directShare(registeredShared, useTreesShaking);\n        if (targetShared.lib) {\n          addUseIn(targetShared, host.options.name);\n          this.emitAfterLoadShare({\n            lifecycle: 'loadShare',\n            pkgName,\n            shareInfo: resolvedShareOptions,\n            selectedShared: registeredShared,\n          });\n          return targetShared.lib as () => T;\n        } else if (targetShared.loading && !targetShared.loaded) {\n          const factory = await targetShared.loading;\n          targetShared.loaded = true;\n          if (!targetShared.lib) {\n            targetShared.lib = factory;\n          }\n          addUseIn(targetShared, host.options.name);\n          this.emitAfterLoadShare({\n            lifecycle: 'loadShare',\n            pkgName,\n            shareInfo: resolvedShareOptions,\n            selectedShared: registeredShared,\n          });\n          return factory;\n        } else {\n          const asyncLoadProcess = async () => {\n            const factory = await targetShared.get!();\n            addUseIn(targetShared, host.options.name);\n            targetShared.loaded = true;\n            targetShared.lib = factory;\n            return factory as () => T;\n          };\n          const loading = asyncLoadProcess();\n          this.setShared({\n            pkgName,\n            loaded: false,\n            shared: registeredShared,\n            from: host.options.name,\n            lib: null,\n            loading,\n            treeShaking: useTreesShaking\n              ? (targetShared as TreeShakingArgs)\n              : undefined,\n          });\n          const factory = await loading;\n          this.emitAfterLoadShare({\n            lifecycle: 'loadShare',\n            pkgName,\n            shareInfo: resolvedShareOptions,\n            selectedShared: registeredShared,\n          });\n          return factory;\n        }\n      } else {\n        if (extraOptions?.customShareInfo) {\n          this.emitErrorLoadShare({\n            lifecycle: 'loadShare',\n            pkgName,\n            shareInfo: resolvedShareOptions,\n            recovered: true,\n          });\n          return false;\n        }\n        const _useTreeShaking = shouldUseTreeShaking(\n          resolvedShareOptions.treeShaking,\n        );\n        const targetShared = directShare(resolvedShareOptions, _useTreeShaking);\n\n        const asyncLoadProcess = async () => {\n          const factory = await targetShared.get!();\n          targetShared.lib = factory;\n          targetShared.loaded = true;\n          addUseIn(targetShared, host.options.name);\n          const { shared: gShared, useTreesShaking: gUseTreeShaking } =\n            getRegisteredShare(\n              this.shareScopeMap,\n              pkgName,\n              resolvedShareOptions,\n              this.hooks.lifecycle.resolveShare,\n            ) || {};\n          if (gShared) {\n            const targetGShared = directShare(gShared, gUseTreeShaking);\n            targetGShared.lib = factory;\n            targetGShared.loaded = true;\n            gShared.from = resolvedShareOptions.from;\n          }\n          return factory as () => T;\n        };\n        const loading = asyncLoadProcess();\n        this.setShared({\n          pkgName,\n          loaded: false,\n          shared: resolvedShareOptions,\n          from: host.options.name,\n          lib: null,\n          loading,\n          treeShaking: _useTreeShaking\n            ? (targetShared as TreeShakingArgs)\n            : undefined,\n        });\n        const factory = await loading;\n        this.emitAfterLoadShare({\n          lifecycle: 'loadShare',\n          pkgName,\n          shareInfo: resolvedShareOptions,\n          selectedShared: resolvedShareOptions,\n        });\n        return factory;\n      }\n    } catch (shareError) {\n      this.emitErrorLoadShare({\n        lifecycle: 'loadShare',\n        pkgName,\n        shareInfo: shareOptionsRes,\n        error: shareError,\n      });\n      throw shareError;\n    }\n  }\n\n  /**\n   * This function initializes the sharing sequence (executed only once per share scope).\n   * It accepts one argument, the name of the share scope.\n   * If the share scope does not exist, it creates one.\n   */\n  // eslint-disable-next-line @typescript-eslint/member-ordering\n  initializeSharing(\n    shareScopeName = DEFAULT_SCOPE,\n    extraOptions?: {\n      initScope?: InitScope;\n      from?: CallFrom;\n      strategy?: ShareStrategy;\n    },\n  ): Array<Promise<void>> {\n    const { host } = this;\n    const from = extraOptions?.from;\n    const strategy = extraOptions?.strategy;\n    let initScope = extraOptions?.initScope;\n    const promises: Promise<any>[] = [];\n    if (from !== 'build') {\n      const { initTokens } = this;\n      if (!initScope) initScope = [];\n      let initToken = initTokens[shareScopeName];\n      if (!initToken)\n        initToken = initTokens[shareScopeName] = { from: this.host.name };\n      if (initScope.indexOf(initToken) >= 0) return promises;\n      initScope.push(initToken);\n    }\n\n    const shareScope = this.shareScopeMap;\n    const hostName = host.options.name;\n    // Creates a new share scope if necessary\n    if (!shareScope[shareScopeName]) {\n      shareScope[shareScopeName] = {};\n    }\n    // Executes all initialization snippets from all accessible modules\n    const scope = shareScope[shareScopeName];\n    const register = (name: string, shared: Shared) => {\n      const { version, eager } = shared;\n      scope[name] = scope[name] || {};\n      const versions = scope[name];\n      const activeVersion: Shared =\n        versions[version] && (directShare(versions[version]) as Shared);\n      const activeVersionEager = Boolean(\n        activeVersion &&\n        (('eager' in activeVersion && activeVersion.eager) ||\n          ('shareConfig' in activeVersion && activeVersion.shareConfig?.eager)),\n      );\n      if (\n        !activeVersion ||\n        (activeVersion.strategy !== 'loaded-first' &&\n          !activeVersion.loaded &&\n          (Boolean(!eager) !== !activeVersionEager\n            ? eager\n            : hostName > versions[version].from))\n      ) {\n        versions[version] = shared;\n      }\n    };\n\n    const initRemoteModule = async (key: string): Promise<void> => {\n      const { module } = await host.remoteHandler.getRemoteModuleAndOptions({\n        id: key,\n      });\n      let remoteEntryExports: RemoteEntryExports | undefined = undefined;\n      try {\n        remoteEntryExports = await module.getEntry();\n      } catch (error) {\n        remoteEntryExports =\n          (await host.remoteHandler.hooks.lifecycle.errorLoadRemote.emit({\n            id: key,\n            error,\n            from: 'runtime',\n            lifecycle: 'beforeLoadShare',\n            remote: module.remoteInfo,\n            origin: host,\n          })) as RemoteEntryExports;\n        if (!remoteEntryExports) {\n          return;\n        }\n      } finally {\n        // prevent self load loop: when host load self , the initTokens is not the same\n        if (remoteEntryExports?.init && !module.initing) {\n          module.remoteEntryExports = remoteEntryExports;\n          await module.init(undefined, undefined, initScope);\n        }\n      }\n    };\n    Object.keys(host.options.shared).forEach((shareName) => {\n      const sharedArr = host.options.shared[shareName];\n      sharedArr.forEach((shared) => {\n        if (shared.scope.includes(shareScopeName)) {\n          register(shareName, shared);\n        }\n      });\n    });\n    // TODO: strategy==='version-first' need to be removed in the future\n    if (\n      host.options.shareStrategy === 'version-first' ||\n      strategy === 'version-first'\n    ) {\n      host.options.remotes.forEach((remote) => {\n        if (remote.shareScope === shareScopeName) {\n          promises.push(initRemoteModule(remote.name));\n        }\n      });\n    }\n\n    return promises;\n  }\n\n  // The lib function will only be available if the shared set by eager or runtime init is set or the shared is successfully loaded.\n  // 1. If the loaded shared already exists globally, then it will be reused\n  // 2. If lib exists in local shared, it will be used directly\n  // 3. If the local get returns something other than Promise, then it will be used directly\n  loadShareSync<T>(\n    pkgName: string,\n    extraOptions?: {\n      from?: 'build' | 'runtime';\n      customShareInfo?: Partial<Shared>;\n      resolver?: (sharedOptions: ShareInfos[string]) => Shared;\n    },\n  ): () => T | never {\n    const { host } = this;\n    const shareOptions = getTargetSharedOptions({\n      pkgName,\n      extraOptions,\n      shareInfos: host.options.shared,\n    });\n\n    try {\n      if (shareOptions?.scope) {\n        shareOptions.scope.forEach((shareScope) => {\n          this.initializeSharing(shareScope, {\n            strategy: shareOptions.strategy,\n          });\n        });\n      }\n      const { shared: registeredShared } =\n        getRegisteredShare(\n          this.shareScopeMap,\n          pkgName,\n          shareOptions,\n          this.hooks.lifecycle.resolveShare,\n        ) || {};\n\n      if (registeredShared) {\n        if (typeof registeredShared.lib === 'function') {\n          addUseIn(registeredShared, host.options.name);\n          if (!registeredShared.loaded) {\n            registeredShared.loaded = true;\n            if (registeredShared.from === host.options.name) {\n              shareOptions.loaded = true;\n            }\n          }\n          this.emitAfterLoadShare({\n            lifecycle: 'loadShareSync',\n            pkgName,\n            shareInfo: shareOptions,\n            selectedShared: registeredShared,\n          });\n          return registeredShared.lib as () => T;\n        }\n        if (typeof registeredShared.get === 'function') {\n          const module = registeredShared.get();\n          if (!(module instanceof Promise)) {\n            addUseIn(registeredShared, host.options.name);\n            this.setShared({\n              pkgName,\n              loaded: true,\n              from: host.options.name,\n              lib: module,\n              shared: registeredShared,\n            });\n            this.emitAfterLoadShare({\n              lifecycle: 'loadShareSync',\n              pkgName,\n              shareInfo: shareOptions,\n              selectedShared: registeredShared,\n            });\n            return module;\n          }\n        }\n      }\n\n      if (shareOptions.lib) {\n        if (!shareOptions.loaded) {\n          shareOptions.loaded = true;\n        }\n        this.emitAfterLoadShare({\n          lifecycle: 'loadShareSync',\n          pkgName,\n          shareInfo: shareOptions,\n          selectedShared: shareOptions,\n        });\n        return shareOptions.lib as () => T;\n      }\n\n      if (shareOptions.get) {\n        const module = shareOptions.get();\n\n        if (module instanceof Promise) {\n          const errorCode =\n            extraOptions?.from === 'build' ? RUNTIME_005 : RUNTIME_006;\n          error(\n            errorCode,\n            runtimeDescMap,\n            {\n              hostName: host.options.name,\n              sharedPkgName: pkgName,\n            },\n            undefined,\n            optionsToMFContext(host.options),\n          );\n        }\n\n        shareOptions.lib = module;\n\n        this.setShared({\n          pkgName,\n          loaded: true,\n          from: host.options.name,\n          lib: shareOptions.lib,\n          shared: shareOptions,\n        });\n        this.emitAfterLoadShare({\n          lifecycle: 'loadShareSync',\n          pkgName,\n          shareInfo: shareOptions,\n          selectedShared: shareOptions,\n        });\n        return shareOptions.lib as () => T;\n      }\n\n      error(\n        RUNTIME_006,\n        runtimeDescMap,\n        {\n          hostName: host.options.name,\n          sharedPkgName: pkgName,\n        },\n        undefined,\n        optionsToMFContext(host.options),\n      );\n    } catch (shareError) {\n      this.emitErrorLoadShare({\n        lifecycle: 'loadShareSync',\n        pkgName,\n        shareInfo: shareOptions,\n        error: shareError,\n      });\n      throw shareError;\n    }\n  }\n\n  initShareScopeMap(\n    scopeName: string,\n    shareScope: ShareScopeMap[string],\n    extraOptions: { hostShareScopeMap?: ShareScopeMap } = {},\n  ): void {\n    const { host } = this;\n    this.shareScopeMap[scopeName] = shareScope;\n    this.hooks.lifecycle.initContainerShareScopeMap.emit({\n      shareScope,\n      options: host.options,\n      origin: host,\n      scopeName,\n      hostShareScopeMap: extraOptions.hostShareScopeMap,\n    });\n  }\n\n  private setShared({\n    pkgName,\n    shared,\n    from,\n    lib,\n    loading,\n    loaded,\n    get,\n    treeShaking,\n  }: {\n    pkgName: string;\n    shared: Shared;\n    from: string;\n    lib: any;\n    loaded?: boolean;\n    loading?: Shared['loading'];\n    get?: Shared['get'];\n    treeShaking?: TreeShakingArgs;\n  }): void {\n    const { version, scope = 'default', ...shareInfo } = shared;\n    const scopes: string[] = Array.isArray(scope) ? scope : [scope];\n\n    const mergeAttrs = (shared: Shared) => {\n      const merge = <K extends keyof TreeShakingArgs>(\n        s: TreeShakingArgs,\n        key: K,\n        val: TreeShakingArgs[K],\n      ): void => {\n        if (val && !s[key]) {\n          s[key] = val;\n        }\n      };\n      const targetShared = (\n        treeShaking ? shared.treeShaking! : shared\n      ) as TreeShakingArgs;\n      merge(targetShared, 'loaded', loaded);\n      merge(targetShared, 'loading', loading);\n      merge(targetShared, 'get', get);\n    };\n    scopes.forEach((sc) => {\n      if (!this.shareScopeMap[sc]) {\n        this.shareScopeMap[sc] = {};\n      }\n      if (!this.shareScopeMap[sc][pkgName]) {\n        this.shareScopeMap[sc][pkgName] = {};\n      }\n\n      if (!this.shareScopeMap[sc][pkgName][version]) {\n        this.shareScopeMap[sc][pkgName][version] = {\n          version,\n          scope: [sc],\n          ...shareInfo,\n          lib,\n        };\n      }\n\n      const registeredShared = this.shareScopeMap[sc][pkgName][version];\n      mergeAttrs(registeredShared);\n      if (from && registeredShared.from !== from) {\n        registeredShared.from = from;\n      }\n    });\n  }\n\n  private _setGlobalShareScopeMap(hostOptions: Options): void {\n    const globalShareScopeMap = getGlobalShareScope();\n    const identifier = hostOptions.id || hostOptions.name;\n    if (identifier && !globalShareScopeMap[identifier]) {\n      globalShareScopeMap[identifier] = this.shareScopeMap;\n    }\n  }\n}\n"],"mappings":"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"}