60 lines
2 KiB
JavaScript
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()]
|
|
});
|