import { defineConfig } from 'vite' import type { Plugin } from 'vite' import react from '@vitejs/plugin-react' import tailwindcss from '@tailwindcss/vite' /** * Livias Recherche-Endpoint in der lokalen Entwicklung. * * In der Produktion liefert Vercel `api/livia/research/refresh.ts` als * serverlose Funktion aus. `vite` kennt keine Serverfunktionen — ohne diesen * Zugang liefe der Aufruf in den `/api`-Proxy darunter und käme als HTML * zurück. Das Plugin lädt dieselbe Datei über Vites SSR-Lader und ruft sie mit * demselben `(req, res)` auf, das auch Vercel übergibt; es gibt also keine * zweite Fassung des Endpoints, die auseinanderlaufen könnte. * * Nur für `serve` — in den Produktionsbau geht davon nichts ein. */ function liviaResearchDevEndpoint(): Plugin { const PFAD = '/api/livia/research/refresh' return { name: 'livia-research-dev-endpoint', apply: 'serve', configureServer(server) { server.middlewares.use((req, res, next) => { if (!req.url?.startsWith(PFAD)) return next() void server .ssrLoadModule('/api/livia/research/refresh.ts') .then(mod => (mod as { default: (q: typeof req, s: typeof res) => Promise }).default(req, res)) .catch((err: unknown) => { res.statusCode = 500 res.setHeader('Content-Type', 'application/json; charset=utf-8') res.end(JSON.stringify({ error: err instanceof Error ? err.message : String(err) })) }) }) }, } } export default defineConfig({ plugins: [ react(), tailwindcss(), liviaResearchDevEndpoint(), ], build: { /** * Objektbilder bleiben immer eigene Dateien. * * Vite bettet Assets unter 4 KB als Base64 ein. Zwei der Objektbilder liegen * knapp darunter und landeten dadurch im JavaScript statt im Dateisystem — * werden sie später durch echte Fotos ersetzt, sollen alle Objekte gleich * behandelt sein. Für alle übrigen Assets bleibt die Voreinstellung. */ assetsInlineLimit: (filePath: string) => filePath.includes('/assets/properties/') ? false : undefined, }, server: { proxy: { // In dev: forward /api/* to the local PowerOn backend. // Set AI_BACKEND_URL in your shell or .env.local (no VITE_ prefix — never bundled). // Example: AI_BACKEND_URL=http://localhost:3001 // // In production: the same-origin backend serves /api/* directly. // No proxy needed; the relative URL /api/ai/chat/completions resolves correctly. '/api': { target: process.env['AI_BACKEND_URL'] ?? 'http://localhost:3001', changeOrigin: true, }, }, }, })