Files
pnpm/lockfile/utils/src/pkgSnapshotToResolution.ts
2024-07-28 01:35:40 +02:00

53 lines
1.7 KiB
TypeScript

import url from 'url'
import { type PackageSnapshot, type TarballResolution } from '@pnpm/lockfile.types'
import { type Resolution } from '@pnpm/resolver-base'
import { type Registries } from '@pnpm/types'
import * as dp from '@pnpm/dependency-path'
import getNpmTarballUrl from 'get-npm-tarball-url'
import { isGitHostedPkgUrl } from '@pnpm/pick-fetcher'
import { nameVerFromPkgSnapshot } from './nameVerFromPkgSnapshot'
export function pkgSnapshotToResolution (
depPath: string,
pkgSnapshot: PackageSnapshot,
registries: Registries
): Resolution {
if (
Boolean((pkgSnapshot.resolution as TarballResolution).type) ||
(pkgSnapshot.resolution as TarballResolution).tarball?.startsWith('file:') ||
isGitHostedPkgUrl((pkgSnapshot.resolution as TarballResolution).tarball ?? '')
) {
return pkgSnapshot.resolution as Resolution
}
const { name } = nameVerFromPkgSnapshot(depPath, pkgSnapshot)
let registry: string = ''
if (name != null) {
if (name.startsWith('@')) {
registry = registries[name.split('/')[0]]
}
}
if (!registry) {
registry = registries.default
}
let tarball!: string
if (!(pkgSnapshot.resolution as TarballResolution).tarball) {
tarball = getTarball(registry)
} else {
tarball = new url.URL((pkgSnapshot.resolution as TarballResolution).tarball,
registry.endsWith('/') ? registry : `${registry}/`
).toString()
}
return {
...pkgSnapshot.resolution,
tarball,
} as Resolution
function getTarball (registry: string) {
const { name, version } = dp.parse(depPath)
if (!name || !version) {
throw new Error(`Couldn't get tarball URL from dependency path ${depPath}`)
}
return getNpmTarballUrl(name, version, { registry })
}
}