@@ -121,31 +121,35 @@ function getPlatform() {
121
121
122
122
export async function getLatestCoreToolsRelease ( targetVersion : number ) : Promise < CoreToolsRelease > {
123
123
try {
124
- const response = await fetch ( RELEASES_FEED_URL ) ;
125
- const feed = ( await response . json ( ) ) as { releases : any ; tags : any } ;
126
- const tag = feed . tags [ `v${ targetVersion } ` ] ;
127
- if ( ! tag || tag . hidden ) {
128
- throw new Error ( `Cannot find the latest version for v${ targetVersion } ` ) ;
129
- }
130
-
131
- const release = feed . releases [ tag . release ] ;
132
- if ( ! release ) {
133
- throw new Error ( `Cannot find release for ${ tag . release } ` ) ;
134
- }
135
-
136
- const coreTools = release . coreTools . filter ( ( t : CoreToolsZipInfo ) => t . size === "full" ) ;
137
- const platform = getPlatform ( ) ;
138
- const info = coreTools . find ( ( t : CoreToolsZipInfo ) => t . OS === platform ) ;
139
- if ( ! info ) {
140
- throw new Error ( `Cannot find download package for ${ platform } ` ) ;
141
- }
142
-
143
- return {
144
- version : tag . release ,
145
- url : info . downloadLink ,
146
- sha2 : info . sha2 ,
147
- } ;
148
- } catch ( error : unknown ) {
124
+ const response = await fetch ( RELEASES_FEED_URL ) ;
125
+ const feed = ( await response . json ( ) ) as { releases : Record < string , Record < string , CoreToolsZipInfo [ ] > > ; } ;
126
+ const platform = getPlatform ( ) ;
127
+
128
+ const matchingVersions = Object . keys ( feed . releases )
129
+ . reverse ( ) // JSON has newest versions first; we want the latest first; potential improvement: sort by semver
130
+ . filter (
131
+ ( version ) =>
132
+ version . match ( / ^ \d + \. \d + \. \d + $ / ) && // only stable versions
133
+ version . startsWith ( `${ targetVersion } .` ) , // only matching major versions
134
+ ) ;
135
+
136
+ for ( const version of matchingVersions ) {
137
+ const matchingDistribution = feed . releases [ version ] . coreTools ?. find (
138
+ ( dist ) =>
139
+ dist . OS === platform && // Distribution for matching platform
140
+ dist . size === "full" , // exclude minified releases
141
+ ) ;
142
+ if ( matchingDistribution ) {
143
+ return {
144
+ version,
145
+ url : matchingDistribution . downloadLink ,
146
+ sha2 : matchingDistribution . sha2 ,
147
+ } ;
148
+ }
149
+ }
150
+
151
+ throw new Error ( `Cannot find download package for ${ platform } ` ) ;
152
+ } catch ( error : unknown ) {
149
153
throw new Error ( `Error fetching Function Core Tools releases: ${ ( error as Error ) . message } ` ) ;
150
154
}
151
155
}
0 commit comments