| /* |
| MIT License http://www.opensource.org/licenses/mit-license.php |
| Author Tobias Koppers @sokra |
| */ |
| "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"); |
| const webpackOptionsSchema = require("../schemas/WebpackOptions.json"); |
| const RemovedPluginError = require("./RemovedPluginError"); |
| const version = require("../package.json").version; |
| |
| /** @typedef {import("../declarations/WebpackOptions").WebpackOptions} WebpackOptions */ |
| |
| /** |
| * @param {WebpackOptions} options options object |
| * @param {function(Error=, Stats=): void=} callback callback |
| * @returns {Compiler | MultiCompiler} the compiler object |
| */ |
| const webpack = (options, callback) => { |
| const webpackOptionsValidationErrors = validateSchema( |
| webpackOptionsSchema, |
| options |
| ); |
| if (webpackOptionsValidationErrors.length) { |
| throw new WebpackOptionsValidationError(webpackOptionsValidationErrors); |
| } |
| let compiler; |
| if (Array.isArray(options)) { |
| compiler = new MultiCompiler( |
| Array.from(options).map(options => webpack(options)) |
| ); |
| } else if (typeof options === "object") { |
| options = new WebpackOptionsDefaulter().process(options); |
| |
| compiler = new Compiler(options.context); |
| compiler.options = options; |
| new NodeEnvironmentPlugin({ |
| infrastructureLogging: options.infrastructureLogging |
| }).apply(compiler); |
| if (options.plugins && Array.isArray(options.plugins)) { |
| for (const plugin of options.plugins) { |
| if (typeof plugin === "function") { |
| plugin.call(compiler, compiler); |
| } else { |
| plugin.apply(compiler); |
| } |
| } |
| } |
| compiler.hooks.environment.call(); |
| compiler.hooks.afterEnvironment.call(); |
| compiler.options = new WebpackOptionsApply().process(options, compiler); |
| } else { |
| throw new Error("Invalid argument: options"); |
| } |
| if (callback) { |
| if (typeof callback !== "function") { |
| throw new Error("Invalid argument: callback"); |
| } |
| if ( |
| options.watch === true || |
| (Array.isArray(options) && options.some(o => o.watch)) |
| ) { |
| const watchOptions = Array.isArray(options) |
| ? options.map(o => o.watchOptions || {}) |
| : options.watchOptions || {}; |
| return compiler.watch(watchOptions, callback); |
| } |
| compiler.run(callback); |
| } |
| return compiler; |
| }; |
| |
| exports = module.exports = webpack; |
| exports.version = version; |
| |
| webpack.WebpackOptionsDefaulter = WebpackOptionsDefaulter; |
| webpack.WebpackOptionsApply = WebpackOptionsApply; |
| webpack.Compiler = Compiler; |
| webpack.MultiCompiler = MultiCompiler; |
| webpack.NodeEnvironmentPlugin = NodeEnvironmentPlugin; |
| // @ts-ignore Global @this directive is not supported |
| webpack.validate = validateSchema.bind(this, webpackOptionsSchema); |
| webpack.validateSchema = validateSchema; |
| webpack.WebpackOptionsValidationError = WebpackOptionsValidationError; |
| |
| const exportPlugins = (obj, mappings) => { |
| for (const name of Object.keys(mappings)) { |
| Object.defineProperty(obj, name, { |
| configurable: false, |
| enumerable: true, |
| get: mappings[name] |
| }); |
| } |
| }; |
| |
| exportPlugins(exports, { |
| AutomaticPrefetchPlugin: () => require("./AutomaticPrefetchPlugin"), |
| BannerPlugin: () => require("./BannerPlugin"), |
| CachePlugin: () => require("./CachePlugin"), |
| ContextExclusionPlugin: () => require("./ContextExclusionPlugin"), |
| ContextReplacementPlugin: () => require("./ContextReplacementPlugin"), |
| DefinePlugin: () => require("./DefinePlugin"), |
| Dependency: () => require("./Dependency"), |
| DllPlugin: () => require("./DllPlugin"), |
| DllReferencePlugin: () => require("./DllReferencePlugin"), |
| EnvironmentPlugin: () => require("./EnvironmentPlugin"), |
| EvalDevToolModulePlugin: () => require("./EvalDevToolModulePlugin"), |
| EvalSourceMapDevToolPlugin: () => require("./EvalSourceMapDevToolPlugin"), |
| ExtendedAPIPlugin: () => require("./ExtendedAPIPlugin"), |
| ExternalsPlugin: () => require("./ExternalsPlugin"), |
| HashedModuleIdsPlugin: () => require("./HashedModuleIdsPlugin"), |
| HotModuleReplacementPlugin: () => require("./HotModuleReplacementPlugin"), |
| IgnorePlugin: () => require("./IgnorePlugin"), |
| LibraryTemplatePlugin: () => require("./LibraryTemplatePlugin"), |
| LoaderOptionsPlugin: () => require("./LoaderOptionsPlugin"), |
| LoaderTargetPlugin: () => require("./LoaderTargetPlugin"), |
| MemoryOutputFileSystem: () => require("./MemoryOutputFileSystem"), |
| Module: () => require("./Module"), |
| ModuleFilenameHelpers: () => require("./ModuleFilenameHelpers"), |
| NamedChunksPlugin: () => require("./NamedChunksPlugin"), |
| NamedModulesPlugin: () => require("./NamedModulesPlugin"), |
| NoEmitOnErrorsPlugin: () => require("./NoEmitOnErrorsPlugin"), |
| NormalModuleReplacementPlugin: () => |
| require("./NormalModuleReplacementPlugin"), |
| PrefetchPlugin: () => require("./PrefetchPlugin"), |
| ProgressPlugin: () => require("./ProgressPlugin"), |
| ProvidePlugin: () => require("./ProvidePlugin"), |
| SetVarMainTemplatePlugin: () => require("./SetVarMainTemplatePlugin"), |
| SingleEntryPlugin: () => require("./SingleEntryPlugin"), |
| SourceMapDevToolPlugin: () => require("./SourceMapDevToolPlugin"), |
| Stats: () => require("./Stats"), |
| Template: () => require("./Template"), |
| UmdMainTemplatePlugin: () => require("./UmdMainTemplatePlugin"), |
| WatchIgnorePlugin: () => require("./WatchIgnorePlugin") |
| }); |
| exportPlugins((exports.dependencies = {}), { |
| DependencyReference: () => require("./dependencies/DependencyReference") |
| }); |
| exportPlugins((exports.optimize = {}), { |
| AggressiveMergingPlugin: () => require("./optimize/AggressiveMergingPlugin"), |
| AggressiveSplittingPlugin: () => |
| require("./optimize/AggressiveSplittingPlugin"), |
| ChunkModuleIdRangePlugin: () => |
| require("./optimize/ChunkModuleIdRangePlugin"), |
| LimitChunkCountPlugin: () => require("./optimize/LimitChunkCountPlugin"), |
| MinChunkSizePlugin: () => require("./optimize/MinChunkSizePlugin"), |
| ModuleConcatenationPlugin: () => |
| require("./optimize/ModuleConcatenationPlugin"), |
| OccurrenceOrderPlugin: () => require("./optimize/OccurrenceOrderPlugin"), |
| OccurrenceModuleOrderPlugin: () => |
| require("./optimize/OccurrenceModuleOrderPlugin"), |
| OccurrenceChunkOrderPlugin: () => |
| require("./optimize/OccurrenceChunkOrderPlugin"), |
| RuntimeChunkPlugin: () => require("./optimize/RuntimeChunkPlugin"), |
| SideEffectsFlagPlugin: () => require("./optimize/SideEffectsFlagPlugin"), |
| SplitChunksPlugin: () => require("./optimize/SplitChunksPlugin") |
| }); |
| exportPlugins((exports.web = {}), { |
| FetchCompileWasmTemplatePlugin: () => |
| require("./web/FetchCompileWasmTemplatePlugin"), |
| JsonpTemplatePlugin: () => require("./web/JsonpTemplatePlugin") |
| }); |
| exportPlugins((exports.webworker = {}), { |
| WebWorkerTemplatePlugin: () => require("./webworker/WebWorkerTemplatePlugin") |
| }); |
| exportPlugins((exports.node = {}), { |
| NodeTemplatePlugin: () => require("./node/NodeTemplatePlugin"), |
| ReadFileCompileWasmTemplatePlugin: () => |
| require("./node/ReadFileCompileWasmTemplatePlugin") |
| }); |
| exportPlugins((exports.debug = {}), { |
| ProfilingPlugin: () => require("./debug/ProfilingPlugin") |
| }); |
| exportPlugins((exports.util = {}), { |
| createHash: () => require("./util/createHash") |
| }); |
| |
| const defineMissingPluginError = (namespace, pluginName, errorMessage) => { |
| Object.defineProperty(namespace, pluginName, { |
| configurable: false, |
| enumerable: true, |
| get() { |
| throw new RemovedPluginError(errorMessage); |
| } |
| }); |
| }; |
| |
| // TODO remove in webpack 5 |
| defineMissingPluginError( |
| exports.optimize, |
| "UglifyJsPlugin", |
| "webpack.optimize.UglifyJsPlugin has been removed, please use config.optimization.minimize instead." |
| ); |
| |
| // TODO remove in webpack 5 |
| defineMissingPluginError( |
| exports.optimize, |
| "CommonsChunkPlugin", |
| "webpack.optimize.CommonsChunkPlugin has been removed, please use config.optimization.splitChunks instead." |
| ); |