@@ -5,19 +5,25 @@ import {
55 DownloadKey ,
66 FilenamePatterns ,
77 GithubRelease ,
8+ maxMajor ,
9+ maxMinor ,
810 maxNightlies ,
911 ReleaseDownloads ,
1012 repository ,
1113} from "@/app/downloads/config" ;
1214import { Octokit } from "octokit" ;
1315import { RestEndpointMethodTypes } from "@octokit/plugin-rest-endpoint-methods" ;
1416import { parse } from "node-html-parser" ;
17+ import semver from "semver/preload" ;
1518
1619function createGithubAuth ( ) {
1720 if ( process . env . GITHUB_TOKEN ) {
1821 return createTokenAuth ( process . env . GITHUB_TOKEN ) ;
1922 } else {
20- return createUnauthenticatedAuth ( { reason : "Please provide a GitHub Personal Access Token via the GITHUB_TOKEN environment variable." } ) ;
23+ return createUnauthenticatedAuth ( {
24+ reason :
25+ "Please provide a GitHub Personal Access Token via the GITHUB_TOKEN environment variable." ,
26+ } ) ;
2127 }
2228}
2329
@@ -39,7 +45,7 @@ export async function getLatestReleases(): Promise<GithubRelease[]> {
3945 const downloads : ReleaseDownloads = { } ;
4046 for ( const asset of release . assets ) {
4147 if ( asset . name === "avm2_report.json" ) {
42- avm2_report_asset_id = asset . id ;
48+ avm2_report_asset_id = asset . id ;
4349 }
4450 for ( const [ key , pattern ] of Object . entries ( FilenamePatterns ) ) {
4551 if ( asset . name . indexOf ( pattern ) > - 1 ) {
@@ -53,6 +59,7 @@ export async function getLatestReleases(): Promise<GithubRelease[]> {
5359 name : release . name || release . tag_name ,
5460 prerelease : release . prerelease ,
5561 url : release . html_url ,
62+ tag : release . tag_name ,
5663 downloads,
5764 avm2_report_asset_id,
5865 } ) ;
@@ -64,6 +71,43 @@ export async function getLatestReleases(): Promise<GithubRelease[]> {
6471 }
6572}
6673
74+ export async function getLatestRelease ( ) : Promise < GithubRelease > {
75+ const releases = await getLatestReleases ( ) ;
76+ const stableReleases = releases . filter ( ( release ) => ! release . prerelease ) ;
77+ return stableReleases . length > 0 ? stableReleases [ 0 ] : releases [ 0 ] ;
78+ }
79+
80+ export function filterLatestStableReleases (
81+ releases : GithubRelease [ ] ,
82+ ) : GithubRelease [ ] {
83+ let newestMajor = null ;
84+ const currentMajorReleases = new Map ( ) ;
85+ const olderMajors = new Map ( ) ;
86+ for ( const release of releases ) {
87+ if ( release . prerelease ) {
88+ continue ;
89+ }
90+ const version = release . tag . replace ( / ^ v / , "" ) ;
91+ const major = semver . major ( version ) ;
92+ const majorMinor = `${ major } .${ semver . minor ( version ) } ` ;
93+ if ( ! newestMajor ) {
94+ newestMajor = major ;
95+ }
96+ if ( major === newestMajor ) {
97+ if ( ! currentMajorReleases . has ( majorMinor ) ) {
98+ currentMajorReleases . set ( majorMinor , release ) ;
99+ }
100+ } else {
101+ if ( ! olderMajors . has ( major ) ) {
102+ olderMajors . set ( major , release ) ;
103+ }
104+ }
105+ }
106+ return Array . from ( currentMajorReleases . values ( ) )
107+ . slice ( 0 , maxMinor )
108+ . concat ( Array . from ( olderMajors . values ( ) ) . slice ( 0 , maxMajor - 1 ) ) ;
109+ }
110+
67111export async function getWeeklyContributions ( ) : Promise <
68112 RestEndpointMethodTypes [ "repos" ] [ "getCommitActivityStats" ] [ "response" ]
69113> {
@@ -72,7 +116,9 @@ export async function getWeeklyContributions(): Promise<
72116}
73117export async function fetchReport ( ) : Promise < AVM2Report | undefined > {
74118 const releases = await getLatestReleases ( ) ;
75- const latest = releases . find ( release => release . avm2_report_asset_id !== undefined ) ;
119+ const latest = releases . find (
120+ ( release ) => release . avm2_report_asset_id !== undefined ,
121+ ) ;
76122 if ( ! latest ?. avm2_report_asset_id ) {
77123 throwBuildError ( ) ;
78124 return ;
@@ -114,9 +160,13 @@ export async function getAVM1Progress(): Promise<number> {
114160 continue ;
115161 }
116162 const topLevelRoot = parse ( topLevelContent ) ;
117- totalItems += topLevelRoot . querySelectorAll ( "input.task-list-item-checkbox" ) . length ;
118- completedItems += topLevelRoot . querySelectorAll ( "input.task-list-item-checkbox:checked" ) . length ;
163+ totalItems += topLevelRoot . querySelectorAll (
164+ "input.task-list-item-checkbox" ,
165+ ) . length ;
166+ completedItems += topLevelRoot . querySelectorAll (
167+ "input.task-list-item-checkbox:checked" ,
168+ ) . length ;
119169 }
120170 if ( totalItems < 3348 ) throwBuildError ( ) ;
121- return Math . round ( completedItems / totalItems * 100 ) ;
171+ return Math . round ( ( completedItems / totalItems ) * 100 ) ;
122172}
0 commit comments