| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Tobias Koppers @sokra and Zackary Jackson @ScriptedAlchemy*/"use strict";const ExternalsPlugin = require("../ExternalsPlugin");const RuntimeGlobals = require("../RuntimeGlobals");const createSchemaValidation = require("../util/create-schema-validation");const FallbackDependency = require("./FallbackDependency");const FallbackItemDependency = require("./FallbackItemDependency");const FallbackModuleFactory = require("./FallbackModuleFactory");const RemoteModule = require("./RemoteModule");const RemoteRuntimeModule = require("./RemoteRuntimeModule");const RemoteToExternalDependency = require("./RemoteToExternalDependency");const { parseOptions } = require("./options");/** @typedef {import("../../declarations/plugins/container/ContainerReferencePlugin").ContainerReferencePluginOptions} ContainerReferencePluginOptions *//** @typedef {import("../../declarations/plugins/container/ContainerReferencePlugin").RemotesConfig} RemotesConfig *//** @typedef {import("../Compiler")} Compiler */const validate = createSchemaValidation(	require("../../schemas/plugins/container/ContainerReferencePlugin.check.js"),	() =>		require("../../schemas/plugins/container/ContainerReferencePlugin.json"),	{		name: "Container Reference Plugin",		baseDataPath: "options"	});const slashCode = "/".charCodeAt(0);class ContainerReferencePlugin {	/**	 * @param {ContainerReferencePluginOptions} options options	 */	constructor(options) {		validate(options);		this._remoteType = options.remoteType;		this._remotes = 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;		/** @type {Record<string, string>} */		const remoteExternals = {};		for (const [key, config] of remotes) {			let i = 0;			for (const external of config.external) {				if (external.startsWith("internal ")) continue;				remoteExternals[					`webpack/container/reference/${key}${i ? `/fallback-${i}` : ""}`				] = external;				i++;			}		}		new ExternalsPlugin(remoteType, remoteExternals).apply(compiler);		compiler.hooks.compilation.tap(			"ContainerReferencePlugin",			(compilation, { normalModuleFactory }) => {				compilation.dependencyFactories.set(					RemoteToExternalDependency,					normalModuleFactory				);				compilation.dependencyFactories.set(					FallbackItemDependency,					normalModuleFactory				);				compilation.dependencyFactories.set(					FallbackDependency,					new FallbackModuleFactory()				);				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)								) {									return new RemoteModule(										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									);								}							}						}					}				);				compilation.hooks.runtimeRequirementInTree					.for(RuntimeGlobals.ensureChunkHandlers)					.tap("ContainerReferencePlugin", (chunk, set) => {						set.add(RuntimeGlobals.module);						set.add(RuntimeGlobals.moduleFactoriesAddOnly);						set.add(RuntimeGlobals.hasOwnProperty);						set.add(RuntimeGlobals.initializeSharing);						set.add(RuntimeGlobals.shareScopeMap);						compilation.addRuntimeModule(chunk, new RemoteRuntimeModule());					});			}		);	}}module.exports = ContainerReferencePlugin;
 |