| 
									
										
										
										
											2012-03-12 04:50:55 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2017-01-02 03:19:00 +08:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const Compiler = require("./Compiler"); | 
					
						
							|  |  |  | const MultiCompiler = require("./MultiCompiler"); | 
					
						
							|  |  |  | const NodeEnvironmentPlugin = require("./node/NodeEnvironmentPlugin"); | 
					
						
							|  |  |  | const WebpackOptionsApply = require("./WebpackOptionsApply"); | 
					
						
							|  |  |  | const WebpackOptionsDefaulter = require("./WebpackOptionsDefaulter"); | 
					
						
							|  |  |  | const validateSchema = require("./validateSchema"); | 
					
						
							|  |  |  | const WebpackOptionsValidationError = require("./WebpackOptionsValidationError"); | 
					
						
							| 
									
										
										
										
											2017-11-11 20:05:55 +08:00
										 |  |  | const webpackOptionsSchema = require("../schemas/WebpackOptions.json"); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | const webpack = (options, callback) => { | 
					
						
							| 
									
										
										
										
											2017-01-02 03:19:00 +08:00
										 |  |  | 	const webpackOptionsValidationErrors = validateSchema(webpackOptionsSchema, options); | 
					
						
							| 
									
										
										
										
											2016-09-19 06:54:35 +08:00
										 |  |  | 	if(webpackOptionsValidationErrors.length) { | 
					
						
							|  |  |  | 		throw new WebpackOptionsValidationError(webpackOptionsValidationErrors); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-01-02 03:19:00 +08:00
										 |  |  | 	let compiler; | 
					
						
							| 
									
										
										
										
											2014-06-12 04:26:50 +08:00
										 |  |  | 	if(Array.isArray(options)) { | 
					
						
							| 
									
										
										
										
											2017-01-02 03:19:00 +08:00
										 |  |  | 		compiler = new MultiCompiler(options.map(options => webpack(options))); | 
					
						
							| 
									
										
										
										
											2015-01-21 19:38:57 +08:00
										 |  |  | 	} else if(typeof options === "object") { | 
					
						
							| 
									
										
										
										
											2017-09-14 15:22:29 +08:00
										 |  |  | 		options = new WebpackOptionsDefaulter().process(options); | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-01 17:44:22 +08:00
										 |  |  | 		compiler = new Compiler(options.context); | 
					
						
							| 
									
										
										
										
											2016-12-14 19:03:24 +08:00
										 |  |  | 		compiler.options = options; | 
					
						
							| 
									
										
										
										
											2014-06-12 04:26:50 +08:00
										 |  |  | 		new NodeEnvironmentPlugin().apply(compiler); | 
					
						
							| 
									
										
										
										
											2016-12-14 19:03:24 +08:00
										 |  |  | 		if(options.plugins && Array.isArray(options.plugins)) { | 
					
						
							| 
									
										
										
										
											2017-12-20 16:53:33 +08:00
										 |  |  | 			options.plugins.forEach(plugin => plugin.apply(compiler)); | 
					
						
							| 
									
										
										
										
											2016-12-14 19:03:24 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-11-27 22:27:37 +08:00
										 |  |  | 		compiler.hooks.environment.call(); | 
					
						
							|  |  |  | 		compiler.hooks.afterEnvironment.call(); | 
					
						
							| 
									
										
										
										
											2016-12-05 06:47:19 +08:00
										 |  |  | 		compiler.options = new WebpackOptionsApply().process(options, compiler); | 
					
						
							| 
									
										
										
										
											2015-01-21 19:38:57 +08:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		throw new Error("Invalid argument: options"); | 
					
						
							| 
									
										
										
										
											2014-06-12 04:26:50 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 	if(callback) { | 
					
						
							| 
									
										
										
										
											2015-01-21 19:38:57 +08:00
										 |  |  | 		if(typeof callback !== "function") throw new Error("Invalid argument: callback"); | 
					
						
							| 
									
										
										
										
											2017-01-02 03:19:00 +08:00
										 |  |  | 		if(options.watch === true || (Array.isArray(options) && options.some(o => o.watch))) { | 
					
						
							| 
									
										
										
										
											2017-02-02 07:14:18 +08:00
										 |  |  | 			const watchOptions = Array.isArray(options) ? options.map(o => o.watchOptions || {}) : (options.watchOptions || {}); | 
					
						
							| 
									
										
										
										
											2015-05-10 19:50:15 +08:00
										 |  |  | 			return compiler.watch(watchOptions, callback); | 
					
						
							| 
									
										
										
										
											2012-03-10 20:11:23 +08:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-05-10 19:50:15 +08:00
										 |  |  | 		compiler.run(callback); | 
					
						
							| 
									
										
										
										
											2012-10-20 21:08:12 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | 	return compiler; | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-18 06:21:49 +08:00
										 |  |  | exports = module.exports = webpack; | 
					
						
							| 
									
										
										
										
											2012-05-07 15:01:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | webpack.WebpackOptionsDefaulter = WebpackOptionsDefaulter; | 
					
						
							|  |  |  | webpack.WebpackOptionsApply = WebpackOptionsApply; | 
					
						
							|  |  |  | webpack.Compiler = Compiler; | 
					
						
							| 
									
										
										
										
											2014-06-12 04:26:50 +08:00
										 |  |  | webpack.MultiCompiler = MultiCompiler; | 
					
						
							| 
									
										
										
										
											2013-01-31 01:49:25 +08:00
										 |  |  | webpack.NodeEnvironmentPlugin = NodeEnvironmentPlugin; | 
					
						
							| 
									
										
										
										
											2016-11-03 22:02:14 +08:00
										 |  |  | webpack.validate = validateSchema.bind(this, webpackOptionsSchema); | 
					
						
							|  |  |  | webpack.validateSchema = validateSchema; | 
					
						
							| 
									
										
										
										
											2016-11-03 00:27:02 +08:00
										 |  |  | webpack.WebpackOptionsValidationError = WebpackOptionsValidationError; | 
					
						
							| 
									
										
										
										
											2013-12-18 06:21:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | const exportPlugins = (obj, mappings) => { | 
					
						
							| 
									
										
										
										
											2017-06-23 20:55:22 +08:00
										 |  |  | 	Object.keys(mappings).forEach(name => { | 
					
						
							| 
									
										
										
										
											2017-07-21 15:25:07 +08:00
										 |  |  | 		Object.defineProperty(obj, name, { | 
					
						
							| 
									
										
										
										
											2013-12-18 06:21:49 +08:00
										 |  |  | 			configurable: false, | 
					
						
							|  |  |  | 			enumerable: true, | 
					
						
							| 
									
										
										
										
											2017-06-23 20:55:22 +08:00
										 |  |  | 			get: mappings[name] | 
					
						
							| 
									
										
										
										
											2013-12-18 06:21:49 +08:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2017-07-21 15:25:07 +08:00
										 |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2017-11-08 18:32:05 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2013-12-18 06:21:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-23 20:55:22 +08:00
										 |  |  | exportPlugins(exports, { | 
					
						
							| 
									
										
										
										
											2017-12-29 18:07:51 +08:00
										 |  |  | 	"Stats": () => require("./Stats"), | 
					
						
							| 
									
										
										
										
											2017-06-23 20:55:22 +08:00
										 |  |  | 	"DefinePlugin": () => require("./DefinePlugin"), | 
					
						
							|  |  |  | 	"NormalModuleReplacementPlugin": () => require("./NormalModuleReplacementPlugin"), | 
					
						
							|  |  |  | 	"ContextReplacementPlugin": () => require("./ContextReplacementPlugin"), | 
					
						
							| 
									
										
										
										
											2017-09-25 19:28:29 +08:00
										 |  |  | 	"ContextExclusionPlugin": () => require("./ContextExclusionPlugin"), | 
					
						
							| 
									
										
										
										
											2017-06-23 20:55:22 +08:00
										 |  |  | 	"IgnorePlugin": () => require("./IgnorePlugin"), | 
					
						
							|  |  |  | 	"WatchIgnorePlugin": () => require("./WatchIgnorePlugin"), | 
					
						
							|  |  |  | 	"BannerPlugin": () => require("./BannerPlugin"), | 
					
						
							|  |  |  | 	"PrefetchPlugin": () => require("./PrefetchPlugin"), | 
					
						
							|  |  |  | 	"AutomaticPrefetchPlugin": () => require("./AutomaticPrefetchPlugin"), | 
					
						
							|  |  |  | 	"ProvidePlugin": () => require("./ProvidePlugin"), | 
					
						
							|  |  |  | 	"HotModuleReplacementPlugin": () => require("./HotModuleReplacementPlugin"), | 
					
						
							|  |  |  | 	"SourceMapDevToolPlugin": () => require("./SourceMapDevToolPlugin"), | 
					
						
							|  |  |  | 	"EvalSourceMapDevToolPlugin": () => require("./EvalSourceMapDevToolPlugin"), | 
					
						
							|  |  |  | 	"EvalDevToolModulePlugin": () => require("./EvalDevToolModulePlugin"), | 
					
						
							|  |  |  | 	"CachePlugin": () => require("./CachePlugin"), | 
					
						
							|  |  |  | 	"ExtendedAPIPlugin": () => require("./ExtendedAPIPlugin"), | 
					
						
							|  |  |  | 	"ExternalsPlugin": () => require("./ExternalsPlugin"), | 
					
						
							|  |  |  | 	"LibraryTemplatePlugin": () => require("./LibraryTemplatePlugin"), | 
					
						
							|  |  |  | 	"LoaderTargetPlugin": () => require("./LoaderTargetPlugin"), | 
					
						
							|  |  |  | 	"MemoryOutputFileSystem": () => require("./MemoryOutputFileSystem"), | 
					
						
							|  |  |  | 	"ProgressPlugin": () => require("./ProgressPlugin"), | 
					
						
							|  |  |  | 	"SetVarMainTemplatePlugin": () => require("./SetVarMainTemplatePlugin"), | 
					
						
							|  |  |  | 	"UmdMainTemplatePlugin": () => require("./UmdMainTemplatePlugin"), | 
					
						
							|  |  |  | 	"NoEmitOnErrorsPlugin": () => require("./NoEmitOnErrorsPlugin"), | 
					
						
							|  |  |  | 	"EnvironmentPlugin": () => require("./EnvironmentPlugin"), | 
					
						
							|  |  |  | 	"DllPlugin": () => require("./DllPlugin"), | 
					
						
							|  |  |  | 	"DllReferencePlugin": () => require("./DllReferencePlugin"), | 
					
						
							|  |  |  | 	"LoaderOptionsPlugin": () => require("./LoaderOptionsPlugin"), | 
					
						
							|  |  |  | 	"NamedModulesPlugin": () => require("./NamedModulesPlugin"), | 
					
						
							|  |  |  | 	"NamedChunksPlugin": () => require("./NamedChunksPlugin"), | 
					
						
							|  |  |  | 	"HashedModuleIdsPlugin": () => require("./HashedModuleIdsPlugin"), | 
					
						
							|  |  |  | 	"ModuleFilenameHelpers": () => require("./ModuleFilenameHelpers") | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | exportPlugins(exports.optimize = {}, { | 
					
						
							|  |  |  | 	"AggressiveMergingPlugin": () => require("./optimize/AggressiveMergingPlugin"), | 
					
						
							|  |  |  | 	"AggressiveSplittingPlugin": () => require("./optimize/AggressiveSplittingPlugin"), | 
					
						
							|  |  |  | 	"CommonsChunkPlugin": () => require("./optimize/CommonsChunkPlugin"), | 
					
						
							|  |  |  | 	"ChunkModuleIdRangePlugin": () => require("./optimize/ChunkModuleIdRangePlugin"), | 
					
						
							|  |  |  | 	"DedupePlugin": () => require("./optimize/DedupePlugin"), | 
					
						
							|  |  |  | 	"LimitChunkCountPlugin": () => require("./optimize/LimitChunkCountPlugin"), | 
					
						
							|  |  |  | 	"MinChunkSizePlugin": () => require("./optimize/MinChunkSizePlugin"), | 
					
						
							|  |  |  | 	"ModuleConcatenationPlugin": () => require("./optimize/ModuleConcatenationPlugin"), | 
					
						
							| 
									
										
										
										
											2017-09-14 19:35:25 +08:00
										 |  |  | 	"SideEffectsFlagPlugin": () => require("./optimize/SideEffectsFlagPlugin"), | 
					
						
							| 
									
										
										
										
											2017-12-13 23:05:21 +08:00
										 |  |  | 	"OccurrenceOrderPlugin": () => require("./optimize/OccurrenceOrderPlugin") | 
					
						
							| 
									
										
										
										
											2017-06-23 20:55:22 +08:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2017-11-12 01:48:29 +08:00
										 |  |  | exportPlugins(exports.web = {}, { | 
					
						
							|  |  |  | 	"JsonpTemplatePlugin": () => require("./web/JsonpTemplatePlugin"), | 
					
						
							|  |  |  | 	"FetchCompileWasmTemplatePlugin": () => require("./web/FetchCompileWasmTemplatePlugin"), | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | exportPlugins(exports.node = {}, { | 
					
						
							|  |  |  | 	"NodeTemplatePlugin": () => require("./node/NodeTemplatePlugin"), | 
					
						
							|  |  |  | 	"ReadFileCompileWasmTemplatePlugin": () => require("./node/ReadFileCompileWasmTemplatePlugin"), | 
					
						
							|  |  |  | }); |