From 275f8c13f782423795b4cbc8b15eb0c5b26e3546 Mon Sep 17 00:00:00 2001 From: Jens <69081683+jenslys@users.noreply.github.com> Date: Wed, 1 Jan 2025 22:28:05 +0100 Subject: [PATCH 1/2] chore: replace npm with bun - Add field for lang color - Add field for lang icon - Add field for full url --- README.md | 10 +++++----- bun.lockb | Bin 0 -> 40464 bytes src/index.ts | 41 +++++++++++++++++++++++++++++++++++++---- 3 files changed, 42 insertions(+), 9 deletions(-) create mode 100755 bun.lockb diff --git a/README.md b/README.md index 53db428..411a807 100644 --- a/README.md +++ b/README.md @@ -41,13 +41,13 @@ If Pinned runs into an error, it will return a response with a response code oth Clone the repository, `cd` into it and run the following commands to install dependencies and run the code: -``` -npm install -npm run dev +```bash +bun install +bun run dev ``` Pinned is deployed on [Cloudflare Workers](https://workers.cloudflare.com/). To deploy Pinned, run the following command: -``` -npm run deploy +```bash +bun run deploy ``` diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..2223051f2cacdacb1829253208d5b6df9eadc305 GIT binary patch literal 40464 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 lj-zx_gTK$Fcn30ogFDyZ#nI?VtR;1L3sdgtkN { - if (!c.env.dev) { + if (c.env.dev === false) { return cache({ cacheName: "gh-request-cache", cacheControl: "max-age=300", @@ -45,12 +45,27 @@ app.get("/", async (c) => { interface RepositoryData { author: string; name: string; + url: string; description: string; language: string; + languageColor?: string; + languageIcon?: string; stars?: number; forks?: number; } +// Map special language names to their simple-icons slugs +function mapLanguageName(lang: string): string { + const mapping: Record = { + "C#": "csharp", + "F#": "fsharp", + "C++": "cplusplus", + "Visual Basic": "visualbasic", + ".NET": "dotnet", + }; + return mapping[lang] || lang.toLowerCase(); +} + function parseRepository(root: HTMLElement, el: HTMLElement): RepositoryData { const repoPath = el.querySelector("a")?.getAttribute("href")?.split("/") || []; @@ -71,14 +86,29 @@ function parseRepository(root: HTMLElement, el: HTMLElement): RepositoryData { } }; + const languageSpan = el.querySelector("span[itemprop='programmingLanguage']"); + const languageColorSpan = languageSpan?.parentNode?.querySelector( + ".repo-language-color" + ); + const language = languageSpan?.text || ""; + return { author, name, + url: `https://github.com/${author}/${name}`, description: el.querySelector("p.pinned-item-desc")?.text?.replace(/\n/g, "").trim() || "", - language: - el.querySelector("span[itemprop='programmingLanguage']")?.text || "", + language, + languageColor: + languageColorSpan + ?.getAttribute("style") + ?.match(/background-color:\s*([^;]+)/)?.[1] || "", + languageIcon: language + ? `https://cdn.simpleicons.org/${encodeURIComponent( + mapLanguageName(language) + )}` + : "", stars: parseMetric(0), forks: parseMetric(1), }; @@ -100,7 +130,10 @@ app.get("/get/:username", async (c) => { } // Handle common HTTP error responses - const errorResponses: Record = { + const errorResponses: Record< + number, + { status: StatusCode; message: string } + > = { 404: { status: 404, message: "User not found" }, 429: { status: 429, message: "Origin rate limit exceeded" }, }; From 56c8dc295944625155b24879d04999013045bd2b Mon Sep 17 00:00:00 2001 From: Jens <69081683+jenslys@users.noreply.github.com> Date: Sat, 4 Jan 2025 15:53:10 +0100 Subject: [PATCH 2/2] chore: root response --- src/index.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index 0393ca0..45c415c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -37,8 +37,19 @@ app.use("*", async (c, next) => { // Redirect root path to GitHub repository app.get("/", async (c) => { - return c.redirect("https://github.com/berrysauce/pinned", 301); - // return c.text("📌 PINNED\nPlease use /get/username to get the pinned repositories of a GitHub user") + const accept = c.req.header("Accept") || ""; + const userAgent = c.req.header("User-Agent") || ""; + + // Check if request is from a browser (prefers HTML or is a common browser) + const isBrowser = + accept.includes("text/html") || + /chrome|firefox|safari|edge|opera/i.test(userAgent); + + return isBrowser + ? c.redirect("https://github.com/berrysauce/pinned", 301) + : c.text( + "📌 PINNED\nPlease use /get/username to get the pinned repositories of a GitHub user" + ); }); // Define structure for repository data