1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | "use strict";
|
7 |
|
8 | const RequestShortener = require("../RequestShortener");
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 | const applyDefaults = (options, defaults) => {
|
16 | for (const key of Object.keys(defaults)) {
|
17 | if (typeof options[key] === "undefined") {
|
18 | options[key] = defaults[key];
|
19 | }
|
20 | }
|
21 | };
|
22 |
|
23 | const NAMED_PRESETS = {
|
24 | verbose: {
|
25 | hash: true,
|
26 | builtAt: true,
|
27 | relatedAssets: true,
|
28 | entrypoints: true,
|
29 | chunkGroups: true,
|
30 | ids: true,
|
31 | modules: false,
|
32 | chunks: true,
|
33 | chunkRelations: true,
|
34 | chunkModules: true,
|
35 | dependentModules: true,
|
36 | chunkOrigins: true,
|
37 | depth: true,
|
38 | env: true,
|
39 | reasons: true,
|
40 | usedExports: true,
|
41 | providedExports: true,
|
42 | optimizationBailout: true,
|
43 | errorDetails: true,
|
44 | errorStack: true,
|
45 | publicPath: true,
|
46 | logging: "verbose",
|
47 | orphanModules: true,
|
48 | runtimeModules: true,
|
49 | exclude: false,
|
50 | modulesSpace: Infinity,
|
51 | chunkModulesSpace: Infinity,
|
52 | assetsSpace: Infinity,
|
53 | reasonsSpace: Infinity,
|
54 | children: true
|
55 | },
|
56 | detailed: {
|
57 | hash: true,
|
58 | builtAt: true,
|
59 | relatedAssets: true,
|
60 | entrypoints: true,
|
61 | chunkGroups: true,
|
62 | ids: true,
|
63 | chunks: true,
|
64 | chunkRelations: true,
|
65 | chunkModules: false,
|
66 | chunkOrigins: true,
|
67 | depth: true,
|
68 | usedExports: true,
|
69 | providedExports: true,
|
70 | optimizationBailout: true,
|
71 | errorDetails: true,
|
72 | publicPath: true,
|
73 | logging: true,
|
74 | runtimeModules: true,
|
75 | exclude: false,
|
76 | modulesSpace: 1000,
|
77 | assetsSpace: 1000,
|
78 | reasonsSpace: 1000
|
79 | },
|
80 | minimal: {
|
81 | all: false,
|
82 | version: true,
|
83 | timings: true,
|
84 | modules: true,
|
85 | modulesSpace: 0,
|
86 | assets: true,
|
87 | assetsSpace: 0,
|
88 | errors: true,
|
89 | errorsCount: true,
|
90 | warnings: true,
|
91 | warningsCount: true,
|
92 | logging: "warn"
|
93 | },
|
94 | "errors-only": {
|
95 | all: false,
|
96 | errors: true,
|
97 | errorsCount: true,
|
98 | moduleTrace: true,
|
99 | logging: "error"
|
100 | },
|
101 | "errors-warnings": {
|
102 | all: false,
|
103 | errors: true,
|
104 | errorsCount: true,
|
105 | warnings: true,
|
106 | warningsCount: true,
|
107 | logging: "warn"
|
108 | },
|
109 | summary: {
|
110 | all: false,
|
111 | version: true,
|
112 | errorsCount: true,
|
113 | warningsCount: true
|
114 | },
|
115 | none: {
|
116 | all: false
|
117 | }
|
118 | };
|
119 |
|
120 | const NORMAL_ON = ({ all }) => all !== false;
|
121 | const NORMAL_OFF = ({ all }) => all === true;
|
122 | const ON_FOR_TO_STRING = ({ all }, { forToString }) =>
|
123 | forToString ? all !== false : all === true;
|
124 | const OFF_FOR_TO_STRING = ({ all }, { forToString }) =>
|
125 | forToString ? all === true : all !== false;
|
126 | const AUTO_FOR_TO_STRING = ({ all }, { forToString }) => {
|
127 | if (all === false) return false;
|
128 | if (all === true) return true;
|
129 | if (forToString) return "auto";
|
130 | return true;
|
131 | };
|
132 |
|
133 |
|
134 | const DEFAULTS = {
|
135 | context: (options, context, compilation) => compilation.compiler.context,
|
136 | requestShortener: (options, context, compilation) =>
|
137 | compilation.compiler.context === options.context
|
138 | ? compilation.requestShortener
|
139 | : new RequestShortener(options.context, compilation.compiler.root),
|
140 | performance: NORMAL_ON,
|
141 | hash: OFF_FOR_TO_STRING,
|
142 | env: NORMAL_OFF,
|
143 | version: NORMAL_ON,
|
144 | timings: NORMAL_ON,
|
145 | builtAt: OFF_FOR_TO_STRING,
|
146 | assets: NORMAL_ON,
|
147 | entrypoints: AUTO_FOR_TO_STRING,
|
148 | chunkGroups: OFF_FOR_TO_STRING,
|
149 | chunkGroupAuxiliary: OFF_FOR_TO_STRING,
|
150 | chunkGroupChildren: OFF_FOR_TO_STRING,
|
151 | chunkGroupMaxAssets: (o, { forToString }) => (forToString ? 5 : Infinity),
|
152 | chunks: OFF_FOR_TO_STRING,
|
153 | chunkRelations: OFF_FOR_TO_STRING,
|
154 | chunkModules: ({ all, modules }) => {
|
155 | if (all === false) return false;
|
156 | if (all === true) return true;
|
157 | if (modules) return false;
|
158 | return true;
|
159 | },
|
160 | dependentModules: OFF_FOR_TO_STRING,
|
161 | chunkOrigins: OFF_FOR_TO_STRING,
|
162 | ids: OFF_FOR_TO_STRING,
|
163 | modules: ({ all, chunks, chunkModules }, { forToString }) => {
|
164 | if (all === false) return false;
|
165 | if (all === true) return true;
|
166 | if (forToString && chunks && chunkModules) return false;
|
167 | return true;
|
168 | },
|
169 | nestedModules: OFF_FOR_TO_STRING,
|
170 | groupModulesByType: ON_FOR_TO_STRING,
|
171 | groupModulesByCacheStatus: ON_FOR_TO_STRING,
|
172 | groupModulesByLayer: ON_FOR_TO_STRING,
|
173 | groupModulesByAttributes: ON_FOR_TO_STRING,
|
174 | groupModulesByPath: ON_FOR_TO_STRING,
|
175 | groupModulesByExtension: ON_FOR_TO_STRING,
|
176 | modulesSpace: (o, { forToString }) => (forToString ? 15 : Infinity),
|
177 | chunkModulesSpace: (o, { forToString }) => (forToString ? 10 : Infinity),
|
178 | nestedModulesSpace: (o, { forToString }) => (forToString ? 10 : Infinity),
|
179 | relatedAssets: OFF_FOR_TO_STRING,
|
180 | groupAssetsByEmitStatus: ON_FOR_TO_STRING,
|
181 | groupAssetsByInfo: ON_FOR_TO_STRING,
|
182 | groupAssetsByPath: ON_FOR_TO_STRING,
|
183 | groupAssetsByExtension: ON_FOR_TO_STRING,
|
184 | groupAssetsByChunk: ON_FOR_TO_STRING,
|
185 | assetsSpace: (o, { forToString }) => (forToString ? 15 : Infinity),
|
186 | orphanModules: OFF_FOR_TO_STRING,
|
187 | runtimeModules: ({ all, runtime }, { forToString }) =>
|
188 | runtime !== undefined
|
189 | ? runtime
|
190 | : forToString
|
191 | ? all === true
|
192 | : all !== false,
|
193 | cachedModules: ({ all, cached }, { forToString }) =>
|
194 | cached !== undefined ? cached : forToString ? all === true : all !== false,
|
195 | moduleAssets: OFF_FOR_TO_STRING,
|
196 | depth: OFF_FOR_TO_STRING,
|
197 | cachedAssets: OFF_FOR_TO_STRING,
|
198 | reasons: OFF_FOR_TO_STRING,
|
199 | reasonsSpace: (o, { forToString }) => (forToString ? 15 : Infinity),
|
200 | groupReasonsByOrigin: ON_FOR_TO_STRING,
|
201 | usedExports: OFF_FOR_TO_STRING,
|
202 | providedExports: OFF_FOR_TO_STRING,
|
203 | optimizationBailout: OFF_FOR_TO_STRING,
|
204 | children: OFF_FOR_TO_STRING,
|
205 | source: NORMAL_OFF,
|
206 | moduleTrace: NORMAL_ON,
|
207 | errors: NORMAL_ON,
|
208 | errorsCount: NORMAL_ON,
|
209 | errorDetails: AUTO_FOR_TO_STRING,
|
210 | errorStack: OFF_FOR_TO_STRING,
|
211 | warnings: NORMAL_ON,
|
212 | warningsCount: NORMAL_ON,
|
213 | publicPath: OFF_FOR_TO_STRING,
|
214 | logging: ({ all }, { forToString }) =>
|
215 | forToString && all !== false ? "info" : false,
|
216 | loggingDebug: () => [],
|
217 | loggingTrace: OFF_FOR_TO_STRING,
|
218 | excludeModules: () => [],
|
219 | excludeAssets: () => [],
|
220 | modulesSort: () => "depth",
|
221 | chunkModulesSort: () => "name",
|
222 | nestedModulesSort: () => false,
|
223 | chunksSort: () => false,
|
224 | assetsSort: () => "!size",
|
225 | outputPath: OFF_FOR_TO_STRING,
|
226 | colors: () => false
|
227 | };
|
228 |
|
229 | const normalizeFilter = item => {
|
230 | if (typeof item === "string") {
|
231 | const regExp = new RegExp(
|
232 | `[\\\\/]${item.replace(
|
233 | // eslint-disable-next-line no-useless-escape
|
234 | /[-[\]{}()*+?.\\^$|]/g,
|
235 | "\\$&"
|
236 | )}([\\\\/]|$|!|\\?)`
|
237 | );
|
238 | return ident => regExp.test(ident);
|
239 | }
|
240 | if (item && typeof item === "object" && typeof item.test === "function") {
|
241 | return ident => item.test(ident);
|
242 | }
|
243 | if (typeof item === "function") {
|
244 | return item;
|
245 | }
|
246 | if (typeof item === "boolean") {
|
247 | return () => item;
|
248 | }
|
249 | };
|
250 |
|
251 | const NORMALIZER = {
|
252 | excludeModules: value => {
|
253 | if (!Array.isArray(value)) {
|
254 | value = value ? [value] : [];
|
255 | }
|
256 | return value.map(normalizeFilter);
|
257 | },
|
258 | excludeAssets: value => {
|
259 | if (!Array.isArray(value)) {
|
260 | value = value ? [value] : [];
|
261 | }
|
262 | return value.map(normalizeFilter);
|
263 | },
|
264 | warningsFilter: value => {
|
265 | if (!Array.isArray(value)) {
|
266 | value = value ? [value] : [];
|
267 | }
|
268 | return value.map(filter => {
|
269 | if (typeof filter === "string") {
|
270 | return (warning, warningString) => warningString.includes(filter);
|
271 | }
|
272 | if (filter instanceof RegExp) {
|
273 | return (warning, warningString) => filter.test(warningString);
|
274 | }
|
275 | if (typeof filter === "function") {
|
276 | return filter;
|
277 | }
|
278 | throw new Error(
|
279 | `Can only filter warnings with Strings or RegExps. (Given: ${filter})`
|
280 | );
|
281 | });
|
282 | },
|
283 | logging: value => {
|
284 | if (value === true) value = "log";
|
285 | return value;
|
286 | },
|
287 | loggingDebug: value => {
|
288 | if (!Array.isArray(value)) {
|
289 | value = value ? [value] : [];
|
290 | }
|
291 | return value.map(normalizeFilter);
|
292 | }
|
293 | };
|
294 |
|
295 | class DefaultStatsPresetPlugin {
|
296 | |
297 |
|
298 |
|
299 |
|
300 |
|
301 | apply(compiler) {
|
302 | compiler.hooks.compilation.tap("DefaultStatsPresetPlugin", compilation => {
|
303 | for (const key of Object.keys(NAMED_PRESETS)) {
|
304 | const defaults = NAMED_PRESETS[key];
|
305 | compilation.hooks.statsPreset
|
306 | .for(key)
|
307 | .tap("DefaultStatsPresetPlugin", (options, context) => {
|
308 | applyDefaults(options, defaults);
|
309 | });
|
310 | }
|
311 | compilation.hooks.statsNormalize.tap(
|
312 | "DefaultStatsPresetPlugin",
|
313 | (options, context) => {
|
314 | for (const key of Object.keys(DEFAULTS)) {
|
315 | if (options[key] === undefined)
|
316 | options[key] = DEFAULTS[key](options, context, compilation);
|
317 | }
|
318 | for (const key of Object.keys(NORMALIZER)) {
|
319 | options[key] = NORMALIZER[key](options[key]);
|
320 | }
|
321 | }
|
322 | );
|
323 | });
|
324 | }
|
325 | }
|
326 | module.exports = DefaultStatsPresetPlugin;
|