From b547d5cbc2b5d57cf27e2d1e3491dd40afcf7c32 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Thu, 29 Jan 2026 15:39:51 +0000 Subject: [PATCH 1/2] feat: display vulnerability count in stats banner --- app/components/PackageVulnerabilityTree.vue | 39 +------- app/pages/[...package].vue | 102 +++++++++++++++++++- i18n/locales/en.json | 1 + 3 files changed, 103 insertions(+), 39 deletions(-) diff --git a/app/components/PackageVulnerabilityTree.vue b/app/components/PackageVulnerabilityTree.vue index e40157f042..2e6d1390a7 100644 --- a/app/components/PackageVulnerabilityTree.vue +++ b/app/components/PackageVulnerabilityTree.vue @@ -188,44 +188,9 @@ function getDepthStyle(depth: string | undefined) { - -
-
-
-
-
-
+ - -
-
-
-
- -
-
-
-
+
diff --git a/app/pages/[...package].vue b/app/pages/[...package].vue index ff18b9533b..d37771adf9 100644 --- a/app/pages/[...package].vue +++ b/app/pages/[...package].vue @@ -83,6 +83,28 @@ const displayVersion = computed(() => { return pkg.value.versions[latestTag] ?? null }) +// Fetch vulnerability tree (lazy, client-side) +// This is the same composable used by PackageVulnerabilityTree +const { + data: vulnTree, + status: vulnTreeStatus, + fetch: fetchVulnTree, +} = useVulnerabilityTree(packageName, () => displayVersion.value?.version ?? '') +onMounted(() => { + // Fetch vulnerability tree once displayVersion is available + if (displayVersion.value) { + fetchVulnTree() + } +}) +watch( + () => displayVersion.value?.version, + () => { + if (displayVersion.value) { + fetchVulnTree() + } + }, +) + // Keep latestVersion for comparison (to show "(latest)" badge) const latestVersion = computed(() => { if (!pkg.value) return null @@ -129,6 +151,22 @@ const hasDependencies = computed(() => { ) }) +// Vulnerability count for the stats banner +const vulnCount = computed(() => vulnTree.value?.totalCounts.total ?? 0) +const hasVulnerabilities = computed(() => vulnCount.value > 0) + +// Total transitive dependencies count (from either vuln tree or install size) +// Subtract 1 to exclude the root package itself +const totalDepsCount = computed(() => { + if (vulnTree.value) { + return vulnTree.value.totalPackages - 1 + } + if (installSize.value) { + return installSize.value.dependencyCount + } + return null +}) + const repositoryUrl = computed(() => { const repo = displayVersion.value?.repository if (!repo?.url) return null @@ -726,7 +764,7 @@ defineOgImageComponent('Package', {
@@ -742,7 +780,31 @@ defineOgImageComponent('Package', { {{ $t('package.stats.deps') }}
- {{ getDependencyCount(displayVersion) }} + + {{ getDependencyCount(displayVersion) }} + + + / + + + + + {{ totalDepsCount }} + - + + +
+ + +
+
+ {{ $t('package.stats.vulns') }} +
+
+ + + + {{ vulnCount }} + + + + - +
+
+ +
+
{{ $t('package.stats.updated') }} diff --git a/i18n/locales/en.json b/i18n/locales/en.json index e6b8596725..6bdb6f9e76 100644 --- a/i18n/locales/en.json +++ b/i18n/locales/en.json @@ -121,6 +121,7 @@ "license": "License", "deps": "Deps", "install_size": "Install Size", + "vulns": "Vulns", "updated": "Updated", "view_dependency_graph": "View dependency graph", "inspect_dependency_tree": "Inspect dependency tree" From a9cb0b78ce2fd076782e424873d212e5eeb3d135 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Thu, 29 Jan 2026 15:44:10 +0000 Subject: [PATCH 2/2] [autofix.ci] apply automated fixes --- lunaria/files/en-US.json | 1 + 1 file changed, 1 insertion(+) diff --git a/lunaria/files/en-US.json b/lunaria/files/en-US.json index e6b8596725..6bdb6f9e76 100644 --- a/lunaria/files/en-US.json +++ b/lunaria/files/en-US.json @@ -121,6 +121,7 @@ "license": "License", "deps": "Deps", "install_size": "Install Size", + "vulns": "Vulns", "updated": "Updated", "view_dependency_graph": "View dependency graph", "inspect_dependency_tree": "Inspect dependency tree"