@@ -4,41 +4,61 @@ import { log } from "../util";
44
55const GITHUB_API_ENDPOINT_URL = "https://api.github.com" ;
66
7-
87/**
9- * Fetches the release with `releaseTag` (or just latest release when not specified)
10- * from GitHub `repo` and returns metadata about `artifactFileName` shipped with
11- * this release or `null` if no such artifact was published.
8+ * Fetches the release with `releaseTag` from GitHub `repo` and
9+ * returns metadata about `artifactFileName` shipped with
10+ * this release.
11+ *
12+ * @throws Error upon network failure or if no such repository, release, or artifact exists.
1213 */
1314export async function fetchArtifactReleaseInfo (
14- repo : GithubRepo , artifactFileName : string , releaseTag ?: string
15- ) : Promise < null | ArtifactReleaseInfo > {
15+ repo : GithubRepo ,
16+ artifactFileName : string ,
17+ releaseTag : string
18+ ) : Promise < ArtifactReleaseInfo > {
1619
1720 const repoOwner = encodeURIComponent ( repo . owner ) ;
1821 const repoName = encodeURIComponent ( repo . name ) ;
1922
20- const apiEndpointPath = releaseTag
21- ? `/repos/${ repoOwner } /${ repoName } /releases/tags/${ releaseTag } `
22- : `/repos/${ repoOwner } /${ repoName } /releases/latest` ;
23+ const apiEndpointPath = `/repos/${ repoOwner } /${ repoName } /releases/tags/${ releaseTag } ` ;
2324
2425 const requestUrl = GITHUB_API_ENDPOINT_URL + apiEndpointPath ;
2526
26- // We skip runtime type checks for simplicity (here we cast from `any` to `GithubRelease`)
27-
2827 log . debug ( "Issuing request for released artifacts metadata to" , requestUrl ) ;
2928
30- // FIXME: handle non-ok response
31- const response : GithubRelease = await fetch ( requestUrl , {
32- headers : { Accept : "application/vnd.github.v3+json" }
33- } )
34- . then ( res => res . json ( ) ) ;
29+ const response = await fetch ( requestUrl , { headers : { Accept : "application/vnd.github.v3+json" } } ) ;
3530
36- const artifact = response . assets . find ( artifact => artifact . name === artifactFileName ) ;
31+ if ( ! response . ok ) {
32+ log . error ( "Error fetching artifact release info" , {
33+ requestUrl,
34+ releaseTag,
35+ artifactFileName,
36+ response : {
37+ headers : response . headers ,
38+ status : response . status ,
39+ body : await response . text ( ) ,
40+ }
41+ } ) ;
42+
43+ throw new Error (
44+ `Got response ${ response . status } when trying to fetch ` +
45+ `"${ artifactFileName } " artifact release info for ${ releaseTag } release`
46+ ) ;
47+ }
3748
38- if ( ! artifact ) return null ;
49+ // We skip runtime type checks for simplicity (here we cast from `any` to `GithubRelease`)
50+ const release : GithubRelease = await response . json ( ) ;
51+
52+ const artifact = release . assets . find ( artifact => artifact . name === artifactFileName ) ;
53+
54+ if ( ! artifact ) {
55+ throw new Error (
56+ `Artifact ${ artifactFileName } was not found in ${ release . name } release!`
57+ ) ;
58+ }
3959
4060 return {
41- releaseName : response . name ,
61+ releaseName : release . name ,
4262 downloadUrl : artifact . browser_download_url
4363 } ;
4464
0 commit comments