aboutsummaryrefslogtreecommitdiff
path: root/editors/code/src/installation/fetch_artifact_release_info.ts
diff options
context:
space:
mode:
Diffstat (limited to 'editors/code/src/installation/fetch_artifact_release_info.ts')
-rw-r--r--editors/code/src/installation/fetch_artifact_release_info.ts52
1 files changed, 52 insertions, 0 deletions
diff --git a/editors/code/src/installation/fetch_artifact_release_info.ts b/editors/code/src/installation/fetch_artifact_release_info.ts
new file mode 100644
index 000000000..7d497057a
--- /dev/null
+++ b/editors/code/src/installation/fetch_artifact_release_info.ts
@@ -0,0 +1,52 @@
1import fetch from "node-fetch";
2import { GithubRepo, ArtifactReleaseInfo } from "./interfaces";
3
4const GITHUB_API_ENDPOINT_URL = "https://api.github.com";
5
6
7/**
8 * Fetches the release with `releaseTag` (or just latest release when not specified)
9 * from GitHub `repo` and returns metadata about `artifactFileName` shipped with
10 * this release or `null` if no such artifact was published.
11 */
12export async function fetchArtifactReleaseInfo(
13 repo: GithubRepo, artifactFileName: string, releaseTag?: string
14): Promise<null | ArtifactReleaseInfo> {
15
16 const repoOwner = encodeURIComponent(repo.owner);
17 const repoName = encodeURIComponent(repo.name);
18
19 const apiEndpointPath = releaseTag
20 ? `/repos/${repoOwner}/${repoName}/releases/tags/${releaseTag}`
21 : `/repos/${repoOwner}/${repoName}/releases/latest`;
22
23 const requestUrl = GITHUB_API_ENDPOINT_URL + apiEndpointPath;
24
25 // We skip runtime type checks for simplicity (here we cast from `any` to `GithubRelease`)
26
27 console.log("Issuing request for released artifacts metadata to", requestUrl);
28
29 // FIXME: handle non-ok response
30 const response: GithubRelease = await fetch(requestUrl, {
31 headers: { Accept: "application/vnd.github.v3+json" }
32 })
33 .then(res => res.json());
34
35 const artifact = response.assets.find(artifact => artifact.name === artifactFileName);
36
37 if (!artifact) return null;
38
39 return {
40 releaseName: response.name,
41 downloadUrl: artifact.browser_download_url
42 };
43
44 // We omit declaration of tremendous amount of fields that we are not using here
45 interface GithubRelease {
46 name: string;
47 assets: Array<{
48 name: string;
49 browser_download_url: string;
50 }>;
51 }
52}