authrix
Version:
Lightweight, flexible authentication library for Node.js and TypeScript.
2 lines • 4.88 kB
JavaScript
;var l="https://api.github.com",s={AUTHORIZE:"https://github.com/login/oauth/authorize",TOKEN:"https://github.com/login/oauth/access_token",USER:`${l}/user`,EMAILS:`${l}/user/emails`,REVOKE:(t,e)=>`${l}/applications/${t}/token`},h=["read:user","user:email"],u=null;function d(){if(u)return u;let t=process.env.GITHUB_CLIENT_ID,e=process.env.GITHUB_CLIENT_SECRET,i=process.env.GITHUB_REDIRECT_URI||process.env.GITHUB_OAUTH_REDIRECT_URI;if(!t||!e||!i){let r=[];throw t||r.push("GITHUB_CLIENT_ID"),e||r.push("GITHUB_CLIENT_SECRET"),i||r.push("GITHUB_REDIRECT_URI"),new Error(`Missing GitHub OAuth environment variables: ${r.join(", ")}. These are required when using GitHub OAuth functionality. Visit https://github.com/settings/developers to create an OAuth App and obtain these values.`)}return u={clientId:t,clientSecret:e,redirectUri:i},u}async function g(t,e,i={}){let r=await fetch(t,{...i,headers:{Authorization:`Bearer ${e}`,Accept:"application/vnd.github.v3+json","X-GitHub-Api-Version":"2022-11-28",...i.headers}});if(!r.ok){let o=await r.text(),n=`GitHub API request failed: ${r.status}`;try{n=JSON.parse(o).message||n;}catch{}throw new Error(n)}return r.json()}function E(t={}){let e=d(),i=new URLSearchParams({client_id:e.clientId,redirect_uri:t.redirectUri||e.redirectUri,scope:(t.scopes||h).join(" ")});return t.state&&i.set("state",t.state),t.login&&i.set("login",t.login),t.allowSignup!==void 0&&i.set("allow_signup",String(t.allowSignup)),`${s.AUTHORIZE}?${i.toString()}`}async function _(t,e={}){let i=d();try{let r=await fetch(s.TOKEN,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({client_id:i.clientId,client_secret:i.clientSecret,code:t,redirect_uri:e.redirectUri||i.redirectUri,...e.state&&{state:e.state}})});if(!r.ok){let a=await r.text();throw new Error(`Token exchange failed: ${r.status} - ${a}`)}let o=await r.json();if(o.error)throw new Error(`GitHub OAuth error: ${o.error_description||o.error}`);if(!o.access_token)throw new Error("No access token received from GitHub");let[n,c]=await Promise.all([g(s.USER,o.access_token),g(s.EMAILS,o.access_token)]),m=c.find(a=>a.primary&&a.verified),p=c.filter(a=>a.verified);if(!m&&!e.skipEmailVerification)throw new Error("No verified primary email found. Please verify your email on GitHub.");let f=m?.email||p[0]?.email||n.email||c[0]?.email;if(!f)throw new Error("No email address found for this GitHub account.");let b={id:n.id.toString(),email:f,username:n.login,name:n.name||n.login,avatar:n.avatar_url,provider:"github",emailVerified:m?.verified||!1,metadata:{bio:n.bio||void 0,company:n.company||void 0,location:n.location||void 0,blog:n.blog||void 0,twitterUsername:n.twitter_username||void 0,publicRepos:n.public_repos,followers:n.followers,following:n.following,createdAt:n.created_at,twoFactorEnabled:n.two_factor_authentication,...e.fetchAllEmails&&{emails:c.map(a=>({email:a.email,verified:a.verified,primary:a.primary}))}}};return e.includeToken?{...b,token:o.access_token}:b}catch(r){throw r instanceof Error?r.message.includes("fetch")?new Error("Network error during GitHub authentication. Please try again."):r.message.includes("401")||r.message.includes("403")?new Error("GitHub authentication failed. Please try again."):r.message.includes("rate limit")?new Error("Too many requests. Please try again later."):new Error(`GitHub authentication failed: ${r.message}`):new Error("An unexpected error occurred during GitHub authentication.")}}async function H(t,e,i){try{let r=e&&i?{clientId:e,clientSecret:i,redirectUri:""}:d();return (await fetch(s.REVOKE(r.clientId,t),{method:"DELETE",headers:{Accept:"application/vnd.github.v3+json",Authorization:`Basic ${btoa(`${r.clientId}:${r.clientSecret}`)}`}})).status===204}catch{return false}}async function y(t){try{return await g(s.USER,t)}catch{return null}}async function w(t){try{return await g(`${l}/user/orgs`,t)}catch{return []}}async function G(t,e){try{return (await w(t)).some(r=>r.login.toLowerCase()===e.toLowerCase())}catch{return false}}function A(t){let e=crypto.getRandomValues(new Uint8Array(32)),i=Array.from(e,r=>r.toString(16).padStart(2,"0")).join("");if(t){let r=JSON.stringify(t),o=btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"");return `${i}.${o}`}return i}function U(t){let e=t.split(".");if(e.length===1)return {token:e[0]};try{let i=e[1],r=i+"=".repeat((4-i.length%4)%4),o=atob(r.replace(/-/g,"+").replace(/_/g,"/")),n=JSON.parse(o);return {token:e[0],data:n}}catch{return {token:e[0]}}}function T(){u=null;}async function v(t){try{let e=await g(`${l}/rate_limit`,t);return {limit:e.rate.limit,remaining:e.rate.remaining,reset:new Date(e.rate.reset*1e3)}}catch{return {limit:0,remaining:0,reset:new Date}}}
exports.a=E;exports.b=_;exports.c=H;exports.d=y;exports.e=w;exports.f=G;exports.g=A;exports.h=U;exports.i=T;exports.j=v;