astro
Version:
Astro is a modern site builder with web best practices, performance, and DX front-of-mind.
52 lines (51 loc) • 1.69 kB
JavaScript
function redirectIsExternal(redirect) {
if (typeof redirect === "string") {
return redirect.startsWith("http://") || redirect.startsWith("https://");
} else {
return redirect.destination.startsWith("http://") || redirect.destination.startsWith("https://");
}
}
async function renderRedirect(renderContext) {
const {
request: { method },
routeData
} = renderContext;
const { redirect, redirectRoute } = routeData;
const status = redirectRoute && typeof redirect === "object" ? redirect.status : method === "GET" ? 301 : 308;
const headers = { location: encodeURI(redirectRouteGenerate(renderContext)) };
if (redirect && redirectIsExternal(redirect)) {
if (typeof redirect === "string") {
return Response.redirect(redirect, status);
} else {
return Response.redirect(redirect.destination, status);
}
}
return new Response(null, { status, headers });
}
function redirectRouteGenerate(renderContext) {
const {
params,
routeData: { redirect, redirectRoute }
} = renderContext;
if (typeof redirectRoute !== "undefined") {
return redirectRoute?.generate(params) || redirectRoute?.pathname || "/";
} else if (typeof redirect === "string") {
if (redirectIsExternal(redirect)) {
return redirect;
} else {
let target = redirect;
for (const param of Object.keys(params)) {
const paramValue = params[param];
target = target.replace(`[${param}]`, paramValue).replace(`[...${param}]`, paramValue);
}
return target;
}
} else if (typeof redirect === "undefined") {
return "/";
}
return redirect.destination;
}
export {
redirectIsExternal,
renderRedirect
};