From 9bce51f651aad297ef9eb6df832bfdaf1de05d84 Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期三, 22 四月 2026 14:27:54 +0800
Subject: [PATCH] 青岛推送

---
 node_modules/webpack/lib/Compiler.js |  114 +++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 103 insertions(+), 11 deletions(-)

diff --git a/node_modules/webpack/lib/Compiler.js b/node_modules/webpack/lib/Compiler.js
index 7fde4b1..f229526 100644
--- a/node_modules/webpack/lib/Compiler.js
+++ b/node_modules/webpack/lib/Compiler.js
@@ -5,7 +5,6 @@
 
 "use strict";
 
-const parseJson = require("json-parse-even-better-errors");
 const asyncLib = require("neo-async");
 const {
 	AsyncParallelHook,
@@ -30,6 +29,8 @@
 const { Logger } = require("./logging/Logger");
 const { dirname, join, mkdirp } = require("./util/fs");
 const { makePathsRelative } = require("./util/identifier");
+const memoize = require("./util/memoize");
+const parseJson = require("./util/parseJson");
 const { isSourceEqual } = require("./util/source");
 const webpack = require(".");
 
@@ -39,7 +40,7 @@
 /** @typedef {import("../declarations/WebpackOptions").WatchOptions} WatchOptions */
 /** @typedef {import("../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
 /** @typedef {import("../declarations/WebpackOptions").Plugins} Plugins */
-/** @typedef {import("../declarations/WebpackOptions").WebpackPluginFunction} WebpackPluginFunction */
+/** @typedef {import("./webpack").WebpackPluginFunction} WebpackPluginFunction */
 /** @typedef {import("./Chunk")} Chunk */
 /** @typedef {import("./Dependency")} Dependency */
 /** @typedef {import("./HotModuleReplacementPlugin").ChunkHashes} ChunkHashes */
@@ -61,14 +62,19 @@
 /** @typedef {import("./util/fs").OutputFileSystem} OutputFileSystem */
 /** @typedef {import("./util/fs").TimeInfoEntries} TimeInfoEntries */
 /** @typedef {import("./util/fs").WatchFileSystem} WatchFileSystem */
+/** @typedef {import("schema-utils").validate} Validate */
+/** @typedef {import("schema-utils").Schema} Schema */
+/** @typedef {import("schema-utils").ValidationErrorConfiguration} ValidationErrorConfiguration */
 
 /**
+ * Defines the compilation params type used by this module.
  * @typedef {object} CompilationParams
  * @property {NormalModuleFactory} normalModuleFactory
  * @property {ContextModuleFactory} contextModuleFactory
  */
 
 /**
+ * Defines the callback type used by this module.
  * @template T
  * @template [R=void]
  * @typedef {import("./webpack").Callback<T, R>} Callback
@@ -77,6 +83,7 @@
 /** @typedef {import("./webpack").ErrorCallback} ErrorCallback */
 
 /**
+ * Defines the run as child callback callback.
  * @callback RunAsChildCallback
  * @param {Error | null} err
  * @param {Chunk[]=} entries
@@ -85,6 +92,7 @@
  */
 
 /**
+ * Defines the known records type used by this module.
  * @typedef {object} KnownRecords
  * @property {SplitData[]=} aggressiveSplits
  * @property {RecordsChunks=} chunks
@@ -101,6 +109,7 @@
 /** @typedef {KnownRecords & Record<string, KnownRecords[]> & Record<string, EXPECTED_ANY>} Records */
 
 /**
+ * Defines the asset emitted info type used by this module.
  * @typedef {object} AssetEmittedInfo
  * @property {Buffer} content
  * @property {Source} source
@@ -117,6 +126,7 @@
 /** @typedef {{ buildInfo: BuildInfo, references: WeakReferences | undefined, memCache: MemCache }} ModuleMemCachesItem */
 
 /**
+ * Checks whether this object is sorted.
  * @template T
  * @param {T[]} array an array
  * @returns {boolean} true, if the array is sorted
@@ -129,6 +139,7 @@
 };
 
 /**
+ * Returns the object with properties sorted by property name.
  * @template {object} T
  * @param {T} obj an object
  * @param {(keyof T)[]} keys the keys of the object
@@ -143,6 +154,7 @@
 };
 
 /**
+ * Returns true, if the filename contains any hash.
  * @param {string} filename filename
  * @param {string | string[] | undefined} hashes list of hashes
  * @returns {boolean} true, if the filename contains any hash
@@ -155,8 +167,11 @@
 	return filename.includes(hashes);
 };
 
+const getValidate = memoize(() => require("schema-utils").validate);
+
 class Compiler {
 	/**
+	 * Creates an instance of Compiler.
 	 * @param {string} context the compilation path
 	 * @param {WebpackOptions} options options
 	 */
@@ -225,6 +240,8 @@
 
 			// TODO the following hooks are weirdly located here
 			// TODO move them for webpack 5
+			/** @type {SyncHook<[]>} */
+			validate: new SyncHook([]),
 			/** @type {SyncHook<[]>} */
 			environment: new SyncHook([]),
 			/** @type {SyncHook<[]>} */
@@ -346,6 +363,7 @@
 	}
 
 	/**
+	 * Returns the cache facade instance.
 	 * @param {string} name cache name
 	 * @returns {CacheFacade} the cache facade instance
 	 */
@@ -358,6 +376,7 @@
 	}
 
 	/**
+	 * Gets infrastructure logger.
 	 * @param {string | (() => string)} name name of the logger, or function called once to get the logger name
 	 * @returns {Logger} a logger with that name
 	 */
@@ -473,6 +492,7 @@
 	}
 
 	/**
+	 * Returns a compiler watcher.
 	 * @param {WatchOptions} watchOptions the watcher's options
 	 * @param {Callback<Stats>} handler signals when the call finishes
 	 * @returns {Watching | undefined} a compiler watcher
@@ -490,6 +510,7 @@
 	}
 
 	/**
+	 * Processes the provided stat.
 	 * @param {Callback<Stats>} callback signals when the call finishes
 	 * @returns {void}
 	 */
@@ -503,6 +524,7 @@
 		let logger;
 
 		/**
+		 * Processes the provided err.
 		 * @param {Error | null} err error
 		 * @param {Stats=} stats stats
 		 */
@@ -510,7 +532,6 @@
 			if (logger) logger.time("beginIdle");
 			this.idle = true;
 			this.cache.beginIdle();
-			this.idle = true;
 			if (logger) logger.timeEnd("beginIdle");
 			this.running = false;
 			if (err) {
@@ -525,6 +546,7 @@
 		this.running = true;
 
 		/**
+		 * Processes the provided err.
 		 * @param {Error | null} err error
 		 * @param {Compilation=} _compilation compilation
 		 * @returns {void}
@@ -632,6 +654,7 @@
 	}
 
 	/**
+	 * Processes the provided run as child callback.
 	 * @param {RunAsChildCallback} callback signals when the call finishes
 	 * @returns {void}
 	 */
@@ -639,6 +662,7 @@
 		const startTime = Date.now();
 
 		/**
+		 * Processes the provided err.
 		 * @param {Error | null} err error
 		 * @param {Chunk[]=} entries entries
 		 * @param {Compilation=} compilation compilation
@@ -692,6 +716,7 @@
 	}
 
 	/**
+	 * Processes the provided compilation.
 	 * @param {Compilation} compilation the compilation
 	 * @param {ErrorCallback} callback signals when the assets are emitted
 	 * @returns {void}
@@ -701,6 +726,7 @@
 		let outputPath;
 
 		/**
+		 * Processes the provided err.
 		 * @param {Error=} err error
 		 * @returns {void}
 		 */
@@ -719,9 +745,9 @@
 				({ name: file, source, info }, callback) => {
 					let targetFile = file;
 					let immutable = info.immutable;
-					const queryStringIdx = targetFile.indexOf("?");
-					if (queryStringIdx >= 0) {
-						targetFile = targetFile.slice(0, queryStringIdx);
+					const queryOrHashStringIdx = targetFile.search(/[?#]/);
+					if (queryOrHashStringIdx >= 0) {
+						targetFile = targetFile.slice(0, queryOrHashStringIdx);
 						// We may remove the hash, which is in the query string
 						// So we recheck if the file is immutable
 						// This doesn't cover all cases, but immutable is only a performance optimization anyway
@@ -734,6 +760,7 @@
 					}
 
 					/**
+					 * Processes the provided err.
 					 * @param {Error=} err error
 					 * @returns {void}
 					 */
@@ -756,6 +783,7 @@
 						if (cacheEntry === undefined) {
 							cacheEntry = {
 								sizeOnlySource: undefined,
+								/** @type {CacheEntry["writtenTo"]} */
 								writtenTo: new Map()
 							};
 							this._assetEmittingSourceCache.set(source, cacheEntry);
@@ -867,6 +895,7 @@
 						};
 
 						/**
+						 * Updates with replacement source.
 						 * @param {number} size size
 						 */
 						const updateWithReplacementSource = (size) => {
@@ -889,6 +918,7 @@
 						};
 
 						/**
+						 * Updates file with replacement source.
 						 * @param {string} file file
 						 * @param {CacheEntry} cacheEntry cache entry
 						 * @param {number} size size
@@ -910,6 +940,7 @@
 						};
 
 						/**
+						 * Process existing file.
 						 * @param {IStats} stats stats
 						 * @returns {void}
 						 */
@@ -1044,6 +1075,7 @@
 	}
 
 	/**
+	 * Processes the provided error callback.
 	 * @param {ErrorCallback} callback signals when the call finishes
 	 * @returns {void}
 	 */
@@ -1055,7 +1087,7 @@
 						(cb) => this.hooks.emitRecords.callAsync(cb),
 						this._emitRecords.bind(this)
 					],
-					(err) => callback(err)
+					(err) => callback(/** @type {Error | null} */ (err))
 				);
 			} else {
 				this.hooks.emitRecords.callAsync(callback);
@@ -1068,6 +1100,7 @@
 	}
 
 	/**
+	 * Processes the provided error callback.
 	 * @param {ErrorCallback} callback signals when the call finishes
 	 * @returns {void}
 	 */
@@ -1117,6 +1150,7 @@
 	}
 
 	/**
+	 * Processes the provided error callback.
 	 * @param {ErrorCallback} callback signals when the call finishes
 	 * @returns {void}
 	 */
@@ -1128,7 +1162,7 @@
 						(cb) => this.hooks.readRecords.callAsync(cb),
 						this._readRecords.bind(this)
 					],
-					(err) => callback(err)
+					(err) => callback(/** @type {Error | null} */ (err))
 				);
 			} else {
 				this.records = {};
@@ -1143,6 +1177,7 @@
 	}
 
 	/**
+	 * Processes the provided error callback.
 	 * @param {ErrorCallback} callback signals when the call finishes
 	 * @returns {void}
 	 */
@@ -1165,9 +1200,9 @@
 					if (err) return callback(err);
 
 					try {
-						this.records = parseJson(
-							/** @type {Buffer} */ (content).toString("utf8")
-						);
+						this.records =
+							/** @type {Records} */
+							(parseJson(/** @type {Buffer} */ (content).toString("utf8")));
 					} catch (parseErr) {
 						return callback(
 							new Error(
@@ -1183,6 +1218,7 @@
 	}
 
 	/**
+	 * Creates a child compiler.
 	 * @param {Compilation} compilation the compilation
 	 * @param {string} compilerName the compiler's name
 	 * @param {number} compilerIndex the compiler's index
@@ -1285,6 +1321,7 @@
 	}
 
 	/**
+	 * Creates a compilation.
 	 * @param {CompilationParams} params the compilation parameters
 	 * @returns {Compilation} compilation
 	 */
@@ -1294,6 +1331,7 @@
 	}
 
 	/**
+	 * Returns the created compilation.
 	 * @param {CompilationParams} params the compilation parameters
 	 * @returns {Compilation} the created compilation
 	 */
@@ -1335,6 +1373,7 @@
 	}
 
 	/**
+	 * Processes the provided compilation.
 	 * @param {Callback<Compilation>} callback signals when the compilation finishes
 	 * @returns {void}
 	 */
@@ -1386,6 +1425,7 @@
 	}
 
 	/**
+	 * Processes the provided error callback.
 	 * @param {ErrorCallback} callback signals when the compiler closes
 	 * @returns {void}
 	 */
@@ -1407,6 +1447,58 @@
 			this.cache.shutdown(callback);
 		});
 	}
+
+	/**
+	 * Schema validation function with optional pre-compiled check
+	 * @template {EXPECTED_OBJECT | EXPECTED_OBJECT[]} [T=EXPECTED_OBJECT]
+	 * @param {Schema | (() => Schema)} schema schema
+	 * @param {T} value value
+	 * @param {ValidationErrorConfiguration=} options options
+	 * @param {((value: T) => boolean)=} check options
+	 */
+	validate(schema, value, options, check) {
+		// Avoid validation at all when disabled
+		if (this.options.validate === false) {
+			return;
+		}
+
+		/**
+		 * Returns schema.
+		 * @returns {Schema} schema
+		 */
+		const getSchema = () => {
+			if (typeof schema === "function") {
+				return schema();
+			}
+
+			return schema;
+		};
+
+		// // If we have precompiled schema let's use it
+		if (check) {
+			if (!check(value)) {
+				getValidate()(
+					getSchema(),
+					/** @type {EXPECTED_OBJECT | EXPECTED_OBJECT[]} */
+					(value),
+					options
+				);
+				require("util").deprecate(
+					() => {},
+					"webpack bug: Pre-compiled schema reports error while real schema is happy. This has performance drawbacks.",
+					"DEP_WEBPACK_PRE_COMPILED_SCHEMA_INVALID"
+				)();
+			}
+			return;
+		}
+
+		// Otherwise let's standard validation
+		getValidate()(
+			getSchema(),
+			/** @type {EXPECTED_OBJECT | EXPECTED_OBJECT[]} */ (value),
+			options
+		);
+	}
 }
 
 module.exports = Compiler;

--
Gitblit v1.9.3