everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
109 lines (107 loc) • 4.46 kB
JavaScript
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
const require_integrity = require('./integrity.cjs');
let _module_federation_enhanced_runtime = require("@module-federation/enhanced/runtime");
let _module_federation_runtime_core = require("@module-federation/runtime-core");
//#region src/mf.ts
let mfInstance = null;
function patchManifestFetchForSsrPublicPath(mf) {
if (!mf || !mf.loaderHook?.lifecycle?.fetch?.on) return;
if (mf.__everythingDevPatchedManifestFetch === true) return;
mf.__everythingDevPatchedManifestFetch = true;
mf.loaderHook.lifecycle.fetch.on((url, init) => {
if (typeof url !== "string" || !url.endsWith("/mf-manifest.json")) return;
return fetch(url, init).then((res) => res.json()).then((json) => {
json.metaData = json.metaData ?? {};
json.metaData.ssrPublicPath = json.metaData.ssrPublicPath ?? url.replace(/\/mf-manifest\.json$/, "/");
return new Response(JSON.stringify(json), { headers: { "content-type": "application/json" } });
});
});
}
function installIntegrityFetchHook(mf, registry) {
if (!mf || !mf.loaderHook?.lifecycle?.fetch?.on) {
console.warn("[SRI] MF lifecycle fetch hook not available, skipping integrity-in-pipeline");
return;
}
if (mf.__everythingDevIntegrityHook === true) return;
mf.__everythingDevIntegrityHook = true;
mf.loaderHook.lifecycle.fetch.on((url, init) => {
if (typeof url !== "string") return;
const expectedHash = registry.get(url);
if (!expectedHash) return;
return fetch(url, init).then(async (res) => {
const buffer = Buffer.from(await res.arrayBuffer());
const computed = require_integrity.computeSriHash(buffer);
if (computed !== expectedHash) {
console.error(`[SRI] Integrity check failed in MF fetch pipeline for ${url}\n Expected: ${expectedHash}\n Computed: ${computed}`);
return new Response(`Integrity check failed for ${url}`, {
status: 500,
statusText: "Integrity Check Failed"
});
}
console.log(`[SRI] Integrity verified in pipeline for ${url}`);
return new Response(buffer, {
status: res.status,
statusText: res.statusText,
headers: res.headers
});
});
});
}
function getFederationInstance() {
if (mfInstance) return mfInstance;
const existing = (0, _module_federation_enhanced_runtime.getInstance)();
if (existing) {
mfInstance = existing;
(0, _module_federation_runtime_core.setGlobalFederationInstance)(mfInstance);
patchManifestFetchForSsrPublicPath(mfInstance);
return mfInstance;
}
mfInstance = (0, _module_federation_enhanced_runtime.createInstance)({
name: "host",
remotes: []
});
(0, _module_federation_runtime_core.setGlobalFederationInstance)(mfInstance);
patchManifestFetchForSsrPublicPath(mfInstance);
return mfInstance;
}
async function registerRemote(opts) {
const instance = getFederationInstance();
const inferType = () => {
if (opts.type) return opts.type;
if (opts.entry.endsWith("/mf-manifest.json")) return "manifest";
if (opts.entry.endsWith("/remoteEntry.js")) return "script";
return typeof window === "undefined" ? "script" : "manifest";
};
const remoteType = inferType();
instance.registerRemotes([{
name: opts.name,
entry: opts.entry,
type: remoteType
}]);
}
async function loadRemoteModule(specifier, options) {
const instance = getFederationInstance();
if (typeof window === "undefined") await instance.initializeSharing?.("default");
const mod = await instance.loadRemote(specifier, options);
if (!mod) throw new Error(`Failed to load remote module: ${specifier}`);
return mod;
}
async function ensureNodeRuntimePlugin() {
const instance = getFederationInstance();
if (typeof window !== "undefined") return;
if (instance.__nodeRuntimePluginLoaded) return;
const mod = await import("@module-federation/node/runtimePlugin");
const factory = mod?.default ?? mod;
const plugin = typeof factory === "function" ? factory() : null;
if (plugin) instance.registerPlugins([plugin]);
instance.__nodeRuntimePluginLoaded = true;
}
//#endregion
exports.ensureNodeRuntimePlugin = ensureNodeRuntimePlugin;
exports.getFederationInstance = getFederationInstance;
exports.installIntegrityFetchHook = installIntegrityFetchHook;
exports.loadRemoteModule = loadRemoteModule;
exports.patchManifestFetchForSsrPublicPath = patchManifestFetchForSsrPublicPath;
exports.registerRemote = registerRemote;
//# sourceMappingURL=mf.cjs.map