diff --git a/package.json b/package.json index d0c05e8..38b47fb 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "oxlint-tsgolint": "0.24.0", "prettier": "3.9.4", "prettier-plugin-svelte": "^4.1.1", + "runed": "^0.37.1", "svelte": "^5.56.4", "svelte-check": "^4.7.1", "svelte-inspect-value": "^0.11.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index afc93c7..a6ce447 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,6 +47,9 @@ importers: prettier-plugin-svelte: specifier: ^4.1.1 version: 4.1.1(prettier@3.9.4)(svelte@5.56.4) + runed: + specifier: ^0.37.1 + version: 0.37.1(@sveltejs/kit@2.69.1(@sveltejs/vite-plugin-svelte@7.1.2(svelte@5.56.4)(vite@8.1.3(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.4)(typescript@6.0.3)(vite@8.1.3(esbuild@0.28.1)(jiti@2.7.0)))(svelte@5.56.4) svelte: specifier: ^5.56.4 version: 5.56.4 diff --git a/src/lib/shared.ts b/src/lib/shared.ts new file mode 100644 index 0000000..70a2ae9 --- /dev/null +++ b/src/lib/shared.ts @@ -0,0 +1 @@ +export const USER_AGENT = 'tangled-stats'; diff --git a/src/routes/ufos/+page.svelte b/src/routes/ufos/+page.svelte new file mode 100644 index 0000000..c7fabcf --- /dev/null +++ b/src/routes/ufos/+page.svelte @@ -0,0 +1,46 @@ + + +
Loading...
+ {/snippet} + + {#snippet failed()} +failed
+ {/snippet} + + {#if $effect.pending()} +Loading further...
+ {/if} + ++ {result.nsid} +
+{/each} diff --git a/src/routes/ufos/[collection]/ufos.remote.ts b/src/routes/ufos/[collection]/ufos.remote.ts index 4e7b628..022d770 100644 --- a/src/routes/ufos/[collection]/ufos.remote.ts +++ b/src/routes/ufos/[collection]/ufos.remote.ts @@ -1,8 +1,7 @@ +import { USER_AGENT } from '$lib/shared'; import { query } from '$app/server'; import * as v from 'valibot'; -const USER_AGENT = 'tangled-stats'; - const InstantSchema = v.nullable( v.pipe( v.string(), diff --git a/src/routes/ufos/search.remote.ts b/src/routes/ufos/search.remote.ts new file mode 100644 index 0000000..1baf670 --- /dev/null +++ b/src/routes/ufos/search.remote.ts @@ -0,0 +1,34 @@ +import { query } from '$app/server'; +import { USER_AGENT } from '$lib/shared'; +import * as v from 'valibot'; + +const SearchSchema = v.object({ + matches: v.array( + v.object({ + nsid: v.string(), + }), + ), +}); + +const QuerySchema = v.pipe( + v.string(), + v.trim(), + v.minLength(1), + v.toLowerCase(), +); + +export const search = query(QuerySchema, async (q) => { + if (q.length === 0) return []; + + const url = new URL('https://ufos-api.microcosm.blue/search'); + url.searchParams.set('q', q); + + const response = await fetch(url, { + headers: { + 'User-Agent': USER_AGENT, + }, + }); + + const data = v.parse(SearchSchema, await response.json()); + return data.matches; +});