|
|
import type { App } from "$api"; |
|
|
import { base } from "$app/paths"; |
|
|
import { treaty, type Treaty } from "@elysiajs/eden"; |
|
|
import { browser } from "$app/environment"; |
|
|
import superjson from "superjson"; |
|
|
import ObjectId from "bson-objectid"; |
|
|
|
|
|
superjson.registerCustom<ObjectId, string>( |
|
|
{ |
|
|
isApplicable: (value): value is ObjectId => { |
|
|
if (typeof value !== "string" && ObjectId.isValid(value)) { |
|
|
const str = value.toString(); |
|
|
return /^[0-9a-fA-F]{24}$/.test(str); |
|
|
} |
|
|
return false; |
|
|
}, |
|
|
serialize: (value) => value.toString(), |
|
|
deserialize: (value) => new ObjectId(value), |
|
|
}, |
|
|
"ObjectId" |
|
|
); |
|
|
|
|
|
export function useAPIClient({ |
|
|
fetch, |
|
|
origin, |
|
|
}: { |
|
|
fetch?: Treaty.Config["fetcher"]; |
|
|
origin?: string; |
|
|
} = {}) { |
|
|
|
|
|
|
|
|
|
|
|
const url = browser |
|
|
? `${window.location.origin}${base}/api/v2` |
|
|
: `${origin ?? `http://localhost:5173`}${base}/api/v2`; |
|
|
|
|
|
const app = treaty<App>(url, { fetcher: fetch }); |
|
|
return app; |
|
|
} |
|
|
|
|
|
export function handleResponse<T extends Record<number, unknown>>( |
|
|
response: Treaty.TreatyResponse<T> |
|
|
): T[200] { |
|
|
if (response.error) { |
|
|
throw new Error(JSON.stringify(response.error)); |
|
|
} |
|
|
|
|
|
return superjson.parse( |
|
|
typeof response.data === "string" ? response.data : JSON.stringify(response.data) |
|
|
) as T[200]; |
|
|
} |
|
|
|