wrap-git
Version:
Wraps GitHub profile and provides summarized details about repos, commits and language coverages for a given profile.
71 lines (70 loc) • 2.41 kB
JavaScript
import { throwError, throwGitError } from "../utils/error.js";
export const getAllRepos = async (username, token) => {
const repos = [];
let page = 1;
let fetching = true;
const headers = {
Accept: "application/vnd.github.cloak-preview+json"
};
if (token)
headers.Authorization = `Bearer ${token}`;
while (fetching) {
const url = token
? `https://api.github.com/user/repos?per_page=100&page=${page}`
: `https://api.github.com/users/${username}/repos?per_page=100&page=${page}`;
try {
const response = await fetch(url, { headers });
if (!response.ok) {
const message = `GitHub API returned status ${response.status}`;
throw throwGitError(response.status, message);
}
const data = await response.json();
repos.push(...data.map((repo) => ({
name: repo.name,
full_name: repo.full_name,
owner: repo.owner?.login ?? "",
description: repo.description,
stargazers_count: repo.stargazers_count,
forks: repo.forks_count,
language: repo.language,
updated_at: repo.updated_at,
created_at: repo.created_at,
open_issues: repo.open_issues_count,
html_url: repo.html_url,
url: repo.url,
languages_url: repo.languages_url,
visibility: repo.visibility
})));
if (data.length < 100) {
fetching = false;
}
else {
page++;
}
}
catch (error) {
throwError(error);
}
}
return repos;
};
export const getRepoLngs = async (repoUrl, token) => {
const url = `${repoUrl}/languages`;
const headers = {
Accept: "application/vnd.github.cloak-preview+json"
};
if (token)
headers.Authorization = `Bearer ${token}`;
try {
const response = await fetch(url, { headers });
if (!response.ok) {
const message = `GitHub API returned status ${response.status}`;
throw throwGitError(response.status, message);
}
const data = await response.json();
return data;
}
catch (error) {
throwError(error);
}
};