| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Tobias Koppers @sokra*/"use strict";const { ConcatSource } = require("webpack-sources");const ConcatenatedModule = require("../optimize/ConcatenatedModule");const AbstractLibraryPlugin = require("./AbstractLibraryPlugin");/** @typedef {import("webpack-sources").Source} Source *//** @typedef {import("../../declarations/WebpackOptions").LibraryOptions} LibraryOptions *//** @typedef {import("../../declarations/WebpackOptions").LibraryType} LibraryType *//** @typedef {import("../Chunk")} Chunk *//** @typedef {import("../Compilation").ChunkHashContext} ChunkHashContext *//** @typedef {import("../Compiler")} Compiler *//** @typedef {import("../Module")} Module *//** @typedef {import("../javascript/JavascriptModulesPlugin").StartupRenderContext} StartupRenderContext *//** @typedef {import("../util/Hash")} Hash *//** @template T @typedef {import("./AbstractLibraryPlugin").LibraryContext<T>} LibraryContext<T> *//** * @typedef {object} ModernModuleLibraryPluginOptions * @property {LibraryType} type *//** * @typedef {object} ModernModuleLibraryPluginParsed * @property {string} name *//** * @typedef {ModernModuleLibraryPluginParsed} T * @extends {AbstractLibraryPlugin<ModernModuleLibraryPluginParsed>} */class ModernModuleLibraryPlugin extends AbstractLibraryPlugin {	/**	 * Apply the plugin	 * @param {Compiler} compiler the compiler instance	 * @returns {void}	 */	apply(compiler) {		super.apply(compiler);		compiler.hooks.compilation.tap("ModernModuleLibraryPlugin", compilation => {			const { exportsDefinitions } =				ConcatenatedModule.getCompilationHooks(compilation);			exportsDefinitions.tap("ModernModuleLibraryPlugin", () => {				return true;			});		});	}	/**	 * @param {ModernModuleLibraryPluginOptions} options the plugin options	 */	constructor(options) {		super({			pluginName: "ModernModuleLibraryPlugin",			type: options.type		});	}	/**	 * @param {LibraryOptions} library normalized library option	 * @returns {T | false} preprocess as needed by overriding	 */	parseOptions(library) {		const { name } = library;		if (name) {			throw new Error(				`Library name must be unset. ${AbstractLibraryPlugin.COMMON_LIBRARY_NAME_MESSAGE}`			);		}		return {			name: /** @type {string} */ (name)		};	}	/**	 * @param {Source} source source	 * @param {Module} module module	 * @param {StartupRenderContext} renderContext render context	 * @param {LibraryContext<T>} libraryContext context	 * @returns {Source} source with library export	 */	renderStartup(		source,		module,		{ moduleGraph, chunk },		{ options, compilation }	) {		const result = new ConcatSource(source);		const exportsInfo = moduleGraph.getExportsInfo(module);		const definitions = module.buildMeta.exportsFinalName;		const exports = [];		for (const exportInfo of exportsInfo.orderedExports) {			let shouldContinue = false;			const reexport = exportInfo.findTarget(moduleGraph, _m => true);			if (reexport) {				const exp = moduleGraph.getExportsInfo(reexport.module);				for (const reexportInfo of exp.orderedExports) {					if (						!reexportInfo.provided &&						reexportInfo.name === reexport.export[0]					) {						shouldContinue = true;					}				}			}			if (shouldContinue) continue;			const webpackExportsProperty = exportInfo.getUsedName(				exportInfo.name,				chunk.runtime			);			const finalName =				definitions[					/** @type {string} */					(webpackExportsProperty)				];			exports.push(				finalName === exportInfo.name					? finalName					: `${finalName} as ${exportInfo.name}`			);		}		if (exports.length > 0) {			result.add(`export { ${exports.join(", ")} };\n`);		}		return result;	}}module.exports = ModernModuleLibraryPlugin;
 |