@frank-auth/react
Version:
Flexible and customizable React UI components for Frank Authentication
3 lines (2 loc) • 6.32 kB
JavaScript
;Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=e=>{try{const t=e.split(".");if(t.length!==3)return null;const n=JSON.parse(atob(t[0])),i=JSON.parse(atob(t[1])),r=t[2];return{header:n,payload:i,signature:r}}catch{return null}},f=e=>{const t=s(e);if(!t)return!0;const n=Math.floor(Date.now()/1e3);return t.payload.exp<n},p=e=>{const t=s(e);return t?new Date(t.payload.exp*1e3):null},g=e=>{const t=s(e);if(!t)return 0;const n=Math.floor(Date.now()/1e3);return Math.max(0,t.payload.exp-n)},h=e=>{const t=new Date,n=new Date(e.expiresAt);return e.isActive&&n>t},l=e=>{const t=new Date,n=new Date(e.expiresAt);return Math.max(0,n.getTime()-t.getTime())},w=e=>{const t=l(e);if(t===0)return"Expired";const n=Math.floor(t/(1e3*60*60)),i=Math.floor(t%(1e3*60*60)/(1e3*60));return n>0?`${n}h ${i}m`:`${i}m`},d=e=>e.fullName?e.fullName:e.firstName&&e.lastName?`${e.firstName} ${e.lastName}`:e.firstName?e.firstName:e.username?e.username:e.emailAddress?e.emailAddress:"Unknown User",y=e=>d(e).split(" ").map(n=>n.charAt(0).toUpperCase()).slice(0,2).join(""),A=e=>e.emailVerified&&(e.phoneNumber?e.phoneVerified:!0),S=e=>{const t=[];return e.emailVerified||t.push("email"),e.phoneNumber&&!e.phoneVerified&&t.push("phone"),{isVerified:t.length===0,emailVerified:e.emailVerified,phoneVerified:e.phoneVerified,missingVerifications:t}},P=(e,t)=>e.organizations?e.organizations.some(n=>n.id===t):!1,b=(e,t)=>e.organizations&&e.organizations.find(i=>i.id===t)?.userRole||null,v=(e,t)=>e.organizations?e.organizations.find(i=>i.id===t)?.userPermissions||[]:[],a=(e,t,n)=>e.permissions?e.permissions.some(i=>i.permissionName!==t?!1:n?i.contextType==="organization"&&i.contextId===n:i.contextType==="system"):!1,o=(e,t,n)=>e.roles?e.roles.some(i=>i.roleName!==t?!1:n?i.contextType==="organization"&&i.contextId===n:i.contextType==="system"):!1,c=(e,t)=>t.ownerId===e.id,U=(e,t)=>c(e,t)||o(e,"admin",t.id)||a(e,"organization:manage",t.id),x=(e,t)=>c(e,t)||o(e,"admin",t.id)||a(e,"members:invite",t.id),k=e=>{const t={passkey:1,oauth:2,email:3,phone:4,username:5,mfa:6,magic_link:7};return e.sort((n,i)=>t[n]-t[i])},C=(e,t)=>t.includes(e),T=e=>({email:"Email",phone:"Phone",username:"Username",oauth:"Social Login",passkey:"Passkey",magic_link:"Magic Link",mfa:"Multi-Factor Authentication"})[e]||e,M=e=>{const t=[];let n=0;return e.length>=8?n+=1:t.push("Password must be at least 8 characters long"),/[a-z]/.test(e)?n+=1:t.push("Include lowercase letters"),/[A-Z]/.test(e)?n+=1:t.push("Include uppercase letters"),/\d/.test(e)?n+=1:t.push("Include numbers"),/[^A-Za-z0-9]/.test(e)?n+=1:t.push("Include special characters"),e.length>=12&&(n+=1),/(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/.test(e)&&(n+=1),{score:Math.min(n,5),feedback:t,isValid:n>=4}},O=e=>["Very Weak","Weak","Fair","Good","Strong"][Math.min(e,4)]||"Very Weak",N=e=>["password","123456","123456789","qwerty","abc123","password123","admin","letmein","welcome","monkey","1234567890","dragon","master","login","welcome123"].includes(e.toLowerCase()),V=e=>e.replace(/(.{4})/g,"$1-").replace(/-$/,""),z=e=>/^\d{6}$/.test(e),I=e=>/^\d{4,8}$/.test(e),E=e=>/^[A-Z0-9]{8}$/.test(e.replace(/-/g,"")),D=()=>{const e=navigator.userAgent;let t="unknown";/Mobile|Android|iPhone|iPad/.test(e)?t=/iPad/.test(e)?"tablet":"mobile":/Windows|Mac|Linux/.test(e)&&(t="desktop");let n;e.includes("Chrome")?n="Chrome":e.includes("Firefox")?n="Firefox":e.includes("Safari")?n="Safari":e.includes("Edge")&&(n="Edge");let i;return e.includes("Windows")?i="Windows":e.includes("Mac")?i="macOS":e.includes("Linux")?i="Linux":e.includes("Android")?i="Android":e.includes("iOS")&&(i="iOS"),{deviceType:t,browser:n,operatingSystem:i,userAgent:e}},R=()=>!!(window.PublicKeyCredential&&window.PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable&&window.PublicKeyCredential.isConditionalMediationAvailable),$=async()=>{if(!window.PublicKeyCredential)return{supported:!1,conditionalUI:!1,platformAuthenticator:!1};const[e,t]=await Promise.all([window.PublicKeyCredential.isConditionalMediationAvailable?.()||Promise.resolve(!1),window.PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable?.()||Promise.resolve(!1)]);return{supported:!0,conditionalUI:e,platformAuthenticator:t}},L=(e,t)=>{const n=new URL(e);for(const[i,r]of Object.entries(t))r!==void 0&&n.searchParams.set(i,r);return n.toString()},W=e=>{const t=new URL(e);return{code:t.searchParams.get("code")||void 0,state:t.searchParams.get("state")||void 0,error:t.searchParams.get("error")||void 0,error_description:t.searchParams.get("error_description")||void 0}},j=()=>{const e=new Uint8Array(32);return crypto.getRandomValues(e),Array.from(e,t=>t.toString(16).padStart(2,"0")).join("")},u=()=>window.isSecureContext,q=()=>{if(!u())throw new Error("This operation requires a secure context (HTTPS)")},K=(e,t)=>{try{const n=new URL(e);return t.some(i=>n.hostname===i||n.hostname.endsWith(`.${i}`))?e:null}catch{return null}},m=(e,t={})=>new CustomEvent(`frank-auth:${e}`,{detail:{timestamp:new Date().toISOString(),...t}}),B=(e,t={})=>{const n=m(e,t);window.dispatchEvent(n)};exports.buildRedirectUrl=L;exports.canUserAccessOrganization=P;exports.canUserInviteMembers=x;exports.canUserManageOrganization=U;exports.createAuthEvent=m;exports.decodeJWT=s;exports.dispatchAuthEvent=B;exports.formatBackupCode=V;exports.formatSessionDuration=w;exports.generateRandomState=j;exports.getAuthMethodDisplayName=T;exports.getDeviceInfo=D;exports.getPasskeySupport=$;exports.getPasswordStrengthLabel=O;exports.getRequiredAuthMethods=k;exports.getSessionTimeRemaining=l;exports.getTokenExpiration=p;exports.getTokenTimeToExpiry=g;exports.getUserDisplayName=d;exports.getUserInitials=y;exports.getUserPermissionsInOrganization=v;exports.getUserRoleInOrganization=b;exports.getUserVerificationStatus=S;exports.hasPermission=a;exports.hasRole=o;exports.isAuthMethodAvailable=C;exports.isCommonPassword=N;exports.isPasskeySupported=R;exports.isSecureContext=u;exports.isSessionActive=h;exports.isTokenExpired=f;exports.isUserOrganizationOwner=c;exports.isUserVerified=A;exports.parseAuthCallback=W;exports.requireSecureContext=q;exports.sanitizeRedirectUrl=K;exports.validateBackupCode=E;exports.validatePasswordStrength=M;exports.validateSMSCode=I;exports.validateTOTPCode=z;
//# sourceMappingURL=auth.cjs.map