diff --git a/.github/workflows/preview-theme.yml b/.github/workflows/preview-theme.yml new file mode 100644 index 0000000..c0203c3 --- /dev/null +++ b/.github/workflows/preview-theme.yml @@ -0,0 +1,29 @@ +name: Theme preview + +on: + pull_request: + types: [opened, synchronize, reopened] + branches: + - master + - theme-preview-script + paths: + - "themes/index.js" + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: setup node + uses: actions/setup-node@v1 + with: + node-version: "12.x" + + - name: npm install, preview theme + run: | + npm install + npm run preview-theme + env: + CI: true + PERSONAL_TOKEN: ${{ secrets.PERSONAL_TOKEN }} diff --git a/package.json b/package.json index d167c1b..af82b59 100644 --- a/package.json +++ b/package.json @@ -6,18 +6,22 @@ "scripts": { "test": "jest --coverage", "test:watch": "jest --watch", - "theme-readme-gen": "node scripts/generate-theme-doc" + "theme-readme-gen": "node scripts/generate-theme-doc", + "preview-theme": "node scripts/preview-theme" }, "author": "Anurag Hazra", "license": "MIT", "devDependencies": { + "@actions/core": "^1.2.4", + "@actions/github": "^4.0.0", "@testing-library/dom": "^7.20.0", "@testing-library/jest-dom": "^5.11.0", "axios": "^0.19.2", "axios-mock-adapter": "^1.18.1", "css-to-object": "^1.1.0", "husky": "^4.2.5", - "jest": "^26.1.0" + "jest": "^26.1.0", + "parse-diff": "^0.7.0" }, "dependencies": { "dotenv": "^8.2.0", diff --git a/scripts/preview-theme.js b/scripts/preview-theme.js new file mode 100644 index 0000000..6a0eaa6 --- /dev/null +++ b/scripts/preview-theme.js @@ -0,0 +1,76 @@ +const core = require("@actions/core"); +const github = require("@actions/github"); +const parse = require("parse-diff"); +require("dotenv").config(); + +const parsePullRequestId = (githubRef) => { + const result = /refs\/pull\/(\d+)\/merge/g.exec(githubRef); + if (!result) { + console.log("Reference not found."); + return 297; + } + const [, pullRequestId] = result; + return pullRequestId; +}; + +async function run() { + try { + const octokit = github.getOctokit(process.env.PERSONAL_TOKEN); + const pullRequestId = parsePullRequestId(process.env.GITHUB_REF); + + let res = await octokit.pulls.get({ + owner: "anuraghazra", + repo: "github-readme-stats", + pull_number: pullRequestId, + mediaType: { + format: "diff", + }, + }); + + let diff = parse(res.data); + let colorStrings = diff + .find((file) => file.to === "themes/index.js") + .chunks[0].changes.filter((c) => c.type === "add") + .map((c) => c.content.replace("+", "")) + .join(""); + + let matches = colorStrings.match(/(title_color:.*bg_color.*\")/); + let colors = matches && matches[0].split(","); + + if (!colors) { + await octokit.issues.createComment({ + owner: "anuraghazra", + repo: "github-readme-stats", + body: ` + \rTheme preview (bot) + Cannot create theme preview + `, + issue_number: pullRequestId, + }); + return; + } + colors = colors.map((color) => + color.replace(/.*\:\s/, "").replace(/\"/g, "") + ); + + let titleColor = colors[0]; + let iconColor = colors[1]; + let textColor = colors[2]; + let bgColor = colors[3]; + const url = `https://github-readme-stats.vercel.app/api?username=anuraghazra&title_color=${titleColor}&icon_color=${iconColor}&text_color=${textColor}&bg_color=${bgColor}&show_icons=true`; + + await octokit.issues.createComment({ + owner: "anuraghazra", + repo: "github-readme-stats", + body: ` + \rTheme preview (bot) + \r![](${url}) + `, + issue_number: pullRequestId, + }); + } catch (error) { + core.setFailed(error.message); + } +} + +run();