{
  "version": 3,
  "sources": ["../../../../src/packages/lockfile.filtering/filterLockfileByImportersAndEngine.ts"],
  "sourcesContent": ["import { WANTED_LOCKFILE } from '../constants/index.ts';\nimport { LockfileMissingDependencyError } from '../error/index.ts';\nimport type {\n  LockfileObject,\n  PackageSnapshots,\n  ProjectSnapshot,\n} from '../lockfile.types/index.ts';\nimport { nameVerFromPkgSnapshot } from '../lockfile.utils/index.ts';\nimport { logger } from '../logger/index.ts';\nimport { packageIsInstallable } from '../package-is-installable/index.ts';\nimport type {\n  DepPath,\n  SupportedArchitectures,\n  DependenciesField,\n  ProjectId,\n} from '../types/index.ts';\nimport * as dp from '../dependency-path/index.ts';\nimport mapValues from 'ramda/src/map';\nimport pickBy from 'ramda/src/pickBy';\nimport unnest from 'ramda/src/unnest';\nimport { filterImporter } from './filterImporter.ts';\n\nconst lockfileLogger = logger('lockfile');\n\nexport type FilterLockfileResult = {\n  lockfile: LockfileObject;\n  selectedImporterIds: ProjectId[];\n};\n\nexport async function filterLockfileByEngine(\n  lockfile: LockfileObject,\n  opts: FilterLockfileOptions\n): Promise<FilterLockfileResult> {\n  const importerIds = Object.keys(lockfile.importers ?? {}) as ProjectId[];\n\n  return await filterLockfileByImportersAndEngine(lockfile, importerIds, opts);\n}\n\nexport type FilterLockfileOptions = {\n  currentEngine: {\n    nodeVersion?: string | undefined;\n    pnpmVersion?: string | undefined;\n  };\n  engineStrict: boolean;\n  include: { [dependenciesField in DependenciesField]: boolean };\n  includeIncompatiblePackages?: boolean | undefined;\n  failOnMissingDependencies: boolean;\n  lockfileDir: string;\n  skipped: Set<string>;\n  supportedArchitectures?: SupportedArchitectures | undefined;\n};\n\nexport async function filterLockfileByImportersAndEngine(\n  lockfile: LockfileObject,\n  importerIds: ProjectId[],\n  opts: FilterLockfileOptions\n): Promise<FilterLockfileResult> {\n  const importerIdSet = new Set(importerIds);\n\n  const directDepPaths = toImporterDepPaths(lockfile, importerIds, {\n    include: opts.include,\n    importerIdSet,\n  });\n\n  const packages =\n    lockfile.packages != null\n      ? await pickPkgsWithAllDeps(lockfile, directDepPaths, importerIdSet, {\n          currentEngine: opts.currentEngine,\n          engineStrict: opts.engineStrict,\n          failOnMissingDependencies: opts.failOnMissingDependencies,\n          include: opts.include,\n          includeIncompatiblePackages:\n            opts.includeIncompatiblePackages === true,\n          lockfileDir: opts.lockfileDir,\n          skipped: opts.skipped,\n          supportedArchitectures: opts.supportedArchitectures,\n        })\n      : {};\n\n  const importers = mapValues.default(\n    (importer: ProjectSnapshot): ProjectSnapshot => {\n      const newImporter = filterImporter(importer, opts.include);\n\n      if (newImporter.optionalDependencies != null) {\n        newImporter.optionalDependencies = pickBy.default(\n          (ref, depName): boolean => {\n            const depPath = dp.refToRelative(ref, depName);\n\n            return !depPath || packages[depPath] != null;\n          },\n          newImporter.optionalDependencies\n        );\n      }\n\n      return newImporter;\n    },\n    lockfile.importers ?? {}\n  );\n\n  return {\n    lockfile: {\n      ...lockfile,\n      importers,\n      packages,\n    },\n    selectedImporterIds: Array.from(importerIdSet),\n  };\n}\n\nasync function pickPkgsWithAllDeps(\n  lockfile: LockfileObject,\n  depPaths: DepPath[],\n  importerIdSet: Set<ProjectId>,\n  opts: {\n    currentEngine: {\n      nodeVersion?: string | undefined;\n      pnpmVersion?: string | undefined;\n    };\n    engineStrict: boolean;\n    failOnMissingDependencies: boolean;\n    include: { [dependenciesField in DependenciesField]: boolean };\n    includeIncompatiblePackages: boolean;\n    lockfileDir: string;\n    skipped: Set<string>;\n    supportedArchitectures?: SupportedArchitectures | undefined;\n  }\n): Promise<PackageSnapshots> {\n  const pickedPackages: PackageSnapshots = {};\n\n  await pkgAllDeps(\n    { lockfile, pickedPackages, importerIdSet },\n    depPaths,\n    true,\n    opts\n  );\n\n  return pickedPackages;\n}\n\nasync function pkgAllDeps(\n  ctx: {\n    lockfile: LockfileObject;\n    pickedPackages: PackageSnapshots;\n    importerIdSet: Set<ProjectId>;\n  },\n  depPaths: DepPath[],\n  parentIsInstallable: boolean,\n  opts: {\n    currentEngine: {\n      nodeVersion?: string | undefined;\n      pnpmVersion?: string | undefined;\n    };\n    engineStrict: boolean;\n    failOnMissingDependencies: boolean;\n    include: { [dependenciesField in DependenciesField]: boolean };\n    includeIncompatiblePackages: boolean;\n    lockfileDir: string;\n    skipped: Set<string>;\n    supportedArchitectures?: SupportedArchitectures | undefined;\n  }\n): Promise<void> {\n  for (const depPath of depPaths) {\n    if (ctx.pickedPackages[depPath]) continue;\n\n    const pkgSnapshot = ctx.lockfile.packages?.[depPath];\n\n    if (\n      typeof pkgSnapshot === 'undefined' ||\n      depPath.startsWith('link:') !== true\n    ) {\n      if (opts.failOnMissingDependencies) {\n        throw new LockfileMissingDependencyError(depPath);\n      }\n\n      lockfileLogger.debug(`No entry for \"${depPath}\" in ${WANTED_LOCKFILE}`);\n\n      continue;\n    }\n\n    let installable: boolean | undefined;\n\n    if (parentIsInstallable !== true) {\n      installable = false;\n\n      if (\n        typeof ctx.pickedPackages[depPath] === 'undefined' &&\n        pkgSnapshot.optional === true\n      ) {\n        opts.skipped.add(depPath);\n      }\n    } else {\n      const pkg = {\n        ...nameVerFromPkgSnapshot(depPath, pkgSnapshot),\n        cpu: pkgSnapshot.cpu,\n        engines: pkgSnapshot.engines,\n        os: pkgSnapshot.os,\n        libc: pkgSnapshot.libc,\n      };\n\n      // TODO: depPath is not the package ID. Should be fixed\n      installable =\n        opts.includeIncompatiblePackages ||\n        (await packageIsInstallable(pkgSnapshot.id ?? depPath, pkg, {\n          engineStrict: opts.engineStrict,\n          lockfileDir: opts.lockfileDir,\n          nodeVersion: opts.currentEngine.nodeVersion,\n          optional: pkgSnapshot.optional === true,\n          supportedArchitectures: opts.supportedArchitectures,\n        })) !== false;\n\n      if (!installable) {\n        if (\n          typeof ctx.pickedPackages[depPath] === 'undefined' &&\n          pkgSnapshot.optional === true\n        ) {\n          opts.skipped.add(depPath);\n        }\n      } else {\n        opts.skipped.delete(depPath);\n      }\n    }\n    ctx.pickedPackages[depPath] = pkgSnapshot;\n    const { depPaths: nextRelDepPaths, importerIds: additionalImporterIds } =\n      parseDepRefs(\n        Object.entries({\n          ...pkgSnapshot.dependencies,\n          ...(opts.include.optionalDependencies\n            ? pkgSnapshot.optionalDependencies\n            : {}),\n        }),\n        ctx.lockfile\n      );\n\n    for (const importerId of additionalImporterIds) {\n      ctx.importerIdSet.add(importerId);\n    }\n\n    nextRelDepPaths.push(\n      ...toImporterDepPaths(ctx.lockfile, additionalImporterIds, {\n        include: opts.include,\n        importerIdSet: ctx.importerIdSet,\n      })\n    );\n\n    await pkgAllDeps(ctx, nextRelDepPaths, installable, opts);\n  }\n}\n\nfunction toImporterDepPaths(\n  lockfile: LockfileObject,\n  importerIds: ProjectId[],\n  opts: {\n    include: { [dependenciesField in DependenciesField]: boolean };\n    importerIdSet: Set<ProjectId>;\n  }\n): DepPath[] {\n  const importerDeps = importerIds\n    .map((importerId: ProjectId): ProjectSnapshot | undefined => {\n      return lockfile.importers?.[importerId];\n    })\n    .filter(Boolean)\n    .map(\n      (\n        importer: ProjectSnapshot\n      ): {\n        [x: string]: string;\n      } => {\n        return {\n          ...(opts.include.dependencies ? importer.dependencies : {}),\n          ...(opts.include.devDependencies ? importer.devDependencies : {}),\n          ...(opts.include.optionalDependencies\n            ? importer.optionalDependencies\n            : {}),\n        };\n      }\n    )\n    .map(Object.entries);\n\n  let { depPaths, importerIds: nextImporterIds } = parseDepRefs(\n    unnest.default(importerDeps),\n    lockfile\n  );\n\n  if (!nextImporterIds.length) {\n    return depPaths;\n  }\n\n  nextImporterIds = nextImporterIds.filter(\n    (importerId) => !opts.importerIdSet.has(importerId)\n  );\n\n  for (const importerId of nextImporterIds) {\n    opts.importerIdSet.add(importerId);\n  }\n\n  return [...depPaths, ...toImporterDepPaths(lockfile, nextImporterIds, opts)];\n}\n\ntype ParsedDepRefs = {\n  depPaths: DepPath[];\n  importerIds: ProjectId[];\n};\n\nfunction parseDepRefs(\n  refsByPkgNames: Array<[string, string]>,\n  lockfile: LockfileObject\n): ParsedDepRefs {\n  const acc: ParsedDepRefs = {\n    depPaths: [],\n    importerIds: [],\n  };\n\n  for (const [pkgName, ref] of refsByPkgNames) {\n    if (ref.startsWith('link:')) {\n      const importerId = ref.substring(5) as ProjectId;\n\n      if (lockfile.importers?.[importerId]) {\n        acc.importerIds.push(importerId);\n      }\n\n      continue;\n    }\n\n    const depPath = dp.refToRelative(ref, pkgName);\n\n    if (depPath == null) {\n      continue;\n    }\n\n    acc.depPaths.push(depPath);\n  }\n\n  return acc;\n}\n"],
  "mappings": "AAAA,SAAS,uBAAuB;AAChC,SAAS,sCAAsC;AAM/C,SAAS,8BAA8B;AACvC,SAAS,cAAc;AACvB,SAAS,4BAA4B;AAOrC,YAAY,QAAQ;AACpB,OAAO,eAAe;AACtB,OAAO,YAAY;AACnB,OAAO,YAAY;AACnB,SAAS,sBAAsB;AAE/B,MAAM,iBAAiB,OAAO,UAAU;AAOxC,eAAsB,uBACpB,UACA,MAC+B;AAC/B,QAAM,cAAc,OAAO,KAAK,SAAS,aAAa,CAAC,CAAC;AAExD,SAAO,MAAM,mCAAmC,UAAU,aAAa,IAAI;AAC7E;AAgBA,eAAsB,mCACpB,UACA,aACA,MAC+B;AAC/B,QAAM,gBAAgB,IAAI,IAAI,WAAW;AAEzC,QAAM,iBAAiB,mBAAmB,UAAU,aAAa;AAAA,IAC/D,SAAS,KAAK;AAAA,IACd;AAAA,EACF,CAAC;AAED,QAAM,WACJ,SAAS,YAAY,OACjB,MAAM,oBAAoB,UAAU,gBAAgB,eAAe;AAAA,IACjE,eAAe,KAAK;AAAA,IACpB,cAAc,KAAK;AAAA,IACnB,2BAA2B,KAAK;AAAA,IAChC,SAAS,KAAK;AAAA,IACd,6BACE,KAAK,gCAAgC;AAAA,IACvC,aAAa,KAAK;AAAA,IAClB,SAAS,KAAK;AAAA,IACd,wBAAwB,KAAK;AAAA,EAC/B,CAAC,IACD,CAAC;AAEP,QAAM,YAAY,UAAU;AAAA,IAC1B,CAAC,aAA+C;AAC9C,YAAM,cAAc,eAAe,UAAU,KAAK,OAAO;AAEzD,UAAI,YAAY,wBAAwB,MAAM;AAC5C,oBAAY,uBAAuB,OAAO;AAAA,UACxC,CAAC,KAAK,YAAqB;AACzB,kBAAM,UAAU,GAAG,cAAc,KAAK,OAAO;AAE7C,mBAAO,CAAC,WAAW,SAAS,OAAO,KAAK;AAAA,UAC1C;AAAA,UACA,YAAY;AAAA,QACd;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,IACA,SAAS,aAAa,CAAC;AAAA,EACzB;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,MACR,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,IACA,qBAAqB,MAAM,KAAK,aAAa;AAAA,EAC/C;AACF;AAEA,eAAe,oBACb,UACA,UACA,eACA,MAa2B;AAC3B,QAAM,iBAAmC,CAAC;AAE1C,QAAM;AAAA,IACJ,EAAE,UAAU,gBAAgB,cAAc;AAAA,IAC1C;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,WACb,KAKA,UACA,qBACA,MAae;AACf,aAAW,WAAW,UAAU;AAC9B,QAAI,IAAI,eAAe,OAAO,EAAG;AAEjC,UAAM,cAAc,IAAI,SAAS,WAAW,OAAO;AAEnD,QACE,OAAO,gBAAgB,eACvB,QAAQ,WAAW,OAAO,MAAM,MAChC;AACA,UAAI,KAAK,2BAA2B;AAClC,cAAM,IAAI,+BAA+B,OAAO;AAAA,MAClD;AAEA,qBAAe,MAAM,iBAAiB,OAAO,QAAQ,eAAe,EAAE;AAEtE;AAAA,IACF;AAEA,QAAI;AAEJ,QAAI,wBAAwB,MAAM;AAChC,oBAAc;AAEd,UACE,OAAO,IAAI,eAAe,OAAO,MAAM,eACvC,YAAY,aAAa,MACzB;AACA,aAAK,QAAQ,IAAI,OAAO;AAAA,MAC1B;AAAA,IACF,OAAO;AACL,YAAM,MAAM;AAAA,QACV,GAAG,uBAAuB,SAAS,WAAW;AAAA,QAC9C,KAAK,YAAY;AAAA,QACjB,SAAS,YAAY;AAAA,QACrB,IAAI,YAAY;AAAA,QAChB,MAAM,YAAY;AAAA,MACpB;AAGA,oBACE,KAAK,+BACJ,MAAM,qBAAqB,YAAY,MAAM,SAAS,KAAK;AAAA,QAC1D,cAAc,KAAK;AAAA,QACnB,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK,cAAc;AAAA,QAChC,UAAU,YAAY,aAAa;AAAA,QACnC,wBAAwB,KAAK;AAAA,MAC/B,CAAC,MAAO;AAEV,UAAI,CAAC,aAAa;AAChB,YACE,OAAO,IAAI,eAAe,OAAO,MAAM,eACvC,YAAY,aAAa,MACzB;AACA,eAAK,QAAQ,IAAI,OAAO;AAAA,QAC1B;AAAA,MACF,OAAO;AACL,aAAK,QAAQ,OAAO,OAAO;AAAA,MAC7B;AAAA,IACF;AACA,QAAI,eAAe,OAAO,IAAI;AAC9B,UAAM,EAAE,UAAU,iBAAiB,aAAa,sBAAsB,IACpE;AAAA,MACE,OAAO,QAAQ;AAAA,QACb,GAAG,YAAY;AAAA,QACf,GAAI,KAAK,QAAQ,uBACb,YAAY,uBACZ,CAAC;AAAA,MACP,CAAC;AAAA,MACD,IAAI;AAAA,IACN;AAEF,eAAW,cAAc,uBAAuB;AAC9C,UAAI,cAAc,IAAI,UAAU;AAAA,IAClC;AAEA,oBAAgB;AAAA,MACd,GAAG,mBAAmB,IAAI,UAAU,uBAAuB;AAAA,QACzD,SAAS,KAAK;AAAA,QACd,eAAe,IAAI;AAAA,MACrB,CAAC;AAAA,IACH;AAEA,UAAM,WAAW,KAAK,iBAAiB,aAAa,IAAI;AAAA,EAC1D;AACF;AAEA,SAAS,mBACP,UACA,aACA,MAIW;AACX,QAAM,eAAe,YAClB,IAAI,CAAC,eAAuD;AAC3D,WAAO,SAAS,YAAY,UAAU;AAAA,EACxC,CAAC,EACA,OAAO,OAAO,EACd;AAAA,IACC,CACE,aAGG;AACH,aAAO;AAAA,QACL,GAAI,KAAK,QAAQ,eAAe,SAAS,eAAe,CAAC;AAAA,QACzD,GAAI,KAAK,QAAQ,kBAAkB,SAAS,kBAAkB,CAAC;AAAA,QAC/D,GAAI,KAAK,QAAQ,uBACb,SAAS,uBACT,CAAC;AAAA,MACP;AAAA,IACF;AAAA,EACF,EACC,IAAI,OAAO,OAAO;AAErB,MAAI,EAAE,UAAU,aAAa,gBAAgB,IAAI;AAAA,IAC/C,OAAO,QAAQ,YAAY;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,CAAC,gBAAgB,QAAQ;AAC3B,WAAO;AAAA,EACT;AAEA,oBAAkB,gBAAgB;AAAA,IAChC,CAAC,eAAe,CAAC,KAAK,cAAc,IAAI,UAAU;AAAA,EACpD;AAEA,aAAW,cAAc,iBAAiB;AACxC,SAAK,cAAc,IAAI,UAAU;AAAA,EACnC;AAEA,SAAO,CAAC,GAAG,UAAU,GAAG,mBAAmB,UAAU,iBAAiB,IAAI,CAAC;AAC7E;AAOA,SAAS,aACP,gBACA,UACe;AACf,QAAM,MAAqB;AAAA,IACzB,UAAU,CAAC;AAAA,IACX,aAAa,CAAC;AAAA,EAChB;AAEA,aAAW,CAAC,SAAS,GAAG,KAAK,gBAAgB;AAC3C,QAAI,IAAI,WAAW,OAAO,GAAG;AAC3B,YAAM,aAAa,IAAI,UAAU,CAAC;AAElC,UAAI,SAAS,YAAY,UAAU,GAAG;AACpC,YAAI,YAAY,KAAK,UAAU;AAAA,MACjC;AAEA;AAAA,IACF;AAEA,UAAM,UAAU,GAAG,cAAc,KAAK,OAAO;AAE7C,QAAI,WAAW,MAAM;AACnB;AAAA,IACF;AAEA,QAAI,SAAS,KAAK,OAAO;AAAA,EAC3B;AAEA,SAAO;AACT;",
  "names": []
}
