import { createReadStream, existsSync, statSync } from 'node:fs' import { join, resolve } from 'node:path' import { fileURLToPath } from 'node:url' import type { IncomingMessage, ServerResponse } from 'node:http' import { defineConfig, type Connect, type Plugin } from 'vite' import { svelte } from '@sveltejs/vite-plugin-svelte' const repoRoot = resolve(fileURLToPath(import.meta.url), '../..') const assetsDir = resolve(repoRoot, 'assets') function serveStatic(root: string): Connect.NextHandleFunction { return (req, res, next) => { const url = (req.url ?? '/').split('?')[0] const filePath = resolve(join(root, url)) if (!filePath.startsWith(root) || !existsSync(filePath)) { next() return } const stat = statSync(filePath) if (!stat.isFile()) { next() return } serveFile(filePath, res) } } function serveFile(filePath: string, res: ServerResponse): void { const ext = filePath.split('.').pop()?.toLowerCase() const types: Record = { json: 'application/json', mp3: 'audio/mpeg', } res.setHeader('Content-Type', types[ext ?? ''] ?? 'application/octet-stream') createReadStream(filePath).pipe(res) } /** Serve repo-level assets/ at /assets in dev and preview. */ function serveRepoAssets(): Plugin { return { name: 'serve-repo-assets', configureServer(server) { server.middlewares.use('/assets', serveStatic(assetsDir)) }, configurePreviewServer(server) { server.middlewares.use('/assets', serveStatic(assetsDir)) }, } } export default defineConfig({ plugins: [svelte(), serveRepoAssets()], server: { fs: { allow: [repoRoot], }, }, })