You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			117 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
		
		
			
		
	
	
			117 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
| 
											9 months ago
										 | /* | ||
|  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||
|  | 	Author Tobias Koppers @sokra | ||
|  | */ | ||
|  | 
 | ||
|  | "use strict"; | ||
|  | 
 | ||
|  | const { ConcatSource } = require("webpack-sources"); | ||
|  | const { UsageState } = require("../ExportsInfo"); | ||
|  | const RuntimeGlobals = require("../RuntimeGlobals"); | ||
|  | const propertyAccess = require("../util/propertyAccess"); | ||
|  | const { getEntryRuntime } = require("../util/runtime"); | ||
|  | 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("../Compiler")} Compiler */ | ||
|  | /** @typedef {import("../Module")} Module */ | ||
|  | /** @typedef {import("../javascript/JavascriptModulesPlugin").StartupRenderContext} StartupRenderContext */ | ||
|  | /** @template T @typedef {import("./AbstractLibraryPlugin").LibraryContext<T>} LibraryContext<T> */ | ||
|  | 
 | ||
|  | /** | ||
|  |  * @typedef {Object} ExportPropertyLibraryPluginParsed | ||
|  |  * @property {string | string[]} export | ||
|  |  */ | ||
|  | 
 | ||
|  | /** | ||
|  |  * @typedef {Object} ExportPropertyLibraryPluginOptions | ||
|  |  * @property {LibraryType} type | ||
|  |  * @property {boolean} nsObjectUsed the namespace object is used | ||
|  |  */ | ||
|  | /** | ||
|  |  * @typedef {ExportPropertyLibraryPluginParsed} T | ||
|  |  * @extends {AbstractLibraryPlugin<ExportPropertyLibraryPluginParsed>} | ||
|  |  */ | ||
|  | class ExportPropertyLibraryPlugin extends AbstractLibraryPlugin { | ||
|  | 	/** | ||
|  | 	 * @param {ExportPropertyLibraryPluginOptions} options options | ||
|  | 	 */ | ||
|  | 	constructor({ type, nsObjectUsed }) { | ||
|  | 		super({ | ||
|  | 			pluginName: "ExportPropertyLibraryPlugin", | ||
|  | 			type | ||
|  | 		}); | ||
|  | 		this.nsObjectUsed = nsObjectUsed; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * @param {LibraryOptions} library normalized library option | ||
|  | 	 * @returns {T | false} preprocess as needed by overriding | ||
|  | 	 */ | ||
|  | 	parseOptions(library) { | ||
|  | 		return { | ||
|  | 			export: library.export | ||
|  | 		}; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * @param {Module} module the exporting entry module | ||
|  | 	 * @param {string} entryName the name of the entrypoint | ||
|  | 	 * @param {LibraryContext<T>} libraryContext context | ||
|  | 	 * @returns {void} | ||
|  | 	 */ | ||
|  | 	finishEntryModule( | ||
|  | 		module, | ||
|  | 		entryName, | ||
|  | 		{ options, compilation, compilation: { moduleGraph } } | ||
|  | 	) { | ||
|  | 		const runtime = getEntryRuntime(compilation, entryName); | ||
|  | 		if (options.export) { | ||
|  | 			const exportsInfo = moduleGraph.getExportInfo( | ||
|  | 				module, | ||
|  | 				Array.isArray(options.export) ? options.export[0] : options.export | ||
|  | 			); | ||
|  | 			exportsInfo.setUsed(UsageState.Used, runtime); | ||
|  | 			exportsInfo.canMangleUse = false; | ||
|  | 		} else { | ||
|  | 			const exportsInfo = moduleGraph.getExportsInfo(module); | ||
|  | 			if (this.nsObjectUsed) { | ||
|  | 				exportsInfo.setUsedInUnknownWay(runtime); | ||
|  | 			} else { | ||
|  | 				exportsInfo.setAllKnownExportsUsed(runtime); | ||
|  | 			} | ||
|  | 		} | ||
|  | 		moduleGraph.addExtraReason(module, "used as library export"); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * @param {Chunk} chunk the chunk | ||
|  | 	 * @param {Set<string>} set runtime requirements | ||
|  | 	 * @param {LibraryContext<T>} libraryContext context | ||
|  | 	 * @returns {void} | ||
|  | 	 */ | ||
|  | 	runtimeRequirements(chunk, set, libraryContext) {} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * @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, renderContext, { options }) { | ||
|  | 		if (!options.export) return source; | ||
|  | 		const postfix = `${RuntimeGlobals.exports} = ${ | ||
|  | 			RuntimeGlobals.exports | ||
|  | 		}${propertyAccess( | ||
|  | 			Array.isArray(options.export) ? options.export : [options.export] | ||
|  | 		)};\n`;
 | ||
|  | 		return new ConcatSource(source, postfix); | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = ExportPropertyLibraryPlugin; |