@module-federation/enhanced
Version:
This package provides enhanced features for module federation.
147 lines (144 loc) • 8.75 kB
JavaScript
;
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