// Icons: GitHub's Octicons, at 16, as the package draws them. import code from '@primer/octicons/build/svg/code-16.svg?raw'; import commit from '@primer/octicons/build/svg/git-commit-16.svg?raw'; import pull from '@primer/octicons/build/svg/git-pull-request-16.svg?raw'; import stack from '@primer/octicons/build/svg/stack-16.svg?raw'; import pullClosed from '@primer/octicons/build/svg/git-pull-request-closed-16.svg?raw'; import pullDraft from '@primer/octicons/build/svg/git-pull-request-draft-16.svg?raw'; import issue from '@primer/octicons/build/svg/issue-opened-16.svg?raw'; import done from '@primer/octicons/build/svg/issue-closed-16.svg?raw'; import merge from '@primer/octicons/build/svg/git-merge-16.svg?raw'; import dir from '@primer/octicons/build/svg/file-directory-fill-16.svg?raw'; import file from '@primer/octicons/build/svg/file-16.svg?raw'; import branch from '@primer/octicons/build/svg/git-branch-16.svg?raw'; import tag from '@primer/octicons/build/svg/tag-16.svg?raw'; import chat from '@primer/octicons/build/svg/comment-16.svg?raw'; import fork from '@primer/octicons/build/svg/repo-forked-16.svg?raw'; import repo from '@primer/octicons/build/svg/repo-16.svg?raw'; import repoLocked from '@primer/octicons/build/svg/repo-locked-16.svg?raw'; import passed from '@primer/octicons/build/svg/check-circle-fill-16.svg?raw'; import failed from '@primer/octicons/build/svg/x-circle-fill-16.svg?raw'; import running from '@primer/octicons/build/svg/dot-fill-16.svg?raw'; import skipped from '@primer/octicons/build/svg/skip-16.svg?raw'; import check from '@primer/octicons/build/svg/check-16.svg?raw'; import x from '@primer/octicons/build/svg/x-16.svg?raw'; import chevron from '@primer/octicons/build/svg/chevron-right-16.svg?raw'; import sun from '@primer/octicons/build/svg/sun-16.svg?raw'; import moon from '@primer/octicons/build/svg/moon-16.svg?raw'; import caret from '@primer/octicons/build/svg/triangle-down-16.svg?raw'; import queue from '@primer/octicons/build/svg/git-merge-queue-16.svg?raw'; import bot from '@primer/octicons/build/svg/dependabot-16.svg?raw'; import mention from '@primer/octicons/build/svg/mention-16.svg?raw'; import checks from '@primer/octicons/build/svg/checklist-16.svg?raw'; import search from '@primer/octicons/build/svg/search-16.svg?raw'; import clock from '@primer/octicons/build/svg/clock-16.svg?raw'; import star from '@primer/octicons/build/svg/star-16.svg?raw'; import starred from '@primer/octicons/build/svg/star-fill-16.svg?raw'; import people from '@primer/octicons/build/svg/people-16.svg?raw'; import organization from '@primer/octicons/build/svg/organization-16.svg?raw'; import eye from '@primer/octicons/build/svg/eye-16.svg?raw'; import eyeClosed from '@primer/octicons/build/svg/eye-closed-16.svg?raw'; import bell from '@primer/octicons/build/svg/bell-16.svg?raw'; import sync from '@primer/octicons/build/svg/sync-16.svg?raw'; import play from '@primer/octicons/build/svg/play-16.svg?raw'; import gear from '@primer/octicons/build/svg/gear-16.svg?raw'; import person from '@primer/octicons/build/svg/person-16.svg?raw'; import mail from '@primer/octicons/build/svg/mail-16.svg?raw'; import paintbrush from '@primer/octicons/build/svg/paintbrush-16.svg?raw'; import blocked from '@primer/octicons/build/svg/blocked-16.svg?raw'; import kebab from '@primer/octicons/build/svg/kebab-horizontal-16.svg?raw'; import sidebarCollapse from '@primer/octicons/build/svg/sidebar-collapse-16.svg?raw'; import sidebarExpand from '@primer/octicons/build/svg/sidebar-expand-16.svg?raw'; import lock from '@primer/octicons/build/svg/lock-16.svg?raw'; import archive from '@primer/octicons/build/svg/archive-16.svg?raw'; import smiley from '@primer/octicons/build/svg/smiley-16.svg?raw'; import plus from '@primer/octicons/build/svg/plus-16.svg?raw'; import personAdd from '@primer/octicons/build/svg/person-add-16.svg?raw'; import signOut from '@primer/octicons/build/svg/sign-out-16.svg?raw'; import shield from '@primer/octicons/build/svg/shield-16.svg?raw'; import book from '@primer/octicons/build/svg/book-16.svg?raw'; import pulse from '@primer/octicons/build/svg/pulse-16.svg?raw'; import link from '@primer/octicons/build/svg/link-16.svg?raw'; import globe from '@primer/octicons/build/svg/globe-16.svg?raw'; import key from '@primer/octicons/build/svg/key-16.svg?raw'; import pkg from '@primer/octicons/build/svg/package-16.svg?raw'; import workflow from '@primer/octicons/build/svg/workflow-16.svg?raw'; import container from '@primer/octicons/build/svg/container-16.svg?raw'; import versions from '@primer/octicons/build/svg/versions-16.svg?raw'; import undo from '@primer/octicons/build/svg/undo-16.svg?raw'; import history from '@primer/octicons/build/svg/history-16.svg?raw'; import download from '@primer/octicons/build/svg/download-16.svg?raw'; import fold from '@primer/octicons/build/svg/fold-16.svg?raw'; import foldDown from '@primer/octicons/build/svg/fold-down-16.svg?raw'; import foldUp from '@primer/octicons/build/svg/fold-up-16.svg?raw'; import unfold from '@primer/octicons/build/svg/unfold-16.svg?raw'; /** What is drawn inside an icon's ``. */ const inside = (svg: string) => svg.replace(/^]*>|<\/svg>\s*$/g, ''); export const icons = Object.fromEntries( Object.entries({ code, commit, pull, pullClosed, pullDraft, issue, done, merge, dir, file, branch, tag, chat, fork, repo, repoLocked, passed, failed, running, skipped, queue, checks, check, x, chevron, caret, search, clock, star, starred, people, organization, eye, eyeClosed, bell, sync, play, gear, person, mail, paintbrush, blocked, kebab, lock, smiley, sidebarCollapse, sidebarExpand, plus, personAdd, signOut, shield, book, pulse, link, globe, key, package: pkg, workflow, container, versions, undo, history, archive, mention, sun, moon, download, stack, bot, fold, foldDown, foldUp, unfold }).map(([k, v]) => [k, inside(v)]) ) as Record< | 'code' | 'commit' | 'pull' | 'pullClosed' | 'pullDraft' | 'issue' | 'done' | 'merge' | 'dir' | 'file' | 'branch' | 'tag' | 'chat' | 'fork' | 'repo' | 'repoLocked' | 'passed' | 'failed' | 'running' | 'skipped' | 'queue' | 'bot' | 'checks' | 'check' | 'x' | 'chevron' | 'caret' | 'search' | 'clock' | 'star' | 'starred' | 'people' | 'organization' | 'eye' | 'eyeClosed' | 'bell' | 'sync' | 'play' | 'gear' | 'person' | 'mail' | 'paintbrush' | 'blocked' | 'kebab' | 'lock' | 'smiley' | 'sidebarCollapse' | 'sidebarExpand' | 'plus' | 'personAdd' | 'signOut' | 'shield' | 'book' | 'pulse' | 'link' | 'globe' | 'key' | 'package' | 'workflow' | 'container' | 'versions' | 'undo' | 'history' | 'archive' | 'mention' | 'sun' | 'moon' | 'download' | 'stack' | 'fold' | 'foldDown' | 'foldUp' | 'unfold', string >; export type IconName = keyof typeof icons; /** The icon for a pull or an issue in `state`, a `draft` or not. */ export function stateIcon(kind: string, state: string, draft = false): IconName { if (kind === 'pull') return state === 'merged' ? 'merge' : state === 'closed' ? 'pullClosed' : draft ? 'pullDraft' : 'pull'; return state === 'open' ? 'issue' : 'done'; } /** The icon for a check in `status`, or for a set of them as `overall` puts it. */ export function checkIcon(status: string): IconName { if (status === 'success') return 'passed'; if (status === 'running') return 'running'; if (status === 'queued') return 'clock'; if (status === 'skipped' || status === 'cancelled') return 'skipped'; return 'failed'; } /** The plain mark for a check in `status` beside a commit, as GitHub draws them there: a check or an x, not the filled circles. */ export function commitCheckIcon(status: string): IconName { if (status === 'success') return 'check'; if (status === 'failure' || status === 'error') return 'x'; return checkIcon(status); }