11<script setup lang="ts">
22import { SEVERITY_TEXT_COLORS , getHighestSeverity } from ' #shared/utils/severity'
3- import { getOutdatedTooltip , getVersionClass } from ' ~/utils/npm/outdated-dependencies'
3+ import { getOutdatedTooltip , getVersionClass , parseDepValue } from ' ~/utils/npm/outdated-dependencies'
44
55const { t } = useI18n ()
66
@@ -71,24 +71,34 @@ const sortedOptionalDependencies = computed(() => {
7171 return Object .entries (props .optionalDependencies ).sort (([a ], [b ]) => a .localeCompare (b ))
7272})
7373
74- // Get version tooltip
75- function getDepVersionTooltip(dep : string , version : string ) {
76- const outdated = outdatedDeps .value [dep ]
74+ // Get version tooltip (key for outdated lookup, realName for vuln/replacement lookup)
75+ function getDepVersionTooltip(key : string , realName : string , version : string ) {
76+ const outdated = outdatedDeps .value [key ]
7777 if (outdated ) return getOutdatedTooltip (outdated , t )
78- if (getVulnerableDepInfo (dep ) || getDeprecatedDepInfo (dep )) return version
79- if (replacementDeps .value [dep ]) return t (' package.dependencies.has_replacement' )
78+ if (getVulnerableDepInfo (realName ) || getDeprecatedDepInfo (realName )) return version
79+ if (replacementDeps .value [realName ]) return t (' package.dependencies.has_replacement' )
8080 return version
8181}
8282
83- // Get version class
84- function getDepVersionClass(dep : string ) {
85- const outdated = outdatedDeps .value [dep ]
83+ // Get version class (key for outdated lookup, realName for vuln/replacement lookup)
84+ function getDepVersionClass(key : string , realName : string ) {
85+ const outdated = outdatedDeps .value [key ]
8686 if (outdated ) return getVersionClass (outdated )
87- if (getVulnerableDepInfo (dep ) || getDeprecatedDepInfo (dep )) return getVersionClass (undefined )
88- if (replacementDeps .value [dep ]) return ' text-amber-700 dark:text-amber-500'
87+ if (getVulnerableDepInfo (realName ) || getDeprecatedDepInfo (realName )) return getVersionClass (undefined )
88+ if (replacementDeps .value [realName ]) return ' text-amber-700 dark:text-amber-500'
8989 return getVersionClass (undefined )
9090}
9191
92+ // Resolve npm: aliases — returns the real package name for links
93+ function depName(key : string , value : string ): string {
94+ return parseDepValue (value ).name ?? key
95+ }
96+
97+ // Resolve npm: aliases — returns the version range for display
98+ function depRange(value : string ): string {
99+ return parseDepValue (value ).range ?? value
100+ }
101+
92102const numberFormatter = useNumberFormatter ()
93103 </script >
94104
@@ -114,7 +124,7 @@ const numberFormatter = useNumberFormatter()
114124 :key =" dep"
115125 class =" flex items-center justify-between py-1 text-sm gap-2"
116126 >
117- <LinkBase :to =" packageRoute(dep)" class =" block truncate" dir =" ltr" >
127+ <LinkBase :to =" packageRoute(depName( dep, version) )" class =" block truncate" dir =" ltr" >
118128 {{ dep }}
119129 </LinkBase >
120130 <span class =" flex items-center gap-1 max-w-[40%]" dir =" ltr" >
@@ -133,7 +143,7 @@ const numberFormatter = useNumberFormatter()
133143 </button >
134144 </TooltipApp >
135145 <TooltipApp
136- v-if =" replacementDeps[dep]"
146+ v-if =" replacementDeps[depName( dep, version) ]"
137147 class =" shrink-0 text-amber-700 dark:text-amber-500"
138148 :text =" $t('package.dependencies.has_replacement')"
139149 >
@@ -146,43 +156,43 @@ const numberFormatter = useNumberFormatter()
146156 </button >
147157 </TooltipApp >
148158 <LinkBase
149- v-if =" getVulnerableDepInfo(dep)"
150- :to =" packageRoute(dep, getVulnerableDepInfo(dep)!.version)"
159+ v-if =" getVulnerableDepInfo(depName( dep, version) )"
160+ :to =" packageRoute(depName( dep, version), getVulnerableDepInfo(depName( dep, version) )!.version)"
151161 class =" shrink-0"
152- :class =" SEVERITY_TEXT_COLORS[getHighestSeverity(getVulnerableDepInfo(dep)!.counts)]"
162+ :class =" SEVERITY_TEXT_COLORS[getHighestSeverity(getVulnerableDepInfo(depName( dep, version) )!.counts)]"
153163 :title ="
154164 $t('package.dependencies.vulnerabilities_count', {
155- count: getVulnerableDepInfo(dep)!.counts.total,
165+ count: getVulnerableDepInfo(depName( dep, version) )!.counts.total,
156166 })
157167 "
158168 classicon =" i-lucide:shield-check"
159169 >
160170 <span class =" sr-only" >{{ $t('package.dependencies.view_vulnerabilities') }}</span >
161171 </LinkBase >
162172 <LinkBase
163- v-if =" getDeprecatedDepInfo(dep)"
164- :to =" packageRoute(dep, getDeprecatedDepInfo(dep)!.version)"
173+ v-if =" getDeprecatedDepInfo(depName( dep, version) )"
174+ :to =" packageRoute(depName( dep, version), getDeprecatedDepInfo(depName( dep, version) )!.version)"
165175 class =" shrink-0 text-purple-700 dark:text-purple-500"
166- :title =" getDeprecatedDepInfo(dep)!.message"
176+ :title =" getDeprecatedDepInfo(depName( dep, version) )!.message"
167177 classicon =" i-lucide:octagon-alert"
168178 >
169179 <span class =" sr-only" >{{ $t('package.deprecated.label') }}</span >
170180 </LinkBase >
171181 <LinkBase
172- :to =" packageRoute(dep, version)"
182+ :to =" packageRoute(depName( dep, version), depRange(version) )"
173183 class =" block truncate"
174- :class =" getDepVersionClass(dep)"
175- :title =" getDepVersionTooltip(dep, version)"
184+ :class =" getDepVersionClass(dep, depName(dep, version) )"
185+ :title =" getDepVersionTooltip(dep, depName(dep, version), depRange(version) )"
176186 >
177- {{ version }}
187+ {{ depRange( version) }}
178188 </LinkBase >
179189 <span v-if =" outdatedDeps[dep]" class =" sr-only" >
180190 ({{ getOutdatedTooltip(outdatedDeps[dep], $t) }})
181191 </span >
182- <span v-if =" getVulnerableDepInfo(dep)" class =" sr-only" >
192+ <span v-if =" getVulnerableDepInfo(depName( dep, version) )" class =" sr-only" >
183193 ({{
184194 $t('package.dependencies.vulnerabilities_count', {
185- count: getVulnerableDepInfo(dep)!.counts.total,
195+ count: getVulnerableDepInfo(depName( dep, version) )!.counts.total,
186196 })
187197 }})
188198 </span >
@@ -227,20 +237,20 @@ const numberFormatter = useNumberFormatter()
227237 class =" flex items-center justify-between py-1 text-sm gap-1 min-w-0"
228238 >
229239 <div class =" flex items-center gap-2 min-w-0 flex-1" >
230- <LinkBase :to =" packageRoute(peer.name)" class =" block max-w-[70%] break-words" dir =" ltr" >
240+ <LinkBase :to =" packageRoute(depName( peer.name, peer.version) )" class =" block max-w-[70%] break-words" dir =" ltr" >
231241 {{ peer.name }}
232242 </LinkBase >
233243 <TagStatic v-if =" peer.optional" :title =" $t('package.dependencies.optional')" >
234244 {{ $t('package.dependencies.optional') }}
235245 </TagStatic >
236246 </div >
237247 <LinkBase
238- :to =" packageRoute(peer.name, peer.version)"
248+ :to =" packageRoute(depName( peer.name, peer.version), depRange(peer.version) )"
239249 class =" block truncate max-w-[30%]"
240- :title =" peer.version"
250+ :title =" depRange( peer.version) "
241251 dir =" ltr"
242252 >
243- {{ peer.version }}
253+ {{ depRange( peer.version) }}
244254 </LinkBase >
245255 </li >
246256 </ul >
@@ -288,16 +298,16 @@ const numberFormatter = useNumberFormatter()
288298 :key =" dep"
289299 class =" flex items-baseline justify-between py-1 text-sm gap-2"
290300 >
291- <LinkBase :to =" packageRoute(dep)" class =" block max-w-[80%] break-words" dir =" ltr" >
301+ <LinkBase :to =" packageRoute(depName( dep, version) )" class =" block max-w-[80%] break-words" dir =" ltr" >
292302 {{ dep }}
293303 </LinkBase >
294304 <LinkBase
295- :to =" packageRoute(dep, version)"
305+ :to =" packageRoute(depName( dep, version), depRange(version) )"
296306 class =" block truncate"
297- :title =" version"
307+ :title =" depRange( version) "
298308 dir =" ltr"
299309 >
300- {{ version }}
310+ {{ depRange( version) }}
301311 </LinkBase >
302312 </li >
303313 </ul >
0 commit comments