mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			353 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			353 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| /*
 | |
| 	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("./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 RequireJsStuffPlugin = require("./RequireJsStuffPlugin");
 | |
| const NodeStuffPlugin = require("./NodeStuffPlugin");
 | |
| 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 AMDPlugin = require("./dependencies/AMDPlugin");
 | |
| const RequireContextPlugin = require("./dependencies/RequireContextPlugin");
 | |
| const RequireEnsurePlugin = require("./dependencies/RequireEnsurePlugin");
 | |
| const RequireIncludePlugin = require("./dependencies/RequireIncludePlugin");
 | |
| 
 | |
| const WarnNoModeSetPlugin = require("./WarnNoModeSetPlugin");
 | |
| 
 | |
| const EnsureChunkConditionsPlugin = require("./optimize/EnsureChunkConditionsPlugin");
 | |
| const RemoveParentModulesPlugin = require("./optimize/RemoveParentModulesPlugin");
 | |
| const RemoveEmptyChunksPlugin = require("./optimize/RemoveEmptyChunksPlugin");
 | |
| const MergeDuplicateChunksPlugin = require("./optimize/MergeDuplicateChunksPlugin");
 | |
| const FlagIncludedChunksPlugin = require("./optimize/FlagIncludedChunksPlugin");
 | |
| const OccurrenceOrderPlugin = require("./optimize/OccurrenceOrderPlugin");
 | |
| const SideEffectsFlagPlugin = require("./optimize/SideEffectsFlagPlugin");
 | |
| const FlagDependencyUsagePlugin = require("./FlagDependencyUsagePlugin");
 | |
| const FlagDependencyExportsPlugin = require("./FlagDependencyExportsPlugin");
 | |
| const ModuleConcatenationPlugin = require("./optimize/ModuleConcatenationPlugin");
 | |
| const SplitChunksPlugin = require("./optimize/SplitChunksPlugin");
 | |
| const RuntimeChunkPlugin = require("./optimize/RuntimeChunkPlugin");
 | |
| const NoEmitOnErrorsPlugin = require("./NoEmitOnErrorsPlugin");
 | |
| const NamedModulesPlugin = require("./NamedModulesPlugin");
 | |
| const NamedChunksPlugin = require("./NamedChunksPlugin");
 | |
| const DefinePlugin = require("./DefinePlugin");
 | |
| const SizeLimitsPlugin = require("./performance/SizeLimitsPlugin");
 | |
| 
 | |
| class WebpackOptionsApply extends OptionsApply {
 | |
| 	constructor() {
 | |
| 		super();
 | |
| 	}
 | |
| 
 | |
| 	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;
 | |
| 		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(options.output).apply(compiler);
 | |
| 					new FetchCompileWasmTemplatePlugin(options.output).apply(compiler);
 | |
| 					new FunctionModulePlugin(options.output).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(options.output).apply(compiler);
 | |
| 						new FunctionModulePlugin(options.output).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(options.output).apply(compiler);
 | |
| 					new FunctionModulePlugin(options.output).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(options.output).apply(compiler);
 | |
| 					new FunctionModulePlugin(options.output).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(options.output).apply(compiler);
 | |
| 					new NodeTargetPlugin().apply(compiler);
 | |
| 					new ExternalsPlugin("commonjs", [
 | |
| 						"app",
 | |
| 						"auto-updater",
 | |
| 						"browser-window",
 | |
| 						"content-tracing",
 | |
| 						"dialog",
 | |
| 						"electron",
 | |
| 						"global-shortcut",
 | |
| 						"ipc",
 | |
| 						"ipc-main",
 | |
| 						"menu",
 | |
| 						"menu-item",
 | |
| 						"power-monitor",
 | |
| 						"power-save-blocker",
 | |
| 						"protocol",
 | |
| 						"session",
 | |
| 						"web-contents",
 | |
| 						"tray",
 | |
| 						"clipboard",
 | |
| 						"crash-reporter",
 | |
| 						"native-image",
 | |
| 						"screen",
 | |
| 						"shell"
 | |
| 					]).apply(compiler);
 | |
| 					new LoaderTargetPlugin(options.target).apply(compiler);
 | |
| 					break;
 | |
| 				case "electron-renderer":
 | |
| 					JsonpTemplatePlugin = require("./web/JsonpTemplatePlugin");
 | |
| 					NodeTargetPlugin = require("./node/NodeTargetPlugin");
 | |
| 					ExternalsPlugin = require("./ExternalsPlugin");
 | |
| 					new JsonpTemplatePlugin(options.output).apply(compiler);
 | |
| 					new FunctionModulePlugin(options.output).apply(compiler);
 | |
| 					new NodeTargetPlugin().apply(compiler);
 | |
| 					new ExternalsPlugin("commonjs", [
 | |
| 						"desktop-capturer",
 | |
| 						"electron",
 | |
| 						"ipc",
 | |
| 						"ipc-renderer",
 | |
| 						"remote",
 | |
| 						"web-frame",
 | |
| 						"clipboard",
 | |
| 						"crash-reporter",
 | |
| 						"native-image",
 | |
| 						"screen",
 | |
| 						"shell"
 | |
| 					]).apply(compiler);
 | |
| 					new LoaderTargetPlugin(options.target).apply(compiler);
 | |
| 					break;
 | |
| 				default:
 | |
| 					throw new Error("Unsupported target '" + options.target + "'.");
 | |
| 			}
 | |
| 		} else if(options.target !== false) {
 | |
| 			options.target(compiler);
 | |
| 		} else {
 | |
| 			throw new Error("Unsupported target '" + options.target + "'.");
 | |
| 		}
 | |
| 
 | |
| 		if(options.output.library || options.output.libraryTarget !== "var") {
 | |
| 			let 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;
 | |
| 			let 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().apply(compiler);
 | |
| 
 | |
| 		new EntryOptionPlugin().apply(compiler);
 | |
| 		compiler.hooks.entryOption.call(options.context, options.entry);
 | |
| 
 | |
| 		new CompatibilityPlugin().apply(compiler);
 | |
| 		new HarmonyModulesPlugin(options.module).apply(compiler);
 | |
| 		new AMDPlugin(options.module, options.amd || {}).apply(compiler);
 | |
| 		new CommonJsPlugin(options.module).apply(compiler);
 | |
| 		new LoaderPlugin().apply(compiler);
 | |
| 		new NodeStuffPlugin(options.node).apply(compiler);
 | |
| 		new RequireJsStuffPlugin().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")
 | |
| 			new WarnNoModeSetPlugin().apply(compiler);
 | |
| 
 | |
| 		new EnsureChunkConditionsPlugin().apply(compiler);
 | |
| 		if(options.optimization.removeAvailableModules)
 | |
| 			new RemoveParentModulesPlugin().apply(compiler);
 | |
| 		if(options.optimization.removeEmptyChunks)
 | |
| 			new RemoveEmptyChunksPlugin().apply(compiler);
 | |
| 		if(options.optimization.mergedDuplicateChunks)
 | |
| 			new MergeDuplicateChunksPlugin().apply(compiler);
 | |
| 		if(options.optimization.flagIncludedChunks)
 | |
| 			new FlagIncludedChunksPlugin().apply(compiler);
 | |
| 		if(options.optimization.occurrenceOrder)
 | |
| 			new OccurrenceOrderPlugin(true).apply(compiler);
 | |
| 		if(options.optimization.sideEffects)
 | |
| 			new SideEffectsFlagPlugin().apply(compiler);
 | |
| 		if(options.optimization.providedExports)
 | |
| 			new FlagDependencyExportsPlugin().apply(compiler);
 | |
| 		if(options.optimization.usedExports)
 | |
| 			new FlagDependencyUsagePlugin().apply(compiler);
 | |
| 		if(options.optimization.concatenateModules)
 | |
| 			new ModuleConcatenationPlugin().apply(compiler);
 | |
| 		if(options.optimization.splitChunks)
 | |
| 			new SplitChunksPlugin(options.optimization.splitChunks).apply(compiler);
 | |
| 		if(options.optimization.runtimeChunk)
 | |
| 			new RuntimeChunkPlugin().apply(compiler);
 | |
| 		if(options.optimization.noEmitOnErrors)
 | |
| 			new NoEmitOnErrorsPlugin().apply(compiler);
 | |
| 		if(options.optimization.namedModules)
 | |
| 			new NamedModulesPlugin().apply(compiler);
 | |
| 		if(options.optimization.namedChunks)
 | |
| 			new NamedChunksPlugin().apply(compiler);
 | |
| 		if(options.optimization.nodeEnv) {
 | |
| 			new DefinePlugin({
 | |
| 				"process.env.NODE_ENV": JSON.stringify(options.optimization.nodeEnv)
 | |
| 			}).apply(compiler);
 | |
| 		}
 | |
| 		if(options.optimization.minimize) {
 | |
| 			for(const minimizer of options.optimization.minimizer) {
 | |
| 				minimizer.apply(compiler);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if(options.performance) {
 | |
| 			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) {
 | |
| 			let 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
 | |
| 			}, options.resolve, resolveOptions);
 | |
| 		});
 | |
| 		compiler.resolverFactory.hooks.resolveOptions.for("context").tap("WebpackOptionsApply", resolveOptions => {
 | |
| 			return Object.assign({
 | |
| 				fileSystem: compiler.inputFileSystem,
 | |
| 				resolveToContext: true
 | |
| 			}, options.resolve, resolveOptions);
 | |
| 		});
 | |
| 		compiler.resolverFactory.hooks.resolveOptions.for("loader").tap("WebpackOptionsApply", resolveOptions => {
 | |
| 			return Object.assign({
 | |
| 				fileSystem: compiler.inputFileSystem
 | |
| 			}, options.resolveLoader, resolveOptions);
 | |
| 		});
 | |
| 		compiler.hooks.afterResolvers.call(compiler);
 | |
| 		return options;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| module.exports = WebpackOptionsApply;
 |