mirror of
https://github.com/supabase/supabase.git
synced 2026-07-04 05:44:39 +08:00
95 lines
2.8 KiB
JavaScript
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()
|