full site update

This commit is contained in:
2025-07-24 18:46:24 +02:00
parent bfe2b90d8d
commit 37a6e0ab31
6912 changed files with 540482 additions and 361712 deletions

View File

@@ -1,33 +1,36 @@
import { loadActions } from "../actions/loadActions.js";
import {
clientLocalsSymbol,
DEFAULT_404_COMPONENT,
NOOP_MIDDLEWARE_HEADER,
REROUTE_DIRECTIVE_HEADER,
REWRITE_DIRECTIVE_HEADER_KEY,
clientLocalsSymbol
REWRITE_DIRECTIVE_HEADER_KEY
} from "../core/constants.js";
import { AstroErrorData, isAstroError } from "../core/errors/index.js";
import { req } from "../core/messages.js";
import { loadMiddleware } from "../core/middleware/loadMiddleware.js";
import { RenderContext } from "../core/render-context.js";
import { routeIsRedirect } from "../core/redirects/index.js";
import { getProps } from "../core/render/index.js";
import { RenderContext } from "../core/render-context.js";
import { createRequest } from "../core/request.js";
import { redirectTemplate } from "../core/routing/3xx.js";
import { matchAllRoutes } from "../core/routing/index.js";
import { isRoute404, isRoute500 } from "../core/routing/match.js";
import { PERSIST_SYMBOL } from "../core/session.js";
import { getSortedPreloadedMatches } from "../prerender/routing.js";
import { writeSSRResult, writeWebResponse } from "./response.js";
function isLoggedRequest(url) {
return url !== "/favicon.ico";
}
function getCustom404Route(manifestData) {
const route404 = /^\/404\/?$/;
return manifestData.routes.find((r) => route404.test(r.route));
return manifestData.routes.find((r) => isRoute404(r.route));
}
function getCustom500Route(manifestData) {
const route500 = /^\/500\/?$/;
return manifestData.routes.find((r) => route500.test(r.route));
return manifestData.routes.find((r) => isRoute500(r.route));
}
async function matchRoute(pathname, manifestData, pipeline) {
async function matchRoute(pathname, routesList, pipeline) {
const { config, logger, routeCache, serverLike, settings } = pipeline;
const matches = matchAllRoutes(pathname, manifestData);
const matches = matchAllRoutes(pathname, routesList);
const preloadedMatches = await getSortedPreloadedMatches({ pipeline, matches, settings });
for await (const { preloadedComponent, route: maybeRoute, filePath } of preloadedMatches) {
try {
@@ -37,7 +40,8 @@ async function matchRoute(pathname, manifestData, pipeline) {
routeCache,
pathname,
logger,
serverLike
serverLike,
base: config.base
});
return {
route: maybeRoute,
@@ -55,7 +59,7 @@ async function matchRoute(pathname, manifestData, pipeline) {
}
const altPathname = pathname.replace(/\/index\.html$/, "/").replace(/\.html$/, "");
if (altPathname !== pathname) {
return await matchRoute(altPathname, manifestData, pipeline);
return await matchRoute(altPathname, routesList, pipeline);
}
if (matches.length) {
const possibleRoutes = matches.flatMap((route) => route.component);
@@ -68,7 +72,7 @@ async function matchRoute(pathname, manifestData, pipeline) {
${AstroErrorData.NoMatchingStaticPathFound.hint(possibleRoutes)}`
);
}
const custom404 = getCustom404Route(manifestData);
const custom404 = getCustom404Route(routesList);
if (custom404) {
const filePath = new URL(`./${custom404.component}`, config.root);
const preloadedComponent = await pipeline.preload(custom404, filePath);
@@ -88,7 +92,7 @@ async function handleRoute({
pathname,
body,
pipeline,
manifestData,
routesList,
incomingRequest,
incomingResponse
}) {
@@ -101,19 +105,20 @@ async function handleRoute({
let renderContext;
let mod = void 0;
let route;
const actions = await loadActions(loader);
pipeline.setActions(actions);
const middleware = (await loadMiddleware(loader)).onRequest;
const locals = Reflect.get(incomingRequest, clientLocalsSymbol);
const { preloadedComponent } = matchedRoute;
route = matchedRoute.route;
request = createRequest({
base: config.base,
url,
headers: incomingRequest.headers,
method: incomingRequest.method,
body,
logger,
clientAddress: incomingRequest.socket.remoteAddress,
staticLike: config.output === "static" || route.prerender
isPrerendered: route.prerender,
routePattern: route.component
});
for (const [name, value] of Object.entries(config.server.headers ?? {})) {
if (value) incomingResponse.setHeader(name, value);
@@ -125,7 +130,9 @@ async function handleRoute({
pathname,
middleware: isDefaultPrerendered404(matchedRoute.route) ? void 0 : middleware,
request,
routeData: route
routeData: route,
clientAddress: incomingRequest.socket.remoteAddress,
actions
});
let response;
let statusCode = 200;
@@ -145,7 +152,7 @@ async function handleRoute({
!response.headers.has(NOOP_MIDDLEWARE_HEADER) && !isReroute ? response.status : statusCodedMatched ?? response.status
);
} catch (err) {
const custom500 = getCustom500Route(manifestData);
const custom500 = getCustom500Route(routesList);
if (!custom500) {
throw err;
}
@@ -155,6 +162,8 @@ async function handleRoute({
renderContext.props.error = err;
response = await renderContext.render(preloaded500Component);
statusCode = 500;
} finally {
renderContext.session?.[PERSIST_SYMBOL]();
}
if (isLoggedRequest(pathname)) {
const timeEnd = performance.now();
@@ -169,8 +178,10 @@ async function handleRoute({
})
);
}
if (statusCode === 404 && response.headers.get(REROUTE_DIRECTIVE_HEADER) !== "no") {
const fourOhFourRoute = await matchRoute("/404", manifestData, pipeline);
if (statusCode === 404 && // If the body isn't null, that means the user sets the 404 status
// but uses the current route to handle the 404
response.body === null && response.headers.get(REROUTE_DIRECTIVE_HEADER) !== "no") {
const fourOhFourRoute = await matchRoute("/404", routesList, pipeline);
if (fourOhFourRoute) {
renderContext = await RenderContext.create({
locals,
@@ -178,7 +189,8 @@ async function handleRoute({
pathname,
middleware: isDefaultPrerendered404(fourOhFourRoute.route) ? void 0 : middleware,
request,
routeData: fourOhFourRoute.route
routeData: fourOhFourRoute.route,
clientAddress: incomingRequest.socket.remoteAddress
});
response = await renderContext.render(fourOhFourRoute.preloadedComponent);
}
@@ -198,6 +210,24 @@ async function handleRoute({
return;
}
if (response.status < 400 && response.status >= 300) {
if (response.status >= 300 && response.status < 400 && routeIsRedirect(route) && !config.build.redirects && pipeline.settings.buildOutput === "static") {
const location = response.headers.get("location");
response = new Response(
redirectTemplate({
status: response.status,
absoluteLocation: location,
relativeLocation: location,
from: pathname
}),
{
status: 200,
headers: {
...response.headers,
"content-type": "text/html"
}
}
);
}
await writeSSRResult(request, response, incomingResponse);
return;
}