56 lines
2 KiB
JavaScript
56 lines
2 KiB
JavaScript
import * as fs from "node:fs";
|
|
import { warn } from "../core/logger/core.js";
|
|
import notFoundTemplate, { subpathNotUsedTemplate } from "../template/4xx.js";
|
|
import { log404 } from "./common.js";
|
|
import { writeHtmlResponse } from "./response.js";
|
|
function baseMiddleware(settings, logging) {
|
|
const { config } = settings;
|
|
const site = config.site ? new URL(config.base, config.site) : void 0;
|
|
const devRootURL = new URL(config.base, "http://localhost");
|
|
const devRoot = site ? site.pathname : devRootURL.pathname;
|
|
const devRootReplacement = devRoot.endsWith("/") ? "/" : "";
|
|
return function devBaseMiddleware(req, res, next) {
|
|
var _a;
|
|
const url = req.url;
|
|
const pathname = decodeURI(new URL(url, "http://localhost").pathname);
|
|
if (pathname.startsWith(devRoot)) {
|
|
req.url = url.replace(devRoot, devRootReplacement);
|
|
return next();
|
|
}
|
|
if (pathname === "/" || pathname === "/index.html") {
|
|
log404(logging, pathname);
|
|
const html = subpathNotUsedTemplate(devRoot, pathname);
|
|
return writeHtmlResponse(res, 404, html);
|
|
}
|
|
if ((_a = req.headers.accept) == null ? void 0 : _a.includes("text/html")) {
|
|
log404(logging, pathname);
|
|
const html = notFoundTemplate({
|
|
statusCode: 404,
|
|
title: "Not found",
|
|
tabTitle: "404: Not Found",
|
|
pathname
|
|
});
|
|
return writeHtmlResponse(res, 404, html);
|
|
}
|
|
const publicPath = new URL("." + req.url, config.publicDir);
|
|
fs.stat(publicPath, (_err, stats) => {
|
|
if (stats) {
|
|
const expectedLocation = new URL("." + url, devRootURL).pathname;
|
|
warn(
|
|
logging,
|
|
"dev",
|
|
`Requests for items in your public folder must also include your base. ${url} should be ${expectedLocation}. Omitting the base will break in production.`
|
|
);
|
|
res.writeHead(301, {
|
|
Location: expectedLocation
|
|
});
|
|
res.end();
|
|
} else {
|
|
next();
|
|
}
|
|
});
|
|
};
|
|
}
|
|
export {
|
|
baseMiddleware
|
|
};
|