{
  "version": 3,
  "sources": ["../../../../src/packages/lockfile.pruner/index.ts"],
  "sourcesContent": ["import { LOCKFILE_VERSION } from '../constants/index.ts';\nimport type {\n  LockfileObject,\n  PackageSnapshots,\n  ProjectSnapshot,\n  ResolvedDependencies,\n} from '../lockfile.types/index.ts';\nimport type { DepPath, PackageManifest, ProjectId } from '../types/index.ts';\nimport { refToRelative } from '../dependency-path/index.ts';\nimport difference from 'ramda/src/difference';\nimport isEmpty from 'ramda/src/isEmpty';\nimport unnest from 'ramda/src/unnest';\nimport type { DependenciesGraph } from '../resolve-dependencies/index.ts';\nimport type { GenericDependenciesGraphWithResolvedChildren } from '../resolve-dependencies/resolvePeers.ts';\n\nexport function pruneSharedLockfile(\n  lockfile: LockfileObject,\n  opts?:\n    | {\n        dependenciesGraph?:\n          | GenericDependenciesGraphWithResolvedChildren\n          | undefined;\n        warn?: ((msg: string) => void) | undefined;\n      }\n    | undefined\n): LockfileObject {\n  const copiedPackages =\n    lockfile.packages == null\n      ? {}\n      : copyPackageSnapshots(lockfile.packages, {\n          devDepPaths: unnest.default(\n            Object.values(lockfile.importers ?? {}).map(\n              (deps: ProjectSnapshot): DepPath[] => {\n                return resolvedDepsToDepPaths(deps.devDependencies ?? {});\n              }\n            )\n          ),\n          optionalDepPaths: unnest.default(\n            Object.values(lockfile.importers ?? {}).map(\n              (deps: ProjectSnapshot): DepPath[] => {\n                return resolvedDepsToDepPaths(deps.optionalDependencies ?? {});\n              }\n            )\n          ),\n          prodDepPaths: unnest.default(\n            Object.values(lockfile.importers ?? {}).map(\n              (deps: ProjectSnapshot): DepPath[] => {\n                return resolvedDepsToDepPaths(deps.dependencies ?? {});\n              }\n            )\n          ),\n          warn:\n            opts?.warn ??\n            ((_msg: string): undefined => {\n              return undefined;\n            }),\n          dependenciesGraph: opts?.dependenciesGraph,\n        });\n\n  const prunedLockfile: LockfileObject = {\n    ...lockfile,\n    packages: copiedPackages,\n  };\n\n  if (isEmpty.default(prunedLockfile.packages)) {\n    // biome-ignore lint/performance/noDelete: <explanation>\n    delete prunedLockfile.packages;\n  }\n\n  return prunedLockfile;\n}\n\nexport function pruneLockfile(\n  lockfile: LockfileObject,\n  pkg: PackageManifest,\n  importerId: ProjectId,\n  opts: {\n    warn?: ((msg: string) => void) | undefined;\n    dependenciesGraph?: DependenciesGraph;\n  }\n): LockfileObject {\n  const importer = lockfile.importers?.[importerId];\n\n  const lockfileSpecs: ResolvedDependencies = importer?.specifiers ?? {};\n  const optionalDependencies = Object.keys(pkg.optionalDependencies ?? {});\n  const dependencies = difference.default(\n    Object.keys(pkg.dependencies ?? {}),\n    optionalDependencies\n  );\n  const devDependencies = difference.default(\n    difference.default(\n      Object.keys(pkg.devDependencies ?? {}),\n      optionalDependencies\n    ),\n    dependencies\n  );\n  const allDeps = new Set([\n    ...optionalDependencies,\n    ...devDependencies,\n    ...dependencies,\n  ]);\n\n  const specifiers: ResolvedDependencies = {};\n  const lockfileDependencies: ResolvedDependencies = {};\n  const lockfileOptionalDependencies: ResolvedDependencies = {};\n  const lockfileDevDependencies: ResolvedDependencies = {};\n\n  for (const depName in lockfileSpecs) {\n    if (!allDeps.has(depName)) {\n      continue;\n    }\n\n    const spec = lockfileSpecs[depName];\n\n    if (typeof spec !== 'undefined') {\n      specifiers[depName] = spec;\n    }\n\n    const dep = importer?.dependencies?.[depName];\n    const opDep = importer?.optionalDependencies?.[depName];\n    const devDep = importer?.devDependencies?.[depName];\n\n    if (typeof dep !== 'undefined') {\n      lockfileDependencies[depName] = dep;\n    } else if (typeof opDep !== 'undefined') {\n      lockfileOptionalDependencies[depName] = opDep;\n    } else if (typeof devDep !== 'undefined') {\n      lockfileDevDependencies[depName] = devDep;\n    }\n  }\n  if (importer?.dependencies != null) {\n    for (const [alias, dep] of Object.entries(importer.dependencies)) {\n      const depAlias = lockfileDependencies[alias];\n      const specAlias = lockfileSpecs[alias];\n\n      if (\n        typeof depAlias === 'undefined' &&\n        dep.startsWith('link:') &&\n        // If the linked dependency was removed from package.json\n        // then it is removed from pnpm-lock.yaml as well\n        typeof specAlias === 'undefined' &&\n        !allDeps.has(alias)\n      ) {\n        lockfileDependencies[alias] = dep;\n      }\n    }\n  }\n\n  const updatedImporter: ProjectSnapshot = {\n    specifiers,\n  };\n\n  const prunedLockfile: LockfileObject = {\n    importers: {\n      ...lockfile.importers,\n      [importerId]: updatedImporter,\n    },\n    lockfileVersion: lockfile.lockfileVersion || LOCKFILE_VERSION,\n    packages: lockfile.packages,\n  };\n\n  if (!isEmpty.default(lockfileDependencies)) {\n    updatedImporter.dependencies = lockfileDependencies;\n  }\n\n  if (!isEmpty.default(lockfileOptionalDependencies)) {\n    updatedImporter.optionalDependencies = lockfileOptionalDependencies;\n  }\n\n  if (!isEmpty.default(lockfileDevDependencies)) {\n    updatedImporter.devDependencies = lockfileDevDependencies;\n  }\n\n  if (typeof lockfile.pnpmfileChecksum === 'string') {\n    prunedLockfile.pnpmfileChecksum = lockfile.pnpmfileChecksum;\n  }\n\n  if (\n    lockfile.ignoredOptionalDependencies &&\n    !isEmpty.default(lockfile.ignoredOptionalDependencies)\n  ) {\n    prunedLockfile.ignoredOptionalDependencies =\n      lockfile.ignoredOptionalDependencies;\n  }\n\n  return pruneSharedLockfile(prunedLockfile, opts);\n}\n\nfunction copyPackageSnapshots(\n  originalPackages: PackageSnapshots,\n  opts: {\n    devDepPaths: DepPath[];\n    optionalDepPaths: DepPath[];\n    prodDepPaths: DepPath[];\n    warn: (msg: string) => void;\n    dependenciesGraph?:\n      | GenericDependenciesGraphWithResolvedChildren\n      | undefined;\n  }\n): PackageSnapshots {\n  const copiedSnapshots: PackageSnapshots = {};\n  const ctx = {\n    copiedSnapshots,\n    nonOptional: new Set<string>(),\n    originalPackages,\n    walked: new Set<string>(),\n    warn: opts.warn,\n    dependenciesGraph: opts.dependenciesGraph,\n  };\n\n  copyDependencySubGraph(ctx, opts.devDepPaths, {\n    optional: false,\n  });\n  copyDependencySubGraph(ctx, opts.optionalDepPaths, {\n    optional: true,\n  });\n  copyDependencySubGraph(ctx, opts.prodDepPaths, {\n    optional: false,\n  });\n\n  return copiedSnapshots;\n}\n\nfunction resolvedDepsToDepPaths(deps: ResolvedDependencies): DepPath[] {\n  return Object.entries(deps)\n    .map(([alias, ref]) => refToRelative(ref, alias))\n    .filter((depPath) => depPath !== null) as DepPath[];\n}\n\nfunction copyDependencySubGraph(\n  ctx: {\n    copiedSnapshots: PackageSnapshots;\n    nonOptional: Set<string>;\n    originalPackages: PackageSnapshots;\n    walked: Set<string>;\n    warn: (msg: string) => void;\n    dependenciesGraph?:\n      | GenericDependenciesGraphWithResolvedChildren\n      | undefined;\n  },\n  depPaths: DepPath[],\n  opts: {\n    optional: boolean;\n  }\n): void {\n  for (const depPath of depPaths) {\n    const key = `${depPath}:${opts.optional.toString()}`;\n\n    if (ctx.walked.has(key)) {\n      continue;\n    }\n\n    ctx.walked.add(key);\n\n    if (!ctx.originalPackages[depPath]) {\n      // local dependencies don't need to be resolved in pnpm-lock.yaml\n      // except local tarball dependencies\n      if (\n        depPath.startsWith('link:') ||\n        (depPath.startsWith('file:') && !depPath.endsWith('.tar.gz'))\n      )\n        continue;\n\n      ctx.warn(`Cannot find resolution of ${depPath} in lockfile`);\n      continue;\n    }\n    const depLockfile = ctx.originalPackages[depPath];\n    ctx.copiedSnapshots[depPath] = depLockfile;\n    if (opts.optional && !ctx.nonOptional.has(depPath)) {\n      depLockfile.optional = true;\n      if (ctx.dependenciesGraph?.[depPath]) {\n        ctx.dependenciesGraph[depPath].optional = true;\n      }\n    } else {\n      ctx.nonOptional.add(depPath);\n\n      // biome-ignore lint/performance/noDelete: <explanation>\n      delete depLockfile.optional;\n\n      if (ctx.dependenciesGraph?.[depPath]) {\n        ctx.dependenciesGraph[depPath].optional = false;\n      }\n    }\n    const newDependencies = resolvedDepsToDepPaths(\n      depLockfile.dependencies ?? {}\n    );\n    copyDependencySubGraph(ctx, newDependencies, opts);\n    const newOptionalDependencies = resolvedDepsToDepPaths(\n      depLockfile.optionalDependencies ?? {}\n    );\n    copyDependencySubGraph(ctx, newOptionalDependencies, { optional: true });\n  }\n}\n"],
  "mappings": "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",
  "names": []
}
