@@ -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 >
@@ -114,7 +127,7 @@ const numberFormatter = useNumberFormatter()
114127 :key =" dep"
115128 class =" flex items-center justify-between py-1 text-sm gap-2"
116129 >
117- <LinkBase :to =" packageRoute(dep)" class =" block truncate" dir =" ltr" >
130+ <LinkBase :to =" packageRoute(parseNpmAlias(version)?.name ?? dep)" class =" block truncate" dir =" ltr" >
118131 {{ dep }}
119132 </LinkBase >
120133 <span class =" flex items-center gap-1 max-w-[40%]" dir =" ltr" >
@@ -169,7 +182,7 @@ const numberFormatter = useNumberFormatter()
169182 <span class =" sr-only" >{{ $t('package.deprecated.label') }}</span >
170183 </LinkBase >
171184 <LinkBase
172- :to =" packageRoute(dep, version)"
185+ :to =" packageRoute(parseNpmAlias(version)?.name ?? dep, parseNpmAlias(version)?.range ?? version)"
173186 class =" block truncate"
174187 :class =" getDepVersionClass(dep)"
175188 :title =" getDepVersionTooltip(dep, version)"
@@ -227,15 +240,15 @@ const numberFormatter = useNumberFormatter()
227240 class =" flex items-center justify-between py-1 text-sm gap-1 min-w-0"
228241 >
229242 <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" >
243+ <LinkBase :to =" packageRoute(parseNpmAlias(peer.version)?.name ?? peer.name)" class =" block max-w-[70%] break-words" dir =" ltr" >
231244 {{ peer.name }}
232245 </LinkBase >
233246 <TagStatic v-if =" peer.optional" :title =" $t('package.dependencies.optional')" >
234247 {{ $t('package.dependencies.optional') }}
235248 </TagStatic >
236249 </div >
237250 <LinkBase
238- :to =" packageRoute(peer.name, peer.version)"
251+ :to =" packageRoute(parseNpmAlias( peer.version)?. name ?? peer.name, parseNpmAlias(peer.version)?.range ?? peer.version)"
239252 class =" block truncate max-w-[30%]"
240253 :title =" peer.version"
241254 dir =" ltr"
@@ -288,11 +301,11 @@ const numberFormatter = useNumberFormatter()
288301 :key =" dep"
289302 class =" flex items-baseline justify-between py-1 text-sm gap-2"
290303 >
291- <LinkBase :to =" packageRoute(dep)" class =" block max-w-[80%] break-words" dir =" ltr" >
304+ <LinkBase :to =" packageRoute(parseNpmAlias(version)?.name ?? dep)" class =" block max-w-[80%] break-words" dir =" ltr" >
292305 {{ dep }}
293306 </LinkBase >
294307 <LinkBase
295- :to =" packageRoute(dep, version)"
308+ :to =" packageRoute(parseNpmAlias(version)?.name ?? dep, parseNpmAlias(version)?.range ?? version)"
296309 class =" block truncate"
297310 :title =" version"
298311 dir =" ltr"
0 commit comments