@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
JavaScript
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;
};