Skip to content

Commit a7d3613

Browse files
committed
fix: link aliased dependencies to their real package (#2010)
1 parent 727f305 commit a7d3613

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

app/components/Package/Dependencies.vue

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,19 @@ function getDepVersionClass(dep: string) {
9090
}
9191
9292
const 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

Comments
 (0)