UNPKG

@clerk/nextjs

Version:

Clerk SDK for NextJS

98 lines 3.84 kB
import "../chunk-BUSYA2B4.js"; import { constants, isTokenTypeAccepted, TokenType } from "@clerk/backend/internal"; import { constants as nextConstants } from "../constants"; import { isNextFetcher } from "./nextFetcher"; function createProtect(opts) { const { redirectToSignIn, authObject, redirect, notFound, request, unauthorized } = opts; return async (...args) => { var _a, _b, _c, _d, _e, _f; const paramsOrFunction = getAuthorizationParams(args[0]); const unauthenticatedUrl = ((_a = args[0]) == null ? void 0 : _a.unauthenticatedUrl) || ((_b = args[1]) == null ? void 0 : _b.unauthenticatedUrl); const unauthorizedUrl = ((_c = args[0]) == null ? void 0 : _c.unauthorizedUrl) || ((_d = args[1]) == null ? void 0 : _d.unauthorizedUrl); const requestedToken = ((_e = args[0]) == null ? void 0 : _e.token) || ((_f = args[1]) == null ? void 0 : _f.token) || TokenType.SessionToken; const handleUnauthenticated = () => { if (unauthenticatedUrl) { return redirect(unauthenticatedUrl); } if (isPageRequest(request)) { return redirectToSignIn(); } return notFound(); }; const handleUnauthorized = () => { if (authObject.tokenType !== TokenType.SessionToken) { return unauthorized(); } if (unauthorizedUrl) { return redirect(unauthorizedUrl); } return notFound(); }; if (!isTokenTypeAccepted(authObject.tokenType, requestedToken)) { return handleUnauthorized(); } if (authObject.tokenType !== TokenType.SessionToken) { if (!authObject.isAuthenticated) { return handleUnauthorized(); } return authObject; } if (authObject.sessionStatus === "pending") { return handleUnauthenticated(); } if (!authObject.userId) { return handleUnauthenticated(); } if (!paramsOrFunction) { return authObject; } if (typeof paramsOrFunction === "function") { if (paramsOrFunction(authObject.has)) { return authObject; } return handleUnauthorized(); } if (authObject.has(paramsOrFunction)) { return authObject; } return handleUnauthorized(); }; } const getAuthorizationParams = (arg) => { if (!arg) { return void 0; } if (arg.unauthenticatedUrl || arg.unauthorizedUrl || arg.token) { return void 0; } if (Object.keys(arg).length === 1 && "token" in arg) { return void 0; } return arg; }; const isServerActionRequest = (req) => { var _a, _b; return !!req.headers.get(nextConstants.Headers.NextUrl) && (((_a = req.headers.get(constants.Headers.Accept)) == null ? void 0 : _a.includes("text/x-component")) || ((_b = req.headers.get(constants.Headers.ContentType)) == null ? void 0 : _b.includes("multipart/form-data")) || !!req.headers.get(nextConstants.Headers.NextAction)); }; const isPageRequest = (req) => { var _a; return req.headers.get(constants.Headers.SecFetchDest) === "document" || req.headers.get(constants.Headers.SecFetchDest) === "iframe" || ((_a = req.headers.get(constants.Headers.Accept)) == null ? void 0 : _a.includes("text/html")) || isAppRouterInternalNavigation(req) || isPagesRouterInternalNavigation(req); }; const isAppRouterInternalNavigation = (req) => !!req.headers.get(nextConstants.Headers.NextUrl) && !isServerActionRequest(req) || isPagePathAvailable(); const isPagePathAvailable = () => { const __fetch = globalThis.fetch; if (!isNextFetcher(__fetch)) { return false; } const { page, pagePath } = __fetch.__nextGetStaticStore().getStore() || {}; return Boolean( // available on next@14 pagePath || // available on next@15 page ); }; const isPagesRouterInternalNavigation = (req) => !!req.headers.get(nextConstants.Headers.NextjsData); export { createProtect }; //# sourceMappingURL=protect.js.map