diff --git a/packages/console/app/src/routes/changelog.json.ts b/packages/console/app/src/routes/changelog.json.ts index a23f205032..dcc8cdff9e 100644 --- a/packages/console/app/src/routes/changelog.json.ts +++ b/packages/console/app/src/routes/changelog.json.ts @@ -90,25 +90,32 @@ export async function GET() { Accept: "application/vnd.github.v3+json", "User-Agent": "OpenCode-Console", }, - }) + cf: { + cacheTtl: 60 * 5, + cacheEverything: true, + }, + } as RequestInit) if (!response.ok) { - return { releases: [] } + return Response.json({ releases: [] }, { status: 502 }) } const releases = (await response.json()) as Release[] - return { - releases: releases.map((release) => { - const parsed = parseMarkdown(release.body || "") - return { - tag: release.tag_name, - name: release.name, - date: release.published_at, - url: release.html_url, - highlights: parsed.highlights, - sections: parsed.sections, - } - }), - } + return Response.json( + { + releases: releases.map((release) => { + const parsed = parseMarkdown(release.body || "") + return { + tag: release.tag_name, + name: release.name, + date: release.published_at, + url: release.html_url, + highlights: parsed.highlights, + sections: parsed.sections, + } + }), + }, + { headers: { "Cache-Control": "public, s-maxage=300, stale-while-revalidate=600" } }, + ) } diff --git a/packages/console/app/src/routes/changelog/index.tsx b/packages/console/app/src/routes/changelog/index.tsx index 87e021ec88..640b4db93e 100644 --- a/packages/console/app/src/routes/changelog/index.tsx +++ b/packages/console/app/src/routes/changelog/index.tsx @@ -7,39 +7,6 @@ import { Legal } from "~/component/legal" import { config } from "~/config" import { For, Show, createSignal } from "solid-js" -type Release = { - tag_name: string - name: string - body: string - published_at: string - html_url: string -} - -const getReleases = query(async () => { - "use server" - const response = await fetch("https://api.github.com/repos/anomalyco/opencode/releases?per_page=20", { - headers: { - Accept: "application/vnd.github.v3+json", - "User-Agent": "OpenCode-Console", - }, - cf: { - cacheTtl: 60 * 5, - cacheEverything: true, - }, - } as any) - if (!response.ok) return [] - return response.json() as Promise -}, "releases.get") - -function formatDate(dateString: string) { - const date = new Date(dateString) - return date.toLocaleDateString("en-US", { - year: "numeric", - month: "short", - day: "numeric", - }) -} - type HighlightMedia = { type: "video"; src: string } | { type: "image"; src: string; width: string; height: string } type HighlightItem = { @@ -54,68 +21,30 @@ type HighlightGroup = { items: HighlightItem[] } -function parseHighlights(body: string): HighlightGroup[] { - const groups = new Map() - const regex = /([\s\S]*?)<\/highlight>/g - let match - - while ((match = regex.exec(body)) !== null) { - const source = match[1] - const content = match[2] - - const titleMatch = content.match(/

([^<]+)<\/h2>/) - const pMatch = content.match(/([^<]+)<\/p>/) - const imgMatch = content.match(/ ({ source, items })) +type ParsedRelease = { + tag: string + name: string + date: string + url: string + highlights: HighlightGroup[] + sections: { title: string; items: string[] }[] } -function parseMarkdown(body: string) { - const lines = body.split("\n") - const sections: { title: string; items: string[] }[] = [] - let current: { title: string; items: string[] } | null = null - let skip = false +const getReleases = query(async () => { + "use server" + const response = await fetch(`${config.baseUrl}/changelog.json`) + if (!response.ok) return [] + const data = (await response.json()) as { releases: ParsedRelease[] } + return data.releases +}, "releases.get") - for (const line of lines) { - if (line.startsWith("## ")) { - if (current) sections.push(current) - const title = line.slice(3).trim() - current = { title, items: [] } - skip = false - } else if (line.startsWith("**Thank you")) { - skip = true - } else if (line.startsWith("- ") && !skip) { - current?.items.push(line.slice(2).trim()) - } - } - if (current) sections.push(current) - - const highlights = parseHighlights(body) - - return { sections, highlights } +function formatDate(dateString: string) { + const date = new Date(dateString) + return date.toLocaleDateString("en-US", { + year: "numeric", + month: "short", + day: "numeric", + }) } function ReleaseItem(props: { item: string }) { @@ -216,43 +145,40 @@ export default function Changelog() {
- {(release) => { - const parsed = () => parseMarkdown(release.body || "") - return ( -
-
- - -
-
- 0}> -
- {(group) => } -
-
- 0 && parsed().sections.length > 0}> - - - - - {(section) => ( -
-

{section.title}

-
    - {(item) => } -
-
- )} -
-
+ {(release) => ( + - ) - }} + + +
+ 0}> +
+ {(group) => } +
+
+ 0 && release.sections.length > 0}> + + + + + {(section) => ( +
+

{section.title}

+
    + {(item) => } +
+
+ )} +
+
+
+
+ )}