diff --git a/app/composables/usePackageComparison.ts b/app/composables/usePackageComparison.ts index 690bff4da..444914650 100644 --- a/app/composables/usePackageComparison.ts +++ b/app/composables/usePackageComparison.ts @@ -5,6 +5,7 @@ import type { Packument, VulnerabilityTreeResult, } from '#shared/types' +import type { PackageLikes } from '#shared/types/social' import { encodePackageName } from '#shared/utils/npm' import type { PackageAnalysisResponse } from './usePackageAnalysis' import { isBinaryOnlyPackage } from '#shared/utils/binary-detection' @@ -14,6 +15,8 @@ import { getDependencyCount } from '~/utils/npm/dependency-count' export interface PackageComparisonData { package: ComparisonPackage downloads?: number + /** Total likes from atproto */ + totalLikes?: number /** Package's own unpacked size (from dist.unpackedSize) */ packageSize?: number /** Number of direct dependencies */ @@ -104,7 +107,7 @@ export function usePackageComparison(packageNames: MaybeRefOrGetter) { if (!latestVersion) return null // Fetch fast additional data in parallel (optional - failures are ok) - const [downloads, analysis, vulns] = await Promise.all([ + const [downloads, analysis, vulns, likes] = await Promise.all([ $fetch<{ downloads: number }>( `https://api.npmjs.org/downloads/point/last-week/${encodePackageName(name)}`, ).catch(() => null), @@ -112,8 +115,8 @@ export function usePackageComparison(packageNames: MaybeRefOrGetter) { $fetch(`/api/registry/vulnerabilities/${name}`).catch( () => null, ), + $fetch(`/api/social/likes/${name}`).catch(() => null), ]) - const versionData = pkgData.versions[latestVersion] const packageSize = versionData?.dist?.unpackedSize @@ -160,6 +163,7 @@ export function usePackageComparison(packageNames: MaybeRefOrGetter) { deprecated: versionData?.deprecated, }, isBinaryOnly: isBinary, + totalLikes: likes?.totalLikes, } } catch { return null @@ -269,6 +273,14 @@ function computeFacetValue( status: 'neutral', } } + case 'totalLikes': { + if (data.totalLikes === undefined) return null + return { + raw: data.totalLikes, + display: formatCompactNumber(data.totalLikes), + status: 'neutral', + } + } case 'packageSize': { if (!data.packageSize) return null return { diff --git a/i18n/locales/en.json b/i18n/locales/en.json index 7518b487c..3077eeb83 100644 --- a/i18n/locales/en.json +++ b/i18n/locales/en.json @@ -908,6 +908,10 @@ "label": "Downloads/wk", "description": "Weekly download count" }, + "totalLikes": { + "label": "Likes", + "description": "Number of likes" + }, "lastUpdated": { "label": "Published", "description": "When this version was published" diff --git a/i18n/locales/fr-FR.json b/i18n/locales/fr-FR.json index 6bfaa114e..2b3e34c3b 100644 --- a/i18n/locales/fr-FR.json +++ b/i18n/locales/fr-FR.json @@ -891,6 +891,10 @@ "label": "Téléch./semaine", "description": "Nombre de téléchargements par semaine" }, + "totalLikes": { + "label": "Likes", + "description": "Nombre de likes" + }, "lastUpdated": { "label": "Publié", "description": "Quand cette version a été publiée" diff --git a/lunaria/files/en-GB.json b/lunaria/files/en-GB.json index 583ca875d..d84d57e08 100644 --- a/lunaria/files/en-GB.json +++ b/lunaria/files/en-GB.json @@ -908,6 +908,10 @@ "label": "Downloads/wk", "description": "Weekly download count" }, + "totalLikes": { + "label": "Likes", + "description": "Number of likes" + }, "lastUpdated": { "label": "Published", "description": "When this version was published" diff --git a/lunaria/files/en-US.json b/lunaria/files/en-US.json index 7518b487c..3077eeb83 100644 --- a/lunaria/files/en-US.json +++ b/lunaria/files/en-US.json @@ -908,6 +908,10 @@ "label": "Downloads/wk", "description": "Weekly download count" }, + "totalLikes": { + "label": "Likes", + "description": "Number of likes" + }, "lastUpdated": { "label": "Published", "description": "When this version was published" diff --git a/lunaria/files/fr-FR.json b/lunaria/files/fr-FR.json index 6bfaa114e..2b3e34c3b 100644 --- a/lunaria/files/fr-FR.json +++ b/lunaria/files/fr-FR.json @@ -891,6 +891,10 @@ "label": "Téléch./semaine", "description": "Nombre de téléchargements par semaine" }, + "totalLikes": { + "label": "Likes", + "description": "Nombre de likes" + }, "lastUpdated": { "label": "Publié", "description": "Quand cette version a été publiée" diff --git a/shared/types/comparison.ts b/shared/types/comparison.ts index ec3113f0f..9dfe229eb 100644 --- a/shared/types/comparison.ts +++ b/shared/types/comparison.ts @@ -16,6 +16,7 @@ export type ComparisonFacet = | 'dependencies' | 'totalDependencies' | 'deprecated' + | 'totalLikes' /** Facet metadata for UI display */ export interface FacetInfo { @@ -46,6 +47,9 @@ export const FACET_INFO: Record> = { downloads: { category: 'health', }, + totalLikes: { + category: 'health', + }, lastUpdated: { category: 'health', }, diff --git a/test/nuxt/components/compare/FacetSelector.spec.ts b/test/nuxt/components/compare/FacetSelector.spec.ts index 6d98e87ae..9dc2757e6 100644 --- a/test/nuxt/components/compare/FacetSelector.spec.ts +++ b/test/nuxt/components/compare/FacetSelector.spec.ts @@ -31,6 +31,7 @@ const facetLabels: Record = {