@@ -5,19 +5,25 @@ import {
5
5
DownloadKey ,
6
6
FilenamePatterns ,
7
7
GithubRelease ,
8
+ maxMajor ,
9
+ maxMinor ,
8
10
maxNightlies ,
9
11
ReleaseDownloads ,
10
12
repository ,
11
13
} from "@/app/downloads/config" ;
12
14
import { Octokit } from "octokit" ;
13
15
import { RestEndpointMethodTypes } from "@octokit/plugin-rest-endpoint-methods" ;
14
16
import { parse } from "node-html-parser" ;
17
+ import semver from "semver/preload" ;
15
18
16
19
function createGithubAuth ( ) {
17
20
if ( process . env . GITHUB_TOKEN ) {
18
21
return createTokenAuth ( process . env . GITHUB_TOKEN ) ;
19
22
} 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
+ } ) ;
21
27
}
22
28
}
23
29
@@ -39,7 +45,7 @@ export async function getLatestReleases(): Promise<GithubRelease[]> {
39
45
const downloads : ReleaseDownloads = { } ;
40
46
for ( const asset of release . assets ) {
41
47
if ( asset . name === "avm2_report.json" ) {
42
- avm2_report_asset_id = asset . id ;
48
+ avm2_report_asset_id = asset . id ;
43
49
}
44
50
for ( const [ key , pattern ] of Object . entries ( FilenamePatterns ) ) {
45
51
if ( asset . name . indexOf ( pattern ) > - 1 ) {
@@ -53,6 +59,7 @@ export async function getLatestReleases(): Promise<GithubRelease[]> {
53
59
name : release . name || release . tag_name ,
54
60
prerelease : release . prerelease ,
55
61
url : release . html_url ,
62
+ tag : release . tag_name ,
56
63
downloads,
57
64
avm2_report_asset_id,
58
65
} ) ;
@@ -64,6 +71,43 @@ export async function getLatestReleases(): Promise<GithubRelease[]> {
64
71
}
65
72
}
66
73
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
+
67
111
export async function getWeeklyContributions ( ) : Promise <
68
112
RestEndpointMethodTypes [ "repos" ] [ "getCommitActivityStats" ] [ "response" ]
69
113
> {
@@ -72,7 +116,9 @@ export async function getWeeklyContributions(): Promise<
72
116
}
73
117
export async function fetchReport ( ) : Promise < AVM2Report | undefined > {
74
118
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
+ ) ;
76
122
if ( ! latest ?. avm2_report_asset_id ) {
77
123
throwBuildError ( ) ;
78
124
return ;
@@ -114,9 +160,13 @@ export async function getAVM1Progress(): Promise<number> {
114
160
continue ;
115
161
}
116
162
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 ;
119
169
}
120
170
if ( totalItems < 3348 ) throwBuildError ( ) ;
121
- return Math . round ( completedItems / totalItems * 100 ) ;
171
+ return Math . round ( ( completedItems / totalItems ) * 100 ) ;
122
172
}
0 commit comments