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/dependencies/HarmonyExportExpressionDependency.js |   49 ++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 44 insertions(+), 5 deletions(-)

diff --git a/node_modules/webpack/lib/dependencies/HarmonyExportExpressionDependency.js b/node_modules/webpack/lib/dependencies/HarmonyExportExpressionDependency.js
index 531b139..8bd3d0c 100644
--- a/node_modules/webpack/lib/dependencies/HarmonyExportExpressionDependency.js
+++ b/node_modules/webpack/lib/dependencies/HarmonyExportExpressionDependency.js
@@ -6,9 +6,10 @@
 "use strict";
 
 const ConcatenationScope = require("../ConcatenationScope");
+const InitFragment = require("../InitFragment");
 const RuntimeGlobals = require("../RuntimeGlobals");
 const makeSerializable = require("../util/makeSerializable");
-const propertyAccess = require("../util/propertyAccess");
+const { propertyAccess } = require("../util/property");
 const HarmonyExportInitFragment = require("./HarmonyExportInitFragment");
 const NullDependency = require("./NullDependency");
 
@@ -21,9 +22,11 @@
 /** @typedef {import("../javascript/JavascriptParser").Range} Range */
 /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
 /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./HarmonyExportInitFragment").ExportMap} ExportMap */
 
 class HarmonyExportExpressionDependency extends NullDependency {
 	/**
+	 * Creates an instance of HarmonyExportExpressionDependency.
 	 * @param {Range} range range
 	 * @param {Range} rangeStatement range statement
 	 * @param {string} prefix prefix
@@ -35,6 +38,7 @@
 		this.rangeStatement = rangeStatement;
 		this.prefix = prefix;
 		this.declarationId = declarationId;
+		this.isAnonymousDefault = false;
 	}
 
 	get type() {
@@ -56,6 +60,7 @@
 	}
 
 	/**
+	 * Gets module evaluation side effects state.
 	 * @param {ModuleGraph} moduleGraph the module graph
 	 * @returns {ConnectionState} how this dependency connects the module to referencing modules
 	 */
@@ -65,6 +70,7 @@
 	}
 
 	/**
+	 * Serializes this instance into the provided serializer context.
 	 * @param {ObjectSerializerContext} context context
 	 */
 	serialize(context) {
@@ -73,10 +79,12 @@
 		write(this.rangeStatement);
 		write(this.prefix);
 		write(this.declarationId);
+		write(this.isAnonymousDefault);
 		super.serialize(context);
 	}
 
 	/**
+	 * Restores this instance from the provided deserializer context.
 	 * @param {ObjectDeserializerContext} context context
 	 */
 	deserialize(context) {
@@ -85,6 +93,7 @@
 		this.rangeStatement = read();
 		this.prefix = read();
 		this.declarationId = read();
+		this.isAnonymousDefault = read();
 		super.deserialize(context);
 	}
 }
@@ -98,6 +107,7 @@
 	NullDependency.Template
 ) {
 	/**
+	 * Applies the plugin by registering its hooks on the compiler.
 	 * @param {Dependency} dependency the dependency for which the template should be applied
 	 * @param {ReplaceSource} source the current replace source which can be modified
 	 * @param {DependencyTemplateContext} templateContext the context object
@@ -120,6 +130,7 @@
 		const { declarationId } = dep;
 		const exportsName = module.exportsArgument;
 		if (declarationId) {
+			/** @type {string} */
 			let name;
 			if (typeof declarationId === "string") {
 				name = declarationId;
@@ -139,6 +150,7 @@
 					.getExportsInfo(module)
 					.getUsedName("default", runtime);
 				if (used) {
+					/** @type {ExportMap} */
 					const map = new Map();
 					map.set(used, `/* export default binding */ ${name}`);
 					initFragments.push(new HarmonyExportInitFragment(exportsName, map));
@@ -150,10 +162,22 @@
 				dep.range[0] - 1,
 				`/* harmony default export */ ${dep.prefix}`
 			);
+
+			if (typeof declarationId !== "string" && dep.isAnonymousDefault) {
+				// Fix .name for anonymous default export function declarations
+				// see test/test262-cases/test/language/module-code/instn-named-bndng-dflt-fun-anon.js cspell:disable-line
+				initFragments.push(
+					new InitFragment(
+						`Object.defineProperty(${name}, "name", { value: "default", configurable: true });\n`,
+						InitFragment.STAGE_HARMONY_EXPORTS,
+						2
+					)
+				);
+			}
 		} else {
 			/** @type {string} */
 			let content;
-			const name = ConcatenationScope.DEFAULT_EXPORT;
+			let name = ConcatenationScope.DEFAULT_EXPORT;
 			if (runtimeTemplate.supportsConst()) {
 				content = `/* harmony default export */ const ${name} = `;
 				if (concatenationScope) {
@@ -164,6 +188,7 @@
 						.getUsedName("default", runtime);
 					if (used) {
 						runtimeRequirements.add(RuntimeGlobals.exports);
+						/** @type {ExportMap} */
 						const map = new Map();
 						map.set(used, name);
 						initFragments.push(new HarmonyExportInitFragment(exportsName, map));
@@ -181,9 +206,13 @@
 				if (used) {
 					runtimeRequirements.add(RuntimeGlobals.exports);
 					// This is a little bit incorrect as TDZ is not correct, but we can't use const.
-					content = `/* harmony default export */ ${exportsName}${propertyAccess(
+					// No local `__WEBPACK_DEFAULT_EXPORT__` binding is created in this path,
+					// so the anonymous-default `.name` fix-up below must reference the actual
+					// assignment target instead. See issue #20793.
+					name = `${exportsName}${propertyAccess(
 						typeof used === "string" ? [used] : used
-					)} = `;
+					)}`;
+					content = `/* harmony default export */ ${name} = `;
 				} else {
 					content = `/* unused harmony default export */ var ${name} = `;
 				}
@@ -195,7 +224,17 @@
 					dep.range[0] - 1,
 					`${content}(${dep.prefix}`
 				);
-				source.replace(dep.range[1], dep.rangeStatement[1] - 0.5, ");");
+				if (dep.isAnonymousDefault) {
+					// Fix .name for anonymous default export expressions
+					// see test/test262-cases/test/language/module-code/eval-export-dflt-cls-anon.js cspell:disable-line
+					source.replace(
+						dep.range[1],
+						dep.rangeStatement[1] - 0.5,
+						`);\n(Object.getOwnPropertyDescriptor(${name}, "name") || {}).writable || Object.defineProperty(${name}, "name", { value: "default", configurable: true });`
+					);
+				} else {
+					source.replace(dep.range[1], dep.rangeStatement[1] - 0.5, ");");
+				}
 				return;
 			}
 

--
Gitblit v1.9.3