From 5406c2d62938f2cf6aa3274de57fadf9f7460366 Mon Sep 17 00:00:00 2001 From: Robert Tyree Date: Mon, 20 Dec 2021 11:43:00 -0800 Subject: [PATCH] feat: Add github helpers util --- utils/github-api-helpers.js | 44 +++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 utils/github-api-helpers.js diff --git a/utils/github-api-helpers.js b/utils/github-api-helpers.js new file mode 100644 index 0000000000..0725693b03 --- /dev/null +++ b/utils/github-api-helpers.js @@ -0,0 +1,44 @@ +'use strict'; + +const fetch = require('node-fetch'); +const parseLinkHeader = require('parse-link-header'); + +/** + * Pulls the next page off of a `Link` header + * @param {String} linkHeader the `Link` header value + * @returns {String|Null} the next page of results + */ +const getNextLink = (linkHeader) => { + const parsedLinkHeader = parseLinkHeader(linkHeader); + if (parsedLinkHeader && parsedLinkHeader.next) { + return parsedLinkHeader.next.url || null; + } + return null; +}; + +/** + * Fetches paginated results from the Github API + * @param {String} url the API to query + * @param {String} token a token for the API + * @returns {Promise} all pages of results + */ +const fetchPaginatedGHResults = async (url, token) => { + let files = []; + let nextPageLink = url; + while (nextPageLink) { + const resp = await fetch(nextPageLink, { + headers: { authorization: `token ${token}` }, + }); + if (!resp.ok) { + throw new Error( + `Github API returned status ${resp.code} - ${resp.message}` + ); + } + const page = await resp.json(); + nextPageLink = getNextLink(resp.headers.get('Link')); + files = [...files, ...page]; + } + return files; +}; + +module.exports = { fetchPaginatedGHResults, getNextLink }; \ No newline at end of file