86 lines
2.1 KiB
TypeScript
86 lines
2.1 KiB
TypeScript
import { NextResponse } from "next/server"
|
|
import { getStats } from "@/lib/stats"
|
|
|
|
/**
|
|
* Shields.io endpoint badge for combined NPM downloads.
|
|
* Usage: https://img.shields.io/endpoint?url=https://ohmyopenagent.com/api/npm-downloads
|
|
*
|
|
* Combines downloads from both oh-my-opencode and oh-my-openagent packages.
|
|
*/
|
|
|
|
function formatDownloads(num: number): string {
|
|
if (num >= 1_000_000) {
|
|
const formatted = (num / 1_000_000).toFixed(1)
|
|
return `${formatted.replace(/\.0$/, "")}M`
|
|
}
|
|
if (num >= 1_000) {
|
|
const formatted = (num / 1_000).toFixed(1)
|
|
return `${formatted.replace(/\.0$/, "")}k`
|
|
}
|
|
return String(num)
|
|
}
|
|
|
|
export async function GET(request: Request) {
|
|
const { searchParams } = new URL(request.url)
|
|
const period = searchParams.get("period") ?? "total"
|
|
|
|
try {
|
|
const stats = await getStats()
|
|
|
|
let value: number
|
|
let label: string
|
|
|
|
switch (period) {
|
|
case "monthly":
|
|
value = stats.monthlyDownloads
|
|
label = "npm downloads/month"
|
|
break
|
|
case "weekly":
|
|
value = stats.weeklyDownloads
|
|
label = "npm downloads/week"
|
|
break
|
|
case "total":
|
|
default:
|
|
value = stats.totalDownloads
|
|
label = "npm downloads"
|
|
break
|
|
}
|
|
|
|
// Shields.io endpoint badge schema
|
|
// https://shields.io/badges/endpoint-badge
|
|
const badge = {
|
|
schemaVersion: 1,
|
|
label,
|
|
message: formatDownloads(value),
|
|
color: "ff6b35",
|
|
labelColor: "000000",
|
|
style: "flat-square",
|
|
}
|
|
|
|
return NextResponse.json(badge, {
|
|
headers: {
|
|
"Cache-Control": "public, s-maxage=3600, stale-while-revalidate=86400",
|
|
"Access-Control-Allow-Origin": "*",
|
|
},
|
|
})
|
|
} catch {
|
|
// Fallback badge
|
|
return NextResponse.json(
|
|
{
|
|
schemaVersion: 1,
|
|
label: "npm downloads",
|
|
message: "1M+",
|
|
color: "ff6b35",
|
|
labelColor: "000000",
|
|
style: "flat-square",
|
|
},
|
|
{
|
|
headers: {
|
|
"Cache-Control": "public, s-maxage=300, stale-while-revalidate=3600",
|
|
"Access-Control-Allow-Origin": "*",
|
|
},
|
|
},
|
|
)
|
|
}
|
|
}
|