Skip to content

Commit bd33d4a

Browse files
committed
fix: link aliased dependencies to their real package (#2010)
1 parent 7f2fc1a commit bd33d4a

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>
@@ -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

Comments
 (0)