astro/scripts/stats/index.js
2021-09-01 02:51:36 +00:00

102 lines
3.1 KiB
JavaScript

// @ts-check
import { Octokit } from '@octokit/action';
import { execSync } from 'child_process';
import { appendFileSync, readFileSync, writeFileSync } from 'fs';
const octokit = new Octokit();
const owner = 'snowpackjs';
const repo = 'astro';
// Relevant IDs captured via: https://docs.github.com/en/graphql/overview/explorer
// query {
// repository(name:"astro", owner:"snowpackjs") {
// project(number: 3) {
// columns(first: 100) {
// nodes {
// id
// databaseId
// name
// }
// }
// }
// }
// }
const COLUMN_ID_BUGS_NEEDS_TRIAGE = 14724521;
const COLUMN_ID_BUGS_ACCEPTED = 14724515;
const COLUMN_ID_BUGS_PRIORITIZED = 14946516;
const COLUMN_ID_RFCS_NEEDS_DISCUSSION = 14946333;
const COLUMN_ID_RFCS_NEEDS_WORK = 14946353;
const COLUMN_ID_RFCS_ACCEPTED = 14946335;
const COLUMN_ID_RFCS_PRIORITIZED = 14946454;
// CREATE LOCAL COPIES OF DATA (Useful for debugging locally)
// Command:
// GITHUB_ACTION=test GITHUB_TOKEN=XXXXXXXXX node scripts/stats/index.js
// Code:
// writeFileSync('pulls.json', JSON.stringify(await octokit.paginate("GET /repos/{owner}/{repo}/pulls", {
// owner,
// repo,
// })));
// writeFileSync('issues.json', JSON.stringify(await octokit.paginate("GET /repos/{owner}/{repo}/issues", {
// owner,
// repo,
// })));
// const issues = JSON.parse(readFileSync('issues.json').toString());
// const pulls = JSON.parse(readFileSync('pulls.json').toString());
async function countCards(column_id) {
return octokit.paginate('GET /projects/columns/{column_id}/cards', {
column_id,
mediaType: {
previews: ['inertia'],
},
});
}
async function countCommits(since) {
return octokit.paginate('GET /repos/{owner}/{repo}/commits', {
owner,
repo,
since: since.toISOString(),
});
}
export async function run() {
const twentyFourHoursAgo = new Date();
twentyFourHoursAgo.setDate(twentyFourHoursAgo.getDate() - 1);
const pulls = await octokit.paginate('GET /repos/{owner}/{repo}/pulls', {
owner,
repo,
});
const issues = await octokit.paginate('GET /repos/{owner}/{repo}/issues', {
owner,
repo,
});
const entry = [
// Date (Human Readable)
`"${new Date().toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' })}"`,
// Commits in last 24 hours
(await countCommits(twentyFourHoursAgo)).length,
// Pull requests
pulls.length,
// Open Issues
issues.length,
// Bugs: Needs Triage
(await countCards(COLUMN_ID_BUGS_NEEDS_TRIAGE)).length,
// Bugs: Accepted
(await countCards(COLUMN_ID_BUGS_ACCEPTED)).length + (await countCards(COLUMN_ID_BUGS_PRIORITIZED)).length,
// RFC: Needs Discussion
(await countCards(COLUMN_ID_RFCS_NEEDS_DISCUSSION)).length,
// RFC: Needs Work
(await countCards(COLUMN_ID_RFCS_NEEDS_WORK)).length,
// RFC: Accepted
(await countCards(COLUMN_ID_RFCS_ACCEPTED)).length + (await countCards(COLUMN_ID_RFCS_PRIORITIZED)).length,
// Date (ISO)
`"${new Date().toISOString()}"`,
];
appendFileSync('scripts/stats/stats.csv', entry.join(',') + '\n');
}
run();