mirror of
https://github.com/pnpm/pnpm.git
synced 2026-01-30 01:32:10 -05:00
53 lines
1.7 KiB
TypeScript
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 })
|
|
}
|
|
}
|