| | |
| | | |
| | | "use strict"; |
| | | |
| | | const createSchemaValidation = require("../util/create-schema-validation"); |
| | | const memoize = require("../util/memoize"); |
| | | const ContainerEntryDependency = require("./ContainerEntryDependency"); |
| | | const ContainerEntryModuleFactory = require("./ContainerEntryModuleFactory"); |
| | |
| | | require("./ModuleFederationPlugin") |
| | | ); |
| | | |
| | | const validate = createSchemaValidation( |
| | | require("../../schemas/plugins/container/ContainerPlugin.check"), |
| | | () => require("../../schemas/plugins/container/ContainerPlugin.json"), |
| | | { |
| | | name: "Container Plugin", |
| | | baseDataPath: "options" |
| | | } |
| | | ); |
| | | |
| | | const PLUGIN_NAME = "ContainerPlugin"; |
| | | |
| | | class ContainerPlugin { |
| | | /** |
| | | * Creates an instance of ContainerPlugin. |
| | | * @param {ContainerPluginOptions} options options |
| | | */ |
| | | constructor(options) { |
| | | validate(options); |
| | | |
| | | this._options = { |
| | | name: options.name, |
| | | shareScope: options.shareScope || "default", |
| | | library: options.library || { |
| | | type: "var", |
| | | name: options.name |
| | | }, |
| | | runtime: options.runtime, |
| | | filename: options.filename || undefined, |
| | | exposes: /** @type {ExposesList} */ ( |
| | | parseOptions( |
| | | options.exposes, |
| | | (item) => ({ |
| | | import: Array.isArray(item) ? item : [item], |
| | | name: undefined |
| | | }), |
| | | (item) => ({ |
| | | import: Array.isArray(item.import) ? item.import : [item.import], |
| | | name: item.name || undefined |
| | | }) |
| | | ) |
| | | ) |
| | | }; |
| | | /** @type {ContainerPluginOptions} */ |
| | | this.options = options; |
| | | } |
| | | |
| | | /** |
| | | * Apply the plugin |
| | | * Applies the plugin by registering its hooks on the compiler. |
| | | * @param {Compiler} compiler the compiler instance |
| | | * @returns {void} |
| | | */ |
| | | apply(compiler) { |
| | | const { name, exposes, shareScope, filename, library, runtime } = |
| | | this._options; |
| | | compiler.hooks.validate.tap(PLUGIN_NAME, () => { |
| | | compiler.validate( |
| | | () => require("../../schemas/plugins/container/ContainerPlugin.json"), |
| | | this.options, |
| | | { |
| | | name: "Container Plugin", |
| | | baseDataPath: "options" |
| | | }, |
| | | (options) => |
| | | require("../../schemas/plugins/container/ContainerPlugin.check")( |
| | | options |
| | | ) |
| | | ); |
| | | }); |
| | | |
| | | const library = this.options.library || { |
| | | type: "var", |
| | | name: this.options.name |
| | | }; |
| | | |
| | | if (!compiler.options.output.enabledLibraryTypes.includes(library.type)) { |
| | | compiler.options.output.enabledLibraryTypes.push(library.type); |
| | | } |
| | | |
| | | const exposes = /** @type {ExposesList} */ ( |
| | | parseOptions( |
| | | this.options.exposes, |
| | | (item) => ({ |
| | | import: Array.isArray(item) ? item : [item], |
| | | name: undefined |
| | | }), |
| | | (item) => ({ |
| | | import: Array.isArray(item.import) ? item.import : [item.import], |
| | | name: item.name || undefined |
| | | }) |
| | | ) |
| | | ); |
| | | |
| | | const shareScope = this.options.shareScope || "default"; |
| | | |
| | | compiler.hooks.make.tapAsync(PLUGIN_NAME, (compilation, callback) => { |
| | | const hooks = |
| | | getModuleFederationPlugin().getCompilationHooks(compilation); |
| | | const dep = new ContainerEntryDependency(name, exposes, shareScope); |
| | | dep.loc = { name }; |
| | | const dep = new ContainerEntryDependency( |
| | | this.options.name, |
| | | exposes, |
| | | shareScope |
| | | ); |
| | | dep.loc = { name: this.options.name }; |
| | | compilation.addEntry( |
| | | compilation.options.context, |
| | | dep, |
| | | { |
| | | name, |
| | | filename, |
| | | runtime, |
| | | name: this.options.name, |
| | | filename: this.options.filename, |
| | | runtime: this.options.runtime, |
| | | library |
| | | }, |
| | | (error) => { |