diff --git a/app/composables/useNpmRegistry.ts b/app/composables/useNpmRegistry.ts index 719085839..1c4ecd21b 100644 --- a/app/composables/useNpmRegistry.ts +++ b/app/composables/useNpmRegistry.ts @@ -858,3 +858,8 @@ export function getVersionClass(info: OutdatedDependencyInfo | undefined): strin // Yellow for patch versions behind return 'text-yellow-500 cursor-help' } + +export function getDependencyCount(version: PackumentVersion | null): number { + if (!version?.dependencies) return 0 + return Object.keys(version.dependencies).length +} diff --git a/app/composables/usePackageComparison.ts b/app/composables/usePackageComparison.ts index 07640df5f..de9f45009 100644 --- a/app/composables/usePackageComparison.ts +++ b/app/composables/usePackageComparison.ts @@ -8,16 +8,20 @@ import type { import { encodePackageName } from '#shared/utils/npm' import type { PackageAnalysisResponse } from './usePackageAnalysis' import { isBinaryOnlyPackage } from '#shared/utils/binary-detection' +import { getDependencyCount } from './useNpmRegistry' export interface PackageComparisonData { package: ComparisonPackage downloads?: number /** Package's own unpacked size (from dist.unpackedSize) */ packageSize?: number + /** Direct dependencies count */ + directDeps: number /** Install size data (fetched lazily) */ installSize?: { selfSize: number totalSize: number + /** Total dependency count */ dependencyCount: number } analysis?: PackageAnalysisResponse @@ -109,6 +113,8 @@ export function usePackageComparison(packageNames: MaybeRefOrGetter) { ), ]) + const pkg = usePackage(name, latestVersion) + const versionData = pkgData.versions[latestVersion] const packageSize = versionData?.dist?.unpackedSize @@ -139,6 +145,7 @@ export function usePackageComparison(packageNames: MaybeRefOrGetter) { }, downloads: downloads?.downloads, packageSize, + directDeps: getDependencyCount(pkg.data.value?.requestedVersion ?? null), installSize: undefined, // Will be filled in second pass analysis: analysis ?? undefined, vulnerabilities: { @@ -360,8 +367,7 @@ function computeFacetValue( } case 'dependencies': - if (!data.installSize) return null - const depCount = data.installSize.dependencyCount + const depCount = data.directDeps return { raw: depCount, display: String(depCount), @@ -380,7 +386,13 @@ function computeFacetValue( // Coming soon facets case 'totalDependencies': - return null + if (!data.installSize) return null + const totalDepCount = data.installSize.dependencyCount + return { + raw: totalDepCount, + display: String(totalDepCount), + status: totalDepCount > 50 ? 'warning' : 'neutral', + } default: return null diff --git a/app/pages/package/[...package].vue b/app/pages/package/[...package].vue index 734a7e060..b78c851ae 100644 --- a/app/pages/package/[...package].vue +++ b/app/pages/package/[...package].vue @@ -293,11 +293,6 @@ function normalizeGitUrl(url: string): string { .replace(/^git@github\.com:/, 'https://github.com/') } -function getDependencyCount(version: PackumentVersion | null): number { - if (!version?.dependencies) return 0 - return Object.keys(version.dependencies).length -} - // Check if a version has provenance/attestations // The dist object may have attestations that aren't in the base type function hasProvenance(version: PackumentVersion | null): boolean { diff --git a/shared/types/comparison.ts b/shared/types/comparison.ts index bcefd38b7..c9c1303b6 100644 --- a/shared/types/comparison.ts +++ b/shared/types/comparison.ts @@ -41,7 +41,6 @@ export const FACET_INFO: Record> = { }, totalDependencies: { category: 'performance', - comingSoon: true, }, // Health downloads: {