diff --git a/.github/workflows/sponsors.yml b/.github/workflows/sponsors.yml new file mode 100644 index 0000000..18c4451 --- /dev/null +++ b/.github/workflows/sponsors.yml @@ -0,0 +1,61 @@ +name: Update Readme sponsor list +on: + workflow_dispatch: + repository_dispatch: + types: + - webhook + schedule: + # Run at 0000 daily + - cron: '0 1 * * *' +jobs: + sponsors: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: git config + run: | + git config user.name "${GITHUB_ACTOR}" + git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version: 16 + cache: npm + - run: npm ci + - name: Generate PR + id: sponsors + run: node ./bin/sponsors.js + - name: Notify status + if: ${{ steps.sponsors.outputs.changed }} + run: | + echo "Sponsor block has changed. Creating PR with updates..." + - name: Create pull request + if: ${{ steps.sponsors.outputs.changed }} + uses: peter-evans/create-pull-request@v6 + id: cpr + with: + branch: sponsors + delete-branch: true + commit-message: 'chore(sponsor): update sponsor block' + title: '[Chore] Update sponsor block' + body: | + **New sponsor block update:** + {{ steps.sponsors.outputs.content }} + labels: | + readme + automated pr + automerge + signoff: false + #team-reviewers: | + # owners + # maintainers + #assignees: jasonsaayman + #reviewers: jasonsaayman + draft: false + - name: Show PR link + if: ${{ steps.sponsors.outputs.changed }} + run: | + echo "Sponsor block has changed. Creating PR..." + echo "Axios Release v${{ steps.package-version.outputs.current-version}}' pull request - ${{ steps.cpr.outputs.pull-request-url }}" diff --git a/README.md b/README.md index 71381cb..b6e8054 100644 --- a/README.md +++ b/README.md @@ -1,62 +1,4 @@ -

- Platinum sponsors -
-

- -
- - - - - - - - -

Alloy is the integration development platform that makes it simple and
fast for SaaS companies to launch critical user-facing integrations.

-

- Sign up free • - Documentation -

-

-
- -

- Gold sponsors -

-

- - - - -
- - - - - - - -

API-first authentication, authorization, and fraud prevention

-

- Website • - DocumentationNode.js Backend SDK -

-
- - - - - - - -

Drag-and-drop authentication, authorization, and identity management

-

- Website • - DocumentationCommunity -

-
- - +


diff --git a/bin/sponsors.js b/bin/sponsors.js new file mode 100644 index 0000000..571b5dc --- /dev/null +++ b/bin/sponsors.js @@ -0,0 +1,63 @@ +import fs from "fs/promises"; +import _axios from '../index.js'; +import {exec} from "./repo.js"; +import {colorize} from "./helpers/colorize.js"; + +const axios = _axios.create({ + headers: { + "User-Agent": 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36' + } +}); + +const getWithRetry = (url, retries = 3) => { + let counter = 0; + const doRequest = async () => { + try { + return await axios.get(url) + } catch (err) { + if (counter++ >= retries) { + throw err; + } + await new Promise(resolve => setTimeout(resolve, counter ** counter * 1000)); + return doRequest(); + } + } + + return doRequest(); +}; + +const updateReadmeSponsors = async (url, path, marker = '') => { + let fileContent = (await fs.readFile(path)).toString(); + + const index = fileContent.indexOf(marker); + + if(index >= 0) { + const readmeContent = fileContent.slice(index); + + let {data: sponsorContent} = await getWithRetry(url); + sponsorContent += '\n'; + + const currentSponsorContent = fileContent.slice(0, index); + + if (currentSponsorContent !== sponsorContent) { + console.log(colorize()`Sponsor block in [${path}] is outdated`); + await fs.writeFile(path, sponsorContent + readmeContent); + return sponsorContent; + } else { + console.log(colorize()`Sponsor block in [${path}] is up to date`); + } + } else { + console.warn(colorize()`Can not find marker (${marker}) in ${path} to inject sponsor block`); + } + + return false; +}; + +(async(url) => { + const newContent = await updateReadmeSponsors(url, './Readme.md'); + + await exec(`echo "tag=${newContent ? 'true' : 'false'}" >> $GITHUB_OUTPUT`); + if (newContent !== false) { + await exec(`echo "content=${newContent}" >> $GITHUB_OUTPUT`); + } +})('https://spontaneous-creponne-3ff312.netlify.app/data/sponsors.md');