aboutsummaryrefslogtreecommitdiff
path: root/editors/code/src/installation/fetch_artifact_release_info.ts
blob: 7d497057aa4787ce05644e1f127e2ebfb2b4be76 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import fetch from "node-fetch";
import { GithubRepo, ArtifactReleaseInfo } from "./interfaces";

const GITHUB_API_ENDPOINT_URL = "https://api.github.com";


/**
 * Fetches the release with `releaseTag` (or just latest release when not specified)
 * from GitHub `repo` and returns metadata about `artifactFileName` shipped with
 * this release or `null` if no such artifact was published.
 */
export async function fetchArtifactReleaseInfo(
    repo: GithubRepo, artifactFileName: string, releaseTag?: string
): Promise<null | ArtifactReleaseInfo> {

    const repoOwner = encodeURIComponent(repo.owner);
    const repoName  = encodeURIComponent(repo.name);

    const apiEndpointPath = releaseTag
        ? `/repos/${repoOwner}/${repoName}/releases/tags/${releaseTag}`
        : `/repos/${repoOwner}/${repoName}/releases/latest`;

    const requestUrl = GITHUB_API_ENDPOINT_URL + apiEndpointPath;

    // We skip runtime type checks for simplicity (here we cast from `any` to `GithubRelease`)

    console.log("Issuing request for released artifacts metadata to", requestUrl);

    // FIXME: handle non-ok response
    const response: GithubRelease = await fetch(requestUrl, {
            headers: { Accept: "application/vnd.github.v3+json" }
        })
        .then(res => res.json());

    const artifact = response.assets.find(artifact => artifact.name === artifactFileName);

    if (!artifact) return null;

    return {
        releaseName: response.name,
        downloadUrl: artifact.browser_download_url
    };

    // We omit declaration of tremendous amount of fields that we are not using here
    interface GithubRelease {
        name: string;
        assets: Array<{
            name: string;
            browser_download_url: string;
        }>;
    }
}