| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Tobias Koppers @sokra*/"use strict";/** @typedef {import("./Module")} Module */const MODULE_REFERENCE_REGEXP =	/^__WEBPACK_MODULE_REFERENCE__(\d+)_([\da-f]+|ns)(_call)?(_directImport)?(?:_asiSafe(\d))?__$/;const DEFAULT_EXPORT = "__WEBPACK_DEFAULT_EXPORT__";const NAMESPACE_OBJECT_EXPORT = "__WEBPACK_NAMESPACE_OBJECT__";/** * @typedef {object} ExternalModuleInfo * @property {number} index * @property {Module} module *//** * @typedef {object} ConcatenatedModuleInfo * @property {number} index * @property {Module} module * @property {Map<string, string>} exportMap mapping from export name to symbol * @property {Map<string, string>} rawExportMap mapping from export name to symbol * @property {string=} namespaceExportSymbol *//** @typedef {ConcatenatedModuleInfo | ExternalModuleInfo} ModuleInfo *//** * @typedef {object} ModuleReferenceOptions * @property {string[]} ids the properties/exports of the module * @property {boolean} call true, when this referenced export is called * @property {boolean} directImport true, when this referenced export is directly imported (not via property access) * @property {boolean | undefined} asiSafe if the position is ASI safe or unknown */class ConcatenationScope {	/**	 * @param {ModuleInfo[] | Map<Module, ModuleInfo>} modulesMap all module info by module	 * @param {ConcatenatedModuleInfo} currentModule the current module info	 */	constructor(modulesMap, currentModule) {		this._currentModule = currentModule;		if (Array.isArray(modulesMap)) {			const map = new Map();			for (const info of modulesMap) {				map.set(info.module, info);			}			modulesMap = map;		}		this._modulesMap = modulesMap;	}	/**	 * @param {Module} module the referenced module	 * @returns {boolean} true, when it's in the scope	 */	isModuleInScope(module) {		return this._modulesMap.has(module);	}	/**	 *	 * @param {string} exportName name of the export	 * @param {string} symbol identifier of the export in source code	 */	registerExport(exportName, symbol) {		if (!this._currentModule.exportMap) {			this._currentModule.exportMap = new Map();		}		if (!this._currentModule.exportMap.has(exportName)) {			this._currentModule.exportMap.set(exportName, symbol);		}	}	/**	 *	 * @param {string} exportName name of the export	 * @param {string} expression expression to be used	 */	registerRawExport(exportName, expression) {		if (!this._currentModule.rawExportMap) {			this._currentModule.rawExportMap = new Map();		}		if (!this._currentModule.rawExportMap.has(exportName)) {			this._currentModule.rawExportMap.set(exportName, expression);		}	}	/**	 * @param {string} symbol identifier of the export in source code	 */	registerNamespaceExport(symbol) {		this._currentModule.namespaceExportSymbol = symbol;	}	/**	 *	 * @param {Module} module the referenced module	 * @param {Partial<ModuleReferenceOptions>} options options	 * @returns {string} the reference as identifier	 */	createModuleReference(		module,		{ ids = undefined, call = false, directImport = false, asiSafe = false }	) {		const info = /** @type {ModuleInfo} */ (this._modulesMap.get(module));		const callFlag = call ? "_call" : "";		const directImportFlag = directImport ? "_directImport" : "";		const asiSafeFlag = asiSafe			? "_asiSafe1"			: asiSafe === false				? "_asiSafe0"				: "";		const exportData = ids			? Buffer.from(JSON.stringify(ids), "utf-8").toString("hex")			: "ns";		// a "._" is appended to allow "delete ...", which would cause a SyntaxError in strict mode		return `__WEBPACK_MODULE_REFERENCE__${info.index}_${exportData}${callFlag}${directImportFlag}${asiSafeFlag}__._`;	}	/**	 * @param {string} name the identifier	 * @returns {boolean} true, when it's an module reference	 */	static isModuleReference(name) {		return MODULE_REFERENCE_REGEXP.test(name);	}	/**	 * @param {string} name the identifier	 * @returns {ModuleReferenceOptions & { index: number } | null} parsed options and index	 */	static matchModuleReference(name) {		const match = MODULE_REFERENCE_REGEXP.exec(name);		if (!match) return null;		const index = +match[1];		const asiSafe = match[5];		return {			index,			ids:				match[2] === "ns"					? []					: JSON.parse(Buffer.from(match[2], "hex").toString("utf-8")),			call: !!match[3],			directImport: !!match[4],			asiSafe: asiSafe ? asiSafe === "1" : undefined		};	}}ConcatenationScope.DEFAULT_EXPORT = DEFAULT_EXPORT;ConcatenationScope.NAMESPACE_OBJECT_EXPORT = NAMESPACE_OBJECT_EXPORT;module.exports = ConcatenationScope;
 |