@sentry/nextjs
Version:
Official Sentry SDK for Next.js
49 lines (46 loc) • 1.89 kB
JavaScript
import { isError } from '@sentry/core';
const MAX_CAUSE_DEPTH = 5;
function hasDigest(subject, predicate, depth = 0) {
if (!isError(subject)) {
return false;
}
const digest = subject.digest;
if (typeof digest === "string" && predicate(digest)) {
return true;
}
if (depth < MAX_CAUSE_DEPTH && "cause" in subject) {
return hasDigest(subject.cause, predicate, depth + 1);
}
return false;
}
function isNotFoundNavigationError(subject) {
return hasDigest(subject, (digest) => ["NEXT_NOT_FOUND", "NEXT_HTTP_ERROR_FALLBACK;404"].includes(digest));
}
function getAuthInterruptStatusCode(subject) {
if (hasDigest(subject, (digest) => digest === "NEXT_HTTP_ERROR_FALLBACK;403")) {
return 403;
}
if (hasDigest(subject, (digest) => digest === "NEXT_HTTP_ERROR_FALLBACK;401")) {
return 401;
}
return void 0;
}
function isRedirectNavigationError(subject) {
return hasDigest(subject, (digest) => digest.startsWith("NEXT_REDIRECT;"));
}
const PRERENDER_CONTROL_FLOW_DIGESTS = [
// Next.js hands out promises that never settle (e.g. from `fetch()` under Cache Components) and rejects
// them once the prerender is aborted. React discards them - anything else observing them must ignore them.
"HANGING_PROMISE_REJECTION",
// Thrown to abort a prerender the moment dynamic data is accessed.
"NEXT_PRERENDER_INTERRUPTED",
// Thrown to bail out of static generation into dynamic rendering.
"DYNAMIC_SERVER_USAGE",
// Thrown by `next/dynamic` to bail out of SSR into client-side rendering.
"BAILOUT_TO_CLIENT_SIDE_RENDERING"
];
function isPrerenderControlFlowError(subject) {
return hasDigest(subject, (digest) => PRERENDER_CONTROL_FLOW_DIGESTS.includes(digest));
}
export { getAuthInterruptStatusCode, isNotFoundNavigationError, isPrerenderControlFlowError, isRedirectNavigationError };
//# sourceMappingURL=nextNavigationErrorUtils.js.map