UNPKG

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