1488 lines
		
	
	
		
			41 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			1488 lines
		
	
	
		
			41 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | |
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | |
| 	Author Tobias Koppers @sokra
 | |
| */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| const ConditionalInitFragment = require("../ConditionalInitFragment");
 | |
| const Dependency = require("../Dependency");
 | |
| const { UsageState } = require("../ExportsInfo");
 | |
| const HarmonyLinkingError = require("../HarmonyLinkingError");
 | |
| const InitFragment = require("../InitFragment");
 | |
| const RuntimeGlobals = require("../RuntimeGlobals");
 | |
| const Template = require("../Template");
 | |
| const {
 | |
| 	getMakeDeferredNamespaceModeFromExportsType
 | |
| } = require("../runtime/MakeDeferredNamespaceObjectRuntime");
 | |
| const { countIterable } = require("../util/IterableHelpers");
 | |
| const { combine, first } = require("../util/SetHelpers");
 | |
| const makeSerializable = require("../util/makeSerializable");
 | |
| const propertyAccess = require("../util/propertyAccess");
 | |
| const { propertyName } = require("../util/propertyName");
 | |
| const {
 | |
| 	filterRuntime,
 | |
| 	getRuntimeKey,
 | |
| 	keyToRuntime
 | |
| } = require("../util/runtime");
 | |
| const HarmonyExportInitFragment = require("./HarmonyExportInitFragment");
 | |
| const HarmonyImportDependency = require("./HarmonyImportDependency");
 | |
| const processExportInfo = require("./processExportInfo");
 | |
| 
 | |
| /** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
 | |
| /** @typedef {import("../ChunkGraph")} ChunkGraph */
 | |
| /** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */
 | |
| /** @typedef {import("../Dependency").GetConditionFn} GetConditionFn */
 | |
| /** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
 | |
| /** @typedef {import("../Dependency").TRANSITIVE} TRANSITIVE */
 | |
| /** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
 | |
| /** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
 | |
| /** @typedef {import("../ExportsInfo")} ExportsInfo */
 | |
| /** @typedef {import("../ExportsInfo").ExportInfo} ExportInfo */
 | |
| /** @typedef {import("../ExportsInfo").UsedName} UsedName */
 | |
| /** @typedef {import("../Generator").GenerateContext} GenerateContext */
 | |
| /** @typedef {import("../Module")} Module */
 | |
| /** @typedef {import("../Module").BuildMeta} BuildMeta */
 | |
| /** @typedef {import("../Module").RuntimeRequirements} RuntimeRequirements */
 | |
| /** @typedef {import("../ModuleGraph")} ModuleGraph */
 | |
| /** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
 | |
| /** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
 | |
| /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
 | |
| /** @typedef {import("../WebpackError")} WebpackError */
 | |
| /** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
 | |
| /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
 | |
| /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
 | |
| /** @typedef {import("../util/Hash")} Hash */
 | |
| /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
 | |
| /** @typedef {import("./HarmonyImportDependency").ExportPresenceMode} ExportPresenceMode */
 | |
| /** @typedef {import("./processExportInfo").ReferencedExports} ReferencedExports */
 | |
| 
 | |
| /** @typedef {"missing"|"unused"|"empty-star"|"reexport-dynamic-default"|"reexport-named-default"|"reexport-namespace-object"|"reexport-fake-namespace-object"|"reexport-undefined"|"normal-reexport"|"dynamic-reexport"} ExportModeType */
 | |
| 
 | |
| const { ExportPresenceModes } = HarmonyImportDependency;
 | |
| 
 | |
| const idsSymbol = Symbol("HarmonyExportImportedSpecifierDependency.ids");
 | |
| 
 | |
| class NormalReexportItem {
 | |
| 	/**
 | |
| 	 * @param {string} name export name
 | |
| 	 * @param {string[]} ids reexported ids from other module
 | |
| 	 * @param {ExportInfo} exportInfo export info from other module
 | |
| 	 * @param {boolean} checked true, if it should be checked at runtime if this export exists
 | |
| 	 * @param {boolean} hidden true, if it is hidden behind another active export in the same module
 | |
| 	 */
 | |
| 	constructor(name, ids, exportInfo, checked, hidden) {
 | |
| 		this.name = name;
 | |
| 		this.ids = ids;
 | |
| 		this.exportInfo = exportInfo;
 | |
| 		this.checked = checked;
 | |
| 		this.hidden = hidden;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /** @typedef {Set<string>} ExportModeIgnored */
 | |
| /** @typedef {Set<string>} ExportModeHidden */
 | |
| 
 | |
| class ExportMode {
 | |
| 	/**
 | |
| 	 * @param {ExportModeType} type type of the mode
 | |
| 	 */
 | |
| 	constructor(type) {
 | |
| 		/** @type {ExportModeType} */
 | |
| 		this.type = type;
 | |
| 
 | |
| 		// for "normal-reexport":
 | |
| 		/** @type {NormalReexportItem[] | null} */
 | |
| 		this.items = null;
 | |
| 
 | |
| 		// for "reexport-named-default" | "reexport-fake-namespace-object" | "reexport-namespace-object"
 | |
| 		/** @type {string | null} */
 | |
| 		this.name = null;
 | |
| 		/** @type {ExportInfo | null} */
 | |
| 		this.partialNamespaceExportInfo = null;
 | |
| 
 | |
| 		// for "dynamic-reexport":
 | |
| 		/** @type {ExportModeIgnored | null} */
 | |
| 		this.ignored = null;
 | |
| 
 | |
| 		// for "dynamic-reexport" | "empty-star":
 | |
| 		/** @type {ExportModeHidden | undefined | null} */
 | |
| 		this.hidden = null;
 | |
| 
 | |
| 		// for "missing":
 | |
| 		/** @type {string | null} */
 | |
| 		this.userRequest = null;
 | |
| 
 | |
| 		// for "reexport-fake-namespace-object":
 | |
| 		/** @type {number} */
 | |
| 		this.fakeType = 0;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /** @typedef {string[]} Names */
 | |
| /** @typedef {number[]} DependencyIndices */
 | |
| 
 | |
| /**
 | |
|  * @param {ModuleGraph} moduleGraph module graph
 | |
|  * @param {ReadonlyArray<HarmonyExportImportedSpecifierDependency>} dependencies dependencies
 | |
|  * @param {TODO=} additionalDependency additional dependency
 | |
|  * @returns {{ names: Names, dependencyIndices: DependencyIndices }} result
 | |
|  */
 | |
| const determineExportAssignments = (
 | |
| 	moduleGraph,
 | |
| 	dependencies,
 | |
| 	additionalDependency
 | |
| ) => {
 | |
| 	/** @type {Set<string>} */
 | |
| 	const names = new Set();
 | |
| 	/** @type {number[]} */
 | |
| 	const dependencyIndices = [];
 | |
| 
 | |
| 	if (additionalDependency) {
 | |
| 		dependencies = [...dependencies, additionalDependency];
 | |
| 	}
 | |
| 
 | |
| 	for (const dep of dependencies) {
 | |
| 		const i = dependencyIndices.length;
 | |
| 		dependencyIndices[i] = names.size;
 | |
| 		const otherImportedModule = moduleGraph.getModule(dep);
 | |
| 		if (otherImportedModule) {
 | |
| 			const exportsInfo = moduleGraph.getExportsInfo(otherImportedModule);
 | |
| 			for (const exportInfo of exportsInfo.exports) {
 | |
| 				if (
 | |
| 					exportInfo.provided === true &&
 | |
| 					exportInfo.name !== "default" &&
 | |
| 					!names.has(exportInfo.name)
 | |
| 				) {
 | |
| 					names.add(exportInfo.name);
 | |
| 					dependencyIndices[i] = names.size;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	dependencyIndices.push(names.size);
 | |
| 
 | |
| 	return { names: [...names], dependencyIndices };
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * @param {object} options options
 | |
|  * @param {Names} options.names names
 | |
|  * @param {DependencyIndices} options.dependencyIndices dependency indices
 | |
|  * @param {string} name name
 | |
|  * @param {ReadonlyArray<HarmonyExportImportedSpecifierDependency>} dependencies dependencies
 | |
|  * @returns {HarmonyExportImportedSpecifierDependency | undefined} found dependency or nothing
 | |
|  */
 | |
| const findDependencyForName = (
 | |
| 	{ names, dependencyIndices },
 | |
| 	name,
 | |
| 	dependencies
 | |
| ) => {
 | |
| 	const dependenciesIt = dependencies[Symbol.iterator]();
 | |
| 	const dependencyIndicesIt = dependencyIndices[Symbol.iterator]();
 | |
| 	let dependenciesItResult = dependenciesIt.next();
 | |
| 	let dependencyIndicesItResult = dependencyIndicesIt.next();
 | |
| 	if (dependencyIndicesItResult.done) return;
 | |
| 	for (let i = 0; i < names.length; i++) {
 | |
| 		while (i >= dependencyIndicesItResult.value) {
 | |
| 			dependenciesItResult = dependenciesIt.next();
 | |
| 			dependencyIndicesItResult = dependencyIndicesIt.next();
 | |
| 			if (dependencyIndicesItResult.done) return;
 | |
| 		}
 | |
| 		if (names[i] === name) return dependenciesItResult.value;
 | |
| 	}
 | |
| 	return undefined;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * @param {ModuleGraph} moduleGraph the module graph
 | |
|  * @param {HarmonyExportImportedSpecifierDependency} dep the dependency
 | |
|  * @param {string} runtimeKey the runtime key
 | |
|  * @returns {ExportMode} the export mode
 | |
|  */
 | |
| const getMode = (moduleGraph, dep, runtimeKey) => {
 | |
| 	const importedModule = moduleGraph.getModule(dep);
 | |
| 
 | |
| 	if (!importedModule) {
 | |
| 		const mode = new ExportMode("missing");
 | |
| 
 | |
| 		mode.userRequest = dep.userRequest;
 | |
| 
 | |
| 		return mode;
 | |
| 	}
 | |
| 
 | |
| 	const name = dep.name;
 | |
| 	const runtime = keyToRuntime(runtimeKey);
 | |
| 	const parentModule = /** @type {Module} */ (moduleGraph.getParentModule(dep));
 | |
| 	const exportsInfo = moduleGraph.getExportsInfo(parentModule);
 | |
| 
 | |
| 	if (
 | |
| 		name
 | |
| 			? exportsInfo.getUsed(name, runtime) === UsageState.Unused
 | |
| 			: exportsInfo.isUsed(runtime) === false
 | |
| 	) {
 | |
| 		const mode = new ExportMode("unused");
 | |
| 
 | |
| 		mode.name = name || "*";
 | |
| 
 | |
| 		return mode;
 | |
| 	}
 | |
| 
 | |
| 	const importedExportsType = importedModule.getExportsType(
 | |
| 		moduleGraph,
 | |
| 		/** @type {BuildMeta} */
 | |
| 		(parentModule.buildMeta).strictHarmonyModule
 | |
| 	);
 | |
| 
 | |
| 	const ids = dep.getIds(moduleGraph);
 | |
| 
 | |
| 	// Special handling for reexporting the default export
 | |
| 	// from non-namespace modules
 | |
| 	if (name && ids.length > 0 && ids[0] === "default") {
 | |
| 		switch (importedExportsType) {
 | |
| 			case "dynamic": {
 | |
| 				const mode = new ExportMode("reexport-dynamic-default");
 | |
| 
 | |
| 				mode.name = name;
 | |
| 
 | |
| 				return mode;
 | |
| 			}
 | |
| 			case "default-only":
 | |
| 			case "default-with-named": {
 | |
| 				const exportInfo = exportsInfo.getReadOnlyExportInfo(name);
 | |
| 				const mode = new ExportMode("reexport-named-default");
 | |
| 
 | |
| 				mode.name = name;
 | |
| 				mode.partialNamespaceExportInfo = exportInfo;
 | |
| 
 | |
| 				return mode;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// reexporting with a fixed name
 | |
| 	if (name) {
 | |
| 		let mode;
 | |
| 		const exportInfo = exportsInfo.getReadOnlyExportInfo(name);
 | |
| 
 | |
| 		if (ids.length > 0) {
 | |
| 			// export { name as name }
 | |
| 			switch (importedExportsType) {
 | |
| 				case "default-only":
 | |
| 					mode = new ExportMode("reexport-undefined");
 | |
| 					mode.name = name;
 | |
| 					break;
 | |
| 				default:
 | |
| 					mode = new ExportMode("normal-reexport");
 | |
| 					mode.items = [
 | |
| 						new NormalReexportItem(name, ids, exportInfo, false, false)
 | |
| 					];
 | |
| 					break;
 | |
| 			}
 | |
| 		} else {
 | |
| 			// export * as name
 | |
| 			switch (importedExportsType) {
 | |
| 				case "default-only":
 | |
| 					mode = new ExportMode("reexport-fake-namespace-object");
 | |
| 					mode.name = name;
 | |
| 					mode.partialNamespaceExportInfo = exportInfo;
 | |
| 					mode.fakeType = 0;
 | |
| 					break;
 | |
| 				case "default-with-named":
 | |
| 					mode = new ExportMode("reexport-fake-namespace-object");
 | |
| 					mode.name = name;
 | |
| 					mode.partialNamespaceExportInfo = exportInfo;
 | |
| 					mode.fakeType = 2;
 | |
| 					break;
 | |
| 				case "dynamic":
 | |
| 				default:
 | |
| 					mode = new ExportMode("reexport-namespace-object");
 | |
| 					mode.name = name;
 | |
| 					mode.partialNamespaceExportInfo = exportInfo;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return mode;
 | |
| 	}
 | |
| 
 | |
| 	// Star reexporting
 | |
| 	const { ignoredExports, exports, checked, hidden } = dep.getStarReexports(
 | |
| 		moduleGraph,
 | |
| 		runtime,
 | |
| 		exportsInfo,
 | |
| 		importedModule
 | |
| 	);
 | |
| 	if (!exports) {
 | |
| 		// We have too few info about the modules
 | |
| 		// Delegate the logic to the runtime code
 | |
| 
 | |
| 		const mode = new ExportMode("dynamic-reexport");
 | |
| 		mode.ignored = ignoredExports;
 | |
| 		mode.hidden = hidden;
 | |
| 
 | |
| 		return mode;
 | |
| 	}
 | |
| 
 | |
| 	if (exports.size === 0) {
 | |
| 		const mode = new ExportMode("empty-star");
 | |
| 		mode.hidden = hidden;
 | |
| 
 | |
| 		return mode;
 | |
| 	}
 | |
| 
 | |
| 	const mode = new ExportMode("normal-reexport");
 | |
| 
 | |
| 	mode.items = Array.from(
 | |
| 		exports,
 | |
| 		(exportName) =>
 | |
| 			new NormalReexportItem(
 | |
| 				exportName,
 | |
| 				[exportName],
 | |
| 				exportsInfo.getReadOnlyExportInfo(exportName),
 | |
| 				/** @type {Set<string>} */
 | |
| 				(checked).has(exportName),
 | |
| 				false
 | |
| 			)
 | |
| 	);
 | |
| 	if (hidden !== undefined) {
 | |
| 		for (const exportName of hidden) {
 | |
| 			mode.items.push(
 | |
| 				new NormalReexportItem(
 | |
| 					exportName,
 | |
| 					[exportName],
 | |
| 					exportsInfo.getReadOnlyExportInfo(exportName),
 | |
| 					false,
 | |
| 					true
 | |
| 				)
 | |
| 			);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return mode;
 | |
| };
 | |
| 
 | |
| /** @typedef {string[]} Ids */
 | |
| /** @typedef {Set<string>} Exports */
 | |
| /** @typedef {Set<string>} Checked */
 | |
| /** @typedef {Set<string>} Hidden */
 | |
| /** @typedef {Set<string>} IgnoredExports */
 | |
| 
 | |
| class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
 | |
| 	/**
 | |
| 	 * @param {string} request the request string
 | |
| 	 * @param {number} sourceOrder the order in the original source file
 | |
| 	 * @param {Ids} ids the requested export name of the imported module
 | |
| 	 * @param {string | null} name the export name of for this module
 | |
| 	 * @param {Set<string>} activeExports other named exports in the module
 | |
| 	 * @param {ReadonlyArray<HarmonyExportImportedSpecifierDependency> | null} otherStarExports other star exports in the module before this import
 | |
| 	 * @param {ExportPresenceMode} exportPresenceMode mode of checking export names
 | |
| 	 * @param {HarmonyStarExportsList | null} allStarExports all star exports in the module
 | |
| 	 * @param {ImportAttributes=} attributes import attributes
 | |
| 	 * @param {boolean=} defer is defer phase
 | |
| 	 */
 | |
| 	constructor(
 | |
| 		request,
 | |
| 		sourceOrder,
 | |
| 		ids,
 | |
| 		name,
 | |
| 		activeExports,
 | |
| 		otherStarExports,
 | |
| 		exportPresenceMode,
 | |
| 		allStarExports,
 | |
| 		attributes,
 | |
| 		defer
 | |
| 	) {
 | |
| 		super(request, sourceOrder, attributes, defer);
 | |
| 
 | |
| 		this.ids = ids;
 | |
| 		this.name = name;
 | |
| 		this.activeExports = activeExports;
 | |
| 		this.otherStarExports = otherStarExports;
 | |
| 		this.exportPresenceMode = exportPresenceMode;
 | |
| 		this.allStarExports = allStarExports;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @returns {boolean | TRANSITIVE} true, when changes to the referenced module could affect the referencing module; TRANSITIVE, when changes to the referenced module could affect referencing modules of the referencing module
 | |
| 	 */
 | |
| 	couldAffectReferencingModule() {
 | |
| 		return Dependency.TRANSITIVE;
 | |
| 	}
 | |
| 
 | |
| 	// TODO webpack 6 remove
 | |
| 	get id() {
 | |
| 		throw new Error("id was renamed to ids and type changed to string[]");
 | |
| 	}
 | |
| 
 | |
| 	// TODO webpack 6 remove
 | |
| 	getId() {
 | |
| 		throw new Error("id was renamed to ids and type changed to string[]");
 | |
| 	}
 | |
| 
 | |
| 	// TODO webpack 6 remove
 | |
| 	setId() {
 | |
| 		throw new Error("id was renamed to ids and type changed to string[]");
 | |
| 	}
 | |
| 
 | |
| 	get type() {
 | |
| 		return "harmony export imported specifier";
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {ModuleGraph} moduleGraph the module graph
 | |
| 	 * @returns {Ids} the imported id
 | |
| 	 */
 | |
| 	getIds(moduleGraph) {
 | |
| 		return moduleGraph.getMeta(this)[idsSymbol] || this.ids;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {ModuleGraph} moduleGraph the module graph
 | |
| 	 * @param {Ids} ids the imported ids
 | |
| 	 * @returns {void}
 | |
| 	 */
 | |
| 	setIds(moduleGraph, ids) {
 | |
| 		moduleGraph.getMeta(this)[idsSymbol] = ids;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {ModuleGraph} moduleGraph the module graph
 | |
| 	 * @param {RuntimeSpec} runtime the runtime
 | |
| 	 * @returns {ExportMode} the export mode
 | |
| 	 */
 | |
| 	getMode(moduleGraph, runtime) {
 | |
| 		return moduleGraph.dependencyCacheProvide(
 | |
| 			this,
 | |
| 			getRuntimeKey(runtime),
 | |
| 			getMode
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {ModuleGraph} moduleGraph the module graph
 | |
| 	 * @param {RuntimeSpec} runtime the runtime
 | |
| 	 * @param {ExportsInfo} exportsInfo exports info about the current module (optional)
 | |
| 	 * @param {Module} importedModule the imported module (optional)
 | |
| 	 * @returns {{exports?: Exports, checked?: Checked, ignoredExports: IgnoredExports, hidden?: Hidden}} information
 | |
| 	 */
 | |
| 	getStarReexports(
 | |
| 		moduleGraph,
 | |
| 		runtime,
 | |
| 		exportsInfo = moduleGraph.getExportsInfo(
 | |
| 			/** @type {Module} */ (moduleGraph.getParentModule(this))
 | |
| 		),
 | |
| 		importedModule = /** @type {Module} */ (moduleGraph.getModule(this))
 | |
| 	) {
 | |
| 		const importedExportsInfo = moduleGraph.getExportsInfo(importedModule);
 | |
| 		const noExtraExports =
 | |
| 			importedExportsInfo.otherExportsInfo.provided === false;
 | |
| 		const noExtraImports =
 | |
| 			exportsInfo.otherExportsInfo.getUsed(runtime) === UsageState.Unused;
 | |
| 
 | |
| 		const ignoredExports = new Set(["default", ...this.activeExports]);
 | |
| 
 | |
| 		let hiddenExports;
 | |
| 		const otherStarExports =
 | |
| 			this._discoverActiveExportsFromOtherStarExports(moduleGraph);
 | |
| 		if (otherStarExports !== undefined) {
 | |
| 			hiddenExports = new Set();
 | |
| 			for (let i = 0; i < otherStarExports.namesSlice; i++) {
 | |
| 				hiddenExports.add(otherStarExports.names[i]);
 | |
| 			}
 | |
| 			for (const e of ignoredExports) hiddenExports.delete(e);
 | |
| 		}
 | |
| 
 | |
| 		if (!noExtraExports && !noExtraImports) {
 | |
| 			return {
 | |
| 				ignoredExports,
 | |
| 				hidden: hiddenExports
 | |
| 			};
 | |
| 		}
 | |
| 
 | |
| 		/** @type {Exports} */
 | |
| 		const exports = new Set();
 | |
| 		/** @type {Checked} */
 | |
| 		const checked = new Set();
 | |
| 		/** @type {Hidden | undefined} */
 | |
| 		const hidden = hiddenExports !== undefined ? new Set() : undefined;
 | |
| 
 | |
| 		if (noExtraImports) {
 | |
| 			for (const exportInfo of exportsInfo.orderedExports) {
 | |
| 				const name = exportInfo.name;
 | |
| 				if (ignoredExports.has(name)) continue;
 | |
| 				if (exportInfo.getUsed(runtime) === UsageState.Unused) continue;
 | |
| 				const importedExportInfo =
 | |
| 					importedExportsInfo.getReadOnlyExportInfo(name);
 | |
| 				if (importedExportInfo.provided === false) continue;
 | |
| 				if (hiddenExports !== undefined && hiddenExports.has(name)) {
 | |
| 					/** @type {Set<string>} */
 | |
| 					(hidden).add(name);
 | |
| 					continue;
 | |
| 				}
 | |
| 				exports.add(name);
 | |
| 				if (importedExportInfo.provided === true) continue;
 | |
| 				checked.add(name);
 | |
| 			}
 | |
| 		} else if (noExtraExports) {
 | |
| 			for (const importedExportInfo of importedExportsInfo.orderedExports) {
 | |
| 				const name = importedExportInfo.name;
 | |
| 				if (ignoredExports.has(name)) continue;
 | |
| 				if (importedExportInfo.provided === false) continue;
 | |
| 				const exportInfo = exportsInfo.getReadOnlyExportInfo(name);
 | |
| 				if (exportInfo.getUsed(runtime) === UsageState.Unused) continue;
 | |
| 				if (hiddenExports !== undefined && hiddenExports.has(name)) {
 | |
| 					/** @type {ExportModeHidden} */
 | |
| 					(hidden).add(name);
 | |
| 					continue;
 | |
| 				}
 | |
| 				exports.add(name);
 | |
| 				if (importedExportInfo.provided === true) continue;
 | |
| 				checked.add(name);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return { ignoredExports, exports, checked, hidden };
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {ModuleGraph} moduleGraph module graph
 | |
| 	 * @returns {null | false | GetConditionFn} function to determine if the connection is active
 | |
| 	 */
 | |
| 	getCondition(moduleGraph) {
 | |
| 		return (connection, runtime) => {
 | |
| 			const mode = this.getMode(moduleGraph, runtime);
 | |
| 			return mode.type !== "unused" && mode.type !== "empty-star";
 | |
| 		};
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {ModuleGraph} moduleGraph the module graph
 | |
| 	 * @returns {ConnectionState} how this dependency connects the module to referencing modules
 | |
| 	 */
 | |
| 	getModuleEvaluationSideEffectsState(moduleGraph) {
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns list of exports referenced by this dependency
 | |
| 	 * @param {ModuleGraph} moduleGraph module graph
 | |
| 	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
 | |
| 	 * @returns {(string[] | ReferencedExport)[]} referenced exports
 | |
| 	 */
 | |
| 	getReferencedExports(moduleGraph, runtime) {
 | |
| 		const mode = this.getMode(moduleGraph, runtime);
 | |
| 
 | |
| 		switch (mode.type) {
 | |
| 			case "missing":
 | |
| 			case "unused":
 | |
| 			case "empty-star":
 | |
| 			case "reexport-undefined":
 | |
| 				return Dependency.NO_EXPORTS_REFERENCED;
 | |
| 
 | |
| 			case "reexport-dynamic-default":
 | |
| 				return Dependency.EXPORTS_OBJECT_REFERENCED;
 | |
| 
 | |
| 			case "reexport-named-default": {
 | |
| 				if (!mode.partialNamespaceExportInfo) {
 | |
| 					return Dependency.EXPORTS_OBJECT_REFERENCED;
 | |
| 				}
 | |
| 				/** @type {ReferencedExports} */
 | |
| 				const referencedExports = [];
 | |
| 				processExportInfo(
 | |
| 					runtime,
 | |
| 					referencedExports,
 | |
| 					[],
 | |
| 					/** @type {ExportInfo} */ (mode.partialNamespaceExportInfo)
 | |
| 				);
 | |
| 				return referencedExports;
 | |
| 			}
 | |
| 
 | |
| 			case "reexport-namespace-object":
 | |
| 			case "reexport-fake-namespace-object": {
 | |
| 				if (!mode.partialNamespaceExportInfo) {
 | |
| 					return Dependency.EXPORTS_OBJECT_REFERENCED;
 | |
| 				}
 | |
| 				/** @type {ReferencedExports} */
 | |
| 				const referencedExports = [];
 | |
| 				processExportInfo(
 | |
| 					runtime,
 | |
| 					referencedExports,
 | |
| 					[],
 | |
| 					/** @type {ExportInfo} */ (mode.partialNamespaceExportInfo),
 | |
| 					mode.type === "reexport-fake-namespace-object"
 | |
| 				);
 | |
| 				return referencedExports;
 | |
| 			}
 | |
| 
 | |
| 			case "dynamic-reexport":
 | |
| 				return Dependency.EXPORTS_OBJECT_REFERENCED;
 | |
| 
 | |
| 			case "normal-reexport": {
 | |
| 				/** @type {ReferencedExports} */
 | |
| 				const referencedExports = [];
 | |
| 				for (const {
 | |
| 					ids,
 | |
| 					exportInfo,
 | |
| 					hidden
 | |
| 				} of /** @type {NormalReexportItem[]} */ (mode.items)) {
 | |
| 					if (hidden) continue;
 | |
| 					processExportInfo(runtime, referencedExports, ids, exportInfo, false);
 | |
| 				}
 | |
| 				return referencedExports;
 | |
| 			}
 | |
| 
 | |
| 			default:
 | |
| 				throw new Error(`Unknown mode ${mode.type}`);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {ModuleGraph} moduleGraph the module graph
 | |
| 	 * @returns {{ names: Names, namesSlice: number, dependencyIndices: DependencyIndices, dependencyIndex: number } | undefined} exported names and their origin dependency
 | |
| 	 */
 | |
| 	_discoverActiveExportsFromOtherStarExports(moduleGraph) {
 | |
| 		if (!this.otherStarExports) return;
 | |
| 
 | |
| 		const i =
 | |
| 			"length" in this.otherStarExports
 | |
| 				? this.otherStarExports.length
 | |
| 				: countIterable(this.otherStarExports);
 | |
| 		if (i === 0) return;
 | |
| 
 | |
| 		if (this.allStarExports) {
 | |
| 			const { names, dependencyIndices } = moduleGraph.cached(
 | |
| 				determineExportAssignments,
 | |
| 				this.allStarExports.dependencies
 | |
| 			);
 | |
| 
 | |
| 			return {
 | |
| 				names,
 | |
| 				namesSlice: dependencyIndices[i - 1],
 | |
| 				dependencyIndices,
 | |
| 				dependencyIndex: i
 | |
| 			};
 | |
| 		}
 | |
| 
 | |
| 		const { names, dependencyIndices } = moduleGraph.cached(
 | |
| 			determineExportAssignments,
 | |
| 			/** @type {HarmonyExportImportedSpecifierDependency[]} */
 | |
| 			(this.otherStarExports),
 | |
| 			this
 | |
| 		);
 | |
| 
 | |
| 		return {
 | |
| 			names,
 | |
| 			namesSlice: dependencyIndices[i - 1],
 | |
| 			dependencyIndices,
 | |
| 			dependencyIndex: i
 | |
| 		};
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns the exported names
 | |
| 	 * @param {ModuleGraph} moduleGraph module graph
 | |
| 	 * @returns {ExportsSpec | undefined} export names
 | |
| 	 */
 | |
| 	getExports(moduleGraph) {
 | |
| 		const mode = this.getMode(moduleGraph, undefined);
 | |
| 
 | |
| 		switch (mode.type) {
 | |
| 			case "missing":
 | |
| 				return;
 | |
| 			case "dynamic-reexport": {
 | |
| 				const from =
 | |
| 					/** @type {ModuleGraphConnection} */
 | |
| 					(moduleGraph.getConnection(this));
 | |
| 				return {
 | |
| 					exports: true,
 | |
| 					from,
 | |
| 					canMangle: false,
 | |
| 					excludeExports: mode.hidden
 | |
| 						? combine(
 | |
| 								/** @type {ExportModeIgnored} */ (mode.ignored),
 | |
| 								mode.hidden
 | |
| 							)
 | |
| 						: /** @type {ExportModeIgnored} */ (mode.ignored),
 | |
| 					hideExports: mode.hidden,
 | |
| 					dependencies: [from.module]
 | |
| 				};
 | |
| 			}
 | |
| 			case "empty-star":
 | |
| 				return {
 | |
| 					exports: [],
 | |
| 					hideExports: mode.hidden,
 | |
| 					dependencies: [/** @type {Module} */ (moduleGraph.getModule(this))]
 | |
| 				};
 | |
| 			// falls through
 | |
| 			case "normal-reexport": {
 | |
| 				const from =
 | |
| 					/** @type {ModuleGraphConnection} */
 | |
| 					(moduleGraph.getConnection(this));
 | |
| 				return {
 | |
| 					exports: Array.from(
 | |
| 						/** @type {NormalReexportItem[]} */ (mode.items),
 | |
| 						(item) => ({
 | |
| 							name: item.name,
 | |
| 							from,
 | |
| 							export: item.ids,
 | |
| 							hidden: item.hidden
 | |
| 						})
 | |
| 					),
 | |
| 					priority: 1,
 | |
| 					dependencies: [from.module]
 | |
| 				};
 | |
| 			}
 | |
| 			case "reexport-dynamic-default": {
 | |
| 				const from =
 | |
| 					/** @type {ModuleGraphConnection} */
 | |
| 					(moduleGraph.getConnection(this));
 | |
| 				return {
 | |
| 					exports: [
 | |
| 						{
 | |
| 							name: /** @type {string} */ (mode.name),
 | |
| 							from,
 | |
| 							export: ["default"]
 | |
| 						}
 | |
| 					],
 | |
| 					priority: 1,
 | |
| 					dependencies: [from.module]
 | |
| 				};
 | |
| 			}
 | |
| 			case "reexport-undefined":
 | |
| 				return {
 | |
| 					exports: [/** @type {string} */ (mode.name)],
 | |
| 					dependencies: [/** @type {Module} */ (moduleGraph.getModule(this))]
 | |
| 				};
 | |
| 			case "reexport-fake-namespace-object": {
 | |
| 				const from =
 | |
| 					/** @type {ModuleGraphConnection} */
 | |
| 					(moduleGraph.getConnection(this));
 | |
| 				return {
 | |
| 					exports: [
 | |
| 						{
 | |
| 							name: /** @type {string} */ (mode.name),
 | |
| 							from,
 | |
| 							export: null,
 | |
| 							exports: [
 | |
| 								{
 | |
| 									name: "default",
 | |
| 									canMangle: false,
 | |
| 									from,
 | |
| 									export: null
 | |
| 								}
 | |
| 							]
 | |
| 						}
 | |
| 					],
 | |
| 					priority: 1,
 | |
| 					dependencies: [from.module]
 | |
| 				};
 | |
| 			}
 | |
| 			case "reexport-namespace-object": {
 | |
| 				const from =
 | |
| 					/** @type {ModuleGraphConnection} */
 | |
| 					(moduleGraph.getConnection(this));
 | |
| 				return {
 | |
| 					exports: [
 | |
| 						{
 | |
| 							name: /** @type {string} */ (mode.name),
 | |
| 							from,
 | |
| 							export: null
 | |
| 						}
 | |
| 					],
 | |
| 					priority: 1,
 | |
| 					dependencies: [from.module]
 | |
| 				};
 | |
| 			}
 | |
| 			case "reexport-named-default": {
 | |
| 				const from =
 | |
| 					/** @type {ModuleGraphConnection} */
 | |
| 					(moduleGraph.getConnection(this));
 | |
| 				return {
 | |
| 					exports: [
 | |
| 						{
 | |
| 							name: /** @type {string} */ (mode.name),
 | |
| 							from,
 | |
| 							export: ["default"]
 | |
| 						}
 | |
| 					],
 | |
| 					priority: 1,
 | |
| 					dependencies: [from.module]
 | |
| 				};
 | |
| 			}
 | |
| 			default:
 | |
| 				throw new Error(`Unknown mode ${mode.type}`);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {ModuleGraph} moduleGraph module graph
 | |
| 	 * @returns {ExportPresenceMode} effective mode
 | |
| 	 */
 | |
| 	_getEffectiveExportPresenceLevel(moduleGraph) {
 | |
| 		if (this.exportPresenceMode !== ExportPresenceModes.AUTO) {
 | |
| 			return this.exportPresenceMode;
 | |
| 		}
 | |
| 		const module = /** @type {Module} */ (moduleGraph.getParentModule(this));
 | |
| 		return /** @type {BuildMeta} */ (module.buildMeta).strictHarmonyModule
 | |
| 			? ExportPresenceModes.ERROR
 | |
| 			: ExportPresenceModes.WARN;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns warnings
 | |
| 	 * @param {ModuleGraph} moduleGraph module graph
 | |
| 	 * @returns {WebpackError[] | null | undefined} warnings
 | |
| 	 */
 | |
| 	getWarnings(moduleGraph) {
 | |
| 		const exportsPresence = this._getEffectiveExportPresenceLevel(moduleGraph);
 | |
| 		if (exportsPresence === ExportPresenceModes.WARN) {
 | |
| 			return this._getErrors(moduleGraph);
 | |
| 		}
 | |
| 		return null;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Returns errors
 | |
| 	 * @param {ModuleGraph} moduleGraph module graph
 | |
| 	 * @returns {WebpackError[] | null | undefined} errors
 | |
| 	 */
 | |
| 	getErrors(moduleGraph) {
 | |
| 		const exportsPresence = this._getEffectiveExportPresenceLevel(moduleGraph);
 | |
| 		if (exportsPresence === ExportPresenceModes.ERROR) {
 | |
| 			return this._getErrors(moduleGraph);
 | |
| 		}
 | |
| 		return null;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {ModuleGraph} moduleGraph module graph
 | |
| 	 * @returns {WebpackError[] | undefined} errors
 | |
| 	 */
 | |
| 	_getErrors(moduleGraph) {
 | |
| 		const ids = this.getIds(moduleGraph);
 | |
| 		let errors = this.getLinkingErrors(
 | |
| 			moduleGraph,
 | |
| 			ids,
 | |
| 			`(reexported as '${this.name}')`
 | |
| 		);
 | |
| 		if (ids.length === 0 && this.name === null) {
 | |
| 			const potentialConflicts =
 | |
| 				this._discoverActiveExportsFromOtherStarExports(moduleGraph);
 | |
| 			if (potentialConflicts && potentialConflicts.namesSlice > 0) {
 | |
| 				const ownNames = new Set(
 | |
| 					potentialConflicts.names.slice(
 | |
| 						potentialConflicts.namesSlice,
 | |
| 						potentialConflicts.dependencyIndices[
 | |
| 							potentialConflicts.dependencyIndex
 | |
| 						]
 | |
| 					)
 | |
| 				);
 | |
| 				const importedModule = moduleGraph.getModule(this);
 | |
| 				if (importedModule) {
 | |
| 					const exportsInfo = moduleGraph.getExportsInfo(importedModule);
 | |
| 					/** @type {Map<string, string[]>} */
 | |
| 					const conflicts = new Map();
 | |
| 					for (const exportInfo of exportsInfo.orderedExports) {
 | |
| 						if (exportInfo.provided !== true) continue;
 | |
| 						if (exportInfo.name === "default") continue;
 | |
| 						if (this.activeExports.has(exportInfo.name)) continue;
 | |
| 						if (ownNames.has(exportInfo.name)) continue;
 | |
| 						const conflictingDependency = findDependencyForName(
 | |
| 							potentialConflicts,
 | |
| 							exportInfo.name,
 | |
| 							this.allStarExports
 | |
| 								? this.allStarExports.dependencies
 | |
| 								: [
 | |
| 										.../** @type {ReadonlyArray<HarmonyExportImportedSpecifierDependency>} */
 | |
| 										(this.otherStarExports),
 | |
| 										this
 | |
| 									]
 | |
| 						);
 | |
| 						if (!conflictingDependency) continue;
 | |
| 						const target = exportInfo.getTerminalBinding(moduleGraph);
 | |
| 						if (!target) continue;
 | |
| 						const conflictingModule =
 | |
| 							/** @type {Module} */
 | |
| 							(moduleGraph.getModule(conflictingDependency));
 | |
| 						if (conflictingModule === importedModule) continue;
 | |
| 						const conflictingExportInfo = moduleGraph.getExportInfo(
 | |
| 							conflictingModule,
 | |
| 							exportInfo.name
 | |
| 						);
 | |
| 						const conflictingTarget =
 | |
| 							conflictingExportInfo.getTerminalBinding(moduleGraph);
 | |
| 						if (!conflictingTarget) continue;
 | |
| 						if (target === conflictingTarget) continue;
 | |
| 						const list = conflicts.get(conflictingDependency.request);
 | |
| 						if (list === undefined) {
 | |
| 							conflicts.set(conflictingDependency.request, [exportInfo.name]);
 | |
| 						} else {
 | |
| 							list.push(exportInfo.name);
 | |
| 						}
 | |
| 					}
 | |
| 					for (const [request, exports] of conflicts) {
 | |
| 						if (!errors) errors = [];
 | |
| 						errors.push(
 | |
| 							new HarmonyLinkingError(
 | |
| 								`The requested module '${
 | |
| 									this.request
 | |
| 								}' contains conflicting star exports for the ${
 | |
| 									exports.length > 1 ? "names" : "name"
 | |
| 								} ${exports
 | |
| 									.map((e) => `'${e}'`)
 | |
| 									.join(", ")} with the previous requested module '${request}'`
 | |
| 							)
 | |
| 						);
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		return errors;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {ObjectSerializerContext} context context
 | |
| 	 */
 | |
| 	serialize(context) {
 | |
| 		const { write, setCircularReference } = context;
 | |
| 
 | |
| 		setCircularReference(this);
 | |
| 		write(this.ids);
 | |
| 		write(this.name);
 | |
| 		write(this.activeExports);
 | |
| 		write(this.otherStarExports);
 | |
| 		write(this.exportPresenceMode);
 | |
| 		write(this.allStarExports);
 | |
| 
 | |
| 		super.serialize(context);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {ObjectDeserializerContext} context context
 | |
| 	 */
 | |
| 	deserialize(context) {
 | |
| 		const { read, setCircularReference } = context;
 | |
| 
 | |
| 		setCircularReference(this);
 | |
| 		this.ids = read();
 | |
| 		this.name = read();
 | |
| 		this.activeExports = read();
 | |
| 		this.otherStarExports = read();
 | |
| 		this.exportPresenceMode = read();
 | |
| 		this.allStarExports = read();
 | |
| 
 | |
| 		super.deserialize(context);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| makeSerializable(
 | |
| 	HarmonyExportImportedSpecifierDependency,
 | |
| 	"webpack/lib/dependencies/HarmonyExportImportedSpecifierDependency"
 | |
| );
 | |
| 
 | |
| module.exports = HarmonyExportImportedSpecifierDependency;
 | |
| 
 | |
| HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedSpecifierDependencyTemplate extends (
 | |
| 	HarmonyImportDependency.Template
 | |
| ) {
 | |
| 	/**
 | |
| 	 * @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
 | |
| 	 * @returns {void}
 | |
| 	 */
 | |
| 	apply(dependency, source, templateContext) {
 | |
| 		const { moduleGraph, runtime, concatenationScope } = templateContext;
 | |
| 
 | |
| 		const dep = /** @type {HarmonyExportImportedSpecifierDependency} */ (
 | |
| 			dependency
 | |
| 		);
 | |
| 
 | |
| 		const mode = dep.getMode(moduleGraph, runtime);
 | |
| 
 | |
| 		if (concatenationScope) {
 | |
| 			switch (mode.type) {
 | |
| 				case "reexport-undefined":
 | |
| 					concatenationScope.registerRawExport(
 | |
| 						/** @type {NonNullable<ExportMode["name"]>} */ (mode.name),
 | |
| 						"/* reexport non-default export from non-harmony */ undefined"
 | |
| 					);
 | |
| 			}
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		if (mode.type !== "unused" && mode.type !== "empty-star") {
 | |
| 			super.apply(dependency, source, templateContext);
 | |
| 
 | |
| 			this._addExportFragments(
 | |
| 				templateContext.initFragments,
 | |
| 				dep,
 | |
| 				mode,
 | |
| 				templateContext.module,
 | |
| 				moduleGraph,
 | |
| 				templateContext.chunkGraph,
 | |
| 				runtime,
 | |
| 				templateContext.runtimeTemplate,
 | |
| 				templateContext.runtimeRequirements
 | |
| 			);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {InitFragment<GenerateContext>[]} initFragments target array for init fragments
 | |
| 	 * @param {HarmonyExportImportedSpecifierDependency} dep dependency
 | |
| 	 * @param {ExportMode} mode the export mode
 | |
| 	 * @param {Module} module the current module
 | |
| 	 * @param {ModuleGraph} moduleGraph the module graph
 | |
| 	 * @param {ChunkGraph} chunkGraph the chunk graph
 | |
| 	 * @param {RuntimeSpec} runtime the runtime
 | |
| 	 * @param {RuntimeTemplate} runtimeTemplate the runtime template
 | |
| 	 * @param {RuntimeRequirements} runtimeRequirements runtime requirements
 | |
| 	 * @returns {void}
 | |
| 	 */
 | |
| 	_addExportFragments(
 | |
| 		initFragments,
 | |
| 		dep,
 | |
| 		mode,
 | |
| 		module,
 | |
| 		moduleGraph,
 | |
| 		chunkGraph,
 | |
| 		runtime,
 | |
| 		runtimeTemplate,
 | |
| 		runtimeRequirements
 | |
| 	) {
 | |
| 		const importedModule = /** @type {Module} */ (moduleGraph.getModule(dep));
 | |
| 		const importVar = dep.getImportVar(moduleGraph);
 | |
| 
 | |
| 		if (
 | |
| 			(mode.type === "reexport-namespace-object" ||
 | |
| 				mode.type === "reexport-fake-namespace-object") &&
 | |
| 			dep.defer &&
 | |
| 			!moduleGraph.isAsync(importedModule)
 | |
| 		) {
 | |
| 			initFragments.push(
 | |
| 				...this.getReexportDeferredNamespaceObjectFragments(
 | |
| 					importedModule,
 | |
| 					chunkGraph,
 | |
| 					moduleGraph
 | |
| 						.getExportsInfo(module)
 | |
| 						.getUsedName(mode.name ? mode.name : [], runtime),
 | |
| 					importVar,
 | |
| 					importedModule.getExportsType(
 | |
| 						moduleGraph,
 | |
| 						module.buildMeta && module.buildMeta.strictHarmonyModule
 | |
| 					),
 | |
| 					runtimeRequirements
 | |
| 				)
 | |
| 			);
 | |
| 			return;
 | |
| 		}
 | |
| 		switch (mode.type) {
 | |
| 			case "missing":
 | |
| 			case "empty-star":
 | |
| 				initFragments.push(
 | |
| 					new InitFragment(
 | |
| 						"/* empty/unused harmony star reexport */\n",
 | |
| 						InitFragment.STAGE_HARMONY_EXPORTS,
 | |
| 						1
 | |
| 					)
 | |
| 				);
 | |
| 				break;
 | |
| 
 | |
| 			case "unused":
 | |
| 				initFragments.push(
 | |
| 					new InitFragment(
 | |
| 						`${Template.toNormalComment(
 | |
| 							`unused harmony reexport ${mode.name}`
 | |
| 						)}\n`,
 | |
| 						InitFragment.STAGE_HARMONY_EXPORTS,
 | |
| 						1
 | |
| 					)
 | |
| 				);
 | |
| 				break;
 | |
| 
 | |
| 			case "reexport-dynamic-default":
 | |
| 				initFragments.push(
 | |
| 					this.getReexportFragment(
 | |
| 						module,
 | |
| 						"reexport default from dynamic",
 | |
| 						moduleGraph
 | |
| 							.getExportsInfo(module)
 | |
| 							.getUsedName(/** @type {string} */ (mode.name), runtime),
 | |
| 						importVar,
 | |
| 						null,
 | |
| 						runtimeRequirements
 | |
| 					)
 | |
| 				);
 | |
| 				break;
 | |
| 
 | |
| 			case "reexport-fake-namespace-object":
 | |
| 				initFragments.push(
 | |
| 					...this.getReexportFakeNamespaceObjectFragments(
 | |
| 						module,
 | |
| 						moduleGraph
 | |
| 							.getExportsInfo(module)
 | |
| 							.getUsedName(/** @type {string} */ (mode.name), runtime),
 | |
| 						importVar,
 | |
| 						mode.fakeType,
 | |
| 						runtimeRequirements
 | |
| 					)
 | |
| 				);
 | |
| 				break;
 | |
| 
 | |
| 			case "reexport-undefined":
 | |
| 				initFragments.push(
 | |
| 					this.getReexportFragment(
 | |
| 						module,
 | |
| 						"reexport non-default export from non-harmony",
 | |
| 						moduleGraph
 | |
| 							.getExportsInfo(module)
 | |
| 							.getUsedName(/** @type {string} */ (mode.name), runtime),
 | |
| 						"undefined",
 | |
| 						"",
 | |
| 						runtimeRequirements
 | |
| 					)
 | |
| 				);
 | |
| 				break;
 | |
| 
 | |
| 			case "reexport-named-default":
 | |
| 				initFragments.push(
 | |
| 					this.getReexportFragment(
 | |
| 						module,
 | |
| 						"reexport default export from named module",
 | |
| 						moduleGraph
 | |
| 							.getExportsInfo(module)
 | |
| 							.getUsedName(/** @type {string} */ (mode.name), runtime),
 | |
| 						importVar,
 | |
| 						"",
 | |
| 						runtimeRequirements
 | |
| 					)
 | |
| 				);
 | |
| 				break;
 | |
| 
 | |
| 			case "reexport-namespace-object":
 | |
| 				initFragments.push(
 | |
| 					this.getReexportFragment(
 | |
| 						module,
 | |
| 						"reexport module object",
 | |
| 						moduleGraph
 | |
| 							.getExportsInfo(module)
 | |
| 							.getUsedName(/** @type {string} */ (mode.name), runtime),
 | |
| 						importVar,
 | |
| 						"",
 | |
| 						runtimeRequirements
 | |
| 					)
 | |
| 				);
 | |
| 				break;
 | |
| 
 | |
| 			case "normal-reexport":
 | |
| 				for (const {
 | |
| 					name,
 | |
| 					ids,
 | |
| 					checked,
 | |
| 					hidden
 | |
| 				} of /** @type {NormalReexportItem[]} */ (mode.items)) {
 | |
| 					if (hidden) continue;
 | |
| 					if (checked) {
 | |
| 						const connection = moduleGraph.getConnection(dep);
 | |
| 						const key = `harmony reexport (checked) ${importVar} ${name}`;
 | |
| 						const runtimeCondition = dep.weak
 | |
| 							? false
 | |
| 							: connection
 | |
| 								? filterRuntime(runtime, (r) => connection.isTargetActive(r))
 | |
| 								: true;
 | |
| 						initFragments.push(
 | |
| 							new ConditionalInitFragment(
 | |
| 								`/* harmony reexport (checked) */ ${this.getConditionalReexportStatement(
 | |
| 									module,
 | |
| 									name,
 | |
| 									importVar,
 | |
| 									ids,
 | |
| 									runtimeRequirements
 | |
| 								)}`,
 | |
| 								moduleGraph.isAsync(importedModule)
 | |
| 									? InitFragment.STAGE_ASYNC_HARMONY_IMPORTS
 | |
| 									: InitFragment.STAGE_HARMONY_IMPORTS,
 | |
| 								dep.sourceOrder,
 | |
| 								key,
 | |
| 								runtimeCondition
 | |
| 							)
 | |
| 						);
 | |
| 					} else {
 | |
| 						initFragments.push(
 | |
| 							this.getReexportFragment(
 | |
| 								module,
 | |
| 								"reexport safe",
 | |
| 								moduleGraph.getExportsInfo(module).getUsedName(name, runtime),
 | |
| 								importVar,
 | |
| 								moduleGraph
 | |
| 									.getExportsInfo(importedModule)
 | |
| 									.getUsedName(ids, runtime),
 | |
| 								runtimeRequirements
 | |
| 							)
 | |
| 						);
 | |
| 					}
 | |
| 				}
 | |
| 				break;
 | |
| 
 | |
| 			case "dynamic-reexport": {
 | |
| 				const ignored = mode.hidden
 | |
| 					? combine(
 | |
| 							/** @type {ExportModeIgnored} */
 | |
| 							(mode.ignored),
 | |
| 							mode.hidden
 | |
| 						)
 | |
| 					: /** @type {ExportModeIgnored} */ (mode.ignored);
 | |
| 				const modern =
 | |
| 					runtimeTemplate.supportsConst() &&
 | |
| 					runtimeTemplate.supportsArrowFunction();
 | |
| 				let content =
 | |
| 					"/* harmony reexport (unknown) */ var __WEBPACK_REEXPORT_OBJECT__ = {};\n" +
 | |
| 					`/* harmony reexport (unknown) */ for(${
 | |
| 						modern ? "const" : "var"
 | |
| 					} __WEBPACK_IMPORT_KEY__ in ${importVar}) `;
 | |
| 
 | |
| 				// Filter out exports which are defined by other exports
 | |
| 				// and filter out default export because it cannot be reexported with *
 | |
| 				if (ignored.size > 1) {
 | |
| 					content += `if(${JSON.stringify([
 | |
| 						...ignored
 | |
| 					])}.indexOf(__WEBPACK_IMPORT_KEY__) < 0) `;
 | |
| 				} else if (ignored.size === 1) {
 | |
| 					content += `if(__WEBPACK_IMPORT_KEY__ !== ${JSON.stringify(
 | |
| 						first(ignored)
 | |
| 					)}) `;
 | |
| 				}
 | |
| 
 | |
| 				content += "__WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = ";
 | |
| 				content += modern
 | |
| 					? `() => ${importVar}[__WEBPACK_IMPORT_KEY__]`
 | |
| 					: `function(key) { return ${importVar}[key]; }.bind(0, __WEBPACK_IMPORT_KEY__)`;
 | |
| 
 | |
| 				runtimeRequirements.add(RuntimeGlobals.exports);
 | |
| 				runtimeRequirements.add(RuntimeGlobals.definePropertyGetters);
 | |
| 
 | |
| 				const exportsName = module.exportsArgument;
 | |
| 				initFragments.push(
 | |
| 					new InitFragment(
 | |
| 						`${content}\n/* harmony reexport (unknown) */ ${RuntimeGlobals.definePropertyGetters}(${exportsName}, __WEBPACK_REEXPORT_OBJECT__);\n`,
 | |
| 						moduleGraph.isAsync(importedModule)
 | |
| 							? InitFragment.STAGE_ASYNC_HARMONY_IMPORTS
 | |
| 							: InitFragment.STAGE_HARMONY_IMPORTS,
 | |
| 						dep.sourceOrder
 | |
| 					)
 | |
| 				);
 | |
| 				break;
 | |
| 			}
 | |
| 
 | |
| 			default:
 | |
| 				throw new Error(`Unknown mode ${mode.type}`);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {Module} module the current module
 | |
| 	 * @param {string} comment comment
 | |
| 	 * @param {UsedName} key key
 | |
| 	 * @param {string} name name
 | |
| 	 * @param {string | string[] | null | false} valueKey value key
 | |
| 	 * @param {RuntimeRequirements} runtimeRequirements runtime requirements
 | |
| 	 * @returns {HarmonyExportInitFragment} harmony export init fragment
 | |
| 	 */
 | |
| 	getReexportFragment(
 | |
| 		module,
 | |
| 		comment,
 | |
| 		key,
 | |
| 		name,
 | |
| 		valueKey,
 | |
| 		runtimeRequirements
 | |
| 	) {
 | |
| 		const returnValue = this.getReturnValue(name, valueKey);
 | |
| 
 | |
| 		runtimeRequirements.add(RuntimeGlobals.exports);
 | |
| 		runtimeRequirements.add(RuntimeGlobals.definePropertyGetters);
 | |
| 
 | |
| 		const map = new Map();
 | |
| 		map.set(key, `/* ${comment} */ ${returnValue}`);
 | |
| 
 | |
| 		return new HarmonyExportInitFragment(module.exportsArgument, map);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {Module} module module
 | |
| 	 * @param {string | string[] | false} key key
 | |
| 	 * @param {string} name name
 | |
| 	 * @param {number} fakeType fake type
 | |
| 	 * @param {RuntimeRequirements} runtimeRequirements runtime requirements
 | |
| 	 * @returns {[InitFragment<GenerateContext>, HarmonyExportInitFragment]} init fragments
 | |
| 	 */
 | |
| 	getReexportFakeNamespaceObjectFragments(
 | |
| 		module,
 | |
| 		key,
 | |
| 		name,
 | |
| 		fakeType,
 | |
| 		runtimeRequirements
 | |
| 	) {
 | |
| 		runtimeRequirements.add(RuntimeGlobals.exports);
 | |
| 		runtimeRequirements.add(RuntimeGlobals.definePropertyGetters);
 | |
| 		runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject);
 | |
| 
 | |
| 		const map = new Map();
 | |
| 		map.set(
 | |
| 			key,
 | |
| 			`/* reexport fake namespace object from non-harmony */ ${name}_namespace_cache || (${name}_namespace_cache = ${
 | |
| 				RuntimeGlobals.createFakeNamespaceObject
 | |
| 			}(${name}${fakeType ? `, ${fakeType}` : ""}))`
 | |
| 		);
 | |
| 
 | |
| 		return [
 | |
| 			new InitFragment(
 | |
| 				`var ${name}_namespace_cache;\n`,
 | |
| 				InitFragment.STAGE_CONSTANTS,
 | |
| 				-1,
 | |
| 				`${name}_namespace_cache`
 | |
| 			),
 | |
| 			new HarmonyExportInitFragment(module.exportsArgument, map)
 | |
| 		];
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {Module} module module
 | |
| 	 * @param {ChunkGraph} chunkGraph chunkGraph
 | |
| 	 * @param {string | false | string[]} key key
 | |
| 	 * @param {string} name name
 | |
| 	 * @param {import("../Module").ExportsType} exportsType exportsType
 | |
| 	 * @param {Set<string>} runtimeRequirements runtimeRequirements
 | |
| 	 * @returns {InitFragment<GenerateContext>[]} fragments
 | |
| 	 */
 | |
| 	getReexportDeferredNamespaceObjectFragments(
 | |
| 		module,
 | |
| 		chunkGraph,
 | |
| 		key,
 | |
| 		name,
 | |
| 		exportsType,
 | |
| 		runtimeRequirements
 | |
| 	) {
 | |
| 		runtimeRequirements.add(RuntimeGlobals.exports);
 | |
| 		runtimeRequirements.add(RuntimeGlobals.definePropertyGetters);
 | |
| 		runtimeRequirements.add(RuntimeGlobals.makeDeferredNamespaceObject);
 | |
| 
 | |
| 		const map = new Map();
 | |
| 		const moduleId = JSON.stringify(chunkGraph.getModuleId(module));
 | |
| 		const mode = getMakeDeferredNamespaceModeFromExportsType(exportsType);
 | |
| 		map.set(
 | |
| 			key,
 | |
| 			`/* reexport deferred namespace object */ ${name}_deferred_namespace_cache || (${name}_deferred_namespace_cache = ${RuntimeGlobals.makeDeferredNamespaceObject}(${moduleId}, ${mode}))`
 | |
| 		);
 | |
| 
 | |
| 		return [
 | |
| 			new InitFragment(
 | |
| 				`var ${name}_deferred_namespace_cache;\n`,
 | |
| 				InitFragment.STAGE_CONSTANTS,
 | |
| 				-1,
 | |
| 				`${name}_deferred_namespace_cache`
 | |
| 			),
 | |
| 			new HarmonyExportInitFragment(module.exportsArgument, map)
 | |
| 		];
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {Module} module module
 | |
| 	 * @param {string} key key
 | |
| 	 * @param {string} name name
 | |
| 	 * @param {string | string[] | false} valueKey value key
 | |
| 	 * @param {RuntimeRequirements} runtimeRequirements runtime requirements
 | |
| 	 * @returns {string} result
 | |
| 	 */
 | |
| 	getConditionalReexportStatement(
 | |
| 		module,
 | |
| 		key,
 | |
| 		name,
 | |
| 		valueKey,
 | |
| 		runtimeRequirements
 | |
| 	) {
 | |
| 		if (valueKey === false) {
 | |
| 			return "/* unused export */\n";
 | |
| 		}
 | |
| 
 | |
| 		const exportsName = module.exportsArgument;
 | |
| 		const returnValue = this.getReturnValue(name, valueKey);
 | |
| 
 | |
| 		runtimeRequirements.add(RuntimeGlobals.exports);
 | |
| 		runtimeRequirements.add(RuntimeGlobals.definePropertyGetters);
 | |
| 		runtimeRequirements.add(RuntimeGlobals.hasOwnProperty);
 | |
| 
 | |
| 		return `if(${RuntimeGlobals.hasOwnProperty}(${name}, ${JSON.stringify(
 | |
| 			valueKey[0]
 | |
| 		)})) ${
 | |
| 			RuntimeGlobals.definePropertyGetters
 | |
| 		}(${exportsName}, { ${propertyName(
 | |
| 			key
 | |
| 		)}: function() { return ${returnValue}; } });\n`;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {string} name name
 | |
| 	 * @param {null | false | string | string[]} valueKey value key
 | |
| 	 * @returns {string | undefined} value
 | |
| 	 */
 | |
| 	getReturnValue(name, valueKey) {
 | |
| 		if (valueKey === null) {
 | |
| 			return `${name}_default.a`;
 | |
| 		}
 | |
| 
 | |
| 		if (valueKey === "") {
 | |
| 			return name;
 | |
| 		}
 | |
| 
 | |
| 		if (valueKey === false) {
 | |
| 			return "/* unused export */ undefined";
 | |
| 		}
 | |
| 
 | |
| 		return `${name}${propertyAccess(valueKey)}`;
 | |
| 	}
 | |
| };
 | |
| 
 | |
| class HarmonyStarExportsList {
 | |
| 	constructor() {
 | |
| 		/** @type {HarmonyExportImportedSpecifierDependency[]} */
 | |
| 		this.dependencies = [];
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {HarmonyExportImportedSpecifierDependency} dep dependency
 | |
| 	 * @returns {void}
 | |
| 	 */
 | |
| 	push(dep) {
 | |
| 		this.dependencies.push(dep);
 | |
| 	}
 | |
| 
 | |
| 	slice() {
 | |
| 		return [...this.dependencies];
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {ObjectSerializerContext} context context
 | |
| 	 */
 | |
| 	serialize({ write, setCircularReference }) {
 | |
| 		setCircularReference(this);
 | |
| 		write(this.dependencies);
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param {ObjectDeserializerContext} context context
 | |
| 	 */
 | |
| 	deserialize({ read, setCircularReference }) {
 | |
| 		setCircularReference(this);
 | |
| 		this.dependencies = read();
 | |
| 	}
 | |
| }
 | |
| 
 | |
| makeSerializable(
 | |
| 	HarmonyStarExportsList,
 | |
| 	"webpack/lib/dependencies/HarmonyExportImportedSpecifierDependency",
 | |
| 	"HarmonyStarExportsList"
 | |
| );
 | |
| 
 | |
| module.exports.HarmonyStarExportsList = HarmonyStarExportsList;
 |