From ddaa9daef7cbbf28fa9a362c5c89e62e4f12cb62 Mon Sep 17 00:00:00 2001 From: Archey Barrell Date: Fri, 19 Dec 2025 00:09:10 +0000 Subject: [PATCH 1/2] alii added a base(d) function --- package-lock.json | 2 +- package.json | 2 +- src/app/about/page.tsx | 1 - src/app/join/page.tsx | 4 ++-- src/spanner/api.ts | 27 ++++++++++----------------- src/spanner/blog.ts | 2 +- 6 files changed, 15 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4d430e4..707a3bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dayjs": "^1.11.13", "lucide-react": "^0.542.0", "next": "^15.4.0", - "pathcat": "^1.4.0", + "pathcat": "^1.5.1", "react": "^19", "react-dom": "^19", "react-grid-gallery": "^1.0.1" diff --git a/package.json b/package.json index 287be68..b15a13e 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "dayjs": "^1.11.13", "lucide-react": "^0.542.0", "next": "^15.4.0", - "pathcat": "^1.4.0", + "pathcat": "^1.5.1", "react": "^19", "react-dom": "^19", "react-grid-gallery": "^1.0.1" diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx index c6e11d7..7cd3c13 100644 --- a/src/app/about/page.tsx +++ b/src/app/about/page.tsx @@ -1,4 +1,3 @@ -import { pathWildcat } from "@/spanner/api"; import { Metadata } from "next"; import Image from "next/image"; import { cloneElement } from "react"; diff --git a/src/app/join/page.tsx b/src/app/join/page.tsx index 10421a8..5de5717 100644 --- a/src/app/join/page.tsx +++ b/src/app/join/page.tsx @@ -1,4 +1,4 @@ -import { pathWildcat } from "@/spanner/api"; +import { spannerPathCat } from "@/spanner/api"; import { wwlrcClubId } from "@/spanner/wwlrc"; import { Download, ExternalLinkIcon } from "lucide-react"; import { Metadata } from "next"; @@ -178,7 +178,7 @@ export default function Join() {

): string { - if (!query) { - return pathcat(spannerBase, template); - } - - return pathcat(spannerBase, template, query); -} - -export function spannerApiFetch( - template: string, - query?: Query, -): Promise { - const url = pathWildcat(template, query); - let p = fetch(url); +export async function spannerApiFetch( + path: Path, + ...query: [ExtractRouteParams] extends [never] + ? [query?: Query] + : [query: Query] +) { + let response = await fetch(spannerPathCat(path, ...query)); // TODO: probably worth putting some more fancy error handling here - return p.then((response) => response.json()); + return response.json(); } diff --git a/src/spanner/blog.ts b/src/spanner/blog.ts index 0d46735..d017cdb 100644 --- a/src/spanner/blog.ts +++ b/src/spanner/blog.ts @@ -1,4 +1,4 @@ -import { spannerApiFetch } from "./api"; +import { spannerApiFetch, spannerPathCat } from "./api"; import { wwlrcClubId } from "./wwlrc"; export async function getPosts(): Promise { From b1e626985f1a486d9a9e7344d4dabd1aa6492c74 Mon Sep 17 00:00:00 2001 From: Archey Barrell Date: Fri, 19 Dec 2025 00:59:14 +0000 Subject: [PATCH 2/2] wrap instead --- src/spanner/api.ts | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/spanner/api.ts b/src/spanner/api.ts index 3f9fefa..5faaa92 100644 --- a/src/spanner/api.ts +++ b/src/spanner/api.ts @@ -1,14 +1,36 @@ -import { base, ExtractRouteParams, Query } from "pathcat"; +import { base, ExtractRouteParams, Query, pathcat } from "pathcat"; export const spannerPathCat = base("https://spanner.wwlrc.co.uk"); -export async function spannerApiFetch( +function wrap( + fn: (path: string) => R, +): ( + base: string, path: Path, ...query: [ExtractRouteParams] extends [never] ? [query?: Query] : [query: Query] -) { - let response = await fetch(spannerPathCat(path, ...query)); - // TODO: probably worth putting some more fancy error handling here - return response.json(); +) => R { + return (base, path, ...query): R => fn(pathcat(base, path, ...query)); } + +function wrapWithBase( + base: string, + fn: (path: string) => R, +): ( + path: Path, + ...query: [ExtractRouteParams] extends [never] + ? [query?: Query] + : [query: Query] +) => R { + return (path, ...query): R => wrap(fn)(base, path, ...query); +} + +export const spannerApiFetch = wrapWithBase>( + "https://spanner.wwlrc.co.uk", + async (path) => { + let response = await fetch(path); + // TODO: probably worth putting some more fancy error handling here + return response.json(); + }, +);