rewrite from monolithic hono jsx to react 19 spa with tanstack router + hono json api backend. add scan, review, execute, nodes, and setup pages. multi-stage dockerfile (node for vite build, bun for runtime). previously, server/ and src/shared/lib/ were silently excluded by global gitignore patterns (/server/ from emacs, lib/ from python). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
27 lines
1.1 KiB
TypeScript
27 lines
1.1 KiB
TypeScript
/** Base URL for API calls. In dev Vite proxies /api → :3000. */
|
|
const BASE = '';
|
|
|
|
async function request<T>(path: string, init?: RequestInit): Promise<T> {
|
|
const res = await fetch(BASE + path, {
|
|
headers: { 'Content-Type': 'application/json', ...(init?.headers ?? {}) },
|
|
...init,
|
|
});
|
|
if (!res.ok) {
|
|
const text = await res.text().catch(() => res.statusText);
|
|
throw new Error(text || `HTTP ${res.status}`);
|
|
}
|
|
return res.json() as Promise<T>;
|
|
}
|
|
|
|
export const api = {
|
|
get: <T>(path: string) => request<T>(path),
|
|
post: <T>(path: string, body?: unknown) =>
|
|
request<T>(path, { method: 'POST', body: body !== undefined ? JSON.stringify(body) : undefined }),
|
|
patch: <T>(path: string, body?: unknown) =>
|
|
request<T>(path, { method: 'PATCH', body: body !== undefined ? JSON.stringify(body) : undefined }),
|
|
delete: <T>(path: string) => request<T>(path, { method: 'DELETE' }),
|
|
/** POST multipart/form-data (file upload). Omit Content-Type so browser sets boundary. */
|
|
postForm: <T>(path: string, body: FormData) =>
|
|
request<T>(path, { method: 'POST', body, headers: {} }),
|
|
};
|