113 lines
3.8 KiB
Plaintext
113 lines
3.8 KiB
Plaintext
import { RequestCookies } from "next/dist/compiled/@edge-runtime/cookies";
|
|
import { NextURL } from "../../../../web/next-url";
|
|
import { cleanURL } from "./clean-url";
|
|
export function proxyRequest(request, { dynamic }, hooks) {
|
|
function handleNextUrlBailout(prop) {
|
|
switch(prop){
|
|
case "search":
|
|
case "searchParams":
|
|
case "toString":
|
|
case "href":
|
|
case "origin":
|
|
hooks.staticGenerationBailout(`nextUrl.${prop}`);
|
|
return;
|
|
default:
|
|
return;
|
|
}
|
|
}
|
|
const cache = {};
|
|
const handleForceStatic = (url, prop)=>{
|
|
switch(prop){
|
|
case "search":
|
|
return "";
|
|
case "searchParams":
|
|
if (!cache.searchParams) cache.searchParams = new URLSearchParams();
|
|
return cache.searchParams;
|
|
case "url":
|
|
case "href":
|
|
if (!cache.url) cache.url = cleanURL(url);
|
|
return cache.url;
|
|
case "toJSON":
|
|
case "toString":
|
|
if (!cache.url) cache.url = cleanURL(url);
|
|
if (!cache.toString) cache.toString = ()=>cache.url;
|
|
return cache.toString;
|
|
case "headers":
|
|
if (!cache.headers) cache.headers = new Headers();
|
|
return cache.headers;
|
|
case "cookies":
|
|
if (!cache.headers) cache.headers = new Headers();
|
|
if (!cache.cookies) cache.cookies = new RequestCookies(cache.headers);
|
|
return cache.cookies;
|
|
case "clone":
|
|
if (!cache.url) cache.url = cleanURL(url);
|
|
return ()=>new NextURL(cache.url);
|
|
default:
|
|
break;
|
|
}
|
|
};
|
|
const wrappedNextUrl = new Proxy(request.nextUrl, {
|
|
get (target, prop) {
|
|
handleNextUrlBailout(prop);
|
|
if (dynamic === "force-static" && typeof prop === "string") {
|
|
const result = handleForceStatic(target.href, prop);
|
|
if (result !== undefined) return result;
|
|
}
|
|
const value = target[prop];
|
|
if (typeof value === "function") {
|
|
return value.bind(target);
|
|
}
|
|
return value;
|
|
},
|
|
set (target, prop, value) {
|
|
handleNextUrlBailout(prop);
|
|
target[prop] = value;
|
|
return true;
|
|
}
|
|
});
|
|
const handleReqBailout = (prop)=>{
|
|
switch(prop){
|
|
case "headers":
|
|
hooks.headerHooks.headers();
|
|
return;
|
|
// if request.url is accessed directly instead of
|
|
// request.nextUrl we bail since it includes query
|
|
// values that can be relied on dynamically
|
|
case "url":
|
|
case "body":
|
|
case "blob":
|
|
case "json":
|
|
case "text":
|
|
case "arrayBuffer":
|
|
case "formData":
|
|
hooks.staticGenerationBailout(`request.${prop}`);
|
|
return;
|
|
default:
|
|
return;
|
|
}
|
|
};
|
|
return new Proxy(request, {
|
|
get (target, prop) {
|
|
handleReqBailout(prop);
|
|
if (prop === "nextUrl") {
|
|
return wrappedNextUrl;
|
|
}
|
|
if (dynamic === "force-static" && typeof prop === "string") {
|
|
const result = handleForceStatic(target.url, prop);
|
|
if (result !== undefined) return result;
|
|
}
|
|
const value = target[prop];
|
|
if (typeof value === "function") {
|
|
return value.bind(target);
|
|
}
|
|
return value;
|
|
},
|
|
set (target, prop, value) {
|
|
handleReqBailout(prop);
|
|
target[prop] = value;
|
|
return true;
|
|
}
|
|
});
|
|
}
|
|
|
|
//# sourceMappingURL=proxy-request.js.map |