1- import type { FacetValue , ComparisonFacet , ComparisonPackage } from '#shared/types'
1+ import type { FacetValue , ComparisonFacet , ComparisonPackage , Packument } from '#shared/types'
22import { encodePackageName } from '#shared/utils/npm'
33import type { PackageAnalysisResponse } from './usePackageAnalysis'
4+ import { isBinaryOnlyPackage } from '#shared/utils/binary-detection'
45
56export interface PackageComparisonData {
67 package : ComparisonPackage
@@ -24,13 +25,16 @@ export interface PackageComparisonData {
2425 engines ?: { node ?: string ; npm ?: string }
2526 deprecated ?: string
2627 }
28+ /** Whether this is a binary-only package (CLI without library entry points) */
29+ isBinaryOnly ?: boolean
2730}
2831
2932/**
3033 * Composable for fetching and comparing multiple packages.
3134 *
3235 */
3336export function usePackageComparison ( packageNames : MaybeRefOrGetter < string [ ] > ) {
37+ const { t } = useI18n ( )
3438 const packages = computed ( ( ) => toValue ( packageNames ) )
3539
3640 // Cache of fetched data by package name (source of truth)
@@ -75,13 +79,9 @@ export function usePackageComparison(packageNames: MaybeRefOrGetter<string[]>) {
7579 namesToFetch . map ( async ( name ) : Promise < PackageComparisonData | null > => {
7680 try {
7781 // Fetch basic package info first (required)
78- const pkgData = await $fetch < {
79- 'name' : string
80- 'dist-tags' : Record < string , string >
81- 'time' : Record < string , string >
82- 'license' ?: string
83- 'versions' : Record < string , { dist ?: { unpackedSize ?: number } ; deprecated ?: string } >
84- } > ( `https://registry.npmjs.org/${ encodePackageName ( name ) } ` )
82+ const pkgData = await $fetch < Packument > (
83+ `https://registry.npmjs.org/${ encodePackageName ( name ) } ` ,
84+ )
8585
8686 const latestVersion = pkgData [ 'dist-tags' ] ?. latest
8787 if ( ! latestVersion ) return null
@@ -100,6 +100,15 @@ export function usePackageComparison(packageNames: MaybeRefOrGetter<string[]>) {
100100 const versionData = pkgData . versions [ latestVersion ]
101101 const packageSize = versionData ?. dist ?. unpackedSize
102102
103+ // Detect if package is binary-only
104+ const isBinary = isBinaryOnlyPackage ( {
105+ name : pkgData . name ,
106+ bin : versionData ?. bin ,
107+ main : versionData ?. main ,
108+ module : versionData ?. module ,
109+ exports : versionData ?. exports ,
110+ } )
111+
103112 // Count vulnerabilities by severity
104113 const vulnCounts = { critical : 0 , high : 0 , medium : 0 , low : 0 }
105114 const vulnList = vulns ?. vulnerabilities ?? [ ]
@@ -128,6 +137,7 @@ export function usePackageComparison(packageNames: MaybeRefOrGetter<string[]>) {
128137 engines : analysis ?. engines ,
129138 deprecated : versionData ?. deprecated ,
130139 } ,
140+ isBinaryOnly : isBinary ,
131141 }
132142 } catch {
133143 return null
@@ -196,7 +206,7 @@ export function usePackageComparison(packageNames: MaybeRefOrGetter<string[]>) {
196206
197207 return packagesData . value . map ( pkg => {
198208 if ( ! pkg ) return null
199- return computeFacetValue ( facet , pkg )
209+ return computeFacetValue ( facet , pkg , t )
200210 } )
201211 }
202212
@@ -223,7 +233,11 @@ export function usePackageComparison(packageNames: MaybeRefOrGetter<string[]>) {
223233 }
224234}
225235
226- function computeFacetValue ( facet : ComparisonFacet , data : PackageComparisonData ) : FacetValue | null {
236+ function computeFacetValue (
237+ facet : ComparisonFacet ,
238+ data : PackageComparisonData ,
239+ t : ( key : string ) => string ,
240+ ) : FacetValue | null {
227241 switch ( facet ) {
228242 case 'downloads' :
229243 if ( data . downloads === undefined ) return null
@@ -259,6 +273,14 @@ function computeFacetValue(facet: ComparisonFacet, data: PackageComparisonData):
259273 }
260274
261275 case 'types' :
276+ if ( data . isBinaryOnly ) {
277+ return {
278+ raw : 'binary' ,
279+ display : 'N/A' ,
280+ status : 'muted' ,
281+ tooltip : t ( 'compare.facets.binary_only_tooltip' ) ,
282+ }
283+ }
262284 if ( ! data . analysis ) return null
263285 const types = data . analysis . types
264286 return {
0 commit comments