138 lines
5.0 KiB
TypeScript
Executable File
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()],
|
|
},
|
|
});
|