UNPKG

@yuki-no/plugin-batch-pr

Version:

Batch PR plugin for yuki-no - Collects opened Yuki-no translation issues and creates a single pull request

50 lines (49 loc) 2.35 kB
import { GitHub } from '@yuki-no/plugin-sdk/infra/github'; import { getOpenedIssues } from '@yuki-no/plugin-sdk/utils-infra/getOpenedIssues'; import { log } from '@yuki-no/plugin-sdk/utils/log'; export const getTrackedIssues = async (github, prNumber) => { log('I', `getTrackedIssues :: Processing PR #${prNumber}`); const prDetails = await getPrDetails(github, prNumber); const { body: prBody } = prDetails; if (!prBody?.length) { log('E', `getTrackedIssues :: PR #${prNumber} body is empty or missing`); throw new Error(`PR #${prNumber} body is empty or missing. Cannot extract tracked issue numbers.`); } log('I', `getTrackedIssues :: Filtering translation issues`); const translationIssues = await getOpenedIssues(github); const translationIssueNumbers = translationIssues.map(({ number }) => number); log('I', `getTrackedIssues :: Found ${translationIssues.length} translation issues`); const trackedIssueNumbers = extractTrackedISsueNumbers(prBody, 'Resolved'); log('I', `getTrackedIssues :: Found ${trackedIssueNumbers.length} tracked issue numbers in PR body`); const openedTrackedIssueNumbers = trackedIssueNumbers.filter(number => translationIssueNumbers.includes(number)); const results = translationIssues.reduce(({ trackedIssues, shouldTrackIssues }, translationIssue) => { if (openedTrackedIssueNumbers.includes(translationIssue.number)) { trackedIssues.push(translationIssue); } else { shouldTrackIssues.push(translationIssue); } return { trackedIssues, shouldTrackIssues }; }, { trackedIssues: [], shouldTrackIssues: [], }); log('S', `getTrackedIssues :: Found ${results.trackedIssues.length} tracked issues and ${results.shouldTrackIssues.length} issues to track`); return results; }; const getPrDetails = async (github, prNumber) => { const { data } = await github.api.pulls.get({ ...github.ownerAndRepo, pull_number: prNumber, }); return data; }; const extractTrackedISsueNumbers = (prBody, type) => { const resolvedPattern = new RegExp(`${type} #(\\d+)`, 'g'); const numbers = []; let match; while ((match = resolvedPattern.exec(prBody)) !== null) { numbers.push(parseInt(match[1], 10)); } return numbers; };