69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | |
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | |
| 	Author Tobias Koppers @sokra
 | |
| */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| const { UsageState } = require("../ExportsInfo");
 | |
| 
 | |
| /** @typedef {import("../ExportsInfo").ExportInfo} ExportInfo */
 | |
| /** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
 | |
| 
 | |
| /** @typedef {string[][]} ReferencedExports */
 | |
| 
 | |
| /**
 | |
|  * @param {RuntimeSpec} runtime the runtime
 | |
|  * @param {ReferencedExports} referencedExports list of referenced exports, will be added to
 | |
|  * @param {string[]} prefix export prefix
 | |
|  * @param {ExportInfo=} exportInfo the export info
 | |
|  * @param {boolean} defaultPointsToSelf when true, using default will reference itself
 | |
|  * @param {Set<ExportInfo>} alreadyVisited already visited export info (to handle circular reexports)
 | |
|  */
 | |
| const processExportInfo = (
 | |
| 	runtime,
 | |
| 	referencedExports,
 | |
| 	prefix,
 | |
| 	exportInfo,
 | |
| 	defaultPointsToSelf = false,
 | |
| 	alreadyVisited = new Set()
 | |
| ) => {
 | |
| 	if (!exportInfo) {
 | |
| 		referencedExports.push(prefix);
 | |
| 		return;
 | |
| 	}
 | |
| 	const used = exportInfo.getUsed(runtime);
 | |
| 	if (used === UsageState.Unused) return;
 | |
| 	if (alreadyVisited.has(exportInfo)) {
 | |
| 		referencedExports.push(prefix);
 | |
| 		return;
 | |
| 	}
 | |
| 	alreadyVisited.add(exportInfo);
 | |
| 	if (
 | |
| 		used !== UsageState.OnlyPropertiesUsed ||
 | |
| 		!exportInfo.exportsInfo ||
 | |
| 		exportInfo.exportsInfo.otherExportsInfo.getUsed(runtime) !==
 | |
| 			UsageState.Unused
 | |
| 	) {
 | |
| 		alreadyVisited.delete(exportInfo);
 | |
| 		referencedExports.push(prefix);
 | |
| 		return;
 | |
| 	}
 | |
| 	const exportsInfo = exportInfo.exportsInfo;
 | |
| 	for (const exportInfo of exportsInfo.orderedExports) {
 | |
| 		processExportInfo(
 | |
| 			runtime,
 | |
| 			referencedExports,
 | |
| 			defaultPointsToSelf && exportInfo.name === "default"
 | |
| 				? prefix
 | |
| 				: [...prefix, exportInfo.name],
 | |
| 			exportInfo,
 | |
| 			false,
 | |
| 			alreadyVisited
 | |
| 		);
 | |
| 	}
 | |
| 	alreadyVisited.delete(exportInfo);
 | |
| };
 | |
| 
 | |
| module.exports = processExportInfo;
 |