scripts/generate-repos-info.js (69 lines of code) (raw):

const { writeFile } = require('fs/promises'); const axios = require('axios'); const Listr = require('listr'); axios.defaults.timeout = 5000; const axiosConfig = { headers: { 'content-type': 'application/json', Accept: 'application/vnd.github.v3+json', ...(process.env.GITHUB_TOKEN ? { Authorization: `token ${process.env.GITHUB_TOKEN}` } : {}), }, }; const repoList = require('../config/docs').map((v) => v.githubRepo); const res = {}; const tasks = new Listr([ { title: `Fetch repos' info and good first issues`, task: () => new Listr( repoList.map((repo) => ({ title: `Fetch data of ${repo}`, task: () => Promise.all([ axios .get(`https://api.github.com/repos/${repo}`, axiosConfig) .then((v) => v.data) .then((v) => { res[repo] = Object.assign(res[repo] || {}, { info: { description: v.description, star: v.stargazers_count, watch: v.subscribers_count, fork: v.forks_count, issue: v.open_issues_count, }, }); }), axios .get( `https://api.github.com/repos/${repo}/issues?state=open&labels=good%20first%20issue`, axiosConfig, ) .then((v) => v.data) .then((v) => { res[repo] = Object.assign(res[repo] || {}, { issues: v.map((issue) => ({ comments: issue.comments, number: issue.number, title: issue.title, htmlUrl: issue.html_url, })), }); }), ]), })), { concurrent: repoList.length }, ), }, { title: `Save repos' info and good first issues to json file`, task: () => writeFile('../config/repos-info.json', JSON.stringify(res)), }, ]); tasks .run() .then(() => { console.log(`[Finish] Generate repos' info and good first issues finished`); }) .catch((err) => { console.error(err); process.exit(1); });