import { defineConfig } from 'vite'; import wasm from 'vite-plugin-wasm'; import { fileURLToPath, URL } from 'node:url'; import { resolve } from 'path'; import type { Plugin } from 'vite'; // Plugin to handle Service Worker in dev and build function serviceWorkerPlugin(): Plugin { const swPath = resolve(__dirname, 'src/service-workers/network.sw.ts'); const swUrl = '/src/service-workers/network.sw.ts'; return { name: 'service-worker-plugin', enforce: 'pre', // Run before other plugins configureServer(server) { // In dev mode, serve the Service Worker from src server.middlewares.use('/network.sw.js', async (req, res, next) => { console.log('[Service Worker Plugin] Request for /network.sw.js'); try { // Try using the URL format that Vite expects let result = await server.transformRequest(swUrl, { ssr: false }); // If that doesn't work, try with the file path if (!result || !result.code) { console.log('[Service Worker Plugin] Trying with file path...'); result = await server.transformRequest(swPath, { ssr: false }); } if (result && result.code) { console.log('[Service Worker Plugin] Successfully transformed Service Worker'); res.setHeader('Content-Type', 'application/javascript'); res.setHeader('Service-Worker-Allowed', '/'); res.setHeader('Cache-Control', 'no-cache'); res.end(result.code); return; } // Final fallback: use pluginContainer directly console.log('[Service Worker Plugin] Fallback: using pluginContainer.transform'); const { readFileSync } = await import('fs'); const code = readFileSync(swPath, 'utf-8'); const transformed = await server.pluginContainer.transform(code, swUrl); if (transformed && transformed.code) { console.log('[Service Worker Plugin] Successfully transformed via pluginContainer'); res.setHeader('Content-Type', 'application/javascript'); res.setHeader('Service-Worker-Allowed', '/'); res.setHeader('Cache-Control', 'no-cache'); res.end(transformed.code); } else { console.error('[Service Worker Plugin] Failed to transform Service Worker'); res.statusCode = 500; res.end('Failed to load Service Worker'); } } catch (err) { console.error('[Service Worker Plugin] Error serving SW:', err); if (err instanceof Error) { console.error('[Service Worker Plugin] Error details:', err.stack); } res.statusCode = 500; res.end(`Service Worker error: ${err instanceof Error ? err.message : String(err)}`); } }); }, }; } export default defineConfig({ // Configuration du serveur de développement server: { port: 3003, host: '0.0.0.0', // Permet l'accès depuis l'extérieur (Docker/Réseau) allowedHosts: ['dev3.4nkweb.com'], proxy: { // Proxy pour le stockage '/storage': { target: process.env.VITE_STORAGEURL || 'https://dev3.4nkweb.com', changeOrigin: true, secure: false, // Accepte les certificats auto-signés si besoin rewrite: (path) => path.replace(/^\/storage/, '/storage'), }, // Proxy pour les websockets (si besoin de contourner CORS ou SSL) '/ws': { target: process.env.VITE_BOOTSTRAPURL?.replace('ws', 'http') || 'https://dev3.4nkweb.com', ws: true, changeOrigin: true, secure: false, }, // Proxy pour l'API BlindBit '/blindbit': { target: process.env.VITE_BLINDBITURL || 'https://dev3.4nkweb.com/blindbit', changeOrigin: true, secure: false, rewrite: (path) => path.replace(/^\/blindbit/, ''), }, }, }, // Plugins essentiels plugins: [ wasm(), // Indispensable pour ton SDK Rust serviceWorkerPlugin(), // Service Worker handler ], // Alias pour les imports (ex: import ... from '@/services/...') resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)), '~': fileURLToPath(new URL('./src', import.meta.url)), // Rétro-compatibilité avec tes anciens imports }, }, // Configuration du Build build: { target: 'esnext', // Nécessaire pour le "Top Level Await" souvent utilisé avec WASM outDir: 'dist', assetsDir: 'assets', emptyOutDir: true, // Vide le dossier dist avant chaque build rollupOptions: { input: { main: resolve(__dirname, 'index.html'), 'network.sw': resolve(__dirname, 'src/service-workers/network.sw.ts'), }, output: { entryFileNames: (chunkInfo) => { return chunkInfo.name === 'network.sw' ? 'network.sw.js' : 'assets/[name]-[hash].js'; }, }, }, }, // Configuration spécifique pour les Workers (Database) worker: { format: 'es', plugins: () => [wasm()], }, });