|
| 1 | +interface Release { |
| 2 | + version: string; |
| 3 | + url: string; |
| 4 | +} |
| 5 | + |
| 6 | +interface ReleasesData { |
| 7 | + releases: Release[]; |
| 8 | + generatedAt: string; |
| 9 | +} |
| 10 | + |
| 11 | +// Semantic version comparison function |
| 12 | +function compareSemver(a: string, b: string): number { |
| 13 | + const aParts = a.split('.').map(Number); |
| 14 | + const bParts = b.split('.').map(Number); |
| 15 | + |
| 16 | + for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) { |
| 17 | + const aPart = aParts[i] || 0; |
| 18 | + const bPart = bParts[i] || 0; |
| 19 | + |
| 20 | + if (aPart < bPart) return -1; |
| 21 | + if (aPart > bPart) return 1; |
| 22 | + } |
| 23 | + |
| 24 | + return 0; |
| 25 | +} |
| 26 | + |
| 27 | +// Check if version is >= minimum version |
| 28 | +function isVersionAtLeast(version: string, minimumVersion: string): boolean { |
| 29 | + return compareSemver(version, minimumVersion) >= 0; |
| 30 | +} |
| 31 | + |
| 32 | +export async function loadVersions(releasesJsonUrl: string, targetId: string): Promise<void> { |
| 33 | + const response = await fetch(releasesJsonUrl); |
| 34 | + if (!response.ok) { |
| 35 | + console.error(`HTTP error! status: ${response.status}`); |
| 36 | + return; |
| 37 | + } |
| 38 | + const data: ReleasesData = await response.json(); |
| 39 | + |
| 40 | + const versionList = document.getElementById(targetId); |
| 41 | + if (!versionList) { |
| 42 | + console.error(`Version list element not found with id: ${targetId}`); |
| 43 | + return; |
| 44 | + } |
| 45 | + |
| 46 | + const ul = document.createElement('ul'); |
| 47 | + versionList.append(ul); |
| 48 | + |
| 49 | + // Filter releases to only include versions >= 0.4.0 |
| 50 | + const filteredReleases = data.releases.filter(release => { |
| 51 | + const version = release.version.replace('v', ''); |
| 52 | + return isVersionAtLeast(version, '0.4.0'); |
| 53 | + }); |
| 54 | + |
| 55 | + // Sort releases in descending order (newest first) using semantic versioning |
| 56 | + const sortedReleases = filteredReleases.sort((a, b) => { |
| 57 | + const aVersion = a.version.replace('v', ''); |
| 58 | + const bVersion = b.version.replace('v', ''); |
| 59 | + return compareSemver(bVersion, aVersion); // Reverse order for descending |
| 60 | + }); |
| 61 | + |
| 62 | + sortedReleases.forEach(release => { |
| 63 | + const li = document.createElement('li'); |
| 64 | + const link = document.createElement('a'); |
| 65 | + link.href = release.url; |
| 66 | + link.textContent = release.version; |
| 67 | + |
| 68 | + li.appendChild(link); |
| 69 | + ul.appendChild(li); |
| 70 | + }); |
| 71 | +} |
0 commit comments