@@ -5,17 +5,15 @@ import { paginateRest } from "@octokit/plugin-paginate-rest";
5
5
import extractModMetadata from "./lib/releases/extractModMetadata.js" ;
6
6
import getMinecraftVersions from "./lib/releases/getMinecraftVersions.js" ;
7
7
import {
8
+ GithubRelease ,
8
9
GithubReleaseCache ,
9
10
ModLoader ,
10
- ReleaseAssetType ,
11
+ ModReleaseAsset ,
12
+ ReleaseAssetType , ReleaseType
11
13
} from "./lib/releases/types.js" ;
12
- import {
13
- CachedGithubAsset ,
14
- CachedGithubRelease ,
15
- } from "./lib/releases/GithubRelease.js" ;
16
14
17
- type GithubRelease = components [ "schemas" ] [ "release" ] ;
18
- type GithubReleaseAsset = components [ "schemas" ] [ "release-asset" ] ;
15
+ type ApiGithubRelease = components [ "schemas" ] [ "release" ] ;
16
+ type ApiGithubReleaseAsset = components [ "schemas" ] [ "release-asset" ] ;
19
17
20
18
const githubToken = process . env . GITHUB_TOKEN ;
21
19
if ( typeof githubToken !== "string" ) {
@@ -25,7 +23,7 @@ if (typeof githubToken !== "string") {
25
23
const PaginatingOctokit = Octokit . plugin ( paginateRest ) ;
26
24
const octokit = new PaginatingOctokit ( {
27
25
auth : githubToken ,
28
- userAgent : "AE2-Release-Indexer" ,
26
+ userAgent : "AE2-Release-Indexer"
29
27
} ) ;
30
28
31
29
const owner = "AppliedEnergistics" ;
@@ -35,7 +33,7 @@ const tagPatterns: [RegExp, ModLoader[]][] = [
35
33
[ / ^ f a b r i c \/ v ( [ 0 - 9 ] .* ) $ / , [ ModLoader . FABRIC ] ] ,
36
34
[ / ^ f o r g e \/ v ( [ 0 - 9 ] .* ) $ / , [ ModLoader . FORGE ] ] ,
37
35
[ / ^ v ( [ 0 - 9 ] .* ) $ / , [ ModLoader . FORGE ] ] ,
38
- [ / ^ ( r v .* ) / , [ ModLoader . FORGE ] ] ,
36
+ [ / ^ ( r v .* ) / , [ ModLoader . FORGE ] ]
39
37
] ;
40
38
41
39
async function listReleases ( ) : Promise <
@@ -44,7 +42,7 @@ async function listReleases(): Promise<
44
42
const options = octokit . rest . repos . listReleases . endpoint . merge ( {
45
43
owner,
46
44
repo,
47
- per_page : 100 ,
45
+ per_page : 100
48
46
} ) ;
49
47
return await octokit . paginate ( options ) ;
50
48
}
@@ -77,16 +75,16 @@ const jarSuffixToAssetType: [string, ReleaseAssetType][] = [
77
75
[ "-javadoc.jar" , ReleaseAssetType . API ] ,
78
76
[ "-api.jar" , ReleaseAssetType . API ] ,
79
77
[ "-dev.jar" , ReleaseAssetType . UNOBF ] ,
80
- [ ".jar" , ReleaseAssetType . MOD ] ,
78
+ [ ".jar" , ReleaseAssetType . MOD ]
81
79
] ;
82
80
83
81
/**
84
82
* Try to find the mod jar among the release assets and download it.
85
83
*/
86
84
function classifyReleaseAssets (
87
- assets : GithubReleaseAsset [ ]
88
- ) : Partial < Record < ReleaseAssetType , GithubReleaseAsset > > {
89
- const result : Partial < Record < ReleaseAssetType , GithubReleaseAsset > > = { } ;
85
+ assets : ApiGithubReleaseAsset [ ]
86
+ ) : Partial < Record < ReleaseAssetType , ApiGithubReleaseAsset > > {
87
+ const result : Partial < Record < ReleaseAssetType , ApiGithubReleaseAsset > > = { } ;
90
88
91
89
const assetsByName = Object . fromEntries (
92
90
assets . map ( ( asset ) => [ asset . name , asset ] )
@@ -131,7 +129,7 @@ function classifyReleaseAssets(
131
129
132
130
async function processRelease (
133
131
cache : GithubReleaseCache ,
134
- release : GithubRelease ,
132
+ release : ApiGithubRelease ,
135
133
allMinecraftVersions : string [ ]
136
134
) {
137
135
const { tag_name : tagName } = release ;
@@ -140,55 +138,63 @@ async function processRelease(
140
138
return ;
141
139
}
142
140
143
- let cachedData = cache . get ( tagName ) ;
144
- if ( ! cachedData ) {
145
- cachedData = {
146
- tagName,
147
- url : release . html_url ,
148
- assets : { } ,
149
- } ;
150
- }
151
-
141
+ let oldCachedData = cache . get ( tagName ) ;
152
142
const assetsByType = classifyReleaseAssets ( release . assets ) ;
153
143
154
144
// Update basic release properties we can gather from the top-level listing
155
- cachedData . tagName = tagName ;
156
- cachedData . url = release . html_url ;
157
- cachedData . assets = Object . fromEntries (
145
+ const assets : GithubRelease [ "assets" ] = Object . fromEntries (
158
146
Object . entries ( assetsByType ) . map ( ( [ type , asset ] ) => [
159
147
type ,
160
148
{
161
149
filename : asset . name ,
162
150
size : asset . size ,
163
151
browser_download_url : asset . browser_download_url ,
164
- url : asset . url ,
165
- } as CachedGithubAsset ,
152
+ url : asset . url
153
+ } satisfies ModReleaseAsset
166
154
] )
167
155
) ;
168
- cachedData . published = release . published_at ?? undefined ;
169
- cachedData . changelog = release . body ?. replaceAll ( "\r\n" , "\n" ) ?? undefined ;
170
- cache . set ( tagName , cachedData ) ;
171
-
172
- // Update Mod metadata if it's missing
173
- if (
174
- ! cachedData . version ||
175
- ! cachedData . minecraftVersions ||
176
- ! cachedData . modLoaders
177
- ) {
178
- // Try deducing a version from the tag first, which will then be overwritten by the mod-data if successful
179
- for ( const [ pattern , loaders ] of tagPatterns ) {
180
- const m = tagName . match ( pattern ) ;
181
- if ( m ) {
182
- cachedData . version = m [ 1 ] ;
183
- // rv.beta.1 is actually versioned rv-beta-1 in the mod metadata
184
- if ( tagName . match ( / ^ ( r v .* ) / ) ) {
185
- cachedData . version = cachedData . version . replaceAll ( "." , "-" ) ;
186
- }
187
- cachedData . modLoaders = loaders . slice ( ) ;
188
- break ;
156
+
157
+ // Try deducing a version from the tag first, which will then be overwritten by the mod-data if successful
158
+ let modVersion : string | undefined ;
159
+ let modLoaders : ModLoader [ ] | undefined ;
160
+ for ( const [ pattern , loaders ] of tagPatterns ) {
161
+ const m = tagName . match ( pattern ) ;
162
+ if ( m ) {
163
+ modVersion = m [ 1 ] ;
164
+ // rv.beta.1 is actually versioned rv-beta-1 in the mod metadata
165
+ if ( tagName . match ( / ^ ( r v .* ) / ) ) {
166
+ modVersion = modVersion . replaceAll ( "." , "-" ) ;
189
167
}
168
+ modLoaders = loaders . slice ( ) ;
169
+ break ;
190
170
}
171
+ }
191
172
173
+ if ( ! modVersion || ! modLoaders ) {
174
+ console . warn ( "Failed to determine mod version from tag name: %s" , tagName ) ;
175
+ return ;
176
+ }
177
+
178
+ let releaseType = ReleaseType . STABLE ;
179
+
180
+
181
+ const releaseInfo : GithubRelease = {
182
+ ...oldCachedData ,
183
+ source : "github" ,
184
+ modVersion,
185
+ modLoaders,
186
+ releaseType,
187
+ gameVersions : [ ] ,
188
+ url : release . html_url ,
189
+ tagName,
190
+ published : new Date ( release . published_at ?? release . created_at ) . getTime ( ) ,
191
+ changelog : release . body ?. replaceAll ( "\r\n" , "\n" ) ?? undefined ,
192
+ assets
193
+ } ;
194
+ cache . set ( tagName , releaseInfo ) ;
195
+
196
+ // Try updating mod metadata if it's missing
197
+ if ( ! releaseInfo . gameVersions || ! releaseInfo . modLoaders ) {
192
198
const modJarAsset = assetsByType [ ReleaseAssetType . MOD ] ;
193
199
if ( ! modJarAsset ) {
194
200
console . warn (
@@ -200,15 +206,14 @@ async function processRelease(
200
206
201
207
const { data } = await octokit . request ( modJarAsset . url , {
202
208
headers : {
203
- accept : "application/octet-stream" ,
204
- } ,
209
+ accept : "application/octet-stream"
210
+ }
205
211
} ) ;
206
212
const modMetadata = extractModMetadata ( data , allMinecraftVersions ) ;
207
- cachedData . version = modMetadata . modVersion ;
208
213
// Remove anything that is not in the version list. Sometimes this includes "Java" or "Forge"
209
- cachedData . minecraftVersions = modMetadata . minecraftVersions ;
210
- cachedData . modLoaders = modMetadata . modLoaders ;
211
- cache . set ( tagName , cachedData ) ;
214
+ releaseInfo . gameVersions = modMetadata . minecraftVersions ;
215
+ releaseInfo . modLoaders = modMetadata . modLoaders ;
216
+ cache . set ( tagName , releaseInfo ) ;
212
217
}
213
218
}
214
219
@@ -221,7 +226,7 @@ console.info(
221
226
const releases = await listReleases ( ) ;
222
227
console . info ( "Read %d releases" , releases . length ) ;
223
228
224
- const cache = new PersistentCache < CachedGithubRelease > (
229
+ const cache = new PersistentCache < GithubRelease > (
225
230
"caches/github_releases.json"
226
231
) ;
227
232
try {
0 commit comments