Skip to content

Commit 220a136

Browse files
feat: add zero direct dependencies banner for package detail page
1 parent 04f3ab9 commit 220a136

6 files changed

Lines changed: 45 additions & 2 deletions

File tree

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<template>
2+
<section aria-labelledby="zero-direct-deps-heading" class="relative">
3+
<div
4+
role="status"
5+
class="border border-emerald-600/40 bg-emerald-500/10 rounded-lg px-3 py-2 text-base text-emerald-800 dark:text-emerald-400"
6+
>
7+
<h2 id="zero-direct-deps-heading" class="font-medium mb-1 flex items-center gap-2">
8+
<span class="i-lucide:circle-check-big w-4 h-4" aria-hidden="true" />
9+
{{ $t('package.dependencies.zero_direct_banner_title') }}
10+
</h2>
11+
<p class="text-sm m-0 mt-1">
12+
{{ $t('package.dependencies.zero_direct_banner_desc') }}
13+
</p>
14+
</div>
15+
</section>
16+
</template>

app/pages/package/[[org]]/[name].vue

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,12 @@ const hasDependencies = computed(() => {
456456
)
457457
})
458458
459+
const hasZeroDirectDependencies = computed(
460+
() =>
461+
!displayVersion.value?.dependencies ||
462+
Object.keys(displayVersion.value.dependencies).length === 0,
463+
)
464+
459465
// Vulnerability count for the stats banner
460466
const vulnCount = computed(() => vulnTree.value?.totalCounts.total ?? 0)
461467
const hasVulnerabilities = computed(() => vulnCount.value > 0)
@@ -1384,6 +1390,8 @@ const showSkeleton = shallowRef(false)
13841390
<PackageReplacement v-if="moduleReplacement" :replacement="moduleReplacement" />
13851391
<!-- Size / dependency increase notice -->
13861392
<PackageSizeIncrease v-if="sizeDiff" :diff="sizeDiff" />
1393+
<!-- Positive signal: no direct runtime dependencies -->
1394+
<PackageZeroDirectDependencies v-if="hasZeroDirectDependencies" />
13871395
<!-- Vulnerability scan -->
13881396
<ClientOnly>
13891397
<PackageVulnerabilityTree

i18n/locales/en.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,9 @@
413413
"outdated_major": "{count} major version behind (latest: {latest}) | {count} major versions behind (latest: {latest})",
414414
"outdated_minor": "{count} minor version behind (latest: {latest}) | {count} minor versions behind (latest: {latest})",
415415
"outdated_patch": "Patch update available (latest: {latest})",
416-
"has_replacement": "This dependency has suggested replacements"
416+
"has_replacement": "This dependency has suggested replacements",
417+
"zero_direct_banner_title": "0 direct dependencies",
418+
"zero_direct_banner_desc": "This package has no direct dependencies."
417419
},
418420
"peer_dependencies": {
419421
"title": "Peer Dependency ({count}) | Peer Dependencies ({count})",

i18n/locales/zh-CN.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,9 @@
403403
"outdated_major": "落后 {count} 个主要版本(最新:{latest})",
404404
"outdated_minor": "落后 {count} 个次要版本(最新:{latest})",
405405
"outdated_patch": "有可用的补丁更新(最新:{latest})",
406-
"has_replacement": "该依赖有推荐的替代包。"
406+
"has_replacement": "该依赖有推荐的替代包。",
407+
"zero_direct_banner_title": "0 个直接依赖",
408+
"zero_direct_banner_desc": "该包没有任何直接依赖。"
407409
},
408410
"peer_dependencies": {
409411
"title": "对等依赖({count} 个)",

i18n/schema.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1245,6 +1245,12 @@
12451245
},
12461246
"has_replacement": {
12471247
"type": "string"
1248+
},
1249+
"zero_direct_banner_title": {
1250+
"type": "string"
1251+
},
1252+
"zero_direct_banner_desc": {
1253+
"type": "string"
12481254
}
12491255
},
12501256
"additionalProperties": false

test/nuxt/a11y.spec.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ import PackageTrendsChart from '~/components/Package/TrendsChart.vue'
229229
import FacetBarChart from '~/components/Compare/FacetBarChart.vue'
230230
import PackageLikeCard from '~/components/Package/LikeCard.vue'
231231
import SizeIncrease from '~/components/Package/SizeIncrease.vue'
232+
import PackageZeroDirectDependencies from '~/components/Package/ZeroDirectDependencies.vue'
232233

233234
describe('component accessibility audits', () => {
234235
describe('DateTime', () => {
@@ -3529,6 +3530,14 @@ describe('component accessibility audits', () => {
35293530
expect(results.violations).toEqual([])
35303531
})
35313532
})
3533+
3534+
describe('PackageZeroDirectDependencies', () => {
3535+
it('should have no accessibility violations', async () => {
3536+
const component = await mountSuspended(PackageZeroDirectDependencies)
3537+
const results = await runAxe(component)
3538+
expect(results.violations).toEqual([])
3539+
})
3540+
})
35323541
})
35333542

35343543
function applyTheme(colorMode: string, bgTheme: string | null) {

0 commit comments

Comments
 (0)