59 lines
1.4 KiB
JavaScript
59 lines
1.4 KiB
JavaScript
import * as fs from "node:fs";
|
|
import { notFoundTemplate } from "../template/4xx.js";
|
|
import { writeHtmlResponse } from "./response.js";
|
|
const VITE_INTERNAL_PREFIXES = [
|
|
"/@vite/",
|
|
"/@fs/",
|
|
"/@id/",
|
|
"/__vite",
|
|
"/@react-refresh",
|
|
"/node_modules/",
|
|
"/.astro/"
|
|
];
|
|
function routeGuardMiddleware(settings) {
|
|
const { config } = settings;
|
|
return function devRouteGuard(req, res, next) {
|
|
const url = req.url;
|
|
if (!url) {
|
|
return next();
|
|
}
|
|
const accept = req.headers.accept || "";
|
|
if (!accept.includes("text/html")) {
|
|
return next();
|
|
}
|
|
let pathname;
|
|
try {
|
|
pathname = decodeURI(new URL(url, "http://localhost").pathname);
|
|
} catch {
|
|
return next();
|
|
}
|
|
if (VITE_INTERNAL_PREFIXES.some((prefix) => pathname.startsWith(prefix))) {
|
|
return next();
|
|
}
|
|
if (url.includes("?")) {
|
|
return next();
|
|
}
|
|
const publicFilePath = new URL("." + pathname, config.publicDir);
|
|
if (fs.existsSync(publicFilePath)) {
|
|
return next();
|
|
}
|
|
const srcFilePath = new URL("." + pathname, config.srcDir);
|
|
if (fs.existsSync(srcFilePath)) {
|
|
return next();
|
|
}
|
|
const rootFilePath = new URL("." + pathname, config.root);
|
|
try {
|
|
const stat = fs.statSync(rootFilePath);
|
|
if (stat.isFile()) {
|
|
const html = notFoundTemplate(pathname);
|
|
return writeHtmlResponse(res, 404, html);
|
|
}
|
|
} catch {
|
|
}
|
|
return next();
|
|
};
|
|
}
|
|
export {
|
|
routeGuardMiddleware
|
|
};
|