UNPKG

@module-federation/enhanced

Version:

This package provides enhanced features for module federation.

73 lines (71 loc) 3.89 kB
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } }); const require_runtime = require('../../../_virtual/_rolldown/runtime.js'); const require_lib_container_runtime_utils = require('./utils.js'); const require_lib_container_runtime_EmbedFederationRuntimeModule = require('./EmbedFederationRuntimeModule.js'); const require_lib_container_runtime_FederationModulesPlugin = require('./FederationModulesPlugin.js'); let _module_federation_sdk_normalize_webpack_path = require("@module-federation/sdk/normalize-webpack-path"); //#region src/lib/container/runtime/EmbedFederationRuntimePlugin.ts const { RuntimeGlobals } = require((0, _module_federation_sdk_normalize_webpack_path.normalizeWebpackPath)("webpack")); const PLUGIN_NAME = "EmbedFederationRuntimePlugin"; const federationGlobal = require_lib_container_runtime_utils.getFederationGlobalScope(RuntimeGlobals); /** * Plugin that embeds Module Federation runtime code into chunks. * It ensures proper initialization of federated modules and manages runtime requirements. */ var EmbedFederationRuntimePlugin = class { constructor(options = {}) { this.processedChunks = /* @__PURE__ */ new WeakMap(); this.options = { enableForAllChunks: false, ...options }; } /** * Determines if runtime embedding should be enabled for a given chunk. */ isEnabledForChunk(chunk) { if (chunk.id === "build time chunk") return false; return this.options.enableForAllChunks || chunk.hasRuntime(); } /** * Checks if a hook has already been tapped by this plugin. */ isHookAlreadyTapped(taps, hookName) { return taps.some((tap) => tap.name === hookName); } apply(compiler) { const compilationTaps = compiler.hooks.thisCompilation.taps || []; if (this.isHookAlreadyTapped(compilationTaps, PLUGIN_NAME)) return; compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => { const { renderStartup } = compiler.webpack.javascript.JavascriptModulesPlugin.getCompilationHooks(compilation); renderStartup.tap(PLUGIN_NAME, (startupSource, _lastInlinedModule, renderContext) => { const { chunk, chunkGraph } = renderContext; if (!this.isEnabledForChunk(chunk)) return startupSource; const runtimeRequirements = chunkGraph.getTreeRuntimeRequirements(chunk); if (chunkGraph.getNumberOfEntryModules(chunk) > 0 || runtimeRequirements.has(RuntimeGlobals.startupNoDefault)) return startupSource; return new compiler.webpack.sources.ConcatSource(startupSource, "\n// Custom hook: appended startup call because none was added automatically\n", `${RuntimeGlobals.startup}();\n`); }); const federationHooks = require_lib_container_runtime_FederationModulesPlugin.default.getCompilationHooks(compilation); const containerEntrySet = /* @__PURE__ */ new Set(); compilation.hooks.additionalChunkRuntimeRequirements.tap(PLUGIN_NAME, (chunk, runtimeRequirements) => { if (!this.isEnabledForChunk(chunk)) return; runtimeRequirements.add(RuntimeGlobals.startupOnlyBefore); }); federationHooks.addFederationRuntimeDependency.tap(PLUGIN_NAME, (dependency) => { containerEntrySet.add(dependency); }); const handleRuntimeRequirements = (chunk, runtimeRequirements) => { if (!this.isEnabledForChunk(chunk)) return; if (runtimeRequirements.has("embeddedFederationRuntime")) return; if (!runtimeRequirements.has(federationGlobal)) return; runtimeRequirements.add("embeddedFederationRuntime"); const runtimeModule = new require_lib_container_runtime_EmbedFederationRuntimeModule.default(containerEntrySet); compilation.addRuntimeModule(chunk, runtimeModule); }; compilation.hooks.runtimeRequirementInTree.for(federationGlobal).tap(PLUGIN_NAME, handleRuntimeRequirements); }); } }; //#endregion exports.default = EmbedFederationRuntimePlugin; //# sourceMappingURL=EmbedFederationRuntimePlugin.js.map