Files
unibus_admin/web/vite.config.ts
Egutierrez df1c03a0be feat: Mantine SPA (Cluster/Rooms/Users) + verified end-to-end
SPA (React 19 + Vite 6 + Mantine v9, dark/indigo, @fn_library-style):
- AdminShell: AppShell nav (Cluster/Rooms/Users), operator endpoint badge
- ClusterPage: per-node up/down + posture badges (enforce/acl/tls/cluster/store),
  10s auto-refresh
- RoomsPage: room table (E2E/cleartext, persist, signed, epoch, role), create
  modal, members drawer with kick(+rekey) and invite modal
- UsersPage: allowlist table (handle/role/status/sign_pub), add modal, revoke
  with confirmation, degraded state when no store backend
- api.ts: single repository layer hitting /api; gateway decides mock vs live

Verified end-to-end against a local membershipd in BOTH postures:
- auth-off: create room, list rooms, signed members GET, add/revoke user
- enforce + TLS + nkey (production posture): TLS-pinned healthz, nkey NATS
  connect, signed control-plane requests verified by the server, 403 surfaced
  for a non-member room

pnpm build green (tsc + vite); go build/vet green; dist embedded.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 19:38:30 +02:00

20 lines
600 B
TypeScript

import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
// The build output (web/dist) is embedded into the Go binary, so the default
// outDir `dist` is exactly what embed.go expects. In dev, /api and /healthz are
// proxied to the gateway (run it with --mock for sample data) so `pnpm dev`
// drives the real handlers.
export default defineConfig({
plugins: [react()],
build: { outDir: "dist", emptyOutDir: true },
server: {
host: true,
port: 5182,
proxy: {
"/api": "http://127.0.0.1:8480",
"/healthz": "http://127.0.0.1:8480",
},
},
});