@@ -90,6 +90,19 @@ function getDepVersionClass(dep: string) {
9090}
9191
9292const numberFormatter = useNumberFormatter ()
93+
94+ /**
95+ * Parses npm alias syntax: "npm:real-pkg@^1.0.0"
96+ * Returns { name, range } for the real package, or null if not an alias.
97+ */
98+ function parseNpmAlias(version : string ): { name: string ; range: string } | null {
99+ if (! version .startsWith (' npm:' )) return null
100+ const spec = version .slice (4 ) // strip 'npm:'
101+ // Handle scoped packages like @scope/pkg@1.0.0 — find @ after position 0
102+ const atIdx = spec .startsWith (' @' ) ? spec .indexOf (' @' , 1 ) : spec .indexOf (' @' )
103+ if (atIdx === - 1 ) return { name: spec , range: ' ' }
104+ return { name: spec .slice (0 , atIdx ), range: spec .slice (atIdx + 1 ) }
105+ }
93106 </script >
94107
95108<template >
@@ -122,7 +135,7 @@ const numberFormatter = useNumberFormatter()
122135 :key =" dep"
123136 class =" flex items-center justify-between py-1 text-sm gap-2"
124137 >
125- <LinkBase :to =" packageRoute(dep)" class =" block truncate" dir =" ltr" >
138+ <LinkBase :to =" packageRoute(parseNpmAlias(version)?.name ?? dep)" class =" block truncate" dir =" ltr" >
126139 {{ dep }}
127140 </LinkBase >
128141 <span class =" flex items-center gap-1 max-w-[40%]" dir =" ltr" >
@@ -177,7 +190,7 @@ const numberFormatter = useNumberFormatter()
177190 <span class =" sr-only" >{{ $t('package.deprecated.label') }}</span >
178191 </LinkBase >
179192 <LinkBase
180- :to =" packageRoute(dep, version)"
193+ :to =" packageRoute(parseNpmAlias(version)?.name ?? dep, parseNpmAlias(version)?.range ?? version)"
181194 class =" block truncate"
182195 :class =" getDepVersionClass(dep)"
183196 :title =" getDepVersionTooltip(dep, version)"
@@ -235,15 +248,15 @@ const numberFormatter = useNumberFormatter()
235248 class =" flex items-center justify-between py-1 text-sm gap-1 min-w-0"
236249 >
237250 <div class =" flex items-center gap-2 min-w-0 flex-1" >
238- <LinkBase :to =" packageRoute(peer.name)" class =" block max-w-[70%] break-words" dir =" ltr" >
251+ <LinkBase :to =" packageRoute(parseNpmAlias(peer.version)?.name ?? peer.name)" class =" block max-w-[70%] break-words" dir =" ltr" >
239252 {{ peer.name }}
240253 </LinkBase >
241254 <TagStatic v-if =" peer.optional" :title =" $t('package.dependencies.optional')" >
242255 {{ $t('package.dependencies.optional') }}
243256 </TagStatic >
244257 </div >
245258 <LinkBase
246- :to =" packageRoute(peer.name, peer.version)"
259+ :to =" packageRoute(parseNpmAlias( peer.version)?. name ?? peer.name, parseNpmAlias(peer.version)?.range ?? peer.version)"
247260 class =" block truncate max-w-[30%]"
248261 :title =" peer.version"
249262 dir =" ltr"
@@ -296,11 +309,11 @@ const numberFormatter = useNumberFormatter()
296309 :key =" dep"
297310 class =" flex items-baseline justify-between py-1 text-sm gap-2"
298311 >
299- <LinkBase :to =" packageRoute(dep)" class =" block max-w-[80%] break-words" dir =" ltr" >
312+ <LinkBase :to =" packageRoute(parseNpmAlias(version)?.name ?? dep)" class =" block max-w-[80%] break-words" dir =" ltr" >
300313 {{ dep }}
301314 </LinkBase >
302315 <LinkBase
303- :to =" packageRoute(dep, version)"
316+ :to =" packageRoute(parseNpmAlias(version)?.name ?? dep, parseNpmAlias(version)?.range ?? version)"
304317 class =" block truncate"
305318 :title =" version"
306319 dir =" ltr"
0 commit comments