UNPKG

every-plugin

Version:
104 lines (102 loc) 4.9 kB
const require_runtime = require('../../_virtual/_rolldown/runtime.cjs'); const require_errors = require('../errors.cjs'); const require_runtime_mf_config = require('../mf-config.cjs'); const require_runtime_services_normalize = require('./normalize.cjs'); let effect = require("effect"); let _module_federation_enhanced_runtime = require("@module-federation/enhanced/runtime"); let _module_federation_runtime_core = require("@module-federation/runtime-core"); //#region src/runtime/services/module-federation.service.ts const coreModuleLoaders = { "every-plugin": () => Promise.resolve().then(() => require("../../index.cjs")), effect: () => import("effect"), zod: () => import("zod"), "@orpc/contract": () => import("@orpc/contract"), "@orpc/server": () => import("@orpc/server") }; function buildSharedConfig() { return Object.fromEntries(Object.entries(require_runtime_mf_config.MF_CORE_SHARED_DEPS).map(([name, config]) => { const load = coreModuleLoaders[name]; if (!load) throw new Error(`Missing core shared module loader for ${name}`); return [name, { version: config.version, get: () => load().then((mod) => () => mod), shareConfig: config.shareConfig }]; })); } const createModuleFederationInstance = effect.Effect.cached(effect.Effect.sync(() => { try { const shared = buildSharedConfig(); let instance = (0, _module_federation_enhanced_runtime.getInstance)(); if (!instance) { instance = (0, _module_federation_enhanced_runtime.createInstance)({ name: "host", remotes: [], shared }); (0, _module_federation_runtime_core.setGlobalFederationInstance)(instance); } else instance.registerShared(shared); return instance; } catch (error) { throw new Error(`Failed to initialize Module Federation: ${error}`); } })); var ModuleFederationService = class extends effect.Effect.Service()("ModuleFederationService", { effect: effect.Effect.gen(function* () { const mf = yield* effect.Effect.flatten(createModuleFederationInstance); return { registerRemote: (pluginId, url) => effect.Effect.gen(function* () { console.log(`[MF] Registering ${pluginId}`); const remoteName = require_runtime_services_normalize.getNormalizedRemoteName(pluginId); const type = url.endsWith("/mf-manifest.json") ? "manifest" : url.endsWith("/remoteEntry.js") ? "script" : void 0; yield* effect.Effect.try({ try: () => mf.registerRemotes([{ name: remoteName, entry: url, ...type ? { type } : {} }]), catch: (error) => new require_errors.ModuleFederationError({ pluginId, remoteUrl: url, cause: error instanceof Error ? error : new Error(String(error)) }) }); console.log(`[MF] ✅ Registered ${pluginId}`); }), loadRemoteConstructor: (pluginId, url) => effect.Effect.gen(function* () { const remoteName = require_runtime_services_normalize.getNormalizedRemoteName(pluginId); console.log(`[MF] Loading remote ${remoteName}`); const modulePath = `${remoteName}/plugin`; return yield* effect.Effect.tryPromise({ try: async () => { const container = await mf.loadRemote(modulePath); if (!container) throw new Error(`No container returned for ${modulePath}`); let Constructor; if (typeof container === "function") Constructor = container; else if (container.default) Constructor = container.default; else { Constructor = Object.values(container).find((exp) => typeof exp === "function" && exp.binding !== void 0); if (!Constructor) Constructor = Object.values(container).find((exp) => typeof exp === "function" && exp.prototype?.constructor === exp); } if (!Constructor || typeof Constructor !== "function") { const containerInfo = typeof container === "object" ? `Available exports: ${Object.keys(container).join(", ")}` : `Container type: ${typeof container}`; throw new Error(`No valid plugin constructor found for '${pluginId}'.\nSupported patterns:\n - export const YourPlugin = createPlugin({...})\n - export default createPlugin({...})\n${containerInfo}`); } if (!Constructor.binding) { const containerInfo = typeof container === "object" ? `Found exports: ${Object.keys(container).join(", ")}` : `Container type: ${typeof container}`; throw new Error(`Invalid plugin constructor for '${pluginId}'. The exported value must be created with createPlugin(). Found a function but it's missing the required 'binding' property.\n${containerInfo}`); } console.log(`[MF] ✅ Loaded constructor for ${pluginId}`); return Constructor; }, catch: (error) => new require_errors.ModuleFederationError({ pluginId, remoteUrl: url, cause: error instanceof Error ? error : new Error(String(error)) }) }); }) }; }) }) {}; //#endregion exports.ModuleFederationService = ModuleFederationService; //# sourceMappingURL=module-federation.service.cjs.map