11<script setup lang="ts">
22import { SEVERITY_TEXT_COLORS , getHighestSeverity } from ' #shared/utils/severity'
33import { getOutdatedTooltip , getVersionClass } from ' ~/utils/npm/outdated-dependencies'
4+ import { clean } from ' semver'
45
56const props = defineProps <{
67 packageName: string
@@ -40,30 +41,40 @@ const optionalDepsExpanded = shallowRef(false)
4041// Sort dependencies alphabetically
4142const sortedDependencies = computed (() => {
4243 if (! props .dependencies ) return []
43- return Object .entries (props .dependencies ).sort (([a ], [b ]) => a .localeCompare (b ))
44+ const cleanedEntries = Object .entries (props .dependencies ).map (([name , version ]) => ({
45+ name ,
46+ origVersion: version ,
47+ cleanVersion: clean (version ),
48+ }))
49+ return cleanedEntries .sort ((a , b ) => a .name .localeCompare (b .name ))
4450})
4551
4652// Sort peer dependencies alphabetically, with required first then optional
4753const sortedPeerDependencies = computed (() => {
4854 if (! props .peerDependencies ) return []
4955
50- return Object .entries (props .peerDependencies )
51- . map (([ name , version ]) => ({
52- name ,
53- version ,
54- optional: props .peerDependenciesMeta ?.[name ]?.optional ?? false ,
55- }))
56- .sort ((a , b ) => {
57- // Required first, then optional
58- if (a .optional !== b .optional ) return a .optional ? 1 : - 1
59- return a .name .localeCompare (b .name )
60- })
56+ const cleanedEntries = Object .entries (props .peerDependencies ). map (([ name , version ]) => ({
57+ name ,
58+ origVersion: version ,
59+ cleanVersion: clean ( version ) ,
60+ optional: props .peerDependenciesMeta ?.[name ]?.optional ?? false ,
61+ }))
62+ return cleanedEntries .sort ((a , b ) => {
63+ // Required first, then optional
64+ if (a .optional !== b .optional ) return a .optional ? 1 : - 1
65+ return a .name .localeCompare (b .name )
66+ })
6167})
6268
6369// Sort optional dependencies alphabetically
6470const sortedOptionalDependencies = computed (() => {
6571 if (! props .optionalDependencies ) return []
66- return Object .entries (props .optionalDependencies ).sort (([a ], [b ]) => a .localeCompare (b ))
72+ const cleanedEntries = Object .entries (props .optionalDependencies ).map (([name , version ]) => ({
73+ name ,
74+ origVersion: version ,
75+ cleanVersion: clean (version ),
76+ }))
77+ return cleanedEntries .sort ((a , b ) => a .name .localeCompare (b .name ))
6778})
6879
6980const numberFormatter = useNumberFormatter ()
@@ -87,7 +98,10 @@ const numberFormatter = useNumberFormatter()
8798 >
8899 <ul class =" px-1 space-y-1 list-none m-0" :aria-label =" $t('package.dependencies.list_label')" >
89100 <li
90- v-for =" [dep, version] in sortedDependencies.slice(0, depsExpanded ? undefined : 10)"
101+ v-for =" { name: dep, origVersion, cleanVersion } in sortedDependencies.slice(
102+ 0,
103+ depsExpanded ? undefined : 10,
104+ )"
91105 :key =" dep"
92106 class =" flex items-center justify-between py-1 text-sm gap-2"
93107 >
@@ -124,12 +138,12 @@ const numberFormatter = useNumberFormatter()
124138 <span class =" sr-only" >{{ $t('package.deprecated.label') }}</span >
125139 </LinkBase >
126140 <LinkBase
127- :to =" packageRoute(dep, version )"
141+ :to =" packageRoute(dep, cleanVersion )"
128142 class =" block truncate"
129143 :class =" getVersionClass(outdatedDeps[dep])"
130- :title =" outdatedDeps[dep] ? getOutdatedTooltip(outdatedDeps[dep], $t) : version "
144+ :title =" outdatedDeps[dep] ? getOutdatedTooltip(outdatedDeps[dep], $t) : origVersion "
131145 >
132- {{ version }}
146+ {{ origVersion }}
133147 </LinkBase >
134148 <span v-if =" outdatedDeps[dep]" class =" sr-only" >
135149 ({{ getOutdatedTooltip(outdatedDeps[dep], $t) }})
@@ -173,25 +187,28 @@ const numberFormatter = useNumberFormatter()
173187 :aria-label =" $t('package.peer_dependencies.list_label')"
174188 >
175189 <li
176- v-for =" peer in sortedPeerDependencies.slice(0, peerDepsExpanded ? undefined : 10)"
177- :key =" peer.name"
190+ v-for =" { name: dep, optional, origVersion, cleanVersion } in sortedPeerDependencies.slice(
191+ 0,
192+ peerDepsExpanded ? undefined : 10,
193+ )"
194+ :key =" dep"
178195 class =" flex items-center justify-between py-1 text-sm gap-1 min-w-0"
179196 >
180197 <div class =" flex items-center gap-1 min-w-0 flex-1" >
181- <LinkBase :to =" packageRoute(peer.name )" class =" block truncate" dir =" ltr" >
182- {{ peer.name }}
198+ <LinkBase :to =" packageRoute(dep )" class =" block truncate" dir =" ltr" >
199+ {{ dep }}
183200 </LinkBase >
184- <TagStatic v-if =" peer. optional" :title =" $t('package.dependencies.optional')" >
201+ <TagStatic v-if =" optional" :title =" $t('package.dependencies.optional')" >
185202 {{ $t('package.dependencies.optional') }}
186203 </TagStatic >
187204 </div >
188205 <LinkBase
189- :to =" packageRoute(peer.name, peer.version )"
206+ :to =" packageRoute(dep, cleanVersion )"
190207 class =" block truncate max-w-[40%]"
191- :title =" peer.version "
208+ :title =" origVersion "
192209 dir =" ltr"
193210 >
194- {{ peer.version }}
211+ {{ origVersion }}
195212 </LinkBase >
196213 </li >
197214 </ul >
@@ -232,7 +249,7 @@ const numberFormatter = useNumberFormatter()
232249 :aria-label =" $t('package.optional_dependencies.list_label')"
233250 >
234251 <li
235- v-for =" [ dep, version] in sortedOptionalDependencies.slice(
252+ v-for =" { name: dep, origVersion, cleanVersion } in sortedOptionalDependencies.slice(
236253 0,
237254 optionalDepsExpanded ? undefined : 10,
238255 )"
@@ -243,12 +260,12 @@ const numberFormatter = useNumberFormatter()
243260 {{ dep }}
244261 </LinkBase >
245262 <LinkBase
246- :to =" packageRoute(dep, version )"
263+ :to =" packageRoute(dep, cleanVersion )"
247264 class =" block truncate"
248- :title =" version "
265+ :title =" origVersion "
249266 dir =" ltr"
250267 >
251- {{ version }}
268+ {{ origVersion }}
252269 </LinkBase >
253270 </li >
254271 </ul >
0 commit comments