@module-federation/enhanced
Version:
This package provides enhanced features for module federation.
75 lines (73 loc) • 4.52 kB
JavaScript
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
const require_runtime = require('../../_virtual/_rolldown/runtime.js');
const require_lib_container_options = require('./options.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_FallbackDependency = require('./FallbackDependency.js');
const require_lib_container_FallbackItemDependency = require('./FallbackItemDependency.js');
const require_lib_container_FallbackModuleFactory = require('./FallbackModuleFactory.js');
const require_lib_container_RemoteToExternalDependency = require('./RemoteToExternalDependency.js');
const require_lib_container_RemoteModule = require('./RemoteModule.js');
const require_lib_container_RemoteRuntimeModule = require('./RemoteRuntimeModule.js');
let _module_federation_sdk_normalize_webpack_path = require("@module-federation/sdk/normalize-webpack-path");
//#region src/lib/container/ContainerReferencePlugin.ts
const { ExternalsPlugin } = require((0, _module_federation_sdk_normalize_webpack_path.normalizeWebpackPath)("webpack"));
const slashCode = "/".charCodeAt(0);
var ContainerReferencePlugin = class {
constructor(options) {
this._remoteType = options.remoteType;
this._remotes = require_lib_container_options.parseOptions(options.remotes, (item) => ({
external: Array.isArray(item) ? item : [item],
shareScope: options.shareScope || "default"
}), (item) => ({
external: Array.isArray(item.external) ? item.external : [item.external],
shareScope: item.shareScope || options.shareScope || "default"
}));
}
/**
* Apply the plugin
* @param {Compiler} compiler the compiler instance
* @returns {void}
*/
apply(compiler) {
const { _remotes: remotes, _remoteType: remoteType } = this;
new require_lib_container_runtime_FederationRuntimePlugin.default().apply(compiler);
/** @type {Record<string, string>} */
const remoteExternals = {};
for (const [key, config] of remotes) {
let i = 0;
for (const external of config.external) {
if (typeof external === "string" && external.startsWith("internal ")) continue;
remoteExternals[`webpack/container/reference/${key}${i ? `/fallback-${i}` : ""}`] = external;
i++;
}
}
new (compiler.webpack.ExternalsPlugin || ExternalsPlugin)(remoteType, remoteExternals).apply(compiler);
compiler.hooks.compilation.tap("ContainerReferencePlugin", (compilation, { normalModuleFactory }) => {
compilation.dependencyFactories.set(require_lib_container_RemoteToExternalDependency.default, normalModuleFactory);
compilation.dependencyFactories.set(require_lib_container_FallbackItemDependency.default, normalModuleFactory);
compilation.dependencyFactories.set(require_lib_container_FallbackDependency.default, new require_lib_container_FallbackModuleFactory.default());
const hooks = require_lib_container_runtime_FederationModulesPlugin.default.getCompilationHooks(compilation);
normalModuleFactory.hooks.factorize.tap("ContainerReferencePlugin", (data) => {
if (!data.request.includes("!")) {
for (const [key, config] of remotes) if (data.request.startsWith(`${key}`) && (data.request.length === key.length || data.request.charCodeAt(key.length) === slashCode)) {
const remoteModule = new require_lib_container_RemoteModule.default(data.request, config.external.map((external, i) => external.startsWith("internal ") ? external.slice(9) : `webpack/container/reference/${key}${i ? `/fallback-${i}` : ""}`), `.${data.request.slice(key.length)}`, config.shareScope);
hooks.addRemoteDependency.call(remoteModule);
return remoteModule;
}
}
});
compilation.hooks.runtimeRequirementInTree.for(compiler.webpack.RuntimeGlobals.ensureChunkHandlers).tap("ContainerReferencePlugin", (chunk, set) => {
set.add(compiler.webpack.RuntimeGlobals.module);
set.add(compiler.webpack.RuntimeGlobals.moduleFactoriesAddOnly);
set.add(compiler.webpack.RuntimeGlobals.hasOwnProperty);
set.add(compiler.webpack.RuntimeGlobals.initializeSharing);
set.add(compiler.webpack.RuntimeGlobals.shareScopeMap);
compilation.addRuntimeModule(chunk, new require_lib_container_RemoteRuntimeModule.default());
});
});
}
};
//#endregion
exports.default = ContainerReferencePlugin;
//# sourceMappingURL=ContainerReferencePlugin.js.map