1- import type { Packument , PackumentVersion } from '@ npm/types '
1+ import type { PackageVersionsInfoWithMetadata } from 'fast- npm-meta '
22import { logger } from '#state'
3- import { ofetch } from 'ofetch '
3+ import { getVersions } from 'fast-npm-meta '
44import { memoize } from './memoize'
55
6- const NPM_REGISTRY = 'https://registry.npmjs.org'
7-
8- interface ResolvedPackumentVersion extends Pick < PackumentVersion , 'version' > {
9- tag ?: string
10- hasProvenance : boolean
11- deprecated ?: string
12- }
13-
14- export interface ResolvedPackument {
15- versions : Record < string , ResolvedPackumentVersion >
16- }
17-
186/**
197 * Encode a package name for use in npm registry URLs.
208 * Handles scoped packages (e.g., @scope/name -> @scope%2Fname).
@@ -26,32 +14,24 @@ export function encodePackageName(name: string): string {
2614 return encodeURIComponent ( name )
2715}
2816
29- export const getPackageInfo = memoize < string , Promise < ResolvedPackument > > ( async ( name ) => {
30- logger . info ( `Fetching package info for ${ name } ` )
31- const encodedName = encodePackageName ( name )
32-
33- const pkg = await ofetch < Packument > ( `${ NPM_REGISTRY } /${ encodedName } ` )
34- logger . info ( `Fetched package info for ${ name } ` )
17+ export interface PackageInfo extends PackageVersionsInfoWithMetadata {
18+ versionToTag : Map < string , string >
19+ }
3520
36- const resolvedVersions = Object . fromEntries (
37- Object . keys ( pkg . versions )
38- . filter ( ( v ) => pkg . time [ v ] )
39- . map < [ string , ResolvedPackumentVersion ] > ( ( v ) => [
40- v ,
41- {
42- version : v ,
43- // @ts -expect-error present if published with provenance
44- hasProvenance : ! ! pkg . versions [ v ] . dist . attestations ,
45- deprecated : pkg . versions [ v ] . deprecated ,
46- } ,
47- ] ) ,
48- )
21+ export const getPackageInfo = memoize < string , Promise < PackageInfo > > ( async ( name ) => {
22+ logger . info ( `Fetching package info for ${ name } ` )
4923
50- Object . entries ( pkg [ 'dist-tags' ] ) . forEach ( ( [ tag , version ] ) => {
51- resolvedVersions [ version ] . tag = tag
24+ const pkg = await getVersions ( name , {
25+ metadata : true ,
5226 } )
27+ logger . info ( `Fetched package info for ${ name } ` )
5328
54- return {
55- versions : resolvedVersions ,
29+ const versionToTag = new Map < string , string > ( )
30+ if ( pkg . distTags ) {
31+ for ( const [ tag , ver ] of Object . entries ( pkg . distTags ) ) {
32+ versionToTag . set ( ver , tag )
33+ }
5634 }
35+
36+ return { ...pkg , versionToTag }
5737} )
0 commit comments