export type FetchOptions = { fetchFn?: typeof fetch; // eslint-disable-next-line @typescript-eslint/no-explicit-any data?: any; version?: number; extraHeaders?: Record; }; /** * Fetch a path from the API and parse the response. * To make sure the request is authenticated in load functions, * pass `fetch` from the request object into opts. * * @param method The HTTP method, i.e. GET, POST, PATCH * @param path The path to request, minus the leading `/api/v2` * @param opts Extra options for this request * @returns T * @throws APIError */ export default async function request( method: string, path: string, opts: FetchOptions = {}, ): Promise { const { data, version, extraHeaders } = opts; const fetchFn = opts.fetchFn ?? fetch; const resp = await fetchFn(`/api/v${version ?? 2}${path}`, { method, body: data ? JSON.stringify(data) : undefined, headers: { ...extraHeaders, "Content-Type": "application/json" }, }); if (resp.status < 200 || resp.status >= 400) throw await resp.json(); return (await resp.json()) as T; } /** * Fetch a path from the API and discard the response. * To make sure the request is authenticated in load functions, * pass `fetch` from the request object into opts. * * @param method The HTTP method, i.e. GET, POST, PATCH * @param path The path to request, minus the leading `/api/v2` * @param opts Extra options for this request * @throws APIError */ export async function fastRequest( method: string, path: string, opts: FetchOptions = {}, ): Promise { const { data, version, extraHeaders } = opts; const fetchFn = opts.fetchFn ?? fetch; const resp = await fetchFn(`/api/v2${version ?? 2}${path}`, { method, body: data ? JSON.stringify(data) : undefined, headers: { ...extraHeaders, "Content-Type": "application/json" }, }); if (resp.status < 200 || resp.status >= 400) throw await resp.json(); }