diff --git a/.github/workflows/contributors.yml b/.github/workflows/contributors.yml new file mode 100644 index 0000000000000..607c604f533a0 --- /dev/null +++ b/.github/workflows/contributors.yml @@ -0,0 +1,35 @@ +name: Docs Contributors + +on: + schedule: + - cron: '0 3 * * SUN' + workflow_dispatch: + +jobs: + contributors: + name: docs_contributors + if: ${{ github.repository_owner == 'withastro' }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + + - name: Install Tools & Dependencies + uses: ./.github/actions/install + + - name: Update Docs Contributors + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: pnpm tsm --require=./scripts/lib/filter-warnings.cjs ./scripts/weekly-contributors.ts + + - name: Create Pull Request + uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8 + with: + branch: ci/contributors + token: ${{ secrets.FREDKBOT_GITHUB_TOKEN }} + add-paths: src/data/contributors.json + commit-message: 'ci: update contributors' + title: 'ci: update docs contributors' + body: | + This PR is auto-generated by a weekly GitHub action to update the list of contributors to the docs repository. + labels: ci diff --git a/scripts/weekly-contributors.ts b/scripts/weekly-contributors.ts new file mode 100644 index 0000000000000..c2bcb862ef902 --- /dev/null +++ b/scripts/weekly-contributors.ts @@ -0,0 +1,73 @@ +import fs from 'node:fs/promises'; + +await run(); + +async function run() { + const repo = 'withastro/docs'; + console.info(`Fetching contributors for ${repo}…`); + + const contributors = await getAllContributors(repo); + await fs.writeFile('./src/data/contributors.json', JSON.stringify(contributors, null, 2) + '\n'); + + console.info(`Saved ${contributors.length} contributors.`); +} + +async function getAllContributors(repo: string) { + const endpoint = `repos/${repo}/contributors`; + const contributors = await recursiveFetch(endpoint); + + return contributors; +} + +async function recursiveFetch(endpoint: string, page = 1): Promise { + const contributors: Contributor[] = []; + try { + const queryParam = endpoint.includes('?') ? '&' : '?'; + const pageSize = 100; + const url = `https://api.github.com/${endpoint}${queryParam}per_page=${pageSize}&page=${page}`; + + const token = process.env.GITHUB_TOKEN ?? ''; + + const res = await fetch(url, { + method: 'GET', + headers: { + Authorization: token && `Basic ${Buffer.from(token, 'binary').toString('base64')}`, + 'User-Agent': 'astro-docs/1.0', + }, + }); + + const data = await res.json(); + + if (!res.ok) { + throw new Error( + `Request to fetch endpoint failed. Reason: ${res.statusText} + Message: ${data?.message}` + ); + } + + contributors.push( + ...data.map((contributor: Contributor) => ({ + id: contributor.id, + login: contributor.login, + })) + ); + + // Fetch more data recursively if there are more than GitHub’s per-page response limit. + if (data.length === pageSize) { + const rest = await recursiveFetch(endpoint, page + 1); + contributors.push(...rest); + } + + return contributors; + } catch (error) { + console.error( + `[error] /scripts/weekly-contributors.ts\n ${error instanceof Error ? error.message : String(error)}` + ); + return []; + } +} + +interface Contributor { + id: number; + login: string; +} diff --git a/src/components/ContributorList.astro b/src/components/ContributorList.astro index e2138f8764e33..916dbfa4ee9b5 100644 --- a/src/components/ContributorList.astro +++ b/src/components/ContributorList.astro @@ -1,14 +1,8 @@ --- -import { getAllContributors } from '~/util/getContributors'; +import { getCollection } from 'astro:content'; import FacePile from './FacePile.astro'; -export interface Props { - githubRepo?: `${string}/${string}`; -} - -const { githubRepo = 'withastro/docs' } = Astro.props as Props; - -const contributors = await getAllContributors(githubRepo); +const contributors = await getCollection('contributors'); --- diff --git a/src/components/FacePile.astro b/src/components/FacePile.astro index 6eb63df2f8bb9..89d4bfa372150 100644 --- a/src/components/FacePile.astro +++ b/src/components/FacePile.astro @@ -1,8 +1,8 @@ --- -import type { Contributor } from '~/util/getContributors'; +import type { CollectionEntry } from 'astro:content'; export interface Props { - contributors: Contributor[]; + contributors: CollectionEntry<'contributors'>[]; } const { contributors } = Astro.props as Props; @@ -14,10 +14,10 @@ const { contributors } = Astro.props as Props; { contributors.map((item) => (
  • - + {item.login} - - - - ) -} diff --git a/src/content.config.ts b/src/content.config.ts index f183029f1b686..4468f44b47ff1 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -1,6 +1,7 @@ import { docsLoader, i18nLoader } from '@astrojs/starlight/loaders'; import { docsSchema, i18nSchema } from '@astrojs/starlight/schema'; import { defineCollection, z, type CollectionEntry } from 'astro:content'; +import { file } from 'astro/loaders'; import { AstroDocsI18nSchema } from './content/i18n-schema'; export const baseSchema = z.object({ @@ -83,6 +84,11 @@ export const docsCollectionSchema = z.union([ recipeSchema, ]); +const contributorSchema = z.object({ + id: z.number(), + login: z.string(), +}); + export type DocsEntryData = z.infer; export type DocsEntryType = DocsEntryData['type']; @@ -141,4 +147,9 @@ export const collections = { loader: i18nLoader(), schema: i18nSchema({ extend: AstroDocsI18nSchema }), }), + // Contributors to the docs repo, updated weekly, sorted number of commits in descending order. + contributors: defineCollection({ + loader: file('src/data/contributors.json'), + schema: contributorSchema, + }), }; diff --git a/src/content/docs/ar/contribute.mdx b/src/content/docs/ar/contribute.mdx index 7eec3942cec59..ed32d1feb0713 100644 --- a/src/content/docs/ar/contribute.mdx +++ b/src/content/docs/ar/contribute.mdx @@ -56,4 +56,4 @@ import PackageManagerTabs from '~/components/tabs/PackageManagerTabs.astro' أنت تُطالع هذا التوثيق بفضل كل هؤلاء المساهمين، [انضم إلينا على GitHub!](https://github.com/withastro/docs) - + diff --git a/src/content/docs/de/contribute.mdx b/src/content/docs/de/contribute.mdx index d5ef8dbb96a11..d1592ac95225b 100644 --- a/src/content/docs/de/contribute.mdx +++ b/src/content/docs/de/contribute.mdx @@ -50,4 +50,4 @@ Bitte besuche unsere spezielle Seite [*Astro Docs* Docs](https://contribute.docs Diese Dokumentation wurden von all diesen hilfsbereiten Menschen zur Verfügung gestellt. [Werde Teil von uns auf GitHub!](https://github.com/withastro/docs) - + diff --git a/src/content/docs/es/contribute.mdx b/src/content/docs/es/contribute.mdx index 1015b10315cb6..8037e8852ee73 100644 --- a/src/content/docs/es/contribute.mdx +++ b/src/content/docs/es/contribute.mdx @@ -56,4 +56,4 @@ Visita nuestro sitio dedicado [*Astro Docs* Docs](https://contribute.docs.astro. Estos documentos son traídos por nuestra comunidad. [¡Únete a nosotros en GitHub!](https://github.com/withastro/docs) - + diff --git a/src/content/docs/fr/contribute.mdx b/src/content/docs/fr/contribute.mdx index 82cb92d980d49..7d0f192771a88 100644 --- a/src/content/docs/fr/contribute.mdx +++ b/src/content/docs/fr/contribute.mdx @@ -53,4 +53,4 @@ Visitez notre site dédié [*Astro Docs* Docs](https://contribute.docs.astro.bui Cette documentation vous est présentée par toutes ces personnes serviables. [Rejoignez-nous sur GitHub !](https://github.com/withastro/docs) - + diff --git a/src/content/docs/hi/contribute.mdx b/src/content/docs/hi/contribute.mdx index 16d666965a21a..d5dd204a53e68 100644 --- a/src/content/docs/hi/contribute.mdx +++ b/src/content/docs/hi/contribute.mdx @@ -49,4 +49,4 @@ Astro Docs में योगदान देने में आपकी स ये दस्तावेज़ आपके लिए इन सभी मददगार लोगों द्वारा लाए गए हैं। [GitHub पर हमसे जुड़ें!](https://github.com/withastro/docs) - + diff --git a/src/content/docs/it/contribute.mdx b/src/content/docs/it/contribute.mdx index a466ae12d6215..6fec02298cfa5 100644 --- a/src/content/docs/it/contribute.mdx +++ b/src/content/docs/it/contribute.mdx @@ -49,4 +49,4 @@ Ti preghiamo di visitare la [documentazione per la *documentazione di Astro*](ht Questa documentazione è realizzata da tutte queste persone. [Unisciti a noi su GitHub!](https://github.com/withastro/docs) - + diff --git a/src/content/docs/ja/contribute.mdx b/src/content/docs/ja/contribute.mdx index 30824423e9f53..70899de5a390a 100644 --- a/src/content/docs/ja/contribute.mdx +++ b/src/content/docs/ja/contribute.mdx @@ -49,4 +49,4 @@ Astro Docsへの貢献を支援するために、いくつかのガイドを用 このドキュメントは、多くの方々の協力によって提供されています。[GitHubで参加しましょう!](https://github.com/withastro/docs) - + diff --git a/src/content/docs/ko/contribute.mdx b/src/content/docs/ko/contribute.mdx index ea06325598e37..c466ae5eb84a2 100644 --- a/src/content/docs/ko/contribute.mdx +++ b/src/content/docs/ko/contribute.mdx @@ -53,4 +53,4 @@ Astro 문서에 기여하는 데 도움이 되는 몇 가지 가이드가 있습 이 문서는 이 모든 도움을 주신 분들의 도움으로 만들어졌습니다. [GitHub에서 함께 하세요!](https://github.com/withastro/docs) - + diff --git a/src/content/docs/pl/contribute.mdx b/src/content/docs/pl/contribute.mdx index be9f2817865da..ebae538b49274 100644 --- a/src/content/docs/pl/contribute.mdx +++ b/src/content/docs/pl/contribute.mdx @@ -49,4 +49,4 @@ Odwiedź naszą dedykowaną stronę [dokumentacji *Astro Docs*](https://contribu Te dokumenty są dostarczane dzięki tym wszystkim pomocnym osobom. [Dołącz do nas na GitHubie!](https://github.com/withastro/docs) - + diff --git a/src/content/docs/pt-br/contribute.mdx b/src/content/docs/pt-br/contribute.mdx index 5725483eca559..c723bc7345e03 100644 --- a/src/content/docs/pt-br/contribute.mdx +++ b/src/content/docs/pt-br/contribute.mdx @@ -49,4 +49,4 @@ Por favor, visite nosso site dedicado [*Astro Docs* Docs](https://contribute.doc Essa documentação é trazida até você por todas essas pessoas colaborativas. [Junte-se a nós no GitHub!](https://github.com/withastro/docs) - + diff --git a/src/content/docs/ru/contribute.mdx b/src/content/docs/ru/contribute.mdx index d6e5048ac36a4..2930d98fa7803 100644 --- a/src/content/docs/ru/contribute.mdx +++ b/src/content/docs/ru/contribute.mdx @@ -52,4 +52,4 @@ import ContributorList from '~/components/ContributorList.astro' Эти документы созданы благодаря всем этим людям. [Присоединяйтесь к нам на GitHub!](https://github.com/withastro/docs) - + diff --git a/src/content/docs/zh-cn/contribute.mdx b/src/content/docs/zh-cn/contribute.mdx index d5106324a4ee9..a5c8a1fd74f2f 100644 --- a/src/content/docs/zh-cn/contribute.mdx +++ b/src/content/docs/zh-cn/contribute.mdx @@ -47,4 +47,4 @@ import ContributorList from '~/components/ContributorList.astro' 这些文档由所有这些有帮助的人提供。[在 GitHub 上加入我们!](https://github.com/withastro/docs) - + diff --git a/src/content/docs/zh-tw/contribute.mdx b/src/content/docs/zh-tw/contribute.mdx index d4a130e79617f..338272c3f1bf2 100644 --- a/src/content/docs/zh-tw/contribute.mdx +++ b/src/content/docs/zh-tw/contribute.mdx @@ -53,4 +53,4 @@ import ContributorList from '~/components/ContributorList.astro' 這些文件由下列熱心的人共同協作。歡迎[在 GitHub 加入我們!](https://github.com/withastro/docs) - + diff --git a/src/data/contributors.json b/src/data/contributors.json new file mode 100644 index 0000000000000..536d76df03e6a --- /dev/null +++ b/src/data/contributors.json @@ -0,0 +1,1698 @@ +[ + { + "id": 39112954, + "login": "jsparkdev" + }, + { + "id": 59021693, + "login": "ArmandPhilippot" + }, + { + "id": 5098874, + "login": "sarah11918" + }, + { + "id": 85648028, + "login": "dreyfus92" + }, + { + "id": 30520689, + "login": "Nin3lee" + }, + { + "id": 357379, + "login": "delucis" + }, + { + "id": 25167721, + "login": "liruifengv" + }, + { + "id": 108291165, + "login": "astrobot-houston" + }, + { + "id": 78129249, + "login": "Waxer59" + }, + { + "id": 36526527, + "login": "100gle" + }, + { + "id": 25839948, + "login": "huyikai" + }, + { + "id": 61414485, + "login": "yanthomasdev" + }, + { + "id": 14293805, + "login": "thomasbnt" + }, + { + "id": 7889778, + "login": "morinokami" + }, + { + "id": 622227, + "login": "FredKSchott" + }, + { + "id": 44530252, + "login": "McFlyPartages" + }, + { + "id": 125820963, + "login": "mearashadowfax" + }, + { + "id": 46791833, + "login": "kevinzunigacuellar" + }, + { + "id": 4033662, + "login": "Jutanium" + }, + { + "id": 6137925, + "login": "hippotastic" + }, + { + "id": 5748616, + "login": "viniciusdeliz" + }, + { + "id": 12958674, + "login": "Alynva" + }, + { + "id": 64310361, + "login": "TheOtterlord" + }, + { + "id": 51384119, + "login": "bholmesdev" + }, + { + "id": 99918022, + "login": "trueberryless" + }, + { + "id": 29927270, + "login": "Chrissdroid" + }, + { + "id": 25897764, + "login": "AitorMT" + }, + { + "id": 45708948, + "login": "kecrily" + }, + { + "id": 602478, + "login": "ematipico" + }, + { + "id": 70939128, + "login": "jp-knj" + }, + { + "id": 13069, + "login": "kyosuke" + }, + { + "id": 8216525, + "login": "vrabe" + }, + { + "id": 11063910, + "login": "Fryuni" + }, + { + "id": 10626596, + "login": "jasikpark" + }, + { + "id": 54233296, + "login": "alexnguyennz" + }, + { + "id": 15145918, + "login": "ElianCodes" + }, + { + "id": 3019731, + "login": "Princesseuh" + }, + { + "id": 188426, + "login": "jonathantneal" + }, + { + "id": 361671, + "login": "matthewp" + }, + { + "id": 31162600, + "login": "agustinmulet" + }, + { + "id": 88548999, + "login": "at-the-vr" + }, + { + "id": 11240579, + "login": "Genteure" + }, + { + "id": 25723446, + "login": "casungo" + }, + { + "id": 40516784, + "login": "mingjunlu" + }, + { + "id": 34116392, + "login": "bluwy" + }, + { + "id": 12275019, + "login": "Egpereira" + }, + { + "id": 7118177, + "login": "natemoo-re" + }, + { + "id": 11237366, + "login": "Hanawa02" + }, + { + "id": 28299972, + "login": "aFuzzyBear" + }, + { + "id": 25883220, + "login": "JuanPabloDiaz" + }, + { + "id": 81974850, + "login": "MoustaphaDev" + }, + { + "id": 49518790, + "login": "pioupia" + }, + { + "id": 7684330, + "login": "fredoist" + }, + { + "id": 494699, + "login": "HiDeoo" + }, + { + "id": 7903076, + "login": "sasoria" + }, + { + "id": 36927158, + "login": "maxchang3" + }, + { + "id": 69633530, + "login": "florian-lefebvre" + }, + { + "id": 103011756, + "login": "piro-hiroki" + }, + { + "id": 1528803, + "login": "sarasate" + }, + { + "id": 232656354, + "login": "mcorrochanoa" + }, + { + "id": 16712703, + "login": "JuanM04" + }, + { + "id": 669326, + "login": "mrienstra" + }, + { + "id": 103585995, + "login": "bjohansebas" + }, + { + "id": 20650404, + "login": "VoxelMC" + }, + { + "id": 229402, + "login": "dragomano" + }, + { + "id": 47194884, + "login": "ImKiri86" + }, + { + "id": 213306, + "login": "ascorbic" + }, + { + "id": 29139614, + "login": "renovate[bot]" + }, + { + "id": 11766500, + "login": "antonyfaris" + }, + { + "id": 74939915, + "login": "glopzel" + }, + { + "id": 52907282, + "login": "tarikrital" + }, + { + "id": 3756185, + "login": "afucher" + }, + { + "id": 1425259, + "login": "shuuji3" + }, + { + "id": 11986753, + "login": "kimulaco" + }, + { + "id": 94928215, + "login": "martrapp" + }, + { + "id": 103483059, + "login": "DerTimonius" + }, + { + "id": 11061182, + "login": "helmerdx" + }, + { + "id": 101558384, + "login": "luoingly" + }, + { + "id": 9084735, + "login": "mayank99" + }, + { + "id": 78459953, + "login": "AbrahamX3" + }, + { + "id": 69170106, + "login": "lilnasy" + }, + { + "id": 42184309, + "login": "asgoshawk" + }, + { + "id": 77632836, + "login": "clemenzi" + }, + { + "id": 12174733, + "login": "itskitto" + }, + { + "id": 30765485, + "login": "CaptainOfPhB" + }, + { + "id": 181699, + "login": "diegognt" + }, + { + "id": 99908851, + "login": "karolhas" + }, + { + "id": 20746019, + "login": "itsmatteomanf" + }, + { + "id": 74938858, + "login": "zadeviggers" + }, + { + "id": 43196286, + "login": "yuto343" + }, + { + "id": 85624552, + "login": "Eric-llos" + }, + { + "id": 89835661, + "login": "XindiShang" + }, + { + "id": 101443426, + "login": "SnowDingo" + }, + { + "id": 19967622, + "login": "BryceRussell" + }, + { + "id": 990216, + "login": "leoj3n" + }, + { + "id": 45965090, + "login": "alexanderniebuhr" + }, + { + "id": 44868357, + "login": "codersjj" + }, + { + "id": 114303361, + "login": "ryuapp" + }, + { + "id": 703248, + "login": "agriffard" + }, + { + "id": 89195061, + "login": "anaxite" + }, + { + "id": 33442948, + "login": "apatel369" + }, + { + "id": 57179957, + "login": "yeonjulee1005" + }, + { + "id": 1038168, + "login": "teinett" + }, + { + "id": 150704902, + "login": "randomguy-2650" + }, + { + "id": 7007253, + "login": "mottox2" + }, + { + "id": 128291517, + "login": "RezixDev" + }, + { + "id": 115520730, + "login": "OliverSpeir" + }, + { + "id": 72817096, + "login": "JusticeMatthew" + }, + { + "id": 66965600, + "login": "louisescher" + }, + { + "id": 44106297, + "login": "hkbertoson" + }, + { + "id": 110926935, + "login": "Eyozy" + }, + { + "id": 92775570, + "login": "HashCookie" + }, + { + "id": 12536486, + "login": "tkskto" + }, + { + "id": 66517416, + "login": "n-tong009" + }, + { + "id": 95019875, + "login": "autroshot" + }, + { + "id": 30383579, + "login": "Adammatthiesen" + }, + { + "id": 9100169, + "login": "crutchcorn" + }, + { + "id": 22087604, + "login": "clearlyTHUYDOAN" + }, + { + "id": 74556046, + "login": "fhiromasa" + }, + { + "id": 46154381, + "login": "magnum-zx" + }, + { + "id": 25793187, + "login": "arisa-fukuzaki" + }, + { + "id": 14830190, + "login": "caioferrarezi" + }, + { + "id": 92606530, + "login": "Elib27" + }, + { + "id": 67210629, + "login": "jdwilkin4" + }, + { + "id": 58094796, + "login": "Jothsa" + }, + { + "id": 139560930, + "login": "Panelinio" + }, + { + "id": 2342458, + "login": "palmiak" + }, + { + "id": 68387835, + "login": "NinuzIBZ" + }, + { + "id": 59335584, + "login": "sujang958" + }, + { + "id": 37566594, + "login": "tejapaturu" + }, + { + "id": 988095, + "login": "pyronaur" + }, + { + "id": 49202538, + "login": "milovangudelj" + }, + { + "id": 29756792, + "login": "michaelbe812" + }, + { + "id": 58347116, + "login": "Pukimaa" + }, + { + "id": 63650415, + "login": "RafidMuhymin" + }, + { + "id": 19380403, + "login": "ralacerda" + }, + { + "id": 1091472, + "login": "chenxsan" + }, + { + "id": 5608239, + "login": "chalkygames123" + }, + { + "id": 78506637, + "login": "gacek1123" + }, + { + "id": 48359052, + "login": "minjongbaek" + }, + { + "id": 51922004, + "login": "Maxframe" + }, + { + "id": 65327974, + "login": "manchan4869" + }, + { + "id": 34824645, + "login": "staticWagomU" + }, + { + "id": 17983739, + "login": "imbant" + }, + { + "id": 59626670, + "login": "angelmarfil" + }, + { + "id": 16765690, + "login": "bandantonio" + }, + { + "id": 100040151, + "login": "BassamXYZ" + }, + { + "id": 37726261, + "login": "wtchnm" + }, + { + "id": 10464497, + "login": "garysassano" + }, + { + "id": 3282350, + "login": "olets" + }, + { + "id": 49127376, + "login": "IgorKowalczyk" + }, + { + "id": 24290044, + "login": "Singebob" + }, + { + "id": 81039882, + "login": "Njong392" + }, + { + "id": 77222233, + "login": "NightFeather0615" + }, + { + "id": 73933669, + "login": "nermalcat69" + }, + { + "id": 26341224, + "login": "mogeko" + }, + { + "id": 171986, + "login": "tinymachine" + }, + { + "id": 5558193, + "login": "mhstrkmp" + }, + { + "id": 56328053, + "login": "marsidev" + }, + { + "id": 15347255, + "login": "lorenzolewis" + }, + { + "id": 190183925, + "login": "ankddev" + }, + { + "id": 13678847, + "login": "mitian233" + }, + { + "id": 362261, + "login": "chriswburke" + }, + { + "id": 3680835, + "login": "santiemanuel" + }, + { + "id": 1110792, + "login": "paulrudy" + }, + { + "id": 41154684, + "login": "nokazn" + }, + { + "id": 22488175, + "login": "miroim" + }, + { + "id": 35761035, + "login": "melon95" + }, + { + "id": 3241026, + "login": "mantaroh" + }, + { + "id": 9054858, + "login": "lostra01" + }, + { + "id": 51779800, + "login": "ktym4a" + }, + { + "id": 75212478, + "login": "dorasans" + }, + { + "id": 49699333, + "login": "dependabot[bot]" + }, + { + "id": 81493003, + "login": "danielcuque" + }, + { + "id": 77161808, + "login": "florluzduarte" + }, + { + "id": 30044630, + "login": "AkashRajpurohit" + }, + { + "id": 10289071, + "login": "guidiego" + }, + { + "id": 6777224, + "login": "JavGuerra" + }, + { + "id": 70809675, + "login": "selfire1" + }, + { + "id": 79452224, + "login": "Kenzo-Wada" + }, + { + "id": 86508666, + "login": "KoriIku" + }, + { + "id": 60052718, + "login": "lumamontes" + }, + { + "id": 28953458, + "login": "marcelwenner" + }, + { + "id": 72772558, + "login": "Hopelezz" + }, + { + "id": 10930234, + "login": "ohansemmanuel" + }, + { + "id": 99479, + "login": "richeklein" + }, + { + "id": 105317145, + "login": "ItzRoBeerT" + }, + { + "id": 18264851, + "login": "seppegadeyne" + }, + { + "id": 16623919, + "login": "vuecat" + }, + { + "id": 111561, + "login": "tordans" + }, + { + "id": 485747, + "login": "simonswiss" + }, + { + "id": 110596249, + "login": "darusk" + }, + { + "id": 18255987, + "login": "coderfee" + }, + { + "id": 87353286, + "login": "vedxp" + }, + { + "id": 15836226, + "login": "tony-sull" + }, + { + "id": 133055, + "login": "arty-name" + }, + { + "id": 3246342, + "login": "timfee" + }, + { + "id": 55956895, + "login": "Tc-001" + }, + { + "id": 61684793, + "login": "hexWars" + }, + { + "id": 63601536, + "login": "SatanshuMishra" + }, + { + "id": 53308129, + "login": "ManorSailor" + }, + { + "id": 65021823, + "login": "BlackdestinyXX" + }, + { + "id": 66678395, + "login": "DevRohit06" + }, + { + "id": 7355835, + "login": "radenpioneer" + }, + { + "id": 17054057, + "login": "thepassle" + }, + { + "id": 3436158, + "login": "fflaten" + }, + { + "id": 69125074, + "login": "emily-shen" + }, + { + "id": 119287439, + "login": "VLTHellolin" + }, + { + "id": 53004404, + "login": "Lilian97" + }, + { + "id": 58453130, + "login": "matdexir" + }, + { + "id": 3417221, + "login": "nadar" + }, + { + "id": 74355, + "login": "okonomi" + }, + { + "id": 22608727, + "login": "oki07" + }, + { + "id": 62075475, + "login": "renanleonel" + }, + { + "id": 28241963, + "login": "situ2001" + }, + { + "id": 27896533, + "login": "space-otter" + }, + { + "id": 75863044, + "login": "tobiasschmidt89" + }, + { + "id": 37883750, + "login": "ws-rush" + }, + { + "id": 124225078, + "login": "ykcory" + }, + { + "id": 20949060, + "login": "bengeois" + }, + { + "id": 1105080, + "login": "openscript" + }, + { + "id": 71955135, + "login": "favanso" + }, + { + "id": 4117920, + "login": "evadecker" + }, + { + "id": 7983005, + "login": "eric-burel" + }, + { + "id": 17516559, + "login": "dsomel21" + }, + { + "id": 136388405, + "login": "Dillonpw" + }, + { + "id": 92310163, + "login": "davidumoru" + }, + { + "id": 87678248, + "login": "David-Large" + }, + { + "id": 7117993, + "login": "cravend" + }, + { + "id": 105683440, + "login": "CBID2" + }, + { + "id": 11388820, + "login": "csarnataro" + }, + { + "id": 26915891, + "login": "emjio" + }, + { + "id": 5795227, + "login": "breadadams" + }, + { + "id": 867257, + "login": "Because789" + }, + { + "id": 18169566, + "login": "deining" + }, + { + "id": 62723180, + "login": "ahmed-n-abdeltwab" + }, + { + "id": 26602940, + "login": "0xflotus" + }, + { + "id": 49027876, + "login": "leen-neel" + }, + { + "id": 28926450, + "login": "nicdun" + }, + { + "id": 12800230, + "login": "Morritz" + }, + { + "id": 4677417, + "login": "pReya" + }, + { + "id": 9967336, + "login": "mhdcodes" + }, + { + "id": 36402166, + "login": "debiru" + }, + { + "id": 91272406, + "login": "baevm" + }, + { + "id": 90469240, + "login": "MartinFerret" + }, + { + "id": 30686223, + "login": "LiHowe" + }, + { + "id": 78465651, + "login": "newtoallofthis123" + }, + { + "id": 24359130, + "login": "swift502" + }, + { + "id": 1029022, + "login": "sunapi386" + }, + { + "id": 61264139, + "login": "kannansuresh" + }, + { + "id": 8854718, + "login": "kanadgupta" + }, + { + "id": 18559798, + "login": "jdbruxelles" + }, + { + "id": 3759507, + "login": "jhuleatt" + }, + { + "id": 34408108, + "login": "Je12emy" + }, + { + "id": 50741, + "login": "millette" + }, + { + "id": 24493056, + "login": "XinChou16" + }, + { + "id": 18482346, + "login": "Rolanddoda" + }, + { + "id": 5978625, + "login": "RolginRoman" + }, + { + "id": 12532733, + "login": "ffxsam" + }, + { + "id": 45321563, + "login": "SandraRodgers" + }, + { + "id": 17608169, + "login": "SebasG22" + }, + { + "id": 9643358, + "login": "SergioDiez" + }, + { + "id": 19520829, + "login": "ShamarYarde" + }, + { + "id": 1884712, + "login": "surjithctly" + }, + { + "id": 8137511, + "login": "V3RON" + }, + { + "id": 10607759, + "login": "motss" + }, + { + "id": 5091416, + "login": "tem235" + }, + { + "id": 96334363, + "login": "tobySolutions" + }, + { + "id": 9438102, + "login": "inwardmovement" + }, + { + "id": 19306765, + "login": "Trombach" + }, + { + "id": 299173, + "login": "lukemcdonald" + }, + { + "id": 129096443, + "login": "MaxTheTurtle0" + }, + { + "id": 37586974, + "login": "mingXta" + }, + { + "id": 73689580, + "login": "xun082" + }, + { + "id": 81434423, + "login": "stormynight9" + }, + { + "id": 137406386, + "login": "NavyStack" + }, + { + "id": 25770025, + "login": "nikhilhenry" + }, + { + "id": 35943047, + "login": "Ekwuno" + }, + { + "id": 17222836, + "login": "okikio" + }, + { + "id": 58887202, + "login": "omarr45" + }, + { + "id": 123599427, + "login": "dibaxu" + }, + { + "id": 14833423, + "login": "9thQuadrant" + }, + { + "id": 1377702, + "login": "serhalp" + }, + { + "id": 16595528, + "login": "Scalamando" + }, + { + "id": 13049130, + "login": "wobsoriano" + }, + { + "id": 6268177, + "login": "RobertAKARobin" + }, + { + "id": 29157111, + "login": "lhz960904" + }, + { + "id": 31998110, + "login": "lstephensca" + }, + { + "id": 190968675, + "login": "my-astro" + }, + { + "id": 80624252, + "login": "pilcrowonpaper" + }, + { + "id": 74651094, + "login": "ref-thomasledoux1" + }, + { + "id": 38100632, + "login": "sentisso" + }, + { + "id": 30691457, + "login": "t0yohei" + }, + { + "id": 11825317, + "login": "JPVan" + }, + { + "id": 79536204, + "login": "woshierha" + }, + { + "id": 53341550, + "login": "yiyuan9" + }, + { + "id": 70315161, + "login": "zreren" + }, + { + "id": 83183656, + "login": "dei8bit" + }, + { + "id": 70379917, + "login": "shinonomelon" + }, + { + "id": 36409869, + "login": "Tsukistar" + }, + { + "id": 4535888, + "login": "zhuchentong" + }, + { + "id": 43034252, + "login": "abhikjain360" + }, + { + "id": 16581093, + "login": "vitoriapena" + }, + { + "id": 91918142, + "login": "vivitt" + }, + { + "id": 82119938, + "login": "Zastinian" + }, + { + "id": 26745086, + "login": "peng" + }, + { + "id": 48325984, + "login": "AsazuTaiga" + }, + { + "id": 3165765, + "login": "magurotabetai" + }, + { + "id": 30541686, + "login": "Bluex-xx" + }, + { + "id": 61925890, + "login": "carsakiller" + }, + { + "id": 32230775, + "login": "djdeo" + }, + { + "id": 133163553, + "login": "fabriciodev26" + }, + { + "id": 26926272, + "login": "mardybardy" + }, + { + "id": 10359074, + "login": "gtnbssn" + }, + { + "id": 46498821, + "login": "guiguir68" + }, + { + "id": 88193046, + "login": "eiis" + }, + { + "id": 817855, + "login": "jose8a" + }, + { + "id": 78880702, + "login": "kikonavarro" + }, + { + "id": 3964466, + "login": "aaronlamz" + }, + { + "id": 86967271, + "login": "coding-in-public" + }, + { + "id": 1045274, + "login": "colbyfayock" + }, + { + "id": 41589731, + "login": "conradagramont" + }, + { + "id": 113018070, + "login": "WooDaeHyun" + }, + { + "id": 113148688, + "login": "DavidEGiraldo" + }, + { + "id": 39919361, + "login": "Sparkhand" + }, + { + "id": 6597211, + "login": "ekafyi" + }, + { + "id": 2900833, + "login": "estruyf" + }, + { + "id": 5727389, + "login": "emma-sg" + }, + { + "id": 43917961, + "login": "Erik-McKelvey" + }, + { + "id": 10679967, + "login": "PanConDev" + }, + { + "id": 44296203, + "login": "Franqsanz" + }, + { + "id": 8008909, + "login": "falvarador" + }, + { + "id": 6182099, + "login": "felixsanz" + }, + { + "id": 15015260, + "login": "ogabrielp" + }, + { + "id": 830515, + "login": "gaeulbyul" + }, + { + "id": 51356696, + "login": "addonion" + }, + { + "id": 550193, + "login": "AdamPrendergast" + }, + { + "id": 19473034, + "login": "afonsojramos" + }, + { + "id": 46956435, + "login": "Alex-S-Davies" + }, + { + "id": 96465880, + "login": "Astisme" + }, + { + "id": 48945157, + "login": "alfredogonzalezmartinez" + }, + { + "id": 13088001, + "login": "alvgaona" + }, + { + "id": 107407814, + "login": "alvinometric" + }, + { + "id": 71379045, + "login": "andremralves" + }, + { + "id": 112902422, + "login": "ArinaKosiakov" + }, + { + "id": 2382552, + "login": "atilafassina" + }, + { + "id": 66757451, + "login": "avilyre" + }, + { + "id": 33166095, + "login": "bartosztrusinski" + }, + { + "id": 20285369, + "login": "branberry" + }, + { + "id": 13206945, + "login": "calebeby" + }, + { + "id": 58281730, + "login": "CheukTsai" + }, + { + "id": 102560332, + "login": "jazzypants1989" + }, + { + "id": 88730883, + "login": "Jhon-H" + }, + { + "id": 29053796, + "login": "jcha0713" + }, + { + "id": 62016742, + "login": "Jvictorvieira" + }, + { + "id": 106132925, + "login": "juanburg98" + }, + { + "id": 33623712, + "login": "juansemprun" + }, + { + "id": 101819212, + "login": "juliamrch" + }, + { + "id": 2209893, + "login": "jurajkapsz" + }, + { + "id": 81643826, + "login": "justinnoel" + }, + { + "id": 144747596, + "login": "yt-kevincarrera" + }, + { + "id": 5457539, + "login": "ixkaito" + }, + { + "id": 14703164, + "login": "yeskunall" + }, + { + "id": 19961439, + "login": "kylebutts" + }, + { + "id": 9098977, + "login": "leoxs22" + }, + { + "id": 1506900, + "login": "leohxj" + }, + { + "id": 76248448, + "login": "LuMiSxh" + }, + { + "id": 1514154, + "login": "neotherapper" + }, + { + "id": 68320771, + "login": "HALQME" + }, + { + "id": 30705623, + "login": "TKDev7" + }, + { + "id": 54203033, + "login": "X7md" + }, + { + "id": 73981739, + "login": "HawtinZeng" + }, + { + "id": 13371332, + "login": "hfournier" + }, + { + "id": 8390324, + "login": "iainsimmons" + }, + { + "id": 56846024, + "login": "teplostanski" + }, + { + "id": 6243993, + "login": "isaac-mcfadyen" + }, + { + "id": 74252988, + "login": "isamardzija" + }, + { + "id": 122728490, + "login": "jacksmithxyz" + }, + { + "id": 58297401, + "login": "AsyncBanana" + }, + { + "id": 140852203, + "login": "vandorsx" + }, + { + "id": 7950094, + "login": "DerYeger" + }, + { + "id": 7818951, + "login": "JEverhart383" + }, + { + "id": 504327, + "login": "jeffdrumgod" + }, + { + "id": 851278, + "login": "heldinz" + }, + { + "id": 28267443, + "login": "hrynko" + }, + { + "id": 59065561, + "login": "alextison" + }, + { + "id": 125706322, + "login": "thekidisalright" + }, + { + "id": 69808183, + "login": "alex-drocks" + }, + { + "id": 104835302, + "login": "haasal" + }, + { + "id": 17162626, + "login": "AlexNodex" + }, + { + "id": 6441503, + "login": "alexpdraper" + }, + { + "id": 35699916, + "login": "amaimus" + }, + { + "id": 5568337, + "login": "albertogiunta" + }, + { + "id": 3164034, + "login": "notjb" + }, + { + "id": 11743804, + "login": "gachikuku" + }, + { + "id": 4699008, + "login": "alvarosabu" + }, + { + "id": 15271679, + "login": "amxmln" + }, + { + "id": 104027530, + "login": "amirzezo201" + }, + { + "id": 6134547, + "login": "yoyo837" + }, + { + "id": 95082903, + "login": "grace-anand" + }, + { + "id": 1617798, + "login": "ancaemcken" + }, + { + "id": 26471, + "login": "andersk" + }, + { + "id": 7058116, + "login": "madrus" + }, + { + "id": 1881266, + "login": "unrevised6419" + }, + { + "id": 52315048, + "login": "3w36zj6" + }, + { + "id": 1002694, + "login": "aaronkai" + }, + { + "id": 6192554, + "login": "arafays" + }, + { + "id": 61620817, + "login": "alfawal" + }, + { + "id": 20342543, + "login": "abisekhsubedi" + }, + { + "id": 81095429, + "login": "adamlevoy" + }, + { + "id": 35545129, + "login": "AdamGEmerson" + }, + { + "id": 675615, + "login": "adamgajzlerowicz" + }, + { + "id": 1427241, + "login": "adam-lynch" + }, + { + "id": 30202878, + "login": "armgitaar" + }, + { + "id": 35582648, + "login": "ADRlANO" + }, + { + "id": 59536294, + "login": "adrian-burkhart" + }, + { + "id": 2024018, + "login": "adrianlyjak" + }, + { + "id": 20273871, + "login": "apz-gh" + }, + { + "id": 67356781, + "login": "ahmedrowaihi" + }, + { + "id": 105178005, + "login": "aidankmcalister" + }, + { + "id": 7365296, + "login": "AishaBlake" + }, + { + "id": 767767, + "login": "aboudard" + }, + { + "id": 1009, + "login": "altano" + }, + { + "id": 1643060, + "login": "wonderbeel" + } +] diff --git a/src/util/cachedFetch.ts b/src/util/cachedFetch.ts index b2bbb2cbfcb36..d2a30dbda30ed 100644 --- a/src/util/cachedFetch.ts +++ b/src/util/cachedFetch.ts @@ -22,13 +22,23 @@ export async function cachedFetch( let buffer: Buffer | undefined; try { - buffer = await retry(() => - EleventyFetch(url, { - duration, - verbose, - type: 'buffer', - fetchOptions, - }) + buffer = await retry( + () => + EleventyFetch(url, { + duration, + verbose, + type: 'buffer', + fetchOptions, + }), + { + retries: 5, + factor: 3, + onFailedAttempt({ attemptNumber, retriesLeft }) { + console.error( + `Failed to fetch ${url} (attempt ${attemptNumber} - ${retriesLeft} retries left)` + ); + }, + } ); } catch (e: unknown) { const error = e as Error; diff --git a/src/util/getContributors.ts b/src/util/getContributors.ts deleted file mode 100644 index fb50d215c74b3..0000000000000 --- a/src/util/getContributors.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { cachedFetch } from '~/util/cachedFetch'; - -export interface Contributor { - login: string; - id: number; - contributions: number; - avatar_url?: string; -} - -interface Commit { - author: { - login: string; - id: number; - }; - commit: { - message: string; - }; -} - -const printError = (e: Error) => - console.warn(`[error] /src/util/getContributors.ts\n ${e?.message ?? e}`); - -async function recursiveFetch(endpoint: string, page = 1) { - try { - const queryParam = endpoint.includes('?') ? '&' : '?'; - const pageSize = 100; - const url = `https://api.github.com/${endpoint}${queryParam}per_page=${pageSize}&page=${page}`; - - const token = import.meta.env.PUBLIC_GITHUB_TOKEN; - - const res = await cachedFetch( - url, - { - method: 'GET', - headers: { - Authorization: token && `Basic ${Buffer.from(token, 'binary').toString('base64')}`, - 'User-Agent': 'astro-docs/1.0', - }, - }, - { duration: '15m' } - ); - - const data = await res.json(); - - if (!res.ok) { - throw new Error( - `Request to fetch endpoint failed. Reason: ${res.statusText} - Message: ${data?.message}` - ); - } - - // Fetch more data recursively if there are more than GitHub’s per-page response limit. - if (data.length === pageSize) { - const rest = await recursiveFetch(endpoint, page + 1); - data.push(...rest); - } - - return data; - } catch (e) { - printError(e as Error); - return []; - } -} - -export async function getAllContributors(repo: string) { - const endpoint = `repos/${repo}/contributors`; - const contributors: Contributor[] = await recursiveFetch(endpoint); - - return contributors; -} - -export async function getTranslationContributors(paths: string[], repo: string) { - const ignoredCommitKeywords = /(en-only|typo|broken link|i18nReady|i18nIgnore)/i; - const contributors: Contributor[] = []; - - for (const path of paths) { - const endpoint = `repos/${repo}/commits?path=${path}`; - const commits: Commit[] = await recursiveFetch(endpoint); - - for (const { author, commit } of commits) { - if (ignoredCommitKeywords.test(commit.message) || !author) continue; - const contributor = contributors.find((contributor) => contributor.id === author.id); - - if (!contributor) { - contributors.push({ - id: author.id, - login: author.login, - contributions: 1, - }); - continue; - } - contributor.contributions += 1; - } - } - - return contributors.sort((a, b) => b.contributions - a.contributions); -}