11<script setup lang="ts">
2- import { useVulnerabilityTree } from ' ~/composables/useVulnerabilityTree '
2+ import { useDependencyAnalysis } from ' ~/composables/useDependencyAnalysis '
33import { SEVERITY_TEXT_COLORS , getHighestSeverity } from ' #shared/utils/severity'
44
55const props = defineProps <{
@@ -15,7 +15,7 @@ const props = defineProps<{
1515const outdatedDeps = useOutdatedDependencies (() => props .dependencies )
1616
1717// Get vulnerability info from shared cache (already fetched by PackageVulnerabilityTree)
18- const { data : vulnTree } = useVulnerabilityTree (
18+ const { data : vulnTree } = useDependencyAnalysis (
1919 () => props .packageName ,
2020 () => props .version ,
2121)
@@ -26,6 +26,12 @@ function getVulnerableDepInfo(depName: string) {
2626 return vulnTree .value .vulnerablePackages .find (p => p .name === depName && p .depth === ' direct' )
2727}
2828
29+ // Check if a dependency is deprecated (only direct deps)
30+ function getDeprecatedDepInfo(depName : string ) {
31+ if (! vulnTree .value ) return null
32+ return vulnTree .value .deprecatedPackages .find (p => p .name === depName && p .depth === ' direct' )
33+ }
34+
2935// Expanded state for each section
3036const depsExpanded = shallowRef (false )
3137const peerDepsExpanded = shallowRef (false )
@@ -80,7 +86,7 @@ const sortedOptionalDependencies = computed(() => {
8086 >
8187 {{ $t('package.dependencies.title', { count: sortedDependencies.length }) }}
8288 <span
83- class =" i-carbon- link w-3 h-3 block opacity-0 group-hover:opacity-100 transition-opacity duration-200"
89+ class =" i-carbon: link w-3 h-3 block opacity-0 group-hover:opacity-100 transition-opacity duration-200"
8490 aria-hidden =" true"
8591 />
8692 </a >
@@ -89,7 +95,7 @@ const sortedOptionalDependencies = computed(() => {
8995 <li
9096 v-for =" [dep, version] in sortedDependencies.slice(0, depsExpanded ? undefined : 10)"
9197 :key =" dep"
92- class =" flex items-center justify-between py-1 text-sm gap-2"
98+ class =" flex items-center justify-start py-1 text-sm gap-2"
9399 >
94100 <NuxtLink
95101 :to =" { name: 'package', params: { package: dep.split('/') } }"
@@ -105,8 +111,9 @@ const sortedOptionalDependencies = computed(() => {
105111 :title =" getOutdatedTooltip(outdatedDeps[dep])"
106112 aria-hidden =" true"
107113 >
108- <span class =" i-carbon- warning-alt w-3 h-3 block" />
114+ <span class =" i-carbon: warning-alt w-3 h-3 block" />
109115 </span >
116+ <span aria-hidden =" true" class =" flex-shrink-1 flex-grow-1" />
110117 <NuxtLink
111118 v-if =" getVulnerableDepInfo(dep)"
112119 :to =" {
@@ -117,12 +124,24 @@ const sortedOptionalDependencies = computed(() => {
117124 :class =" SEVERITY_TEXT_COLORS[getHighestSeverity(getVulnerableDepInfo(dep)!.counts)]"
118125 :title =" `${getVulnerableDepInfo(dep)!.counts.total} vulnerabilities`"
119126 >
120- <span class =" i-carbon- security w-3 h-3 block" aria-hidden =" true" />
127+ <span class =" i-carbon: security w-3 h-3 block" aria-hidden =" true" />
121128 <span class =" sr-only" >{{ $t('package.dependencies.view_vulnerabilities') }}</span >
122129 </NuxtLink >
130+ <NuxtLink
131+ v-if =" getDeprecatedDepInfo(dep)"
132+ :to =" {
133+ name: 'package',
134+ params: { package: [...dep.split('/'), 'v', getDeprecatedDepInfo(dep)!.version] },
135+ }"
136+ class =" shrink-0 text-purple-500"
137+ :title =" getDeprecatedDepInfo(dep)!.message"
138+ >
139+ <span class =" i-carbon-warning-hex w-3 h-3 block" aria-hidden =" true" />
140+ <span class =" sr-only" >{{ $t('package.deprecated.label') }}</span >
141+ </NuxtLink >
123142 <NuxtLink
124143 :to =" { name: 'package', params: { package: [...dep.split('/'), 'v', version] } }"
125- class =" font-mono text-xs text-right truncate"
144+ class =" font-mono text-xs text-end truncate"
126145 :class =" getVersionClass(outdatedDeps[dep])"
127146 :title =" outdatedDeps[dep] ? getOutdatedTooltip(outdatedDeps[dep]) : version"
128147 >
@@ -164,7 +183,7 @@ const sortedOptionalDependencies = computed(() => {
164183 >
165184 {{ $t('package.peer_dependencies.title', { count: sortedPeerDependencies.length }) }}
166185 <span
167- class =" i-carbon- link w-3 h-3 block opacity-0 group-hover:opacity-100 transition-opacity duration-200"
186+ class =" i-carbon: link w-3 h-3 block opacity-0 group-hover:opacity-100 transition-opacity duration-200"
168187 aria-hidden =" true"
169188 />
170189 </a >
@@ -176,7 +195,7 @@ const sortedOptionalDependencies = computed(() => {
176195 <li
177196 v-for =" peer in sortedPeerDependencies.slice(0, peerDepsExpanded ? undefined : 10)"
178197 :key =" peer.name"
179- class =" flex items-center justify-between py-1 text-sm gap-2"
198+ class =" flex items-center justify-start py-1 text-sm gap-2"
180199 >
181200 <div class =" flex items-center gap-2 min-w-0" >
182201 <NuxtLink
@@ -193,12 +212,13 @@ const sortedOptionalDependencies = computed(() => {
193212 {{ $t('package.dependencies.optional') }}
194213 </span >
195214 </div >
215+ <span aria-hidden =" true" class =" flex-shrink-1 flex-grow-1" />
196216 <NuxtLink
197217 :to =" {
198218 name: 'package',
199219 params: { package: [...peer.name.split('/'), 'v', peer.version] },
200220 }"
201- class =" font-mono text-xs text-fg-subtle max-w-[40%] text-right truncate"
221+ class =" font-mono text-xs text-fg-subtle max-w-[40%] text-end truncate"
202222 :title =" peer.version"
203223 >
204224 {{ peer.version }}
@@ -234,7 +254,7 @@ const sortedOptionalDependencies = computed(() => {
234254 $t('package.optional_dependencies.title', { count: sortedOptionalDependencies.length })
235255 }}
236256 <span
237- class =" i-carbon- link w-3 h-3 block opacity-0 group-hover:opacity-100 transition-opacity duration-200"
257+ class =" i-carbon: link w-3 h-3 block opacity-0 group-hover:opacity-100 transition-opacity duration-200"
238258 aria-hidden =" true"
239259 />
240260 </a >
@@ -249,17 +269,18 @@ const sortedOptionalDependencies = computed(() => {
249269 optionalDepsExpanded ? undefined : 10,
250270 )"
251271 :key =" dep"
252- class =" flex items-center justify-between py-1 text-sm gap-2"
272+ class =" flex items-center justify-start py-1 text-sm gap-2"
253273 >
254274 <NuxtLink
255275 :to =" { name: 'package', params: { package: dep.split('/') } }"
256276 class =" font-mono text-fg-muted hover:text-fg transition-colors duration-200 truncate min-w-0"
257277 >
258278 {{ dep }}
259279 </NuxtLink >
280+ <span aria-hidden =" true" class =" flex-shrink-1 flex-grow-1" />
260281 <NuxtLink
261282 :to =" { name: 'package', params: { package: [...dep.split('/'), 'v', version] } }"
262- class =" font-mono text-xs text-fg-subtle max-w-[50%] text-right truncate"
283+ class =" font-mono text-xs text-fg-subtle max-w-[50%] text-end truncate"
263284 :title =" version"
264285 >
265286 {{ version }}
0 commit comments