{"version":3,"file":"core.cjs","names":["PluginSystem","SyncWaterfallHook","SyncHook","AsyncWaterfallHook","AsyncHook","snapshotPlugin","generatePreloadAssetsPlugin","getBuilderId","isBrowserEnvValue","SnapshotHandler","SharedHandler","RemoteHandler","RUNTIME_010","runtimeDescMap","DEFAULT_SCOPE","getRemoteInfo","Module","formatShareConfigs","registerPlugins"],"sources":["../src/core.ts"],"sourcesContent":["import { isBrowserEnvValue } from '@module-federation/sdk';\nimport type {\n  CreateLinkHookReturnDom,\n  CreateScriptHookReturn,\n  GlobalModuleInfo,\n  ModuleInfo,\n} from '@module-federation/sdk';\nimport {\n  Options,\n  PreloadRemoteArgs,\n  RemoteEntryExports,\n  Remote,\n  Shared,\n  ShareInfos,\n  UserOptions,\n  RemoteInfo,\n  ShareScopeMap,\n  InitScope,\n  RemoteEntryInitOptions,\n  CallFrom,\n  ResourceLoadContext,\n} from './type';\nimport { getBuilderId, registerPlugins, getRemoteEntry, error } from './utils';\nimport {\n  getShortErrorMsg,\n  RUNTIME_010,\n  runtimeDescMap,\n} from '@module-federation/error-codes';\nimport { Module, type RemoteModuleFactory } from './module';\nimport {\n  AsyncHook,\n  AsyncWaterfallHook,\n  PluginSystem,\n  SyncHook,\n  SyncWaterfallHook,\n} from './utils/hooks';\nimport { generatePreloadAssetsPlugin } from './plugins/generate-preload-assets';\nimport { snapshotPlugin } from './plugins/snapshot';\nimport { getRemoteInfo } from './utils/load';\nimport { DEFAULT_SCOPE } from './constant';\nimport { SnapshotHandler } from './plugins/snapshot/SnapshotHandler';\nimport { SharedHandler } from './shared';\nimport { RemoteHandler } from './remote';\nimport { formatShareConfigs } from './utils/share';\n\n// Declare the global constant that will be defined by DefinePlugin\n// Default to true if not defined (e.g., when runtime-core is used outside of webpack)\n// so that snapshot functionality is included by default.\ndeclare const FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN: boolean;\nconst USE_SNAPSHOT =\n  typeof FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN === 'boolean'\n    ? !FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN\n    : true; // Default to true (use snapshot) when not explicitly defined\n\nexport class ModuleFederation {\n  options: Options;\n  hooks = new PluginSystem({\n    beforeInit: new SyncWaterfallHook<{\n      userOptions: UserOptions;\n      options: Options;\n      origin: ModuleFederation;\n      /**\n       * @deprecated shareInfo will be removed soon, please use userOptions directly!\n       */\n      shareInfo: ShareInfos;\n    }>('beforeInit'),\n    init: new SyncHook<\n      [\n        {\n          options: Options;\n          origin: ModuleFederation;\n        },\n      ],\n      void\n    >(),\n    // maybe will change, temporarily for internal use only\n    beforeInitContainer: new AsyncWaterfallHook<{\n      shareScope: ShareScopeMap[string];\n      initScope: InitScope;\n      remoteEntryInitOptions: RemoteEntryInitOptions;\n      remoteInfo: RemoteInfo;\n      origin: ModuleFederation;\n    }>('beforeInitContainer'),\n    // maybe will change, temporarily for internal use only\n    initContainer: new AsyncWaterfallHook<{\n      shareScope: ShareScopeMap[string];\n      initScope: InitScope;\n      remoteEntryInitOptions: RemoteEntryInitOptions;\n      remoteInfo: RemoteInfo;\n      remoteEntryExports: RemoteEntryExports;\n      origin: ModuleFederation;\n      id?: string;\n      remoteSnapshot?: ModuleInfo;\n    }>('initContainer'),\n  });\n  version: string = __VERSION__;\n  name: string;\n  moduleCache: Map<string, Module> = new Map();\n  snapshotHandler: SnapshotHandler;\n  sharedHandler: SharedHandler;\n  remoteHandler: RemoteHandler;\n  shareScopeMap: ShareScopeMap;\n  loaderHook = new PluginSystem({\n    // FIXME: may not be suitable , not open to the public yet\n    getModuleInfo: new SyncHook<\n      [\n        {\n          target: Record<string, any>;\n          key: any;\n        },\n      ],\n      { value: any | undefined; key: string } | void\n    >(),\n    createScript: new SyncHook<\n      [\n        {\n          url: string;\n          attrs?: Record<string, any>;\n          /**\n           * The producer(remote) info bound to this resource.\n           * Only present when the loader is invoked in a remote-related context\n           * (e.g. preloadRemote / loading remoteEntry).\n           */\n          remoteInfo?: RemoteInfo;\n          resourceContext?: ResourceLoadContext;\n        },\n      ],\n      CreateScriptHookReturn\n    >(),\n    createLink: new SyncHook<\n      [\n        {\n          url: string;\n          attrs?: Record<string, any>;\n          /**\n           * The producer(remote) info bound to this resource.\n           * Only present when the loader is invoked in a remote-related context\n           * (e.g. preloadRemote / loading remoteEntry).\n           */\n          remoteInfo?: RemoteInfo;\n          resourceContext?: ResourceLoadContext;\n        },\n      ],\n      CreateLinkHookReturnDom\n    >(),\n    fetch: new AsyncHook<\n      [string, RequestInit, RemoteInfo?, ResourceLoadContext?],\n      Promise<Response> | void | false\n    >(),\n    loadEntryError: new AsyncHook<\n      [\n        {\n          getRemoteEntry: typeof getRemoteEntry;\n          origin: ModuleFederation;\n          remoteInfo: RemoteInfo;\n          remoteEntryExports?: RemoteEntryExports | undefined;\n          globalLoading: Record<\n            string,\n            Promise<void | RemoteEntryExports> | undefined\n          >;\n          uniqueKey: string;\n        },\n      ],\n      Promise<Promise<RemoteEntryExports | undefined> | undefined>\n    >(),\n    afterLoadEntry: new AsyncHook<\n      [\n        {\n          origin: ModuleFederation;\n          remoteInfo: RemoteInfo;\n          remoteEntryExports?: RemoteEntryExports | false | void;\n          error?: unknown;\n          recovered?: boolean;\n        },\n      ],\n      void\n    >('afterLoadEntry'),\n    beforeInitRemote: new AsyncHook<\n      [\n        {\n          id?: string;\n          remoteInfo: RemoteInfo;\n          remoteSnapshot?: ModuleInfo;\n          origin: ModuleFederation;\n        },\n      ],\n      void\n    >('beforeInitRemote'),\n    afterInitRemote: new AsyncHook<\n      [\n        {\n          id?: string;\n          remoteInfo: RemoteInfo;\n          remoteSnapshot?: ModuleInfo;\n          remoteEntryExports?: RemoteEntryExports;\n          error?: unknown;\n          cached?: boolean;\n          origin: ModuleFederation;\n        },\n      ],\n      void\n    >('afterInitRemote'),\n    beforeGetExpose: new AsyncHook<\n      [\n        {\n          id: string;\n          expose: string;\n          moduleInfo: RemoteInfo;\n          remoteEntryExports: RemoteEntryExports;\n          origin: ModuleFederation;\n        },\n      ],\n      void\n    >('beforeGetExpose'),\n    afterGetExpose: new AsyncHook<\n      [\n        {\n          id: string;\n          expose: string;\n          moduleInfo: RemoteInfo;\n          remoteEntryExports: RemoteEntryExports;\n          moduleFactory?: RemoteModuleFactory;\n          error?: unknown;\n          origin: ModuleFederation;\n        },\n      ],\n      void\n    >('afterGetExpose'),\n    beforeExecuteFactory: new AsyncHook<\n      [\n        {\n          id: string;\n          expose: string;\n          moduleInfo: RemoteInfo;\n          loadFactory: boolean;\n          origin: ModuleFederation;\n        },\n      ],\n      void\n    >('beforeExecuteFactory'),\n    afterExecuteFactory: new AsyncHook<\n      [\n        {\n          id: string;\n          expose: string;\n          moduleInfo: RemoteInfo;\n          loadFactory: boolean;\n          exposeModule?: unknown;\n          error?: unknown;\n          origin: ModuleFederation;\n        },\n      ],\n      void\n    >('afterExecuteFactory'),\n    getModuleFactory: new AsyncHook<\n      [\n        {\n          remoteEntryExports: RemoteEntryExports;\n          expose: string;\n          moduleInfo: RemoteInfo;\n        },\n      ],\n      RemoteModuleFactory | Promise<RemoteModuleFactory | undefined> | undefined\n    >(),\n  });\n  bridgeHook = new PluginSystem({\n    beforeBridgeRender: new SyncHook<\n      [Record<string, any>],\n      void | Record<string, any>\n    >(),\n    afterBridgeRender: new SyncHook<\n      [Record<string, any>],\n      void | Record<string, any>\n    >(),\n    beforeBridgeDestroy: new SyncHook<\n      [Record<string, any>],\n      void | Record<string, any>\n    >(),\n    afterBridgeDestroy: new SyncHook<\n      [Record<string, any>],\n      void | Record<string, any>\n    >(),\n  });\n  moduleInfo?: GlobalModuleInfo[string];\n\n  constructor(userOptions: UserOptions) {\n    const plugins = USE_SNAPSHOT\n      ? [snapshotPlugin(), generatePreloadAssetsPlugin()]\n      : [];\n    // TODO: Validate the details of the options\n    // Initialize options with default values\n    const defaultOptions: Options = {\n      id: getBuilderId(),\n      name: userOptions.name,\n      plugins,\n      remotes: [],\n      shared: {},\n      inBrowser: isBrowserEnvValue,\n    };\n\n    this.name = userOptions.name;\n    this.options = defaultOptions;\n    this.snapshotHandler = new SnapshotHandler(this);\n    this.sharedHandler = new SharedHandler(this);\n    this.remoteHandler = new RemoteHandler(this);\n    this.shareScopeMap = this.sharedHandler.shareScopeMap;\n    this.registerPlugins([\n      ...defaultOptions.plugins,\n      ...(userOptions.plugins || []),\n    ]);\n    this.options = this.formatOptions(defaultOptions, userOptions);\n  }\n\n  initOptions(userOptions: UserOptions): Options {\n    if (userOptions.name && userOptions.name !== this.options.name) {\n      error(getShortErrorMsg(RUNTIME_010, runtimeDescMap));\n    }\n    this.registerPlugins(userOptions.plugins);\n    const options = this.formatOptions(this.options, userOptions);\n\n    this.options = options;\n\n    return options;\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    return this.sharedHandler.loadShare(pkgName, extraOptions);\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      customShareInfo?: Partial<Shared>;\n      from?: 'build' | 'runtime';\n      resolver?: (sharedOptions: ShareInfos[string]) => Shared;\n    },\n  ): () => T | never {\n    return this.sharedHandler.loadShareSync(pkgName, extraOptions);\n  }\n\n  initializeSharing(\n    shareScopeName = DEFAULT_SCOPE,\n    extraOptions?: {\n      initScope?: InitScope;\n      from?: CallFrom;\n      strategy?: Shared['strategy'];\n    },\n  ): Array<Promise<void>> {\n    return this.sharedHandler.initializeSharing(shareScopeName, extraOptions);\n  }\n\n  initRawContainer(\n    name: string,\n    url: string,\n    container: RemoteEntryExports,\n  ): Module {\n    const remoteInfo = getRemoteInfo({ name, entry: url });\n    const module = new Module({ host: this, remoteInfo });\n\n    module.remoteEntryExports = container;\n    this.moduleCache.set(name, module);\n\n    return module;\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    return this.remoteHandler.loadRemote(id, options);\n  }\n\n  // eslint-disable-next-line @typescript-eslint/member-ordering\n  async preloadRemote(preloadOptions: Array<PreloadRemoteArgs>): Promise<void> {\n    return this.remoteHandler.preloadRemote(preloadOptions);\n  }\n\n  initShareScopeMap(\n    scopeName: string,\n    shareScope: ShareScopeMap[string],\n    extraOptions: { hostShareScopeMap?: ShareScopeMap } = {},\n  ): void {\n    this.sharedHandler.initShareScopeMap(scopeName, shareScope, extraOptions);\n  }\n\n  formatOptions(globalOptions: Options, userOptions: UserOptions): Options {\n    const { allShareInfos: shared } = formatShareConfigs(\n      globalOptions,\n      userOptions,\n    );\n    const { userOptions: userOptionsRes, options: globalOptionsRes } =\n      this.hooks.lifecycle.beforeInit.emit({\n        origin: this,\n        userOptions,\n        options: globalOptions,\n        shareInfo: shared,\n      });\n\n    const remotes = this.remoteHandler.formatAndRegisterRemote(\n      globalOptionsRes,\n      userOptionsRes,\n    );\n\n    const { allShareInfos } = this.sharedHandler.registerShared(\n      globalOptionsRes,\n      userOptionsRes,\n    );\n\n    const plugins = [...globalOptionsRes.plugins];\n\n    if (userOptionsRes.plugins) {\n      userOptionsRes.plugins.forEach((plugin) => {\n        if (!plugins.includes(plugin)) {\n          plugins.push(plugin);\n        }\n      });\n    }\n\n    const optionsRes: Options = {\n      ...globalOptions,\n      ...userOptions,\n      plugins,\n      remotes,\n      shared: allShareInfos,\n      id: userOptionsRes.id || globalOptions.id,\n    };\n\n    this.hooks.lifecycle.init.emit({\n      origin: this,\n      options: optionsRes,\n    });\n    return optionsRes;\n  }\n\n  registerPlugins(plugins: UserOptions['plugins']) {\n    const pluginRes = registerPlugins(plugins, this);\n    // Merge plugin\n    this.options.plugins = this.options.plugins.reduce((res, plugin) => {\n      if (!plugin) return res;\n      if (res && !res.find((item) => item.name === plugin.name)) {\n        res.push(plugin);\n      }\n      return res;\n    }, pluginRes || []);\n  }\n  registerRemotes(remotes: Remote[], options?: { force?: boolean }): void {\n    return this.remoteHandler.registerRemotes(remotes, options);\n  }\n\n  registerShared(shared: UserOptions['shared']) {\n    this.sharedHandler.registerShared(this.options, {\n      ...this.options,\n      shared,\n    });\n  }\n}\n"],"mappings":"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"}