import { Rank } from '../utils' import { filterNotEmpty } from '../utils/filter' export type Stats = { avatar: string commits: string contributions: string issues: string name: string prs: string rank: Rank['level'] stars: string } export type TemplateOptions = { color: string background: string hiddenStatsKeys: string[] includeAllCommits: boolean backgroundImage?: string backgroundSize?: string backgroundRepeat?: string } export const defaultTemplateOptions = { color: 'white', background: '#434343' } export const CARD_SIZE = { BIG: { CARD_WIDTH: 1226, CARD_HEIGHT: 430 }, SMALL: { CARD_WIDTH: 1226, CARD_HEIGHT: 350 } } export const AVATAR_SIZE = { AVATAR_WIDTH: 280, AVATAR_HEIGHT: 280 } const mainStatsItems = ['stars', 'commits', 'issues', 'prs', 'contributions'] const getVisibleMainStatsCount = (hiddenStatsKeys: string[]) => mainStatsItems.filter((stat) => !hiddenStatsKeys.includes(stat)).length export function makeGithubStats(stats: Stats, options: TemplateOptions) { const { avatar, commits, contributions, issues, name, prs, rank, stars } = stats const { hiddenStatsKeys, includeAllCommits, color, background, backgroundRepeat, backgroundSize, backgroundImage } = options const date = new Date() const year = date.getFullYear() const isVisible = (key: string) => !hiddenStatsKeys.includes(key) const visibleMainStatsCount = getVisibleMainStatsCount(hiddenStatsKeys) const isShowSeparator = isVisible('rank') && visibleMainStatsCount > 0 return (
{/* Header */}
{`${name}'s GitHub Stats`}
{/* Stats */}
{isVisible('stars') && (
Total Stars Earned:
{stars}
)} {isVisible('commits') && (
{`Total Commits${includeAllCommits ? '' : `(${year})`}:`}
{commits}
)} {isVisible('prs') && (
Total PRs:
{prs}
)} {isVisible('issues') && (
Total Issues:
{issues}
)} {isVisible('contributions') && (
Contributed to (last year):
{contributions}
)} {isShowSeparator && (
{avatar ? (
--------------------------------
) : (
---------------------------------------------
)}
)} {isVisible('rank') && (
Rank:
{rank}
)}
{isVisible('avatar') && Avatar}
) }