UNPKG

7.89 kBJavaScriptView Raw
1/*
2 MIT License http://www.opensource.org/licenses/mit-license.php
3 Author Tobias Koppers @sokra
4*/
5"use strict";
6
7const Compiler = require("./Compiler");
8const MultiCompiler = require("./MultiCompiler");
9const NodeEnvironmentPlugin = require("./node/NodeEnvironmentPlugin");
10const WebpackOptionsApply = require("./WebpackOptionsApply");
11const WebpackOptionsDefaulter = require("./WebpackOptionsDefaulter");
12const validateSchema = require("./validateSchema");
13const WebpackOptionsValidationError = require("./WebpackOptionsValidationError");
14const webpackOptionsSchema = require("../schemas/WebpackOptions.json");
15const RemovedPluginError = require("./RemovedPluginError");
16const version = require("../package.json").version;
17
18/** @typedef {import("../declarations/WebpackOptions").WebpackOptions} WebpackOptions */
19
20/**
21 * @param {WebpackOptions} options options object
22 * @param {function(Error=, Stats=): void=} callback callback
23 * @returns {Compiler | MultiCompiler} the compiler object
24 */
25const webpack = (options, callback) => {
26 const webpackOptionsValidationErrors = validateSchema(
27 webpackOptionsSchema,
28 options
29 );
30 if (webpackOptionsValidationErrors.length) {
31 throw new WebpackOptionsValidationError(webpackOptionsValidationErrors);
32 }
33 let compiler;
34 if (Array.isArray(options)) {
35 compiler = new MultiCompiler(options.map(options => webpack(options)));
36 } else if (typeof options === "object") {
37 options = new WebpackOptionsDefaulter().process(options);
38
39 compiler = new Compiler(options.context);
40 compiler.options = options;
41 new NodeEnvironmentPlugin().apply(compiler);
42 if (options.plugins && Array.isArray(options.plugins)) {
43 for (const plugin of options.plugins) {
44 if (typeof plugin === "function") {
45 plugin.apply(compiler);
46 } else {
47 plugin.apply(compiler);
48 }
49 }
50 }
51 compiler.hooks.environment.call();
52 compiler.hooks.afterEnvironment.call();
53 compiler.options = new WebpackOptionsApply().process(options, compiler);
54 } else {
55 throw new Error("Invalid argument: options");
56 }
57 if (callback) {
58 if (typeof callback !== "function") {
59 throw new Error("Invalid argument: callback");
60 }
61 if (
62 options.watch === true ||
63 (Array.isArray(options) && options.some(o => o.watch))
64 ) {
65 const watchOptions = Array.isArray(options)
66 ? options.map(o => o.watchOptions || {})
67 : options.watchOptions || {};
68 return compiler.watch(watchOptions, callback);
69 }
70 compiler.run(callback);
71 }
72 return compiler;
73};
74
75exports = module.exports = webpack;
76exports.version = version;
77
78webpack.WebpackOptionsDefaulter = WebpackOptionsDefaulter;
79webpack.WebpackOptionsApply = WebpackOptionsApply;
80webpack.Compiler = Compiler;
81webpack.MultiCompiler = MultiCompiler;
82webpack.NodeEnvironmentPlugin = NodeEnvironmentPlugin;
83// @ts-ignore Global @this directive is not supported
84webpack.validate = validateSchema.bind(this, webpackOptionsSchema);
85webpack.validateSchema = validateSchema;
86webpack.WebpackOptionsValidationError = WebpackOptionsValidationError;
87
88const exportPlugins = (obj, mappings) => {
89 for (const name of Object.keys(mappings)) {
90 Object.defineProperty(obj, name, {
91 configurable: false,
92 enumerable: true,
93 get: mappings[name]
94 });
95 }
96};
97
98exportPlugins(exports, {
99 AutomaticPrefetchPlugin: () => require("./AutomaticPrefetchPlugin"),
100 BannerPlugin: () => require("./BannerPlugin"),
101 CachePlugin: () => require("./CachePlugin"),
102 ContextExclusionPlugin: () => require("./ContextExclusionPlugin"),
103 ContextReplacementPlugin: () => require("./ContextReplacementPlugin"),
104 DefinePlugin: () => require("./DefinePlugin"),
105 Dependency: () => require("./Dependency"),
106 DllPlugin: () => require("./DllPlugin"),
107 DllReferencePlugin: () => require("./DllReferencePlugin"),
108 EnvironmentPlugin: () => require("./EnvironmentPlugin"),
109 EvalDevToolModulePlugin: () => require("./EvalDevToolModulePlugin"),
110 EvalSourceMapDevToolPlugin: () => require("./EvalSourceMapDevToolPlugin"),
111 ExtendedAPIPlugin: () => require("./ExtendedAPIPlugin"),
112 ExternalsPlugin: () => require("./ExternalsPlugin"),
113 HashedModuleIdsPlugin: () => require("./HashedModuleIdsPlugin"),
114 HotModuleReplacementPlugin: () => require("./HotModuleReplacementPlugin"),
115 IgnorePlugin: () => require("./IgnorePlugin"),
116 LibraryTemplatePlugin: () => require("./LibraryTemplatePlugin"),
117 LoaderOptionsPlugin: () => require("./LoaderOptionsPlugin"),
118 LoaderTargetPlugin: () => require("./LoaderTargetPlugin"),
119 MemoryOutputFileSystem: () => require("./MemoryOutputFileSystem"),
120 Module: () => require("./Module"),
121 ModuleFilenameHelpers: () => require("./ModuleFilenameHelpers"),
122 NamedChunksPlugin: () => require("./NamedChunksPlugin"),
123 NamedModulesPlugin: () => require("./NamedModulesPlugin"),
124 NoEmitOnErrorsPlugin: () => require("./NoEmitOnErrorsPlugin"),
125 NormalModuleReplacementPlugin: () =>
126 require("./NormalModuleReplacementPlugin"),
127 PrefetchPlugin: () => require("./PrefetchPlugin"),
128 ProgressPlugin: () => require("./ProgressPlugin"),
129 ProvidePlugin: () => require("./ProvidePlugin"),
130 SetVarMainTemplatePlugin: () => require("./SetVarMainTemplatePlugin"),
131 SingleEntryPlugin: () => require("./SingleEntryPlugin"),
132 SourceMapDevToolPlugin: () => require("./SourceMapDevToolPlugin"),
133 Stats: () => require("./Stats"),
134 Template: () => require("./Template"),
135 UmdMainTemplatePlugin: () => require("./UmdMainTemplatePlugin"),
136 WatchIgnorePlugin: () => require("./WatchIgnorePlugin")
137});
138exportPlugins((exports.dependencies = {}), {
139 DependencyReference: () => require("./dependencies/DependencyReference")
140});
141exportPlugins((exports.optimize = {}), {
142 AggressiveMergingPlugin: () => require("./optimize/AggressiveMergingPlugin"),
143 AggressiveSplittingPlugin: () =>
144 require("./optimize/AggressiveSplittingPlugin"),
145 ChunkModuleIdRangePlugin: () =>
146 require("./optimize/ChunkModuleIdRangePlugin"),
147 LimitChunkCountPlugin: () => require("./optimize/LimitChunkCountPlugin"),
148 MinChunkSizePlugin: () => require("./optimize/MinChunkSizePlugin"),
149 ModuleConcatenationPlugin: () =>
150 require("./optimize/ModuleConcatenationPlugin"),
151 OccurrenceOrderPlugin: () => require("./optimize/OccurrenceOrderPlugin"),
152 OccurrenceModuleOrderPlugin: () =>
153 require("./optimize/OccurrenceModuleOrderPlugin"),
154 OccurrenceChunkOrderPlugin: () =>
155 require("./optimize/OccurrenceChunkOrderPlugin"),
156 RuntimeChunkPlugin: () => require("./optimize/RuntimeChunkPlugin"),
157 SideEffectsFlagPlugin: () => require("./optimize/SideEffectsFlagPlugin"),
158 SplitChunksPlugin: () => require("./optimize/SplitChunksPlugin")
159});
160exportPlugins((exports.web = {}), {
161 FetchCompileWasmTemplatePlugin: () =>
162 require("./web/FetchCompileWasmTemplatePlugin"),
163 JsonpTemplatePlugin: () => require("./web/JsonpTemplatePlugin")
164});
165exportPlugins((exports.webworker = {}), {
166 WebWorkerTemplatePlugin: () => require("./webworker/WebWorkerTemplatePlugin")
167});
168exportPlugins((exports.node = {}), {
169 NodeTemplatePlugin: () => require("./node/NodeTemplatePlugin"),
170 ReadFileCompileWasmTemplatePlugin: () =>
171 require("./node/ReadFileCompileWasmTemplatePlugin")
172});
173exportPlugins((exports.debug = {}), {
174 ProfilingPlugin: () => require("./debug/ProfilingPlugin")
175});
176exportPlugins((exports.util = {}), {
177 createHash: () => require("./util/createHash")
178});
179
180const defineMissingPluginError = (namespace, pluginName, errorMessage) => {
181 Object.defineProperty(namespace, pluginName, {
182 configurable: false,
183 enumerable: true,
184 get() {
185 throw new RemovedPluginError(errorMessage);
186 }
187 });
188};
189
190// TODO remove in webpack 5
191defineMissingPluginError(
192 exports.optimize,
193 "UglifyJsPlugin",
194 "webpack.optimize.UglifyJsPlugin has been removed, please use config.optimization.minimize instead."
195);
196
197// TODO remove in webpack 5
198defineMissingPluginError(
199 exports.optimize,
200 "CommonsChunkPlugin",
201 "webpack.optimize.CommonsChunkPlugin has been removed, please use config.optimization.splitChunks instead."
202);