@@ -373,11 +373,72 @@ const badgeStrategies = {
373373 } ,
374374
375375 'types' : async ( pkgData : globalThis . Packument ) => {
376- const latest = getLatestVersion ( pkgData )
377- const versionData = latest ? pkgData . versions ?. [ latest ] : undefined
378- const hasTypes = ! ! ( versionData ?. types || versionData ?. typings )
379- const value = hasTypes ? 'included' : 'missing'
380- const color = hasTypes ? COLORS . blue : COLORS . slate
376+ const versionData = pkgData . versions ?. latest
377+
378+ if ( ! versionData ) {
379+ return { label : 'types' , value : 'unknown' , color : COLORS . slate }
380+ }
381+
382+ const pkgJson : ExtendedPackageJson = {
383+ name : pkgData . name ,
384+ version : 'latest' ,
385+ types : versionData . types ,
386+ typings : versionData . typings ,
387+ exports : versionData . exports ,
388+ main : versionData . main ,
389+ module : versionData . module ,
390+ type : versionData . type ,
391+ }
392+
393+ let typesStatus : TypesStatus = { kind : 'none' }
394+ let detailColor = COLORS . blue
395+
396+ if ( hasBuiltInTypes ( pkgJson ) ) {
397+ typesStatus = { kind : 'included' }
398+ } else {
399+ try {
400+ const [ fileTreeResult , typesMetaResult ] = await Promise . allSettled ( [
401+ getPackageFileTree ( pkgData . name , latest ) ,
402+ getLatestVersion ( getTypesPackageName ( pkgData . name ) , { metadata : true , throw : false } ) ,
403+ ] )
404+
405+ let files : Set < string > | undefined
406+ if ( fileTreeResult . status === 'fulfilled' ) {
407+ files = flattenFileTree ( fileTreeResult . value . tree )
408+ }
409+
410+ let typesPkg : TypesPackageInfo | undefined
411+ if ( typesMetaResult . status === 'fulfilled' && ! ( 'error' in typesMetaResult . value ) ) {
412+ typesPkg = {
413+ packageName : getTypesPackageName ( pkgData . name ) ,
414+ deprecated : typesMetaResult . value . deprecated ,
415+ }
416+ }
417+
418+ typesStatus = detectTypesStatus ( pkgJson , typesPkg , files )
419+ } catch { }
420+ }
421+
422+ let value : 'included' | '@types' | 'missing'
423+ let color : string
424+
425+ switch ( typesStatus . kind ) {
426+ case 'included' : {
427+ value = 'included'
428+ color = COLORS . blue
429+ break
430+ }
431+ case '@types' : {
432+ value = '@types'
433+ color = COLORS . blue
434+ break
435+ }
436+ default : {
437+ value = 'missing'
438+ color = COLORS . slate
439+ break
440+ }
441+ }
381442 return { label : 'types' , value, color }
382443 } ,
383444
0 commit comments