{
  "version": 3,
  "sources": ["../../../../src/packages/list/pruneTree.ts"],
  "sourcesContent": ["import * as crypto from '../crypto.polyfill/index.ts';\nimport type {\n  DependenciesHierarchy,\n  PackageNode,\n} from '../reviewing.dependencies-hierarchy/index.ts';\nimport type { PackageDependencyHierarchy } from './types.ts';\n\nexport function pruneDependenciesTrees(\n  trees: PackageDependencyHierarchy[] | null,\n  limit: number\n): PackageDependencyHierarchy[] {\n  if (trees === null) {\n    return [];\n  }\n\n  return trees.map(\n    (\n      tree: PackageDependencyHierarchy\n    ): {\n      dependencies: PackageNode[];\n      name?: string | undefined;\n      version?: string | undefined;\n      path: string;\n      private?: boolean | undefined;\n      devDependencies?: PackageNode[] | undefined;\n      optionalDependencies?: PackageNode[] | undefined;\n      unsavedDependencies?: PackageNode[] | undefined;\n    } => {\n      const endLeafPaths: PackageNode[][] = [];\n\n      const visitedNodes = new Set<string>();\n\n      function findEndLeaves(node: PackageNode, path: PackageNode[]): void {\n        if (node.circular) {\n          return;\n        }\n\n        const nodeId = `${node.name}@${node.version}`;\n\n        if (visitedNodes.has(nodeId)) {\n          return;\n        }\n\n        visitedNodes.add(nodeId);\n\n        const newPath = [...path, node];\n\n        if (!node.dependencies || node.dependencies.length === 0) {\n          endLeafPaths.push(newPath);\n\n          if (endLeafPaths.length >= limit) {\n            return;\n          }\n        }\n\n        for (const child of node.dependencies ?? []) {\n          findEndLeaves(child, newPath);\n\n          if (endLeafPaths.length >= limit) {\n            return;\n          }\n        }\n\n        visitedNodes.delete(nodeId);\n      }\n\n      if (tree.dependencies) {\n        for (const node of tree.dependencies) {\n          findEndLeaves(node, []);\n        }\n      }\n\n      const firstNPaths = endLeafPaths.slice(0, limit);\n\n      const map = new Map<string, PackageNode>();\n\n      const newTree: DependenciesHierarchy = { dependencies: [] };\n\n      for (const path of firstNPaths) {\n        let currentDependencies: PackageNode[] = newTree.dependencies ?? [];\n\n        let pathSoFar = '';\n\n        for (const node of path) {\n          pathSoFar += `${node.name}@${node.version},`;\n\n          const id = crypto.hash('sha256', pathSoFar, 'hex');\n\n          let existingNode = map.get(id);\n\n          if (!existingNode) {\n            existingNode = { ...node, dependencies: [] };\n\n            currentDependencies.push(existingNode);\n\n            map.set(id, existingNode);\n          }\n\n          currentDependencies = existingNode.dependencies ?? [];\n        }\n      }\n\n      return {\n        ...tree,\n        dependencies: newTree.dependencies ?? [],\n      };\n    }\n  );\n}\n"],
  "mappings": "AAAA,YAAY,YAAY;AAOjB,SAAS,uBACd,OACA,OAC8B;AAC9B,MAAI,UAAU,MAAM;AAClB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,MAAM;AAAA,IACX,CACE,SAUG;AACH,YAAM,eAAgC,CAAC;AAEvC,YAAM,eAAe,oBAAI,IAAY;AAErC,eAAS,cAAc,MAAmB,MAA2B;AACnE,YAAI,KAAK,UAAU;AACjB;AAAA,QACF;AAEA,cAAM,SAAS,GAAG,KAAK,IAAI,IAAI,KAAK,OAAO;AAE3C,YAAI,aAAa,IAAI,MAAM,GAAG;AAC5B;AAAA,QACF;AAEA,qBAAa,IAAI,MAAM;AAEvB,cAAM,UAAU,CAAC,GAAG,MAAM,IAAI;AAE9B,YAAI,CAAC,KAAK,gBAAgB,KAAK,aAAa,WAAW,GAAG;AACxD,uBAAa,KAAK,OAAO;AAEzB,cAAI,aAAa,UAAU,OAAO;AAChC;AAAA,UACF;AAAA,QACF;AAEA,mBAAW,SAAS,KAAK,gBAAgB,CAAC,GAAG;AAC3C,wBAAc,OAAO,OAAO;AAE5B,cAAI,aAAa,UAAU,OAAO;AAChC;AAAA,UACF;AAAA,QACF;AAEA,qBAAa,OAAO,MAAM;AAAA,MAC5B;AAEA,UAAI,KAAK,cAAc;AACrB,mBAAW,QAAQ,KAAK,cAAc;AACpC,wBAAc,MAAM,CAAC,CAAC;AAAA,QACxB;AAAA,MACF;AAEA,YAAM,cAAc,aAAa,MAAM,GAAG,KAAK;AAE/C,YAAM,MAAM,oBAAI,IAAyB;AAEzC,YAAM,UAAiC,EAAE,cAAc,CAAC,EAAE;AAE1D,iBAAW,QAAQ,aAAa;AAC9B,YAAI,sBAAqC,QAAQ,gBAAgB,CAAC;AAElE,YAAI,YAAY;AAEhB,mBAAW,QAAQ,MAAM;AACvB,uBAAa,GAAG,KAAK,IAAI,IAAI,KAAK,OAAO;AAEzC,gBAAM,KAAK,OAAO,KAAK,UAAU,WAAW,KAAK;AAEjD,cAAI,eAAe,IAAI,IAAI,EAAE;AAE7B,cAAI,CAAC,cAAc;AACjB,2BAAe,EAAE,GAAG,MAAM,cAAc,CAAC,EAAE;AAE3C,gCAAoB,KAAK,YAAY;AAErC,gBAAI,IAAI,IAAI,YAAY;AAAA,UAC1B;AAEA,gCAAsB,aAAa,gBAAgB,CAAC;AAAA,QACtD;AAAA,MACF;AAEA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,cAAc,QAAQ,gBAAgB,CAAC;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AACF;",
  "names": []
}
