UNPKG

@module-federation/enhanced

Version:

This package provides enhanced features for module federation.

147 lines (144 loc) • 8.75 kB
'use strict'; Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } }); const require_runtime = require('../../_virtual/_rolldown/runtime.js'); const require_utils = require('../../utils.js'); const require_lib_container_runtime_FederationModulesPlugin = require('./runtime/FederationModulesPlugin.js'); const require_lib_container_runtime_FederationRuntimePlugin = require('./runtime/FederationRuntimePlugin.js'); const require_lib_container_ContainerPlugin = require('./ContainerPlugin.js'); const require_lib_container_ContainerReferencePlugin = require('./ContainerReferencePlugin.js'); const require_lib_sharing_SharePlugin = require('../sharing/SharePlugin.js'); const require_lib_startup_MfStartupChunkDependenciesPlugin = require('../startup/MfStartupChunkDependenciesPlugin.js'); const require_lib_sharing_tree_shaking_TreeShakingSharedPlugin = require('../sharing/tree-shaking/TreeShakingSharedPlugin.js'); const require_schemas_container_ModuleFederationPlugin_check = require('../../schemas/container/ModuleFederationPlugin.check.js'); const require_schemas_container_ModuleFederationPlugin = require('../../schemas/container/ModuleFederationPlugin.js'); let _module_federation_sdk = require("@module-federation/sdk"); let node_path = require("node:path"); node_path = require_runtime.__toESM(node_path); let node_fs = require("node:fs"); node_fs = require_runtime.__toESM(node_fs); let _module_federation_sdk_normalize_webpack_path = require("@module-federation/sdk/normalize-webpack-path"); let _module_federation_data_prefetch_cli = require("@module-federation/data-prefetch/cli"); let _module_federation_dts_plugin = require("@module-federation/dts-plugin"); let _module_federation_managers = require("@module-federation/managers"); let _module_federation_manifest = require("@module-federation/manifest"); let _module_federation_rspack_remote_entry_plugin = require("@module-federation/rspack/remote-entry-plugin"); //#region src/lib/container/ModuleFederationPlugin.ts const isValidExternalsType = require((0, _module_federation_sdk_normalize_webpack_path.normalizeWebpackPath)("webpack/schemas/plugins/container/ExternalsType.check.js")); const { ExternalsPlugin } = require((0, _module_federation_sdk_normalize_webpack_path.normalizeWebpackPath)("webpack")); const validate = require_utils.createSchemaValidation((require_schemas_container_ModuleFederationPlugin_check.init_ModuleFederationPlugin_check(), require_runtime.__toCommonJS(require_schemas_container_ModuleFederationPlugin_check.ModuleFederationPlugin_check_exports)).validate, () => (require_schemas_container_ModuleFederationPlugin.init_ModuleFederationPlugin(), require_runtime.__toCommonJS(require_schemas_container_ModuleFederationPlugin.ModuleFederationPlugin_exports)).default, { name: "Module Federation Plugin", baseDataPath: "options" }); function getEnhancedPackageVersion() { let currentDir = __dirname; while (true) { const packageJsonPath = node_path.default.join(currentDir, "package.json"); if (node_fs.default.existsSync(packageJsonPath)) { const pkg = JSON.parse(node_fs.default.readFileSync(packageJsonPath, "utf-8")); if (pkg.name === "@module-federation/enhanced" && pkg.version) return pkg.version; } const parentDir = node_path.default.dirname(currentDir); if (parentDir === currentDir) break; currentDir = parentDir; } throw new Error("Unable to resolve @module-federation/enhanced package.json"); } var ModuleFederationPlugin = class { /** * @param {moduleFederationPlugin.ModuleFederationPluginOptions} options options */ constructor(options) { validate(options); this._options = options; } _patchBundlerConfig(compiler) { const { name, experiments } = this._options; const definePluginOptions = {}; const MFPluginNum = compiler.options.plugins.filter((p) => !!p && p.name === "ModuleFederationPlugin").length; if (name && MFPluginNum < 2) definePluginOptions["FEDERATION_BUILD_IDENTIFIER"] = JSON.stringify((0, _module_federation_sdk.composeKeyWithSeparator)(name, _module_federation_managers.utils.getBuildVersion())); definePluginOptions["FEDERATION_OPTIMIZE_NO_SNAPSHOT_PLUGIN"] = experiments?.optimization?.disableSnapshot ?? false; if (experiments?.optimization && typeof experiments.optimization === "object" && experiments.optimization !== null && "target" in experiments.optimization) { const manualTarget = experiments.optimization.target; if (manualTarget === "web" || manualTarget === "node") definePluginOptions["ENV_TARGET"] = JSON.stringify(manualTarget); } new compiler.webpack.DefinePlugin(definePluginOptions).apply(compiler); } /** * Apply the plugin * @param {Compiler} compiler the compiler instance * @returns {void} */ apply(compiler) { (0, _module_federation_sdk.bindLoggerToCompiler)(_module_federation_sdk.infrastructureLogger, compiler, "EnhancedModuleFederationPlugin"); const { _options: options } = this; const { name, experiments, dts, remotes, shared, shareScope } = options; if (!name) throw new Error("ModuleFederationPlugin name is required"); new _module_federation_rspack_remote_entry_plugin.RemoteEntryPlugin(options).apply(compiler); const useContainerPlugin = options.exposes && (Array.isArray(options.exposes) ? options.exposes.length > 0 : Object.keys(options.exposes).length > 0); if (experiments?.provideExternalRuntime) { if (useContainerPlugin) throw new Error("You can only set provideExternalRuntime: true in pure consumer which not expose modules."); options.runtimePlugins = (options.runtimePlugins || []).concat(require.resolve("@module-federation/inject-external-runtime-core-plugin")); } if (experiments?.externalRuntime === true) new (compiler.webpack.ExternalsPlugin || ExternalsPlugin)(compiler.options.externalsType || "global", { "@module-federation/runtime-core": "_FEDERATION_RUNTIME_CORE" }).apply(compiler); new require_lib_container_runtime_FederationModulesPlugin.default().apply(compiler); if (experiments?.asyncStartup) new require_lib_startup_MfStartupChunkDependenciesPlugin.default({ asyncChunkLoading: true }).apply(compiler); if (dts !== false) { const dtsPlugin = new _module_federation_dts_plugin.DtsPlugin(options); dtsPlugin.apply(compiler); dtsPlugin.addRuntimePlugins(); } if (options.dataPrefetch) new _module_federation_data_prefetch_cli.PrefetchPlugin(options).apply(compiler); new require_lib_container_runtime_FederationRuntimePlugin.default(options).apply(compiler); const library = options.library || { type: "var", name }; const containerRemoteType = options.remoteType || (options.library && isValidExternalsType(options.library.type) ? options.library.type : "script"); let disableManifest = options.manifest === false; if (useContainerPlugin) require_lib_container_ContainerPlugin.default.patchChunkSplit(compiler, name); this._patchBundlerConfig(compiler); if (!disableManifest && useContainerPlugin) try { const containerManager = new _module_federation_managers.ContainerManager(); containerManager.init(options); options.exposes = containerManager.containerPluginExposesOptions; } catch (err) { if (err instanceof Error) err.message = `[ ModuleFederationPlugin ]: Manifest will not generate, because: ${err.message}`; _module_federation_sdk.infrastructureLogger.warn(err); disableManifest = true; } if (library && !compiler.options.output.enabledLibraryTypes?.includes(library.type)) compiler.options.output.enabledLibraryTypes?.push(library.type); compiler.hooks.afterPlugins.tap("ModuleFederationPlugin", () => { if (useContainerPlugin) new require_lib_container_ContainerPlugin.default({ name, library, filename: options.filename, runtime: options.runtime, shareScope: options.shareScope, exposes: options.exposes, runtimePlugins: options.runtimePlugins }).apply(compiler); if (remotes && (Array.isArray(remotes) ? remotes.length > 0 : Object.keys(remotes).length > 0)) new require_lib_container_ContainerReferencePlugin.default({ remoteType: containerRemoteType, shareScope, remotes }).apply(compiler); if (shared) { new require_lib_sharing_tree_shaking_TreeShakingSharedPlugin.default({ mfConfig: options }).apply(compiler); new require_lib_sharing_SharePlugin.default({ shared, shareScope }).apply(compiler); } }); if (!disableManifest) { this._statsPlugin = new _module_federation_manifest.StatsPlugin(options, { pluginVersion: getEnhancedPackageVersion(), bundler: "webpack" }); this._statsPlugin.apply(compiler); } } }; //#endregion exports.default = ModuleFederationPlugin; //# sourceMappingURL=ModuleFederationPlugin.js.map