summaryrefslogtreecommitdiff
path: root/node_modules/webpack/lib/container/ModuleFederationPlugin.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/webpack/lib/container/ModuleFederationPlugin.js')
-rw-r--r--node_modules/webpack/lib/container/ModuleFederationPlugin.js94
1 files changed, 94 insertions, 0 deletions
diff --git a/node_modules/webpack/lib/container/ModuleFederationPlugin.js b/node_modules/webpack/lib/container/ModuleFederationPlugin.js
new file mode 100644
index 00000000..3652bf58
--- /dev/null
+++ b/node_modules/webpack/lib/container/ModuleFederationPlugin.js
@@ -0,0 +1,94 @@
+/*
+ MIT License http://www.opensource.org/licenses/mit-license.php
+ Author Tobias Koppers @sokra and Zackary Jackson @ScriptedAlchemy
+*/
+
+"use strict";
+
+const isValidExternalsType = require("../../schemas/plugins/container/ExternalsType.check.js");
+const SharePlugin = require("../sharing/SharePlugin");
+const createSchemaValidation = require("../util/create-schema-validation");
+const ContainerPlugin = require("./ContainerPlugin");
+const ContainerReferencePlugin = require("./ContainerReferencePlugin");
+
+/** @typedef {import("../../declarations/plugins/container/ModuleFederationPlugin").ExternalsType} ExternalsType */
+/** @typedef {import("../../declarations/plugins/container/ModuleFederationPlugin").ModuleFederationPluginOptions} ModuleFederationPluginOptions */
+/** @typedef {import("../../declarations/plugins/container/ModuleFederationPlugin").Shared} Shared */
+/** @typedef {import("../Compiler")} Compiler */
+
+const validate = createSchemaValidation(
+ require("../../schemas/plugins/container/ModuleFederationPlugin.check.js"),
+ () => require("../../schemas/plugins/container/ModuleFederationPlugin.json"),
+ {
+ name: "Module Federation Plugin",
+ baseDataPath: "options"
+ }
+);
+class ModuleFederationPlugin {
+ /**
+ * @param {ModuleFederationPluginOptions} options options
+ */
+ constructor(options) {
+ validate(options);
+
+ this._options = options;
+ }
+
+ /**
+ * Apply the plugin
+ * @param {Compiler} compiler the compiler instance
+ * @returns {void}
+ */
+ apply(compiler) {
+ const { _options: options } = this;
+ const library = options.library || { type: "var", name: options.name };
+ const remoteType =
+ options.remoteType ||
+ (options.library && isValidExternalsType(options.library.type)
+ ? /** @type {ExternalsType} */ (options.library.type)
+ : "script");
+ if (
+ library &&
+ !compiler.options.output.enabledLibraryTypes.includes(library.type)
+ ) {
+ compiler.options.output.enabledLibraryTypes.push(library.type);
+ }
+ compiler.hooks.afterPlugins.tap("ModuleFederationPlugin", () => {
+ if (
+ options.exposes &&
+ (Array.isArray(options.exposes)
+ ? options.exposes.length > 0
+ : Object.keys(options.exposes).length > 0)
+ ) {
+ new ContainerPlugin({
+ name: options.name,
+ library,
+ filename: options.filename,
+ runtime: options.runtime,
+ shareScope: options.shareScope,
+ exposes: options.exposes
+ }).apply(compiler);
+ }
+ if (
+ options.remotes &&
+ (Array.isArray(options.remotes)
+ ? options.remotes.length > 0
+ : Object.keys(options.remotes).length > 0)
+ ) {
+ new ContainerReferencePlugin({
+ remoteType,
+ shareScope: options.shareScope,
+ remotes: options.remotes
+ }).apply(compiler);
+ }
+ if (options.shared) {
+ new SharePlugin({
+ shared: options.shared,
+ shareScope: options.shareScope
+ }).apply(compiler);
+ }
+ });
+ }
+}
+
+module.exports = ModuleFederationPlugin;