-
Notifications
You must be signed in to change notification settings - Fork 51
Expand file tree
/
Copy pathsidebar-semver-sort.js
More file actions
140 lines (118 loc) · 3.52 KB
/
sidebar-semver-sort.js
File metadata and controls
140 lines (118 loc) · 3.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// Reverse the sidebar items ordering (including nested category items)
const semver = require("semver");
function getTitleFromItemId(id) {
return id.split("/").at(-1);
}
function getSemverFromId(id) {
try {
return semver.parse(getTitleFromItemId(id));
} catch (error) {
return null;
}
}
function addItemTitle(item) {
return {
...item,
label: getTitleFromItemId(item.id)
};
}
function itemLabel(item) {
return item.label?.toLowerCase();
}
function isVersionHistoryDoc(item) {
return item.type === "doc" && item.id === "unraid-os/download_list";
}
function groupReleaseReferencesUnderUpdatingUnraid(items) {
const updatingIndex = items.findIndex((item) =>
item.type === "category" && itemLabel(item) === "updating unraid"
);
if (updatingIndex === -1) {
return items;
}
const releaseNotes = [];
const versionHistory = [];
const remainingItems = [];
items.forEach((item, index) => {
if (index === updatingIndex) {
remainingItems.push(item);
} else if (item.type === "category" && itemLabel(item) === "release notes") {
releaseNotes.push(item);
} else if (isVersionHistoryDoc(item)) {
versionHistory.push(item);
} else {
remainingItems.push(item);
}
});
if (releaseNotes.length === 0 && versionHistory.length === 0) {
return items;
}
const updatedUpdatingCategory = {
...items[updatingIndex],
items: [
...(items[updatingIndex].items || []),
...releaseNotes,
...versionHistory,
],
};
return remainingItems.map((item) =>
item === items[updatingIndex] ? updatedUpdatingCategory : item
);
}
function sortSidebarItems(items, sortBySemver = false) {
let result = items.map((item) => {
if (item.type === "category") {
if (itemLabel(item) === "release notes") {
return { ...item, items: sortSidebarItems(item.items, true) };
} else {
return { ...item, items: sortSidebarItems(item.items, false) };
}
}
return item;
});
if (!sortBySemver) {
result = groupReleaseReferencesUnderUpdatingUnraid(result);
}
if (sortBySemver) {
const subfolderArrays = result.reduce((acc, item) => {
const semverCompare = getSemverFromId(item.id);
// Add null check for semverCompare
if (!semverCompare) {
console.warn(`Skipping invalid semver item: ${item.id}`);
return acc;
}
const compareString = `${semverCompare.major}.${semverCompare.minor}`;
acc[compareString] = acc[compareString] || [];
acc[compareString].push(item);
return acc;
}, {});
const subfolders = Object.entries(subfolderArrays)
.map(([folderName, items]) => {
const sortedSubfolder = items
.map(addItemTitle)
.sort((a, b) => {
const aSemver = getSemverFromId(a.id) || semver.parse("0.0.0");
const bSemver = getSemverFromId(b.id) || semver.parse("0.0.0");
return semver.compare(bSemver, aSemver);
});
return {
type: "category",
label: folderName,
items: sortedSubfolder,
};
})
.sort((a, b) => {
// Add fallback for invalid versions
const aSemver = getSemverFromId(`${a.label}.0`) || semver.parse("0.0.0");
const bSemver = getSemverFromId(`${b.label}.0`) || semver.parse("0.0.0");
return semver.compare(bSemver, aSemver);
});
if (subfolders[0]) {
subfolders[0].collapsed = false;
}
return subfolders;
}
return result;
}
module.exports = {
sortSidebarItems,
};