{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "github-info",
  "title": "GitHub info",
  "description": "GithubInfo: a link to a GitHub repository with its star and fork counts, fetched on the server.",
  "dependencies": [
    "cn",
    "lucide-react"
  ],
  "files": [
    {
      "path": "registry/base/docs/components/github-info.tsx",
      "content": "// Adapted from Fumadocs UI (https://github.com/fuma-nama/fumadocs)\n// Copyright (c) 2023 Fuma, MIT License\nimport { cn } from \"cn\";\nimport { GitFork, Star } from \"lucide-react\";\nimport { type ComponentProps, use } from \"react\";\n\nexport interface FetchRepositoryInfoOptions {\n  owner: string;\n  repo: string;\n\n  baseUrl?: string;\n  token?: string;\n  fetchOptions?: RequestInit;\n}\n\nexport interface RepositoryInfo {\n  stars: number;\n  forks: number;\n}\n\nexport interface GithubInfoProps\n  extends ComponentProps<\"a\">, FetchRepositoryInfoOptions {\n  locale?: Intl.LocalesArgument;\n}\n\nexport async function fetchRepositoryInfo({\n  owner,\n  repo,\n  token,\n  baseUrl = \"https://api.github.com\",\n  fetchOptions = {\n    // default revalidate options for Next.js (optional)\n    next: {\n      revalidate: 60,\n    },\n  } as RequestInit,\n}: FetchRepositoryInfoOptions): Promise<RepositoryInfo> {\n  const endpoint = `${baseUrl}/repos/${owner}/${repo}`;\n  const headers = new Headers(fetchOptions.headers);\n\n  headers.set(\"Content-Type\", \"application/json\");\n  if (token) headers.set(\"Authorization\", `Bearer ${token}`);\n\n  const response = await fetch(endpoint, {\n    ...fetchOptions,\n    headers,\n  } as RequestInit);\n\n  if (!response.ok) {\n    const message = await response.text();\n\n    throw new Error(`Failed to fetch repository data: ${message}`);\n  }\n\n  const data = await response.json();\n  return {\n    stars: data.stargazers_count,\n    forks: data.forks_count,\n  };\n}\n\n/**\n * Uses compact notation (e.g., 1.5K, 2.3M).\n */\nconst formatterOptions: Intl.NumberFormatOptions = {\n  notation: \"compact\",\n  maximumFractionDigits: 1,\n};\n\nconst defaultFormatter = new Intl.NumberFormat(undefined, formatterOptions);\n\nconst promises: Record<string, Promise<RepositoryInfo>> = {};\n\nexport function GithubInfo({\n  repo,\n  owner,\n  token,\n  baseUrl,\n  fetchOptions,\n  locale,\n  ...props\n}: GithubInfoProps) {\n  const options: FetchRepositoryInfoOptions = {\n    repo,\n    owner,\n    token,\n    baseUrl,\n    fetchOptions,\n  };\n  const { stars, forks } = use(\n    (promises[JSON.stringify(options)] ??= fetchRepositoryInfo(options)),\n  );\n  const formatter = locale\n    ? new Intl.NumberFormat(locale, formatterOptions)\n    : defaultFormatter;\n\n  return (\n    <a\n      href={`https://github.com/${owner}/${repo}`}\n      rel=\"noreferrer noopener\"\n      target=\"_blank\"\n      {...props}\n      className={cn(\n        \"not-docs-typeset flex flex-col gap-1.5 rounded-lg p-2 text-sm text-foreground/80 transition-colors hover:bg-accent hover:text-accent-foreground\",\n        props.className,\n      )}\n    >\n      <p className=\"flex items-center gap-2 truncate\">\n        <svg fill=\"currentColor\" viewBox=\"0 0 24 24\" className=\"size-3.5\">\n          <title>GitHub</title>\n          <path d=\"M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" />\n        </svg>\n        {owner}/{repo}\n      </p>\n      <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n        <Star className=\"size-3\" />\n        <span>{formatter.format(stars)}</span>\n        <GitFork className=\"ms-2 size-3\" />\n        <span>{formatter.format(forks)}</span>\n      </div>\n    </a>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/docs/components/github-info.tsx"
    }
  ],
  "type": "registry:component"
}