import React from 'dom-chef'; import cache from 'webext-storage-cache'; import select from 'select-dom'; import {BookIcon} from '@primer/octicons-react'; import elementReady from 'element-ready'; import * as pageDetect from 'github-url-detection'; import features from '.'; import * as api from '../github-helpers/api'; import {wrapAll} from '../helpers/dom-utils'; import {buildRepoURL, getRepo} from '../github-helpers'; type FileType = { name: string; type: string; }; const getCacheKey = (): string => `changelog:${getRepo()!.nameWithOwner}`; const changelogFiles = /^(changelog|news|changes|history|release|whatsnew)(\.(mdx?|mkdn?|mdwn|mdown|markdown|litcoffee|txt|rst))?$/i; function findChangelogName(files: string[]): string | false { return files.find(name => changelogFiles.test(name)) ?? false; } function parseFromDom(): false { const files = select.all('[aria-labelledby="files"] .js-navigation-open[href*="/blob/"').map(file => file.title); void cache.set(getCacheKey(), findChangelogName(files)); return false; } const getChangelogName = cache.function(async (): Promise => { const {repository} = await api.v4(` repository() { object(expression: "HEAD:") { ...on Tree { entries { name type } } } } `); const files: string[] = []; for (const entry of repository.object.entries as FileType[]) { if (entry.type === 'blob') { files.push(entry.name); } } return findChangelogName(files); }, { cacheKey: getCacheKey, }); async function init(): Promise { const changelog = await getChangelogName(); if (!changelog) { return false; } const changelogButton = ( Changelog ); const releasesOrTagsNavbarSelector = [ 'nav[aria-label^="Releases and Tags"]', // Release list '.subnav-links', // Tag list ].join(','); const navbar = (await elementReady(releasesOrTagsNavbarSelector, {waitForChildren: false}))!; navbar.classList.remove('flex-1'); wrapAll([navbar, changelogButton],
); } void features.add(import.meta.url, { include: [ pageDetect.isReleasesOrTags, ], exclude: [ pageDetect.isSingleTag, ], awaitDomReady: false, deduplicate: 'has-rgh-inner', init, }, { include: [ pageDetect.isRepoHome, ], init: parseFromDom, });