import { ModuleFederation, type UserOptions, getGlobalFederationConstructor, setGlobalFederationInstance, assert, setGlobalFederationConstructor, } from '@module-federation/runtime-core'; import { runtimeDescMap, RUNTIME_009 } from '@module-federation/error-codes'; import { getGlobalFederationInstance } from './utils'; export { loadScript, loadScriptNode, Module, getRemoteEntry, getRemoteInfo, registerGlobalPlugins, type ModuleFederationRuntimePlugin, type Federation, } from '@module-federation/runtime-core'; export { ModuleFederation }; export function createInstance(options: UserOptions) { // Retrieve debug constructor const ModuleFederationConstructor = getGlobalFederationConstructor() || ModuleFederation; const instance = new ModuleFederationConstructor(options); setGlobalFederationInstance(instance); return instance; } let FederationInstance: ModuleFederation | null = null; /** * @deprecated Use createInstance or getInstance instead */ export function init(options: UserOptions): ModuleFederation { // Retrieve the same instance with the same name const instance = getGlobalFederationInstance(options.name, options.version); if (!instance) { FederationInstance = createInstance(options); return FederationInstance; } else { // Merge options instance.initOptions(options); if (!FederationInstance) { FederationInstance = instance; } return instance; } } export function loadRemote( ...args: Parameters ): Promise { assert(FederationInstance, RUNTIME_009, runtimeDescMap); const loadRemote: typeof FederationInstance.loadRemote = FederationInstance.loadRemote; // eslint-disable-next-line prefer-spread return loadRemote.apply(FederationInstance, args); } export function loadShare( ...args: Parameters ): Promise T | undefined)> { assert(FederationInstance, RUNTIME_009, runtimeDescMap); // eslint-disable-next-line prefer-spread const loadShare: typeof FederationInstance.loadShare = FederationInstance.loadShare; return loadShare.apply(FederationInstance, args); } export function loadShareSync( ...args: Parameters ): () => T | never { assert(FederationInstance, RUNTIME_009, runtimeDescMap); const loadShareSync: typeof FederationInstance.loadShareSync = FederationInstance.loadShareSync; // eslint-disable-next-line prefer-spread return loadShareSync.apply(FederationInstance, args); } export function preloadRemote( ...args: Parameters ): ReturnType { assert(FederationInstance, RUNTIME_009, runtimeDescMap); // eslint-disable-next-line prefer-spread return FederationInstance.preloadRemote.apply(FederationInstance, args); } export function registerRemotes( ...args: Parameters ): ReturnType { assert(FederationInstance, RUNTIME_009, runtimeDescMap); // eslint-disable-next-line prefer-spread return FederationInstance.registerRemotes.apply(FederationInstance, args); } export function registerPlugins( ...args: Parameters ): ReturnType { assert(FederationInstance, RUNTIME_009, runtimeDescMap); // eslint-disable-next-line prefer-spread return FederationInstance.registerPlugins.apply(FederationInstance, args); } export function getInstance() { return FederationInstance; } export function registerShared( ...args: Parameters ): ReturnType { assert(FederationInstance, RUNTIME_009, runtimeDescMap); // eslint-disable-next-line prefer-spread return FederationInstance.registerShared.apply(FederationInstance, args); } // Inject for debug setGlobalFederationConstructor(ModuleFederation);