import { createInstance as createMFInstance } from "@module-federation/runtime"; import type { UserOptions } from "@module-federation/runtime/types"; import type { MakeOptional } from "../types"; /** * @public */ export type FederationRemote = { name: string; entry: string; }; /** * @public */ export type CreateInstanceOptions = MakeOptional< Pick, "remotes" | "plugins" >; /** * @public */ export interface FederationInstance { registerRemotes(remotes: FederationRemote[]): void; loadRemote(id: string): Promise; } /** * @public */ export function createInstance( options: CreateInstanceOptions, ): FederationInstance { const instance = createMFInstance({ remotes: [], ...options, }); return { registerRemotes: (remotes) => instance.registerRemotes(remotes, { force: false }), loadRemote: async (id: string) => { let remoteModule: T | null; try { remoteModule = await instance.loadRemote(id); } catch (error) { throw new Error(`Failed to load remote module "${id}"`, { cause: error, }); } return remoteModule; }, }; }