| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Tobias Koppers @sokra*/"use strict";const OptionsApply = require("./OptionsApply");const JavascriptModulesPlugin = require("./JavascriptModulesPlugin");const JsonModulesPlugin = require("./JsonModulesPlugin");const WebAssemblyModulesPlugin = require("./wasm/WebAssemblyModulesPlugin");const LoaderTargetPlugin = require("./LoaderTargetPlugin");const FunctionModulePlugin = require("./FunctionModulePlugin");const EvalDevToolModulePlugin = require("./EvalDevToolModulePlugin");const SourceMapDevToolPlugin = require("./SourceMapDevToolPlugin");const EvalSourceMapDevToolPlugin = require("./EvalSourceMapDevToolPlugin");const EntryOptionPlugin = require("./EntryOptionPlugin");const RecordIdsPlugin = require("./RecordIdsPlugin");const APIPlugin = require("./APIPlugin");const ConstPlugin = require("./ConstPlugin");const CommonJsStuffPlugin = require("./CommonJsStuffPlugin");const CompatibilityPlugin = require("./CompatibilityPlugin");const TemplatedPathPlugin = require("./TemplatedPathPlugin");const WarnCaseSensitiveModulesPlugin = require("./WarnCaseSensitiveModulesPlugin");const UseStrictPlugin = require("./UseStrictPlugin");const LoaderPlugin = require("./dependencies/LoaderPlugin");const CommonJsPlugin = require("./dependencies/CommonJsPlugin");const HarmonyModulesPlugin = require("./dependencies/HarmonyModulesPlugin");const SystemPlugin = require("./dependencies/SystemPlugin");const ImportPlugin = require("./dependencies/ImportPlugin");const RequireContextPlugin = require("./dependencies/RequireContextPlugin");const RequireEnsurePlugin = require("./dependencies/RequireEnsurePlugin");const RequireIncludePlugin = require("./dependencies/RequireIncludePlugin");const { cachedCleverMerge } = require("./util/cleverMerge");/** @typedef {import("../declarations/WebpackOptions").WebpackOptions} WebpackOptions *//** @typedef {import("./Compiler")} Compiler */class WebpackOptionsApply extends OptionsApply {	constructor() {		super();	}	/**	 * @param {WebpackOptions} options options object	 * @param {Compiler} compiler compiler object	 * @returns {WebpackOptions} options object	 */	process(options, compiler) {		let ExternalsPlugin;		compiler.outputPath = options.output.path;		compiler.recordsInputPath = options.recordsInputPath || options.recordsPath;		compiler.recordsOutputPath =			options.recordsOutputPath || options.recordsPath;		compiler.name = options.name;		// TODO webpack 5 refactor this to MultiCompiler.setDependencies() with a WeakMap		// @ts-ignore TODO		compiler.dependencies = options.dependencies;		if (typeof options.target === "string") {			let JsonpTemplatePlugin;			let FetchCompileWasmTemplatePlugin;			let ReadFileCompileWasmTemplatePlugin;			let NodeSourcePlugin;			let NodeTargetPlugin;			let NodeTemplatePlugin;			switch (options.target) {				case "web":					JsonpTemplatePlugin = require("./web/JsonpTemplatePlugin");					FetchCompileWasmTemplatePlugin = require("./web/FetchCompileWasmTemplatePlugin");					NodeSourcePlugin = require("./node/NodeSourcePlugin");					new JsonpTemplatePlugin().apply(compiler);					new FetchCompileWasmTemplatePlugin({						mangleImports: options.optimization.mangleWasmImports					}).apply(compiler);					new FunctionModulePlugin().apply(compiler);					new NodeSourcePlugin(options.node).apply(compiler);					new LoaderTargetPlugin(options.target).apply(compiler);					break;				case "webworker": {					let WebWorkerTemplatePlugin = require("./webworker/WebWorkerTemplatePlugin");					FetchCompileWasmTemplatePlugin = require("./web/FetchCompileWasmTemplatePlugin");					NodeSourcePlugin = require("./node/NodeSourcePlugin");					new WebWorkerTemplatePlugin().apply(compiler);					new FetchCompileWasmTemplatePlugin({						mangleImports: options.optimization.mangleWasmImports					}).apply(compiler);					new FunctionModulePlugin().apply(compiler);					new NodeSourcePlugin(options.node).apply(compiler);					new LoaderTargetPlugin(options.target).apply(compiler);					break;				}				case "node":				case "async-node":					NodeTemplatePlugin = require("./node/NodeTemplatePlugin");					ReadFileCompileWasmTemplatePlugin = require("./node/ReadFileCompileWasmTemplatePlugin");					NodeTargetPlugin = require("./node/NodeTargetPlugin");					new NodeTemplatePlugin({						asyncChunkLoading: options.target === "async-node"					}).apply(compiler);					new ReadFileCompileWasmTemplatePlugin({						mangleImports: options.optimization.mangleWasmImports					}).apply(compiler);					new FunctionModulePlugin().apply(compiler);					new NodeTargetPlugin().apply(compiler);					new LoaderTargetPlugin("node").apply(compiler);					break;				case "node-webkit":					JsonpTemplatePlugin = require("./web/JsonpTemplatePlugin");					NodeTargetPlugin = require("./node/NodeTargetPlugin");					ExternalsPlugin = require("./ExternalsPlugin");					new JsonpTemplatePlugin().apply(compiler);					new FunctionModulePlugin().apply(compiler);					new NodeTargetPlugin().apply(compiler);					new ExternalsPlugin("commonjs", "nw.gui").apply(compiler);					new LoaderTargetPlugin(options.target).apply(compiler);					break;				case "electron-main":					NodeTemplatePlugin = require("./node/NodeTemplatePlugin");					NodeTargetPlugin = require("./node/NodeTargetPlugin");					ExternalsPlugin = require("./ExternalsPlugin");					new NodeTemplatePlugin({						asyncChunkLoading: true					}).apply(compiler);					new FunctionModulePlugin().apply(compiler);					new NodeTargetPlugin().apply(compiler);					new ExternalsPlugin("commonjs", [						"app",						"auto-updater",						"browser-window",						"clipboard",						"content-tracing",						"crash-reporter",						"dialog",						"electron",						"global-shortcut",						"ipc",						"ipc-main",						"menu",						"menu-item",						"native-image",						"original-fs",						"power-monitor",						"power-save-blocker",						"protocol",						"screen",						"session",						"shell",						"tray",						"web-contents"					]).apply(compiler);					new LoaderTargetPlugin(options.target).apply(compiler);					break;				case "electron-renderer":				case "electron-preload":					FetchCompileWasmTemplatePlugin = require("./web/FetchCompileWasmTemplatePlugin");					NodeTargetPlugin = require("./node/NodeTargetPlugin");					ExternalsPlugin = require("./ExternalsPlugin");					if (options.target === "electron-renderer") {						JsonpTemplatePlugin = require("./web/JsonpTemplatePlugin");						new JsonpTemplatePlugin().apply(compiler);					} else if (options.target === "electron-preload") {						NodeTemplatePlugin = require("./node/NodeTemplatePlugin");						new NodeTemplatePlugin({							asyncChunkLoading: true						}).apply(compiler);					}					new FetchCompileWasmTemplatePlugin({						mangleImports: options.optimization.mangleWasmImports					}).apply(compiler);					new FunctionModulePlugin().apply(compiler);					new NodeTargetPlugin().apply(compiler);					new ExternalsPlugin("commonjs", [						"clipboard",						"crash-reporter",						"desktop-capturer",						"electron",						"ipc",						"ipc-renderer",						"native-image",						"original-fs",						"remote",						"screen",						"shell",						"web-frame"					]).apply(compiler);					new LoaderTargetPlugin(options.target).apply(compiler);					break;				default:					throw new Error("Unsupported target '" + options.target + "'.");			}		}		// @ts-ignore This is always true, which is good this way		else if (options.target !== false) {			options.target(compiler);		} else {			throw new Error("Unsupported target '" + options.target + "'.");		}		if (options.output.library || options.output.libraryTarget !== "var") {			const LibraryTemplatePlugin = require("./LibraryTemplatePlugin");			new LibraryTemplatePlugin(				options.output.library,				options.output.libraryTarget,				options.output.umdNamedDefine,				options.output.auxiliaryComment || "",				options.output.libraryExport			).apply(compiler);		}		if (options.externals) {			ExternalsPlugin = require("./ExternalsPlugin");			new ExternalsPlugin(				options.output.libraryTarget,				options.externals			).apply(compiler);		}		let noSources;		let legacy;		let modern;		let comment;		if (			options.devtool &&			(options.devtool.includes("sourcemap") ||				options.devtool.includes("source-map"))		) {			const hidden = options.devtool.includes("hidden");			const inline = options.devtool.includes("inline");			const evalWrapped = options.devtool.includes("eval");			const cheap = options.devtool.includes("cheap");			const moduleMaps = options.devtool.includes("module");			noSources = options.devtool.includes("nosources");			legacy = options.devtool.includes("@");			modern = options.devtool.includes("#");			comment =				legacy && modern					? "\n/*\n//@ source" +					  "MappingURL=[url]\n//# source" +					  "MappingURL=[url]\n*/"					: legacy					? "\n/*\n//@ source" + "MappingURL=[url]\n*/"					: modern					? "\n//# source" + "MappingURL=[url]"					: null;			const Plugin = evalWrapped				? EvalSourceMapDevToolPlugin				: SourceMapDevToolPlugin;			new Plugin({				filename: inline ? null : options.output.sourceMapFilename,				moduleFilenameTemplate: options.output.devtoolModuleFilenameTemplate,				fallbackModuleFilenameTemplate:					options.output.devtoolFallbackModuleFilenameTemplate,				append: hidden ? false : comment,				module: moduleMaps ? true : cheap ? false : true,				columns: cheap ? false : true,				lineToLine: options.output.devtoolLineToLine,				noSources: noSources,				namespace: options.output.devtoolNamespace			}).apply(compiler);		} else if (options.devtool && options.devtool.includes("eval")) {			legacy = options.devtool.includes("@");			modern = options.devtool.includes("#");			comment =				legacy && modern					? "\n//@ sourceURL=[url]\n//# sourceURL=[url]"					: legacy					? "\n//@ sourceURL=[url]"					: modern					? "\n//# sourceURL=[url]"					: null;			new EvalDevToolModulePlugin({				sourceUrlComment: comment,				moduleFilenameTemplate: options.output.devtoolModuleFilenameTemplate,				namespace: options.output.devtoolNamespace			}).apply(compiler);		}		new JavascriptModulesPlugin().apply(compiler);		new JsonModulesPlugin().apply(compiler);		new WebAssemblyModulesPlugin({			mangleImports: options.optimization.mangleWasmImports		}).apply(compiler);		new EntryOptionPlugin().apply(compiler);		compiler.hooks.entryOption.call(options.context, options.entry);		new CompatibilityPlugin().apply(compiler);		new HarmonyModulesPlugin(options.module).apply(compiler);		if (options.amd !== false) {			const AMDPlugin = require("./dependencies/AMDPlugin");			const RequireJsStuffPlugin = require("./RequireJsStuffPlugin");			new AMDPlugin(options.module, options.amd || {}).apply(compiler);			new RequireJsStuffPlugin().apply(compiler);		}		new CommonJsPlugin(options.module).apply(compiler);		new LoaderPlugin().apply(compiler);		if (options.node !== false) {			const NodeStuffPlugin = require("./NodeStuffPlugin");			new NodeStuffPlugin(options.node).apply(compiler);		}		new CommonJsStuffPlugin().apply(compiler);		new APIPlugin().apply(compiler);		new ConstPlugin().apply(compiler);		new UseStrictPlugin().apply(compiler);		new RequireIncludePlugin().apply(compiler);		new RequireEnsurePlugin().apply(compiler);		new RequireContextPlugin(			options.resolve.modules,			options.resolve.extensions,			options.resolve.mainFiles		).apply(compiler);		new ImportPlugin(options.module).apply(compiler);		new SystemPlugin(options.module).apply(compiler);		if (typeof options.mode !== "string") {			const WarnNoModeSetPlugin = require("./WarnNoModeSetPlugin");			new WarnNoModeSetPlugin().apply(compiler);		}		const EnsureChunkConditionsPlugin = require("./optimize/EnsureChunkConditionsPlugin");		new EnsureChunkConditionsPlugin().apply(compiler);		if (options.optimization.removeAvailableModules) {			const RemoveParentModulesPlugin = require("./optimize/RemoveParentModulesPlugin");			new RemoveParentModulesPlugin().apply(compiler);		}		if (options.optimization.removeEmptyChunks) {			const RemoveEmptyChunksPlugin = require("./optimize/RemoveEmptyChunksPlugin");			new RemoveEmptyChunksPlugin().apply(compiler);		}		if (options.optimization.mergeDuplicateChunks) {			const MergeDuplicateChunksPlugin = require("./optimize/MergeDuplicateChunksPlugin");			new MergeDuplicateChunksPlugin().apply(compiler);		}		if (options.optimization.flagIncludedChunks) {			const FlagIncludedChunksPlugin = require("./optimize/FlagIncludedChunksPlugin");			new FlagIncludedChunksPlugin().apply(compiler);		}		if (options.optimization.sideEffects) {			const SideEffectsFlagPlugin = require("./optimize/SideEffectsFlagPlugin");			new SideEffectsFlagPlugin().apply(compiler);		}		if (options.optimization.providedExports) {			const FlagDependencyExportsPlugin = require("./FlagDependencyExportsPlugin");			new FlagDependencyExportsPlugin().apply(compiler);		}		if (options.optimization.usedExports) {			const FlagDependencyUsagePlugin = require("./FlagDependencyUsagePlugin");			new FlagDependencyUsagePlugin().apply(compiler);		}		if (options.optimization.concatenateModules) {			const ModuleConcatenationPlugin = require("./optimize/ModuleConcatenationPlugin");			new ModuleConcatenationPlugin().apply(compiler);		}		if (options.optimization.splitChunks) {			const SplitChunksPlugin = require("./optimize/SplitChunksPlugin");			new SplitChunksPlugin(options.optimization.splitChunks).apply(compiler);		}		if (options.optimization.runtimeChunk) {			const RuntimeChunkPlugin = require("./optimize/RuntimeChunkPlugin");			new RuntimeChunkPlugin(options.optimization.runtimeChunk).apply(compiler);		}		if (options.optimization.noEmitOnErrors) {			const NoEmitOnErrorsPlugin = require("./NoEmitOnErrorsPlugin");			new NoEmitOnErrorsPlugin().apply(compiler);		}		if (options.optimization.checkWasmTypes) {			const WasmFinalizeExportsPlugin = require("./wasm/WasmFinalizeExportsPlugin");			new WasmFinalizeExportsPlugin().apply(compiler);		}		let moduleIds = options.optimization.moduleIds;		if (moduleIds === undefined) {			// TODO webpack 5 remove all these options			if (options.optimization.occurrenceOrder) {				moduleIds = "size";			}			if (options.optimization.namedModules) {				moduleIds = "named";			}			if (options.optimization.hashedModuleIds) {				moduleIds = "hashed";			}			if (moduleIds === undefined) {				moduleIds = "natural";			}		}		if (moduleIds) {			const NamedModulesPlugin = require("./NamedModulesPlugin");			const HashedModuleIdsPlugin = require("./HashedModuleIdsPlugin");			const OccurrenceModuleOrderPlugin = require("./optimize/OccurrenceModuleOrderPlugin");			switch (moduleIds) {				case "natural":					// TODO webpack 5: see hint in Compilation.sortModules					break;				case "named":					new NamedModulesPlugin().apply(compiler);					break;				case "hashed":					new HashedModuleIdsPlugin().apply(compiler);					break;				case "size":					new OccurrenceModuleOrderPlugin({						prioritiseInitial: true					}).apply(compiler);					break;				case "total-size":					new OccurrenceModuleOrderPlugin({						prioritiseInitial: false					}).apply(compiler);					break;				default:					throw new Error(						`webpack bug: moduleIds: ${moduleIds} is not implemented`					);			}		}		let chunkIds = options.optimization.chunkIds;		if (chunkIds === undefined) {			// TODO webpack 5 remove all these options			if (options.optimization.occurrenceOrder) {				// This looks weird but it's for backward-compat				// This bug already existed before adding this feature				chunkIds = "total-size";			}			if (options.optimization.namedChunks) {				chunkIds = "named";			}			if (chunkIds === undefined) {				chunkIds = "natural";			}		}		if (chunkIds) {			const NaturalChunkOrderPlugin = require("./optimize/NaturalChunkOrderPlugin");			const NamedChunksPlugin = require("./NamedChunksPlugin");			const OccurrenceChunkOrderPlugin = require("./optimize/OccurrenceChunkOrderPlugin");			switch (chunkIds) {				case "natural":					new NaturalChunkOrderPlugin().apply(compiler);					break;				case "named":					// TODO webapck 5: for backward-compat this need to have OccurrenceChunkOrderPlugin too					// The NamedChunksPlugin doesn't give every chunk a name					// This should be fixed, and the OccurrenceChunkOrderPlugin should be removed here.					new OccurrenceChunkOrderPlugin({						prioritiseInitial: false					}).apply(compiler);					new NamedChunksPlugin().apply(compiler);					break;				case "size":					new OccurrenceChunkOrderPlugin({						prioritiseInitial: true					}).apply(compiler);					break;				case "total-size":					new OccurrenceChunkOrderPlugin({						prioritiseInitial: false					}).apply(compiler);					break;				default:					throw new Error(						`webpack bug: chunkIds: ${chunkIds} is not implemented`					);			}		}		if (options.optimization.nodeEnv) {			const DefinePlugin = require("./DefinePlugin");			new DefinePlugin({				"process.env.NODE_ENV": JSON.stringify(options.optimization.nodeEnv)			}).apply(compiler);		}		if (options.optimization.minimize) {			for (const minimizer of options.optimization.minimizer) {				if (typeof minimizer === "function") {					minimizer.call(compiler, compiler);				} else {					minimizer.apply(compiler);				}			}		}		if (options.performance) {			const SizeLimitsPlugin = require("./performance/SizeLimitsPlugin");			new SizeLimitsPlugin(options.performance).apply(compiler);		}		new TemplatedPathPlugin().apply(compiler);		new RecordIdsPlugin({			portableIds: options.optimization.portableRecords		}).apply(compiler);		new WarnCaseSensitiveModulesPlugin().apply(compiler);		if (options.cache) {			const CachePlugin = require("./CachePlugin");			new CachePlugin(				typeof options.cache === "object" ? options.cache : null			).apply(compiler);		}		compiler.hooks.afterPlugins.call(compiler);		if (!compiler.inputFileSystem) {			throw new Error("No input filesystem provided");		}		compiler.resolverFactory.hooks.resolveOptions			.for("normal")			.tap("WebpackOptionsApply", resolveOptions => {				return Object.assign(					{						fileSystem: compiler.inputFileSystem					},					cachedCleverMerge(options.resolve, resolveOptions)				);			});		compiler.resolverFactory.hooks.resolveOptions			.for("context")			.tap("WebpackOptionsApply", resolveOptions => {				return Object.assign(					{						fileSystem: compiler.inputFileSystem,						resolveToContext: true					},					cachedCleverMerge(options.resolve, resolveOptions)				);			});		compiler.resolverFactory.hooks.resolveOptions			.for("loader")			.tap("WebpackOptionsApply", resolveOptions => {				return Object.assign(					{						fileSystem: compiler.inputFileSystem					},					cachedCleverMerge(options.resolveLoader, resolveOptions)				);			});		compiler.hooks.afterResolvers.call(compiler);		return options;	}}module.exports = WebpackOptionsApply;
 |