From a31ef0e66631c67c628e705e00799ff95bfbb438 Mon Sep 17 00:00:00 2001 From: LukaDev <47296785+lukadev-0@users.noreply.github.com> Date: Wed, 14 Aug 2024 22:32:01 +0200 Subject: [PATCH] feat(website): display package readme --- website/bun.lockb | Bin 157348 -> 201335 bytes website/package.json | 11 ++- website/src/app.css | 16 ++++ website/src/lib/registry-api.ts | 27 +++++-- website/src/routes/+page.server.ts | 4 +- .../[[version]]/[[target]]/+layout.server.ts | 43 +++++++---- .../[[version]]/[[target]]/+layout.svelte | 14 +++- .../[[version]]/[[target]]/+page.server.ts | 69 ++++++++++++++++++ .../[[version]]/[[target]]/+page.svelte | 9 ++- website/tailwind.config.ts | 24 ++++++ 10 files changed, 188 insertions(+), 29 deletions(-) create mode 100644 website/src/routes/packages/[scope]/[name]/[[version]]/[[target]]/+page.server.ts diff --git a/website/bun.lockb b/website/bun.lockb index 545cfce60550db82ca1ebb95eb3154d2dfc5ffff..94c679ca75c8fab165f9402bc94fc288259d29dc 100755 GIT binary patch delta 58069 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 delta 29856 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 diff --git a/website/package.json b/website/package.json index 66526ee..e728d78 100644 --- a/website/package.json +++ b/website/package.json @@ -38,9 +38,18 @@ "type": "module", "dependencies": { "@fontsource-variable/nunito-sans": "^5.0.14", + "@shikijs/rehype": "^1.13.0", "date-fns": "^3.6.0", "gunzip-maybe": "^1.4.2", "lucide-svelte": "^0.427.0", - "tar-stream": "^3.1.7" + "rehype-raw": "^7.0.0", + "rehype-sanitize": "^6.0.0", + "rehype-stringify": "^10.0.0", + "remark-gfm": "^4.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.0", + "shiki": "^1.13.0", + "tar-stream": "^3.1.7", + "unified": "^11.0.5" } } diff --git a/website/src/app.css b/website/src/app.css index 8803aeb..660b89e 100644 --- a/website/src/app.css +++ b/website/src/app.css @@ -20,6 +20,22 @@ --color-primary-hover: 255 172 42; --color-primary-bg: 241 157 30; --color-primary-fg: 10 7 4; + + --shiki-foreground: rgb(var(--color-heading)); + --shiki-background: rgb(var(--color-card)); + --shiki-token-constant: color-mix(in srgb, rgb(120 140 230), rgb(var(--color-light)) 50%); + --shiki-token-string: rgb(var(--color-heading)); + --shiki-token-comment: rgb(var(--color-body)); + --shiki-token-keyword: color-mix(in srgb, rgb(var(--color-primary)), rgb(var(--color-light)) 50%); + --shiki-token-parameter: rgb(var(--color-heading)); + --shiki-token-function: rgb(var(--color-primary)); + --shiki-token-string-expression: color-mix( + in srgb, + rgb(120 230 140), + rgb(var(--color-light)) 50% + ); + --shiki-token-punctuation: rgb(var(--color-heading)); + --shiki-token-link: rgb(var(--color-primary)); } @media (prefers-color-scheme: dark) { diff --git a/website/src/lib/registry-api.ts b/website/src/lib/registry-api.ts index e5302c7..d16d842 100644 --- a/website/src/lib/registry-api.ts +++ b/website/src/lib/registry-api.ts @@ -28,15 +28,30 @@ export type TargetInfo = { export type TargetKind = "roblox" | "lune" | "luau" -export async function fetchRegistry( +export class RegistryHttpError extends Error { + name = "RegistryError" + constructor( + message: string, + public response: Response, + ) { + super(message) + } +} + +export async function fetchRegistryJson( path: string, fetcher: typeof fetch, options?: RequestInit, ): Promise { - const response = await fetcher(new URL(path, PUBLIC_REGISTRY_URL), options) - if (!response.ok) { - throw new Error(`Failed to fetch from registry: ${response.status} ${response.statusText}`) - } - + const response = await fetchRegistry(path, fetcher, options) return response.json() } + +export async function fetchRegistry(path: string, fetcher: typeof fetch, options?: RequestInit) { + const response = await fetcher(new URL(path, PUBLIC_REGISTRY_URL), options) + if (!response.ok) { + throw new RegistryHttpError(`Failed to fetch ${response.url}: ${response.statusText}`, response) + } + + return response +} diff --git a/website/src/routes/+page.server.ts b/website/src/routes/+page.server.ts index a419b94..8d1ae78 100644 --- a/website/src/routes/+page.server.ts +++ b/website/src/routes/+page.server.ts @@ -1,8 +1,8 @@ -import { fetchRegistry, type SearchResponse } from "$lib/registry-api" +import { fetchRegistryJson, type SearchResponse } from "$lib/registry-api" import type { PageServerLoad } from "./$types" export const load: PageServerLoad = async ({ fetch }) => { - const { data: packages } = await fetchRegistry("search", fetch) + const { data: packages } = await fetchRegistryJson("search", fetch) return { packages } } diff --git a/website/src/routes/packages/[scope]/[name]/[[version]]/[[target]]/+layout.server.ts b/website/src/routes/packages/[scope]/[name]/[[version]]/[[target]]/+layout.server.ts index 42ca03a..7951665 100644 --- a/website/src/routes/packages/[scope]/[name]/[[version]]/[[target]]/+layout.server.ts +++ b/website/src/routes/packages/[scope]/[name]/[[version]]/[[target]]/+layout.server.ts @@ -1,8 +1,10 @@ import { - fetchRegistry, + fetchRegistryJson, + RegistryHttpError, type PackageVersionsResponse, type PackageVersionResponse, } from "$lib/registry-api" +import { error } from "@sveltejs/kit" import type { LayoutServerLoad } from "./$types" type FetchPackageOptions = @@ -20,23 +22,34 @@ type FetchPackageOptions = const fetchPackage = async (fetcher: typeof fetch, options: FetchPackageOptions) => { const { scope, name } = options - if ("version" in options) { - const { version, target } = options - return fetchRegistry( - `packages/${encodeURIComponent(`${scope}/${name}`)}/${version}/${target}`, + try { + if ("version" in options) { + if (options.target === undefined) { + error(404, "Not Found") + } + + const { version, target } = options + return fetchRegistryJson( + `packages/${encodeURIComponent(`${scope}/${name}`)}/${version}/${target}`, + fetcher, + ) + } + + const versions = await fetchRegistryJson( + `packages/${encodeURIComponent(`${scope}/${name}`)}`, fetcher, ) + + const latestVersion = versions.at(-1) + if (latestVersion === undefined) throw new Error("package has no versions *blows up*") + + return latestVersion + } catch (e) { + if (e instanceof RegistryHttpError && e.response.status === 404) { + error(404, "This package does not exist.") + } + throw e } - - const versions = await fetchRegistry( - `packages/${encodeURIComponent(`${scope}/${name}`)}`, - fetcher, - ) - - const latestVersion = versions.at(-1) - if (latestVersion === undefined) throw new Error("package has no versions *blows up*") - - return latestVersion } export const load: LayoutServerLoad = async ({ params }) => { diff --git a/website/src/routes/packages/[scope]/[name]/[[version]]/[[target]]/+layout.svelte b/website/src/routes/packages/[scope]/[name]/[[version]]/[[target]]/+layout.svelte index f5c703e..0c973e3 100644 --- a/website/src/routes/packages/[scope]/[name]/[[version]]/[[target]]/+layout.svelte +++ b/website/src/routes/packages/[scope]/[name]/[[version]]/[[target]]/+layout.svelte @@ -12,15 +12,21 @@ const installCommand = `pesde add ${data.pkg.name}` -
+

{scope}/{name}

- v{data.pkg.version} · published {formatDistanceToNow(new Date(data.pkg.published_at), { - addSuffix: true, - })} + v{data.pkg.version} · +

{data.pkg.description}

diff --git a/website/src/routes/packages/[scope]/[name]/[[version]]/[[target]]/+page.server.ts b/website/src/routes/packages/[scope]/[name]/[[version]]/[[target]]/+page.server.ts new file mode 100644 index 0000000..8623bf2 --- /dev/null +++ b/website/src/routes/packages/[scope]/[name]/[[version]]/[[target]]/+page.server.ts @@ -0,0 +1,69 @@ +import { fetchRegistry, RegistryHttpError } from "$lib/registry-api" +import { unified } from "unified" +import type { PageServerLoad } from "./$types" +import remarkParse from "remark-parse" +import remarkRehype from "remark-rehype" +import rehypeSanitize from "rehype-sanitize" +import rehypeStringify from "rehype-stringify" +import rehypeRaw from "rehype-raw" +import remarkGfm from "remark-gfm" +import rehypeShiki from "@shikijs/rehype" +import { createCssVariablesTheme } from "shiki" + +const fetchReadme = async ( + fetcher: typeof fetch, + name: string, + version: string, + target: string, +) => { + try { + const res = await fetchRegistry( + `packages/${encodeURIComponent(name)}/${version}/${target}`, + fetcher, + { + headers: { + Accept: "text/plain", + }, + }, + ) + + return res.text() + } catch (e) { + if (e instanceof RegistryHttpError && e.response.status === 404) { + return "*No README provided*" + } + throw e + } +} + +export const load: PageServerLoad = async ({ parent }) => { + const { pkg } = await parent() + const { name, version, targets } = pkg + + const readmeText = await fetchReadme(fetch, name, version, targets[0].kind) + + const file = await unified() + .use(remarkParse) + .use(remarkGfm) + .use(remarkRehype, { allowDangerousHtml: true }) + .use(rehypeRaw) + .use(rehypeSanitize) + .use(rehypeShiki, { + theme: createCssVariablesTheme({ + name: "css-variables", + variablePrefix: "--shiki-", + variableDefaults: {}, + fontStyle: true, + }), + defaultLanguage: "text", + }) + .use(rehypeStringify) + .process(readmeText) + + const readmeHtml = file.value + + return { + readmeHtml, + pkg, + } +} diff --git a/website/src/routes/packages/[scope]/[name]/[[version]]/[[target]]/+page.svelte b/website/src/routes/packages/[scope]/[name]/[[version]]/[[target]]/+page.svelte index e845566..929d498 100644 --- a/website/src/routes/packages/[scope]/[name]/[[version]]/[[target]]/+page.svelte +++ b/website/src/routes/packages/[scope]/[name]/[[version]]/[[target]]/+page.svelte @@ -1 +1,8 @@ -README + + +
+ + {@html data.readmeHtml} +
diff --git a/website/tailwind.config.ts b/website/tailwind.config.ts index 1f19abc..e6fb711 100644 --- a/website/tailwind.config.ts +++ b/website/tailwind.config.ts @@ -1,6 +1,8 @@ import type { Config } from "tailwindcss" import defaultTheme from "tailwindcss/defaultTheme" +const alpha = (color: string, alpha: number = 1) => color.replace("", alpha.toString()) + export default { content: ["./src/**/*.{html,js,svelte,ts}"], @@ -45,6 +47,28 @@ export default { borderColor: { DEFAULT: "rgb(var(--color-border) / )", }, + typography: ({ theme }) => ({ + DEFAULT: { + css: { + "--tw-prose-body": alpha(theme("colors.body")), + "--tw-prose-headings": alpha(theme("colors.heading")), + "--tw-prose-lead": alpha(theme("colors.heading")), + "--tw-prose-links": alpha(theme("colors.primary").DEFAULT), + "--tw-prose-bold": alpha(theme("colors.body")), + "--tw-prose-counters": alpha(theme("colors.body")), + "--tw-prose-bullets": alpha(theme("colors.border")), + "--tw-prose-hr": alpha(theme("colors.border")), + "--tw-prose-quotes": alpha(theme("colors.body")), + "--tw-prose-quote-borders": alpha(theme("colors.border")), + "--tw-prose-captions": alpha(theme("colors.body")), + "--tw-prose-code": alpha(theme("colors.body")), + "--tw-prose-pre-code": alpha(theme("colors.body")), + "--tw-prose-pre-bg": alpha(theme("colors.card").DEFAULT), + "--tw-prose-th-borders": alpha(theme("colors.border")), + "--tw-prose-td-borders": alpha(theme("colors.border")), + }, + }, + }), }, },