{
  "version": 3,
  "sources": ["../../../../src/packages/audit/lockfileToAuditTree.ts"],
  "sourcesContent": ["import path from 'node:path';\nimport type { LockfileObject } from '../lockfile.types/index.ts';\nimport { nameVerFromPkgSnapshot } from '../lockfile.utils/index.ts';\nimport {\n  lockfileWalkerGroupImporterSteps,\n  type LockfileWalkerStep,\n} from '../lockfile.walker/index.ts';\nimport {\n  detectDepTypes,\n  type DepTypes,\n  DepType,\n} from '../lockfile.detect-dep-types/index.ts';\nimport type { DependenciesField, ProjectId } from '../types/index.ts';\nimport { safeReadProjectManifestOnly } from '../read-project-manifest/index.ts';\nimport mapValues from 'ramda/src/map';\n\nexport interface AuditNode {\n  version?: string | undefined;\n  integrity?: string | undefined;\n  requires?: Record<string, string | undefined> | undefined;\n  dependencies?: { [name: string]: AuditNode } | undefined;\n  dev: boolean;\n}\n\nexport type AuditTree = AuditNode & {\n  name?: string | undefined;\n  install: string[];\n  remove: string[];\n  metadata: unknown;\n};\n\nexport async function lockfileToAuditTree(\n  lockfile: LockfileObject,\n  opts: {\n    include?: { [dependenciesField in DependenciesField]: boolean } | undefined;\n    lockfileDir: string;\n  }\n): Promise<AuditTree> {\n  const importerWalkers = lockfileWalkerGroupImporterSteps(\n    lockfile,\n    Object.keys(lockfile.importers ?? {}) as ProjectId[],\n    { include: opts.include }\n  );\n\n  const dependencies: Record<string, AuditNode> = {};\n\n  const depTypes = detectDepTypes(lockfile);\n\n  await Promise.all(\n    importerWalkers.map(\n      async (importerWalker: {\n        importerId: string;\n        step: LockfileWalkerStep;\n      }): Promise<void> => {\n        const importerDeps = lockfileToAuditNode(depTypes, importerWalker.step);\n\n        // For some reason the registry responds with 500 if the keys in dependencies have slashes\n        // see issue: https://github.com/pnpm/pnpm/issues/2848\n        const depName = importerWalker.importerId.replace(/\\//g, '__');\n\n        const manifest = await safeReadProjectManifestOnly(\n          path.join(opts.lockfileDir, importerWalker.importerId)\n        );\n\n        dependencies[depName] = {\n          dependencies: importerDeps,\n          dev: false,\n          requires: toRequires(importerDeps),\n          version: manifest?.version ?? '0.0.0',\n        };\n      }\n    )\n  );\n\n  const auditTree: AuditTree = {\n    name: undefined,\n    version: undefined,\n    dependencies,\n    dev: false,\n    install: [],\n    integrity: undefined,\n    metadata: {},\n    remove: [],\n    requires: toRequires(dependencies),\n  };\n\n  return auditTree;\n}\n\nfunction lockfileToAuditNode(\n  depTypes: DepTypes,\n  step: LockfileWalkerStep\n): Record<string, AuditNode> {\n  const dependencies: Record<string, AuditNode> = {};\n\n  for (const { depPath, pkgSnapshot, next } of step.dependencies) {\n    const { name, version } = nameVerFromPkgSnapshot(depPath, pkgSnapshot);\n\n    const subdeps = lockfileToAuditNode(depTypes, next());\n\n    const dep: AuditNode = {\n      dev: depTypes[depPath] === DepType.DevOnly,\n      integrity:\n        typeof pkgSnapshot.resolution !== 'undefined' &&\n        'integrity' in pkgSnapshot.resolution\n          ? pkgSnapshot.resolution.integrity\n          : undefined,\n      version,\n    };\n\n    if (Object.keys(subdeps).length > 0) {\n      dep.dependencies = subdeps;\n      dep.requires = toRequires(subdeps);\n    }\n\n    dependencies[name] = dep;\n  }\n\n  return dependencies;\n}\n\nfunction toRequires(\n  auditNodesByDepName: Record<string, AuditNode>\n): Record<string, string | undefined> {\n  return mapValues.default((auditNode: AuditNode): string | undefined => {\n    return auditNode.version;\n  }, auditNodesByDepName);\n}\n"],
  "mappings": "AAAA,OAAO,UAAU;AAEjB,SAAS,8BAA8B;AACvC;AAAA,EACE;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EAEA;AAAA,OACK;AAEP,SAAS,mCAAmC;AAC5C,OAAO,eAAe;AAiBtB,eAAsB,oBACpB,UACA,MAIoB;AACpB,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA,OAAO,KAAK,SAAS,aAAa,CAAC,CAAC;AAAA,IACpC,EAAE,SAAS,KAAK,QAAQ;AAAA,EAC1B;AAEA,QAAM,eAA0C,CAAC;AAEjD,QAAM,WAAW,eAAe,QAAQ;AAExC,QAAM,QAAQ;AAAA,IACZ,gBAAgB;AAAA,MACd,OAAO,mBAGc;AACnB,cAAM,eAAe,oBAAoB,UAAU,eAAe,IAAI;AAItE,cAAM,UAAU,eAAe,WAAW,QAAQ,OAAO,IAAI;AAE7D,cAAM,WAAW,MAAM;AAAA,UACrB,KAAK,KAAK,KAAK,aAAa,eAAe,UAAU;AAAA,QACvD;AAEA,qBAAa,OAAO,IAAI;AAAA,UACtB,cAAc;AAAA,UACd,KAAK;AAAA,UACL,UAAU,WAAW,YAAY;AAAA,UACjC,SAAS,UAAU,WAAW;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAuB;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,IACT;AAAA,IACA,KAAK;AAAA,IACL,SAAS,CAAC;AAAA,IACV,WAAW;AAAA,IACX,UAAU,CAAC;AAAA,IACX,QAAQ,CAAC;AAAA,IACT,UAAU,WAAW,YAAY;AAAA,EACnC;AAEA,SAAO;AACT;AAEA,SAAS,oBACP,UACA,MAC2B;AAC3B,QAAM,eAA0C,CAAC;AAEjD,aAAW,EAAE,SAAS,aAAa,KAAK,KAAK,KAAK,cAAc;AAC9D,UAAM,EAAE,MAAM,QAAQ,IAAI,uBAAuB,SAAS,WAAW;AAErE,UAAM,UAAU,oBAAoB,UAAU,KAAK,CAAC;AAEpD,UAAM,MAAiB;AAAA,MACrB,KAAK,SAAS,OAAO,MAAM,QAAQ;AAAA,MACnC,WACE,OAAO,YAAY,eAAe,eAClC,eAAe,YAAY,aACvB,YAAY,WAAW,YACvB;AAAA,MACN;AAAA,IACF;AAEA,QAAI,OAAO,KAAK,OAAO,EAAE,SAAS,GAAG;AACnC,UAAI,eAAe;AACnB,UAAI,WAAW,WAAW,OAAO;AAAA,IACnC;AAEA,iBAAa,IAAI,IAAI;AAAA,EACvB;AAEA,SAAO;AACT;AAEA,SAAS,WACP,qBACoC;AACpC,SAAO,UAAU,QAAQ,CAAC,cAA6C;AACrE,WAAO,UAAU;AAAA,EACnB,GAAG,mBAAmB;AACxB;",
  "names": []
}
