| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
- const { UsageState } = require("../ExportsInfo");
- /** @import { RawReferencedExports } from "../Dependency" */
- /** @import { ExportInfo } from "../ExportsInfo" */
- /** @import { RuntimeSpec } from "../util/runtime" */
- /**
- * Process export info.
- * @param {RuntimeSpec} runtime the runtime
- * @param {RawReferencedExports} referencedExports list of referenced exports, will be added to
- * @param {string[]} prefix export prefix
- * @param {InstanceType<ExportInfo>=} exportInfo the export info
- * @param {boolean} defaultPointsToSelf when true, using default will reference itself
- * @param {Set<InstanceType<ExportInfo>>=} alreadyVisited already visited export info (to handle circular reexports)
- */
- const processExportInfo = (
- runtime,
- referencedExports,
- prefix,
- exportInfo,
- defaultPointsToSelf = false,
- alreadyVisited = undefined
- ) => {
- if (!exportInfo) {
- referencedExports.push(prefix);
- return;
- }
- const used = exportInfo.getUsed(runtime);
- if (used === UsageState.Unused) return;
- if (alreadyVisited !== undefined && alreadyVisited.has(exportInfo)) {
- referencedExports.push(prefix);
- return;
- }
- // Terminal case: not recursing, so no need to track visited here
- if (
- used !== UsageState.OnlyPropertiesUsed ||
- !exportInfo.exportsInfo ||
- exportInfo.exportsInfo.otherExportsInfo.getUsed(runtime) !==
- UsageState.Unused
- ) {
- referencedExports.push(prefix);
- return;
- }
- // Only the recursive path needs the visited set; allocate it lazily
- const visited = alreadyVisited !== undefined ? alreadyVisited : new Set();
- visited.add(exportInfo);
- const exportsInfo = exportInfo.exportsInfo;
- for (const childExportInfo of exportsInfo.orderedExports) {
- processExportInfo(
- runtime,
- referencedExports,
- defaultPointsToSelf && childExportInfo.name === "default"
- ? prefix
- : [...prefix, childExportInfo.name],
- childExportInfo,
- false,
- visited
- );
- }
- visited.delete(exportInfo);
- };
- module.exports = processExportInfo;
|