import { defineConfig } from "vite"; import react from "@vitejs/plugin-react-swc"; import path from "path"; import { componentTagger } from "lovable-tagger"; import { visualizer } from 'rollup-plugin-visualizer'; // https://vitejs.dev/config/ export default defineConfig(({ mode }) => ({ server: { host: "::", port: 8080, }, plugins: [ react(), mode === 'development' && componentTagger(), mode === 'production' && visualizer({ filename: 'dist/bundle-analysis.html', open: false, gzipSize: true, brotliSize: true, }), ].filter(Boolean), resolve: { alias: { "@": path.resolve(__dirname, "./src"), }, }, build: { rollupOptions: { output: { manualChunks: { // Vendor chunk for React ecosystem 'vendor-react': ['react', 'react-dom', 'react-router-dom'], // UI library chunks (large Radix UI components) 'vendor-ui-core': [ '@radix-ui/react-dialog', '@radix-ui/react-dropdown-menu', '@radix-ui/react-popover', '@radix-ui/react-select', '@radix-ui/react-tabs', '@radix-ui/react-toast', '@radix-ui/react-tooltip', ], 'vendor-ui-forms': [ '@radix-ui/react-checkbox', '@radix-ui/react-radio-group', '@radix-ui/react-slider', '@radix-ui/react-switch', '@radix-ui/react-label', 'react-hook-form', '@hookform/resolvers', 'zod', ], 'vendor-ui-layout': [ '@radix-ui/react-accordion', '@radix-ui/react-collapsible', '@radix-ui/react-navigation-menu', '@radix-ui/react-scroll-area', '@radix-ui/react-separator', '@radix-ui/react-aspect-ratio', ], 'vendor-ui-misc': [ '@radix-ui/react-alert-dialog', '@radix-ui/react-avatar', '@radix-ui/react-context-menu', '@radix-ui/react-hover-card', '@radix-ui/react-menubar', '@radix-ui/react-progress', '@radix-ui/react-slot', '@radix-ui/react-toggle', '@radix-ui/react-toggle-group', ], // Data & State management 'vendor-data': [ '@tanstack/react-query', '@supabase/supabase-js', ], // Utilities & Styling 'vendor-utils': [ 'clsx', 'class-variance-authority', 'tailwind-merge', 'tailwindcss-animate', 'cmdk', ], // Internationalization 'vendor-i18n': [ 'i18next', 'i18next-browser-languagedetector', 'react-i18next', ], // Charts & Data Visualization 'vendor-charts': [ 'recharts', 'date-fns', ], // UI Enhancements 'vendor-ui-enhanced': [ 'lucide-react', 'next-themes', 'sonner', 'vaul', 'embla-carousel-react', 'react-day-picker', 'react-resizable-panels', 'input-otp', ], }, // Optimize chunk loading chunkFileNames: (chunkInfo) => { const facadeModuleId = chunkInfo.facadeModuleId ? chunkInfo.facadeModuleId.split('/').pop().replace('.tsx', '').replace('.ts', '') : 'chunk' return `assets/${facadeModuleId}-[hash].js` }, }, }, // Increase chunk size warning limit slightly to account for necessary chunks chunkSizeWarningLimit: 600, // Enable minification optimizations minify: 'terser', terserOptions: { compress: { drop_console: mode === 'production', drop_debugger: mode === 'production', }, }, }, }));