{
  "version": 3,
  "sources": ["../../../../src/packages/plugin-commands-patching/getPatchedDependency.ts"],
  "sourcesContent": ["import path from 'node:path';\nimport {\n  parseWantedDependency,\n  type ParseWantedDependencyResult,\n} from '../parse-wanted-dependency/index.ts';\nimport { prompt } from 'enquirer';\nimport { readCurrentLockfile } from '../lockfile.fs/index.ts';\nimport { nameVerFromPkgSnapshot } from '../lockfile.utils/index.ts';\nimport { PnpmError } from '../error/index.ts';\nimport { readModulesManifest } from '../modules-yaml/index.ts';\nimport { isGitHostedPkgUrl } from '../pick-fetcher/index.ts';\nimport realpathMissing from 'realpath-missing';\nimport semver from 'semver';\nimport type { Config } from '../config/index.ts';\nimport type { TarballResolution } from '../resolver-base/index.ts';\nimport type { ModulesDir, PkgResolutionId } from '../types/index.ts';\nimport type { PackageSnapshot } from '../lockfile.types/index.ts';\n\nexport type GetPatchedDependencyOptions = {\n  lockfileDir: string;\n} & Pick<Config, 'virtualStoreDir' | 'modulesDir'>;\n\nexport type GetPatchedDependencyResult = ParseWantedDependencyResult & {\n  applyToAll: boolean;\n};\n\nexport async function getPatchedDependency(\n  rawDependency: string,\n  opts: GetPatchedDependencyOptions\n): Promise<GetPatchedDependencyResult> {\n  const dep = parseWantedDependency(rawDependency);\n\n  const { versions, preferredVersions } = await getVersionsFromLockfile(\n    dep,\n    opts\n  );\n\n  if (!preferredVersions.length) {\n    throw new PnpmError(\n      'PATCH_VERSION_NOT_FOUND',\n      `Can not find ${rawDependency} in project ${opts.lockfileDir}, ${versions.length ? `you can specify currently installed version: ${versions.map(({ version }) => version).join(', ')}.` : `did you forget to install ${rawDependency}?`}`\n    );\n  }\n\n  dep.alias = dep.alias ?? rawDependency;\n\n  if (preferredVersions.length > 1) {\n    const { version, applyToAll } = await prompt<{\n      version: string;\n      applyToAll: boolean;\n    }>([\n      {\n        type: 'select',\n        name: 'version',\n        message: 'Choose which version to patch',\n        choices: preferredVersions.map(\n          (\n            preferred: LockfileVersion\n          ): {\n            name: string;\n            message: string;\n            value: string;\n            hint: string;\n          } => {\n            return {\n              name: preferred.version,\n              message: preferred.version,\n              value: preferred.gitTarballUrl ?? preferred.version,\n              hint:\n                typeof preferred.gitTarballUrl === 'string' ? 'Git Hosted' : '',\n            };\n          }\n        ),\n        result(selected: string) {\n          const selectedVersion = preferredVersions.find(\n            (preferred: LockfileVersion): boolean => {\n              return preferred.version === selected;\n            }\n          );\n\n          return selectedVersion?.gitTarballUrl ?? selected;\n        },\n      },\n      {\n        type: 'confirm',\n        name: 'applyToAll',\n        message: 'Apply this patch to all versions?',\n      },\n    ]);\n\n    return {\n      ...dep,\n      applyToAll,\n      pref: version,\n    };\n  }\n\n  const preferred = preferredVersions[0];\n\n  return {\n    ...dep,\n    applyToAll: typeof dep.pref === 'undefined',\n    pref: preferred?.gitTarballUrl ?? preferred?.version ?? '',\n  };\n}\n\nexport interface LockfileVersion {\n  gitTarballUrl?: string;\n  name: string;\n  peersSuffix?: string;\n  version: string;\n}\n\nexport interface LockfileVersionsList {\n  versions: LockfileVersion[];\n  preferredVersions: LockfileVersion[];\n}\n\nexport async function getVersionsFromLockfile(\n  dep: ParseWantedDependencyResult,\n  opts: GetPatchedDependencyOptions\n): Promise<LockfileVersionsList> {\n  const modulesDir: ModulesDir = (await realpathMissing(\n    path.join(opts.lockfileDir, opts.modulesDir ?? 'node_modules')\n  )) as ModulesDir;\n\n  const modules = await readModulesManifest(modulesDir);\n\n  const lockfile =\n    (typeof modules?.virtualStoreDir === 'string' &&\n      (await readCurrentLockfile(modules.virtualStoreDir, {\n        ignoreIncompatible: true,\n      }))) ??\n    null;\n\n  // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n  if (!lockfile) {\n    throw new PnpmError(\n      'PATCH_NO_LOCKFILE',\n      'The modules directory is not ready for patching',\n      {\n        hint: 'Run pnpm install first',\n      }\n    );\n  }\n\n  const pkgName =\n    typeof dep.alias === 'string' && typeof dep.pref === 'string'\n      ? dep.alias\n      : (dep.pref ?? dep.alias);\n\n  const versions = Object.entries(lockfile.packages ?? {})\n    .map(\n      ([depPath, pkgSnapshot]: [string, PackageSnapshot]): {\n        gitTarballUrl: string;\n        name: string;\n        peersSuffix: string;\n        version: string;\n        nonSemverVersion?: PkgResolutionId | undefined;\n      } => {\n        const tarball =\n          (pkgSnapshot.resolution as TarballResolution).tarball ?? '';\n\n        return {\n          ...nameVerFromPkgSnapshot(depPath, pkgSnapshot),\n          gitTarballUrl: isGitHostedPkgUrl(tarball) ? tarball : '',\n        };\n      }\n    )\n    .filter(\n      ({\n        name,\n      }: {\n        gitTarballUrl: string;\n        name: string;\n        peersSuffix: string;\n        version: string;\n        nonSemverVersion?: PkgResolutionId | undefined;\n      }): boolean => {\n        return name === pkgName;\n      }\n    );\n\n  return {\n    versions,\n    preferredVersions: versions.filter(\n      ({\n        version,\n      }: {\n        gitTarballUrl?: string | undefined;\n        name: string;\n        peersSuffix?: string | undefined;\n        version: string;\n        nonSemverVersion?: PkgResolutionId | undefined;\n      }): boolean => {\n        return typeof dep.alias === 'string' && typeof dep.pref === 'string'\n          ? semver.satisfies(version, dep.pref)\n          : true;\n      }\n    ),\n  };\n}\n"],
  "mappings": "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",
  "names": ["preferred"]
}
