import type { Plugin } from 'vite' /** * Dev-only: reject requests with malformed URIs before Vite's static/transform * middleware runs decodeURI(), which would throw and crash the server. * See: https://github.com/vitejs/vite/issues/6482 */ export function viteUriGuard(): Plugin { return { name: 'vite-uri-guard', apply: 'serve', configureServer(server) { const guard = (req: any, res: any, next: () => void) => { const raw = req.url ?? req.originalUrl ?? '' try { decodeURI(raw) const path = raw.includes('?') ? raw.slice(0, raw.indexOf('?')) : raw if (path) decodeURI(path) } catch { res.statusCode = 400 res.setHeader('Content-Type', 'text/plain') res.end('Bad Request: malformed URI') return } next() } // Prepend so we run before Vite's static/transform middleware (which calls decodeURI) server.middlewares.stack.unshift({ route: '', handle: guard }) }, } }