Files
supabase/web/traction.js
2021-05-22 02:30:29 +00:00

95 lines
2.8 KiB
JavaScript

var axios = require('axios')
var fs = require('fs')
const fetchAllEvents = async (repo, totalStars) => {
const MAX_PER_PAGE = 100
const baseUrl = `https://api.github.com/repos/supabase/${repo}/stargazers?per_page=${MAX_PER_PAGE}`
//Start fetching every page of repos.
const fetchPromises = [],
pageCount = Math.ceil(totalStars / MAX_PER_PAGE)
for (let pageI = 1; pageI <= pageCount; ++pageI) {
const fetchPagePromise = axios.get(`${baseUrl}&page=${pageI}`, {
headers: {
Accept: 'application/vnd.github.v3.star+json',
},
})
fetchPromises.push(fetchPagePromise)
}
//This promise resolves after all the fetching is done.
const responses = await Promise.all(fetchPromises)
//Parse all the responses to JSON.
const results = await Promise.all(responses.map((response) => response.data))
//Copy the results into one big array that has all the friggin repos.
let repos = []
results.forEach((result) => {
repos = repos.concat(result)
})
return repos
}
const formatResults = (repo, githubResponse) => {
return githubResponse.map((x) => ({
repo,
starred_at: x.starred_at,
user: { login: x.user.login, id: x.user.id, avatar_url: x.user.avatar_url, url: x.user.url },
}))
}
const main = async () => {
let repos = await axios.get('https://api.github.com/users/supabase/repos')
repos = await Promise.all(
repos.data
.map((repo) => [repo.name, repo.stargazers_count])
.map(async ([name, stars]) => [name, await fetchAllEvents(name, stars)])
)
const history = repos
.map(([name, githubResponse]) => formatResults(name, githubResponse))
.reduce((acc, x) => acc.concat(x), [])
const groups = history.reduce((groups, event) => {
const date = event.starred_at.split('T')[0]
if (!groups[date]) {
groups[date] = []
}
groups[date].push(event)
return groups
}, {})
var tally = {}
repos.forEach(([name, _]) => (tally[name] = 0))
const data = Object.keys(groups)
.sort((a, b) => a.localeCompare(b))
.map((date) => {
repos.forEach(
([name, _]) => (tally[name] += groups[date].filter((x) => x.repo === name).length)
)
let result = { name: date }
repos.forEach(([name, _]) => (result[name] = tally[name]))
return result
})
for (const [name, _] of repos) {
let { data } = await axios.get(`https://api.github.com/repos/supabase/${name}`)
fs.writeFile(`./src/data/repos/${name}.json`, JSON.stringify(data, null, 2), 'utf8', (err) => {
if (err) throw err
console.log(`${name}.json saved.`)
})
}
fs.writeFile(
'./src/data/stars/stargazers.json',
JSON.stringify(data, null, 2),
'utf8',
function (err) {
if (err) throw err
console.log('stargazers.json saved.')
}
)
}
main()