1 |
|
2 |
|
3 |
|
4 |
|
5 | "use strict";
|
6 |
|
7 | const Compiler = require("./Compiler");
|
8 | const MultiCompiler = require("./MultiCompiler");
|
9 | const NodeEnvironmentPlugin = require("./node/NodeEnvironmentPlugin");
|
10 | const WebpackOptionsApply = require("./WebpackOptionsApply");
|
11 | const WebpackOptionsDefaulter = require("./WebpackOptionsDefaulter");
|
12 | const validateSchema = require("./validateSchema");
|
13 | const WebpackOptionsValidationError = require("./WebpackOptionsValidationError");
|
14 | const webpackOptionsSchema = require("../schemas/WebpackOptions.json");
|
15 | const RemovedPluginError = require("./RemovedPluginError");
|
16 | const version = require("../package.json").version;
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 | const 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 |
|
79 | exports = module.exports = webpack;
|
80 | exports.version = version;
|
81 |
|
82 | webpack.WebpackOptionsDefaulter = WebpackOptionsDefaulter;
|
83 | webpack.WebpackOptionsApply = WebpackOptionsApply;
|
84 | webpack.Compiler = Compiler;
|
85 | webpack.MultiCompiler = MultiCompiler;
|
86 | webpack.NodeEnvironmentPlugin = NodeEnvironmentPlugin;
|
87 |
|
88 | webpack.validate = validateSchema.bind(this, webpackOptionsSchema);
|
89 | webpack.validateSchema = validateSchema;
|
90 | webpack.WebpackOptionsValidationError = WebpackOptionsValidationError;
|
91 |
|
92 | const 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 |
|
102 | exportPlugins(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 | });
|
142 | exportPlugins((exports.dependencies = {}), {
|
143 | DependencyReference: () => require("./dependencies/DependencyReference")
|
144 | });
|
145 | exportPlugins((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 | });
|
164 | exportPlugins((exports.web = {}), {
|
165 | FetchCompileWasmTemplatePlugin: () =>
|
166 | require("./web/FetchCompileWasmTemplatePlugin"),
|
167 | JsonpTemplatePlugin: () => require("./web/JsonpTemplatePlugin")
|
168 | });
|
169 | exportPlugins((exports.webworker = {}), {
|
170 | WebWorkerTemplatePlugin: () => require("./webworker/WebWorkerTemplatePlugin")
|
171 | });
|
172 | exportPlugins((exports.node = {}), {
|
173 | NodeTemplatePlugin: () => require("./node/NodeTemplatePlugin"),
|
174 | ReadFileCompileWasmTemplatePlugin: () =>
|
175 | require("./node/ReadFileCompileWasmTemplatePlugin")
|
176 | });
|
177 | exportPlugins((exports.debug = {}), {
|
178 | ProfilingPlugin: () => require("./debug/ProfilingPlugin")
|
179 | });
|
180 | exportPlugins((exports.util = {}), {
|
181 | createHash: () => require("./util/createHash")
|
182 | });
|
183 |
|
184 | const 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 |
|
195 | defineMissingPluginError(
|
196 | exports.optimize,
|
197 | "UglifyJsPlugin",
|
198 | "webpack.optimize.UglifyJsPlugin has been removed, please use config.optimization.minimize instead."
|
199 | );
|
200 |
|
201 |
|
202 | defineMissingPluginError(
|
203 | exports.optimize,
|
204 | "CommonsChunkPlugin",
|
205 | "webpack.optimize.CommonsChunkPlugin has been removed, please use config.optimization.splitChunks instead."
|
206 | );
|