ihm_client/vite.config.ts

138 lines
5.0 KiB
TypeScript
Executable File

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()],
},
});