//Imports import common from "./../common.mjs" /** Template processor */ export default async function ({login, q}, {conf, data, rest, graphql, plugins, queries}, {s, pending, imports}) { //Check arguments const {repo} = q if (!repo) { console.debug(`metrics/compute/${login}/${repo} > error, repo was undefined`) data.errors.push({error:{message:`You must pass a "repo" argument to use this template`}}) return await common(...arguments) } //Retrieving single repository console.debug(`metrics/compute/${login}/${repo} > retrieving single repository ${repo}`) const {user:{repository}} = await graphql(queries.repository({login, repo})) data.user.repositories.nodes = [repository] data.repo = repository //Contributors and sponsors data.repo.contributors = {totalCount:(await rest.repos.listContributors({owner:data.repo.owner.login, repo})).data.length} data.repo.sponsorshipsAsMaintainer = data.user.sponsorshipsAsMaintainer //Get commit activity console.debug(`metrics/compute/${login}/${repo} > querying api for commits`) const commits = [] for (let page = 0; page < 100; page++) { console.debug(`metrics/compute/${login}/${repo} > loading page ${page}`) const {data} = await rest.repos.listCommits({owner:login, repo, per_page:100, page}) if (!data.length) { console.debug(`metrics/compute/${login}/${repo} > no more page to load`) break } commits.push(...data) } console.debug(`metrics/compute/${login}/${repo} > ${commits.length} commits loaded`) //Override creation date, disk usage and website url data.user.createdAt = repository.createdAt data.user.repositories.totalDiskUsage = repository.diskUsage data.user.websiteUrl = repository.homepageUrl //Override contributions calendar const days = 14 //Compute relative date for each contribution const now = new Date() now.setHours(0, 0, 0, 0) const contributions = commits.map(({commit}) => Math.abs(Math.ceil((now - new Date(commit.committer.date))/(24*60*60*1000)))) //Count contributions per relative day const calendar = new Array(days).fill(0) for (const day of contributions) calendar[day]++ calendar.splice(days) const max = Math.max(...calendar) //Override contributions calendar data.user.calendar.contributionCalendar.weeks = calendar.map(commit => ({contributionDays:{color:commit ? `var(--color-calendar-graph-day-L${Math.ceil(commit/max/0.25)}-bg)` : "var(--color-calendar-graph-day-bg)"}})) //Override plugins parameters q["projects.limit"] = 0 //Common await common(...arguments) await Promise.all(pending) //Set repository name data.user.name = `${data.user.login}/${repo}` //Reformat projects names if (data.plugins.projects) data.plugins.projects.list?.map(project => project.name = project.name.replace(`(${login}/${repo})`, "").trim()) }