11import type { Packument , PackumentVersion } from '@npm/types'
2- import { NPM_REGISTRY } from '#constants'
3- import { logger } from '#state'
4- import { LRUCache } from 'lru-cache'
52import { ofetch } from 'ofetch'
3+ import { createCachedFetch } from './cache'
4+
5+ const NPM_REGISTRY = 'https://registry.npmjs.org'
66
77interface ResolvedPackumentVersion extends Pick < PackumentVersion , 'version' > {
88 tag ?: string
@@ -25,46 +25,33 @@ export function encodePackageName(name: string): string {
2525 return encodeURIComponent ( name )
2626}
2727
28- const cache = new LRUCache < string , ResolvedPackument > ( {
29- max : 500 ,
30- ttl : 5 * 60 * 1000 ,
31- updateAgeOnGet : true ,
32- allowStale : true ,
33- fetchMethod : async ( name , staleValue , { signal } ) => {
28+ export const getPackageInfo = createCachedFetch < ResolvedPackument > (
29+ 'package info' ,
30+ async ( name , staleValue , { signal } ) => {
3431 const encodedName = encodePackageName ( name )
3532
36- try {
37- logger . info ( `[${ name } ] fetching package info...` )
38- const pkg = await ofetch < Packument > ( `${ NPM_REGISTRY } /${ encodedName } ` , { signal } )
39- logger . info ( `[${ name } ] fetching package info done!` )
40-
41- const resolvedVersions = Object . fromEntries (
42- Object . keys ( pkg . versions )
43- . filter ( ( v ) => pkg . time [ v ] )
44- . map < [ string , ResolvedPackumentVersion ] > ( ( v ) => [
45- v ,
46- {
47- version : v ,
48- // @ts -expect-error present if published with provenance
49- hasProvenance : ! ! pkg . versions [ v ] . dist . attestations ,
50- deprecated : pkg . versions [ v ] . deprecated ,
51- } ,
52- ] ) ,
53- )
54-
55- Object . entries ( pkg [ 'dist-tags' ] ) . forEach ( ( [ tag , version ] ) => {
56- resolvedVersions [ version ] . tag = tag
57- } )
58-
59- return {
60- versions : resolvedVersions ,
61- }
62- } catch ( err ) {
63- logger . warn ( `[${ name } ] fetching package info error: ` , err )
33+ const pkg = await ofetch < Packument > ( `${ NPM_REGISTRY } /${ encodedName } ` , { signal } )
34+
35+ const resolvedVersions = Object . fromEntries (
36+ Object . keys ( pkg . versions )
37+ . filter ( ( v ) => pkg . time [ v ] )
38+ . map < [ string , ResolvedPackumentVersion ] > ( ( v ) => [
39+ v ,
40+ {
41+ version : v ,
42+ // @ts -expect-error present if published with provenance
43+ hasProvenance : ! ! pkg . versions [ v ] . dist . attestations ,
44+ deprecated : pkg . versions [ v ] . deprecated ,
45+ } ,
46+ ] ) ,
47+ )
48+
49+ Object . entries ( pkg [ 'dist-tags' ] ) . forEach ( ( [ tag , version ] ) => {
50+ resolvedVersions [ version ] . tag = tag
51+ } )
52+
53+ return {
54+ versions : resolvedVersions ,
6455 }
6556 } ,
66- } )
67-
68- export async function getPackageInfo ( name : string ) {
69- return ( await cache . fetch ( name ) ) !
70- }
57+ )
0 commit comments