UNPKG

authrix

Version:

Lightweight, flexible authentication library for Node.js and TypeScript.

1 lines 5.94 kB
import {a as a$1}from'./chunk-YS4LLLFP.mjs';import {a,e}from'./chunk-5NOQNI5F.mjs';import {b}from'./chunk-GACMQPPZ.mjs';import {randomUUID}from'crypto';async function l(e$1,n={}){let r=b.db;if(!r)throw new Error("Database not configured. Make sure initAuth() is called before using SSO functions.");let{autoCreateUser:a$2=true,updateExistingUser:o=false,requireVerifiedEmail:c=true,mergeUserData:g=true,customUserMapping:f}=n;if(!e$1.email)throw new Error(`${e$1.provider} SSO did not provide email address`);if(!e$1.id)throw new Error(`${e$1.provider} SSO did not provide user ID`);if(c&&e$1.verified===false)throw new Error(`${e$1.provider} SSO email is not verified`);let d=e$1.email.toLowerCase().trim(),t=await r.findUserByEmail(d),u=false;if(t){if(o&&g){let i={};if(f)Object.assign(i,f(e$1));else {if(e$1.name&&!t.firstName&&!t.lastName){let s=e$1.name.split(" ");i.firstName=s[0],s.length>1&&(i.lastName=s.slice(1).join(" "));}if(e$1.firstName&&!t.firstName&&(i.firstName=e$1.firstName),e$1.lastName&&!t.lastName&&(i.lastName=e$1.lastName),e$1.fullName&&!t.fullName&&(i.fullName=e$1.fullName),e$1.avatar&&!t.profilePicture&&(i.profilePicture=e$1.avatar),!t.username&&e$1.email){let m=e$1.email.split("@")[0].toLowerCase().replace(/[^a-z0-9]/g,"");try{r.findUserByUsername&&await r.findUserByUsername(m)?i.username=`${m}${Math.floor(Math.random()*1e3)}`:i.username=m;}catch{}}}if(Object.keys(i).length>0&&r.updateUser&&(t=await r.updateUser(t.id,i),!t))throw new Error("Failed to update user with SSO data")}}else {if(!a$2)throw new Error(`No account found for ${d}. Please create an account first.`);let i={email:d,password:await a(e(32),{skipValidation:true}),emailVerified:c?e$1.verified!==false:true,emailVerifiedAt:c&&e$1.verified!==false?new Date:void 0,authMethod:"sso",authProvider:e$1.provider};if(f)Object.assign(i,f(e$1));else {if(e$1.name){let s=e$1.name.split(" ");i.firstName=s[0],s.length>1&&(i.lastName=s.slice(1).join(" "));}if(e$1.firstName&&(i.firstName=e$1.firstName),e$1.lastName&&(i.lastName=e$1.lastName),e$1.fullName&&(i.fullName=e$1.fullName),e$1.avatar&&(i.profilePicture=e$1.avatar),e$1.email){let m=e$1.email.split("@")[0].toLowerCase().replace(/[^a-z0-9]/g,"");try{r.findUserByUsername&&await r.findUserByUsername(m)?i.username=`${m}${Math.floor(Math.random()*1e3)}`:i.username=m;}catch{}}}try{t=await r.createUser(i),u=!0;}catch(s){if(s instanceof Error&&s.message.includes("already exists")){if(t=await r.findUserByEmail(d),!t)throw new Error("Failed to create or find user after SSO authentication")}else throw new Error(`Failed to create user: ${s instanceof Error?s.message:"Unknown error"}`)}}let S={id:t.id,email:t.email,provider:e$1.provider};t.username&&(S.username=t.username);let v=a$1(S);return {user:{id:t.id,email:t.email,username:t.username,firstName:t.firstName,lastName:t.lastName,fullName:t.fullName,profilePicture:t.profilePicture,...t.authMethod?{authMethod:t.authMethod}:{},...t.authProvider?{authProvider:t.authProvider}:{}},token:v,cookieOptions:{httpOnly:true,secure:process.env.NODE_ENV==="production",maxAge:1e3*60*60*24*7,sameSite:"lax",path:"/"},isNewUser:u,provider:e$1.provider}}async function x(e,n={}){try{let{handleGoogleCallback:r}=await import('./providers/google.mjs'),a=await r(e),o={id:a.id,email:a.email,name:a.name,avatar:a.avatar,provider:"google",verified:!0};return l(o,n)}catch(r){throw new Error(`Google SSO failed: ${r instanceof Error?r.message:"Unknown error"}`)}}async function P(e,n={}){try{let{handleGitHubCallback:r}=await import('./providers/github.mjs'),a=await r(e),o={id:a.id,email:a.email,name:a.name,avatar:a.avatar,provider:"github",verified:!0};return l(o,n)}catch(r){throw new Error(`GitHub SSO failed: ${r instanceof Error?r.message:"Unknown error"}`)}}async function $(e,n={}){try{let{handleAppleCallback:r}=await import('./apple-NPMY3FCP.mjs'),a=await r(e),o={id:a.id,email:a.email||"",name:a.name,provider:"apple",verified:a.emailVerified};return l(o,n)}catch(r){throw new Error(`Apple SSO failed: ${r instanceof Error?r.message:"Unknown error"}`)}}async function D(e,n={}){try{let{handleDiscordCallback:r}=await import('./discord-WUGSCUEC.mjs'),a=await r(e),o={id:a.id,email:a.email||"",name:a.displayName||a.username,avatar:a.avatar,provider:"discord",verified:a.emailVerified};return l(o,n)}catch(r){throw new Error(`Discord SSO failed: ${r instanceof Error?r.message:"Unknown error"}`)}}async function C(e,n={}){try{let{handleFacebookCallback:r}=await import('./facebook-ITC2JFTE.mjs'),a=await r(e),o={id:a.id,email:a.email||"",name:a.name,avatar:a.avatar,provider:"facebook",verified:a.emailVerified};return l(o,n)}catch(r){throw new Error(`Facebook SSO failed: ${r instanceof Error?r.message:"Unknown error"}`)}}async function M(e,n={}){try{let{handleLinkedInCallback:r}=await import('./linkedin-3GHCAEJF.mjs'),a=await r(e),o={id:a.id,email:a.email,name:a.name,avatar:a.avatar,provider:"linkedin",verified:a.emailVerified};return l(o,n)}catch(r){throw new Error(`LinkedIn SSO failed: ${r instanceof Error?r.message:"Unknown error"}`)}}async function V(e,n,r={}){try{let{handleXCallback:a}=await import('./x-32WPG3VQ.mjs'),o=await a(e,n),c={id:o.id,email:o.email||"",name:o.name,avatar:o.avatar,provider:"x",verified:o.emailVerified};return l(c,r)}catch(a){throw new Error(`X SSO failed: ${a instanceof Error?a.message:"Unknown error"}`)}}async function R(e,n,r={}){let a={...n,provider:e};return l(a,r)}function A(e){let n={timestamp:Date.now(),nonce:randomUUID(),...e};return Buffer.from(JSON.stringify(n)).toString("base64url")}function B(e,n=3e5){try{let r=JSON.parse(Buffer.from(e,"base64url").toString());if(!r.timestamp||!r.nonce)throw new Error("Invalid state format");if(Date.now()-r.timestamp>n)throw new Error("State has expired");return r}catch(r){throw new Error(`Invalid SSO state: ${r instanceof Error?r.message:"Unknown error"}`)}}export{l as a,x as b,P as c,$ as d,D as e,C as f,M as g,V as h,R as i,A as j,B as k};