import './mark-merge-commits-in-list.css'; import React from 'dom-chef'; import select from 'select-dom'; import {GitMergeIcon} from '@primer/octicons-react'; import * as pageDetect from 'github-url-detection'; import {objectEntries} from 'ts-extras'; import features from '../feature-manager'; import * as api from '../github-helpers/api'; const filterMergeCommits = async (commits: string[]): Promise => { const {repository} = await api.v4(` repository() { ${commits.map((commit: string) => ` ${api.escapeKey(commit)}: object(expression: "${commit}") { ... on Commit { parents { totalCount } } } `).join('\n')} } `); const mergeCommits = []; for (const [key, commit] of objectEntries(repository)) { if (commit.parents.totalCount >= 2) { mergeCommits.push(key.slice(1)); } } return mergeCommits; }; export function getCommitHash(commit: HTMLElement): string { return select('a.markdown-title', commit)!.pathname.split('/').pop()!; } async function init(): Promise { const pageCommits = select.all([ '.js-commits-list-item', // `isCommitList` '[data-test-selector="pr-timeline-commits-list"] .TimelineItem', // `isPRConversation` ].join(',')); const mergeCommits = await filterMergeCommits(pageCommits.map(commit => getCommitHash(commit))); for (const commit of pageCommits) { if (mergeCommits.includes(getCommitHash(commit))) { commit.classList.add('rgh-merge-commit'); select('a.markdown-title', commit)!.before(); } } } void features.add(import.meta.url, { include: [ pageDetect.isCommitList, pageDetect.isPRConversation, pageDetect.isCompare, ], deduplicate: 'has-rgh-inner', init, });