66 buildVersionToTagsMap ,
77 filterExcludedTags ,
88 getPrereleaseChannel ,
9+ getVersionGroupKey ,
10+ getVersionGroupLabel ,
11+ isSameVersionGroup ,
912 parseVersion ,
1013} from ' ~/utils/versions'
1114import { fetchAllPackageVersions } from ' ~/composables/useNpmRegistry'
@@ -120,8 +123,10 @@ const tagVersions = ref<Map<string, VersionDisplay[]>>(new Map())
120123const loadingTags = ref <Set <string >>(new Set ())
121124
122125const otherVersionsExpanded = shallowRef (false )
123- const expandedMajorGroups = ref <Set <number >>(new Set ())
124- const otherMajorGroups = shallowRef <Array <{ major: number ; versions: VersionDisplay [] }>>([])
126+ const expandedMajorGroups = ref <Set <string >>(new Set ())
127+ const otherMajorGroups = shallowRef <
128+ Array < { groupKey : string ; label : string ; versions : VersionDisplay [] }>
129+ > ([])
125130const otherVersionsLoading = shallowRef (false )
126131
127132// Cached full version list (local to component instance)
@@ -167,14 +172,14 @@ function processLoadedVersions(allVersions: PackageVersionInfo[]) {
167172 const tagVersion = distTags [row .tag ]
168173 if (! tagVersion ) continue
169174
170- const tagParsed = parseVersion (tagVersion )
171175 const tagChannel = getPrereleaseChannel (tagVersion )
172176
177+ // Find all versions in the same version group + prerelease channel
178+ // For 0.x versions, this means same major.minor; for 1.x+, same major
173179 const channelVersions = allVersions
174180 .filter (v => {
175- const vParsed = parseVersion (v .version )
176181 const vChannel = getPrereleaseChannel (v .version )
177- return vParsed . major === tagParsed . major && vChannel === tagChannel
182+ return isSameVersionGroup ( v . version , tagVersion ) && vChannel === tagChannel
178183 })
179184 .sort ((a , b ) => compare (b .version , a .version ))
180185 .map (v => ({
@@ -192,17 +197,19 @@ function processLoadedVersions(allVersions: PackageVersionInfo[]) {
192197 }
193198 }
194199
195- // Group unclaimed versions by major
196- const byMajor = new Map <number , VersionDisplay []>()
200+ // Group unclaimed versions by version group key
201+ // For 0.x versions, group by major.minor (e.g., "0.9", "0.10")
202+ // For 1.x+, group by major (e.g., "1", "2")
203+ const byGroupKey = new Map <string , VersionDisplay []>()
197204
198205 for (const v of allVersions ) {
199206 if (claimedVersions .has (v .version )) continue
200207
201- const major = parseVersion (v .version ). major
202- if (! byMajor .has (major )) {
203- byMajor .set (major , [])
208+ const groupKey = getVersionGroupKey (v .version )
209+ if (! byGroupKey .has (groupKey )) {
210+ byGroupKey .set (groupKey , [])
204211 }
205- byMajor .get (major )! .push ({
212+ byGroupKey .get (groupKey )! .push ({
206213 version: v .version ,
207214 time: v .time ,
208215 tags: versionToTags .value .get (v .version ),
@@ -211,16 +218,23 @@ function processLoadedVersions(allVersions: PackageVersionInfo[]) {
211218 })
212219 }
213220
214- // Sort within each major
215- for (const versions of byMajor .values ()) {
221+ // Sort within each group
222+ for (const versions of byGroupKey .values ()) {
216223 versions .sort ((a , b ) => compare (b .version , a .version ))
217224 }
218225
219- // Build major groups sorted by major descending
220- const sortedMajors = Array .from (byMajor .keys ()).sort ((a , b ) => b - a )
221- otherMajorGroups .value = sortedMajors .map (major => ({
222- major ,
223- versions: byMajor .get (major )! ,
226+ // Build groups sorted by group key descending
227+ // Sort: "2", "1", "0.10", "0.9" (numerically descending)
228+ const sortedGroupKeys = Array .from (byGroupKey .keys ()).sort ((a , b ) => {
229+ const [aMajor, aMinor] = a .split (' .' ).map (Number )
230+ const [bMajor, bMinor] = b .split (' .' ).map (Number )
231+ if (aMajor !== bMajor ) return (bMajor ?? 0 ) - (aMajor ?? 0 )
232+ return (bMinor ?? - 1 ) - (aMinor ?? - 1 )
233+ })
234+ otherMajorGroups .value = sortedGroupKeys .map (groupKey => ({
235+ groupKey ,
236+ label: getVersionGroupLabel (groupKey ),
237+ versions: byGroupKey .get (groupKey )! ,
224238 }))
225239 expandedMajorGroups .value .clear ()
226240}
@@ -275,12 +289,12 @@ async function expandOtherVersions() {
275289 otherVersionsExpanded .value = true
276290}
277291
278- // Toggle a major group
279- function toggleMajorGroup(major : number ) {
280- if (expandedMajorGroups .value .has (major )) {
281- expandedMajorGroups .value .delete (major )
292+ // Toggle a version group
293+ function toggleMajorGroup(groupKey : string ) {
294+ if (expandedMajorGroups .value .has (groupKey )) {
295+ expandedMajorGroups .value .delete (groupKey )
282296 } else {
283- expandedMajorGroups .value .add (major )
297+ expandedMajorGroups .value .add (groupKey )
284298 }
285299}
286300
@@ -521,28 +535,28 @@ function getTagVersions(tag: string): VersionDisplay[] {
521535 </div >
522536 </div >
523537
524- <!-- Major version groups (untagged versions) -->
538+ <!-- Version groups (untagged versions) -->
525539 <template v-if =" otherMajorGroups .length > 0 " >
526- <div v-for =" group in otherMajorGroups" :key =" group.major " >
527- <!-- Major group header -->
540+ <div v-for =" group in otherMajorGroups" :key =" group.groupKey " >
541+ <!-- Version group header -->
528542 <div v-if =" group.versions.length > 1" class =" py-1" >
529543 <div class =" flex items-center justify-between gap-2" >
530544 <div class =" flex items-center gap-2 min-w-0" >
531545 <button
532546 type =" button"
533547 class =" w-4 h-4 flex items-center justify-center text-fg-subtle hover:text-fg transition-colors shrink-0 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-fg-muted focus-visible:ring-offset-1 focus-visible:ring-offset-bg rounded-sm"
534- :aria-expanded =" expandedMajorGroups.has(group.major )"
548+ :aria-expanded =" expandedMajorGroups.has(group.groupKey )"
535549 :aria-label ="
536- expandedMajorGroups.has(group.major )
537- ? $t('package.versions.collapse_major', { major: group.major })
538- : $t('package.versions.expand_major', { major: group.major })
550+ expandedMajorGroups.has(group.groupKey )
551+ ? $t('package.versions.collapse_major', { major: group.label })
552+ : $t('package.versions.expand_major', { major: group.label })
539553 "
540- @click =" toggleMajorGroup(group.major )"
554+ @click =" toggleMajorGroup(group.groupKey )"
541555 >
542556 <span
543557 class =" w-3 h-3 transition-transform duration-200"
544558 :class ="
545- expandedMajorGroups.has(group.major )
559+ expandedMajorGroups.has(group.groupKey )
546560 ? 'i-carbon-chevron-down'
547561 : 'i-carbon-chevron-right'
548562 "
@@ -653,9 +667,9 @@ function getTagVersions(tag: string): VersionDisplay[] {
653667 </div >
654668 </div >
655669
656- <!-- Major group versions -->
670+ <!-- Version group versions -->
657671 <div
658- v-if =" expandedMajorGroups.has(group.major ) && group.versions.length > 1"
672+ v-if =" expandedMajorGroups.has(group.groupKey ) && group.versions.length > 1"
659673 class =" ml-6 space-y-0.5"
660674 >
661675 <div v-for =" v in group.versions.slice(1)" :key =" v.version" class =" py-1" >
0 commit comments