import {Octokit} from "@octokit/rest"; import fetch from "node-fetch"; const labelName = "Waiting on Dependency PR"; async function run() { const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN, request: { fetch: fetch, }, }); const context = JSON.parse(process.env.GITHUB_CONTEXT); const pull_request = context.event.pull_request; const owner = context.repository_owner; const name = context.repository.split("/")[1]; const prNumber = pull_request.number; const prBody = pull_request.body || ""; const dependencyRegex = /## Dependencies/; const match = prBody.match(dependencyRegex); if (match) { const prLinks = prBody.match(/- https:\/\/github\.com\/[\w-]+\/[\w-]+\/pull\/\d+/g); if (prLinks && prLinks.length > 0) { let hasOpenDependencies = false; for (const link of prLinks) { const [, depOwner, depRepo, depNumber] = link.match(/github\.com\/([\w-]+)\/([\w-]+)\/pull\/(\d+)/); const {data: dependencyPr} = await octokit.pulls.get({ owner: depOwner, repo: depRepo, pull_number: depNumber, }); if (dependencyPr.state === "open") { hasOpenDependencies = true; break; } } const labels = pull_request.labels.map(label => label.name); if (hasOpenDependencies && !labels.includes(labelName)) { await octokit.issues.addLabels({ owner, repo: name, issue_number: prNumber, labels: [labelName], }); } else if (!hasOpenDependencies && labels.includes(labelName)) { await octokit.issues.removeLabel({ owner, repo: name, issue_number: prNumber, name: labelName, }); } } } } run().catch(error => { console.error(error); process.exit(1); });