summaryrefslogtreecommitdiff
path: root/node_modules/webpack/lib/MultiStats.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/webpack/lib/MultiStats.js')
-rw-r--r--node_modules/webpack/lib/MultiStats.js208
1 files changed, 208 insertions, 0 deletions
diff --git a/node_modules/webpack/lib/MultiStats.js b/node_modules/webpack/lib/MultiStats.js
new file mode 100644
index 00000000..bf4771a5
--- /dev/null
+++ b/node_modules/webpack/lib/MultiStats.js
@@ -0,0 +1,208 @@
+/*
+ MIT License http://www.opensource.org/licenses/mit-license.php
+ Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const identifierUtils = require("./util/identifier");
+
+/** @typedef {import("../declarations/WebpackOptions").StatsOptions} StatsOptions */
+/** @typedef {import("./Compilation").CreateStatsOptionsContext} CreateStatsOptionsContext */
+/** @typedef {import("./Compilation").NormalizedStatsOptions} NormalizedStatsOptions */
+/** @typedef {import("./Stats")} Stats */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").KnownStatsCompilation} KnownStatsCompilation */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsCompilation} StatsCompilation */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsError} StatsError */
+
+/**
+ * @param {string} str string
+ * @param {string} prefix pref
+ * @returns {string} indent
+ */
+const indent = (str, prefix) => {
+ const rem = str.replace(/\n([^\n])/g, `\n${prefix}$1`);
+ return prefix + rem;
+};
+
+/** @typedef {{ version: boolean, hash: boolean, errorsCount: boolean, warningsCount: boolean, errors: boolean, warnings: boolean, children: NormalizedStatsOptions[] }} ChildOptions */
+
+class MultiStats {
+ /**
+ * @param {Stats[]} stats the child stats
+ */
+ constructor(stats) {
+ this.stats = stats;
+ }
+
+ get hash() {
+ return this.stats.map(stat => stat.hash).join("");
+ }
+
+ /**
+ * @returns {boolean} true if a child compilation encountered an error
+ */
+ hasErrors() {
+ return this.stats.some(stat => stat.hasErrors());
+ }
+
+ /**
+ * @returns {boolean} true if a child compilation had a warning
+ */
+ hasWarnings() {
+ return this.stats.some(stat => stat.hasWarnings());
+ }
+
+ /**
+ * @param {string | boolean | StatsOptions | undefined} options stats options
+ * @param {CreateStatsOptionsContext} context context
+ * @returns {ChildOptions} context context
+ */
+ _createChildOptions(options, context) {
+ const getCreateStatsOptions = () => {
+ if (!options) {
+ options = {};
+ }
+
+ const { children: childrenOptions = undefined, ...baseOptions } =
+ typeof options === "string"
+ ? { preset: options }
+ : /** @type {StatsOptions} */ (options);
+
+ return { childrenOptions, baseOptions };
+ };
+
+ const children = this.stats.map((stat, idx) => {
+ if (typeof options === "boolean") {
+ return stat.compilation.createStatsOptions(options, context);
+ }
+ const { childrenOptions, baseOptions } = getCreateStatsOptions();
+ const childOptions = Array.isArray(childrenOptions)
+ ? childrenOptions[idx]
+ : childrenOptions;
+ return stat.compilation.createStatsOptions(
+ {
+ ...baseOptions,
+ ...(typeof childOptions === "string"
+ ? { preset: childOptions }
+ : childOptions && typeof childOptions === "object"
+ ? childOptions
+ : undefined)
+ },
+ context
+ );
+ });
+ return {
+ version: children.every(o => o.version),
+ hash: children.every(o => o.hash),
+ errorsCount: children.every(o => o.errorsCount),
+ warningsCount: children.every(o => o.warningsCount),
+ errors: children.every(o => o.errors),
+ warnings: children.every(o => o.warnings),
+ children
+ };
+ }
+
+ /**
+ * @param {(string | boolean | StatsOptions)=} options stats options
+ * @returns {StatsCompilation} json output
+ */
+ toJson(options) {
+ const childOptions = this._createChildOptions(options, {
+ forToString: false
+ });
+ /** @type {KnownStatsCompilation} */
+ const obj = {};
+ obj.children = this.stats.map((stat, idx) => {
+ const obj = stat.toJson(childOptions.children[idx]);
+ const compilationName = stat.compilation.name;
+ const name =
+ compilationName &&
+ identifierUtils.makePathsRelative(
+ stat.compilation.compiler.context,
+ compilationName,
+ stat.compilation.compiler.root
+ );
+ obj.name = name;
+ return obj;
+ });
+ if (childOptions.version) {
+ obj.version = obj.children[0].version;
+ }
+ if (childOptions.hash) {
+ obj.hash = obj.children.map(j => j.hash).join("");
+ }
+ /**
+ * @param {StatsCompilation} j stats error
+ * @param {StatsError} obj Stats error
+ * @returns {TODO} result
+ */
+ const mapError = (j, obj) => ({
+ ...obj,
+ compilerPath: obj.compilerPath ? `${j.name}.${obj.compilerPath}` : j.name
+ });
+ if (childOptions.errors) {
+ obj.errors = [];
+ for (const j of obj.children) {
+ const errors =
+ /** @type {NonNullable<KnownStatsCompilation["errors"]>} */
+ (j.errors);
+ for (const i of errors) {
+ obj.errors.push(mapError(j, i));
+ }
+ }
+ }
+ if (childOptions.warnings) {
+ obj.warnings = [];
+ for (const j of obj.children) {
+ const warnings =
+ /** @type {NonNullable<KnownStatsCompilation["warnings"]>} */
+ (j.warnings);
+ for (const i of warnings) {
+ obj.warnings.push(mapError(j, i));
+ }
+ }
+ }
+ if (childOptions.errorsCount) {
+ obj.errorsCount = 0;
+ for (const j of obj.children) {
+ obj.errorsCount += /** @type {number} */ (j.errorsCount);
+ }
+ }
+ if (childOptions.warningsCount) {
+ obj.warningsCount = 0;
+ for (const j of obj.children) {
+ obj.warningsCount += /** @type {number} */ (j.warningsCount);
+ }
+ }
+ return obj;
+ }
+
+ /**
+ * @param {(string | boolean | StatsOptions)=} options stats options
+ * @returns {string} string output
+ */
+ toString(options) {
+ const childOptions = this._createChildOptions(options, {
+ forToString: true
+ });
+ const results = this.stats.map((stat, idx) => {
+ const str = stat.toString(childOptions.children[idx]);
+ const compilationName = stat.compilation.name;
+ const name =
+ compilationName &&
+ identifierUtils
+ .makePathsRelative(
+ stat.compilation.compiler.context,
+ compilationName,
+ stat.compilation.compiler.root
+ )
+ .replace(/\|/g, " ");
+ if (!str) return str;
+ return name ? `${name}:\n${indent(str, " ")}` : str;
+ });
+ return results.filter(Boolean).join("\n\n");
+ }
+}
+
+module.exports = MultiStats;