build-valuecurve/apps/homepage/vite.config.js

60 lines
2 KiB
JavaScript

import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
import { readFileSync, existsSync } from 'fs';
import { resolve, join } from 'path';
import { fileURLToPath } from 'url';
const __dirname = fileURLToPath(new URL('.', import.meta.url));
// Custom Vite plugin to serve pre-built static apps in dev mode
function serveStaticApps() {
const staticRoutes = {
'/guides/statistical-tests': resolve(__dirname, '../../guides/statistical-tests'),
'/tools/flowchart': resolve(__dirname, '../../tools/flowchart')
};
return {
name: 'serve-static-apps',
configureServer(server) {
server.middlewares.use((req, res, next) => {
const url = req.url?.split('?')[0] || '';
for (const [route, basePath] of Object.entries(staticRoutes)) {
if (url.startsWith(route)) {
let filePath = url.slice(route.length) || '/index.html';
if (filePath === '/') filePath = '/index.html';
const fullPath = join(basePath, filePath);
if (existsSync(fullPath)) {
try {
const content = readFileSync(fullPath);
const ext = filePath.split('.').pop() || 'html';
const mimeTypes = {
'html': 'text/html',
'js': 'application/javascript',
'css': 'text/css',
'json': 'application/json',
'png': 'image/png',
'jpg': 'image/jpeg',
'svg': 'image/svg+xml',
'woff': 'font/woff',
'woff2': 'font/woff2'
};
res.setHeader('Content-Type', mimeTypes[ext] || 'application/octet-stream');
res.end(content);
return;
} catch (e) {
// Fall through to next handler
}
}
}
}
next();
});
}
};
}
export default defineConfig({
plugins: [serveStaticApps(), sveltekit()]
});