{"version":3,"file":"mf.mjs","names":[],"sources":["../src/mf.ts"],"sourcesContent":["import { createInstance, getInstance } from \"@module-federation/enhanced/runtime\";\nimport { setGlobalFederationInstance } from \"@module-federation/runtime-core\";\nimport { computeSriHash, type IntegrityRegistry } from \"./integrity\";\n\ntype FederationInstance = ReturnType<typeof createInstance>;\n\nlet mfInstance: FederationInstance | null = null;\n\nexport function patchManifestFetchForSsrPublicPath(mf: FederationInstance): void {\n  if (!mf || !(mf as any).loaderHook?.lifecycle?.fetch?.on) return;\n  if ((mf as any).__everythingDevPatchedManifestFetch === true) return;\n  (mf as any).__everythingDevPatchedManifestFetch = true;\n\n  (mf as any).loaderHook.lifecycle.fetch.on((url: unknown, init: unknown) => {\n    if (typeof url !== \"string\" || !url.endsWith(\"/mf-manifest.json\")) {\n      return;\n    }\n    return fetch(url, init as any)\n      .then((res) => res.json())\n      .then((json: any) => {\n        json.metaData = json.metaData ?? {};\n        json.metaData.ssrPublicPath =\n          json.metaData.ssrPublicPath ?? url.replace(/\\/mf-manifest\\.json$/, \"/\");\n        return new Response(JSON.stringify(json), {\n          headers: { \"content-type\": \"application/json\" },\n        });\n      });\n  });\n}\n\nexport function installIntegrityFetchHook(\n  mf: FederationInstance,\n  registry: IntegrityRegistry,\n): void {\n  if (!mf || !(mf as any).loaderHook?.lifecycle?.fetch?.on) {\n    console.warn(\"[SRI] MF lifecycle fetch hook not available, skipping integrity-in-pipeline\");\n    return;\n  }\n  if ((mf as any).__everythingDevIntegrityHook === true) return;\n  (mf as any).__everythingDevIntegrityHook = true;\n\n  (mf as any).loaderHook.lifecycle.fetch.on((url: unknown, init: unknown) => {\n    if (typeof url !== \"string\") return;\n\n    const expectedHash = registry.get(url);\n    if (!expectedHash) return;\n\n    return fetch(url, init as any).then(async (res) => {\n      const buffer = Buffer.from(await res.arrayBuffer());\n      const computed = computeSriHash(buffer);\n\n      if (computed !== expectedHash) {\n        console.error(\n          `[SRI] Integrity check failed in MF fetch pipeline for ${url}\\n  Expected: ${expectedHash}\\n  Computed: ${computed}`,\n        );\n        return new Response(`Integrity check failed for ${url}`, {\n          status: 500,\n          statusText: \"Integrity Check Failed\",\n        });\n      }\n\n      console.log(`[SRI] Integrity verified in pipeline for ${url}`);\n      return new Response(buffer, {\n        status: res.status,\n        statusText: res.statusText,\n        headers: res.headers,\n      });\n    });\n  });\n}\n\nexport function getFederationInstance(): FederationInstance {\n  if (mfInstance) return mfInstance;\n\n  const existing = getInstance();\n  if (existing) {\n    mfInstance = existing as FederationInstance;\n    setGlobalFederationInstance(mfInstance as any);\n    patchManifestFetchForSsrPublicPath(mfInstance);\n    return mfInstance;\n  }\n\n  mfInstance = createInstance({\n    name: \"host\",\n    remotes: [],\n  }) as FederationInstance;\n  setGlobalFederationInstance(mfInstance as any);\n  patchManifestFetchForSsrPublicPath(mfInstance);\n  return mfInstance;\n}\n\nexport async function registerRemote(opts: {\n  name: string;\n  entry: string;\n  type?: \"manifest\" | \"script\";\n}): Promise<void> {\n  const instance = getFederationInstance();\n\n  const inferType = (): \"manifest\" | \"script\" => {\n    if (opts.type) return opts.type;\n    if (opts.entry.endsWith(\"/mf-manifest.json\")) return \"manifest\";\n    if (opts.entry.endsWith(\"/remoteEntry.js\")) return \"script\";\n    return typeof window === \"undefined\" ? \"script\" : \"manifest\";\n  };\n\n  const remoteType = inferType();\n\n  instance.registerRemotes([\n    {\n      name: opts.name,\n      entry: opts.entry,\n      type: remoteType,\n    },\n  ]);\n}\n\nexport async function loadRemoteModule<T>(\n  specifier: string,\n  options?: { loadFactory?: boolean; from?: \"build\" | \"runtime\" },\n): Promise<T> {\n  const instance = getFederationInstance();\n\n  const isServer = typeof window === \"undefined\";\n  if (isServer) {\n    await (instance as any).initializeSharing?.(\"default\");\n  }\n\n  const mod = await instance.loadRemote<T>(specifier, options as any);\n  if (!mod) {\n    throw new Error(`Failed to load remote module: ${specifier}`);\n  }\n  return mod;\n}\n\nexport async function ensureNodeRuntimePlugin(): Promise<void> {\n  const instance = getFederationInstance();\n  if (typeof window !== \"undefined\") return;\n  if ((instance as any).__nodeRuntimePluginLoaded) return;\n\n  const mod: any = await import(\"@module-federation/node/runtimePlugin\");\n  const factory = mod?.default ?? mod;\n  const plugin = typeof factory === \"function\" ? factory() : null;\n  if (plugin) {\n    instance.registerPlugins([plugin]);\n  }\n  (instance as any).__nodeRuntimePluginLoaded = true;\n}\n"],"mappings":"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"}