import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import istanbul from 'vite-plugin-istanbul' const backendUrl = process.env.LOCALAI_URL || 'http://localhost:8080' // COVERAGE=true produces an instrumented build whose modules report istanbul // counters on window.__coverage__, harvested by the Playwright coverage // fixture (e2e/coverage-fixtures.js). Off by default so normal/dev/prod builds // carry no instrumentation overhead. const coverage = process.env.COVERAGE === 'true' // COVERAGE_V8=true produces a NON-instrumented build with source maps, so the // Playwright coverage fixture can collect Chromium V8 coverage (near-zero // runtime overhead, unlike istanbul's build-time counters) and map it back to // source via v8-to-istanbul. Mutually exclusive with COVERAGE. const coverageV8 = process.env.COVERAGE_V8 === 'true' export default defineConfig({ plugins: [ react(), ...(coverage ? [ istanbul({ include: 'src/**/*', extension: ['.js', '.jsx', '.ts', '.tsx'], requireEnv: false, // The e2e suite runs against `vite build` output, not the dev // server, so instrumentation must be applied to the production // build too (the plugin only instruments dev mode otherwise). forceBuildInstrument: true, }), ] : []), ], base: '/', server: { port: 3000, proxy: { '/api': backendUrl, '/v1': backendUrl, '/tts': backendUrl, '/video': backendUrl, '/backend': backendUrl, '/models': backendUrl, '/backends': backendUrl, '/swagger': backendUrl, '/static': backendUrl, '/generated-audio': backendUrl, '/generated-images': backendUrl, '/generated-videos': backendUrl, '/version': backendUrl, '/system': backendUrl, }, }, build: { outDir: 'dist', assetsDir: 'assets', // Source maps are needed only to map V8 coverage back to original sources. sourcemap: coverageV8, rollupOptions: { output: { // The coverage build inlines all dynamic imports into a single chunk. // The app is route-code-split (router.jsx uses React.lazy), so a normal // build emits ~50 lazy chunks. V8 coverage only sees chunks a test // actually loaded, so untested pages would silently drop out of the // denominator and inflate the percentage. Bundling everything into one // chunk for the coverage build keeps the denominator complete and the // measurement invariant to how production is split. Production builds // (COVERAGE_V8 unset) keep code-splitting for fast first paint. inlineDynamicImports: coverageV8, }, }, }, })