import { fileURLToPath, URL } from 'node:url'; import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; import { VitePWA } from 'vite-plugin-pwa'; export default defineConfig({ resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) } }, plugins: [ react(), VitePWA({ registerType: 'autoUpdate', includeAssets: ['icons/*.png', 'icons/*.svg', 'uqo-logo.png', 'uqo-logo-white.png'], manifest: { name: 'UQO-Chat', short_name: 'UQO-Chat', description: 'Tuteur IA — IMM1003 · IMM1033 (UQO)', lang: 'fr-CA', display: 'standalone', start_url: '/', scope: '/', theme_color: '#0F6180', background_color: '#FFFFFF', icons: [ { src: '/icons/icon-192.png', sizes: '192x192', type: 'image/png' }, { src: '/icons/icon-512.png', sizes: '512x512', type: 'image/png' }, { src: '/icons/icon-maskable-512.png', sizes: '512x512', type: 'image/png', purpose: 'maskable' }, ], }, workbox: { navigateFallback: '/index.html', navigateFallbackDenylist: [/^\/api\//], globPatterns: ['**/*.{js,css,html,svg,png,woff2}'], maximumFileSizeToCacheInBytes: 6 * 1024 * 1024, runtimeCaching: [ { urlPattern: /\/api\/v1\/(conversations|courses|me)(\?.*)?$/, handler: 'NetworkFirst', options: { cacheName: 'api-read', networkTimeoutSeconds: 4, expiration: { maxEntries: 60, maxAgeSeconds: 86400 } }, }, { urlPattern: /\/api\/v1\/conversations\/[a-f0-9]+$/, handler: 'NetworkFirst', options: { cacheName: 'api-conv', networkTimeoutSeconds: 4, expiration: { maxEntries: 40, maxAgeSeconds: 86400 } }, }, { urlPattern: /^https:\/\/fonts\.(googleapis|gstatic)\.com\//, handler: 'CacheFirst', options: { cacheName: 'fonts', expiration: { maxEntries: 20, maxAgeSeconds: 31536000 } }, }, ], }, }), ], server: { port: 5173, proxy: { '/api': { target: 'http://127.0.0.1:8190', changeOrigin: true } }, }, build: { sourcemap: false, rollupOptions: { output: { manualChunks: { markdown: ['react-markdown', 'remark-gfm', 'remark-math', 'rehype-katex'], charts: ['recharts'], }, }, }, }, });