better-auth 0.5.1-beta.2 → 0.5.1-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { A as Adapter } from '../auth-D8X910LZ.js';
1
+ import { A as Adapter } from '../auth-BygKDI7g.js';
2
2
  import 'zod';
3
3
  import 'kysely';
4
4
  import '../schema-Dkt0LqYs.js';
@@ -1,5 +1,5 @@
1
1
  import { Kysely } from 'kysely';
2
- import { B as BetterAuthOptions, K as KyselyDatabaseType, F as FieldAttribute, A as Adapter } from '../auth-D8X910LZ.js';
2
+ import { B as BetterAuthOptions, K as KyselyDatabaseType, F as FieldAttribute, A as Adapter } from '../auth-BygKDI7g.js';
3
3
  import 'zod';
4
4
  import '../schema-Dkt0LqYs.js';
5
5
  import 'better-call';
@@ -1,5 +1,5 @@
1
1
  import { Db } from 'mongodb';
2
- import { W as Where } from '../auth-D8X910LZ.js';
2
+ import { W as Where } from '../auth-BygKDI7g.js';
3
3
  import 'zod';
4
4
  import 'kysely';
5
5
  import '../schema-Dkt0LqYs.js';
@@ -1,4 +1,4 @@
1
- import { A as Adapter } from '../auth-D8X910LZ.js';
1
+ import { A as Adapter } from '../auth-BygKDI7g.js';
2
2
  import 'zod';
3
3
  import 'kysely';
4
4
  import '../schema-Dkt0LqYs.js';
package/dist/api.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { e as AuthEndpoint, f as AuthMiddleware, a1 as callbackOAuth, aj as changeEmail, ag as changePassword, d as createAuthEndpoint, c as createAuthMiddleware, ac as createEmailVerificationToken, ao as csrfMiddleware, ai as deleteUser, al as error, a9 as forgetPassword, aa as forgetPasswordCallback, ak as getCSRFToken, Z as getEndpoints, a2 as getSession, a3 as getSessionFromCtx, a5 as listSessions, am as ok, o as optionsMiddleware, ab as resetPassword, a6 as revokeSession, a7 as revokeSessions, _ as router, ad as sendVerificationEmail, a4 as sessionMiddleware, ah as setPassword, a0 as signInEmail, $ as signInOAuth, a8 as signOut, an as signUpEmail, af as updateUser, ae as verifyEmail } from './auth-D8X910LZ.js';
1
+ export { e as AuthEndpoint, f as AuthMiddleware, a1 as callbackOAuth, aj as changeEmail, ag as changePassword, d as createAuthEndpoint, c as createAuthMiddleware, ac as createEmailVerificationToken, ao as csrfMiddleware, ai as deleteUser, al as error, a9 as forgetPassword, aa as forgetPasswordCallback, ak as getCSRFToken, Z as getEndpoints, a2 as getSession, a3 as getSessionFromCtx, a5 as listSessions, am as ok, o as optionsMiddleware, ab as resetPassword, a6 as revokeSession, a7 as revokeSessions, _ as router, ad as sendVerificationEmail, a4 as sessionMiddleware, ah as setPassword, a0 as signInEmail, $ as signInOAuth, a8 as signOut, an as signUpEmail, af as updateUser, ae as verifyEmail } from './auth-BygKDI7g.js';
2
2
  import './helper-DPDj8Nix.js';
3
3
  export { APIError } from 'better-call';
4
4
  import 'zod';
package/dist/api.js CHANGED
@@ -1,4 +1,4 @@
1
- import{APIError as et,createRouter as $t,statusCode as Vt}from"better-call";import{APIError as W}from"better-call";import{z as se}from"zod";import{xchacha20poly1305 as Jt}from"@noble/ciphers/chacha";import{bytesToHex as Xt,hexToBytes as Yt,utf8ToBytes as er}from"@noble/ciphers/utils";import{managedNonce as rr}from"@noble/ciphers/webcrypto";import{sha256 as nr}from"oslo/crypto";function Z(e,t){let r=new Uint8Array(e),o=new Uint8Array(t);if(r.length!==o.length)return!1;let n=0;for(let i=0;i<r.length;i++)n|=r[i]^o[i];return n===0}import{decodeHex as Nt,encodeHex as Mt}from"oslo/encoding";import{scryptAsync as Qt}from"@noble/hashes/scrypt";function tt(e){return e.toString(2).padStart(8,"0")}function rt(e){return[...e].map(t=>tt(t)).join("")}function te(e){return parseInt(rt(e),2)}function ot(e){if(e<0||!Number.isInteger(e))throw new Error("Argument 'max' must be an integer greater than or equal to 0");let t=(e-1).toString(2).length,r=t%8,o=new Uint8Array(Math.ceil(t/8));crypto.getRandomValues(o),r!==0&&(o[0]&=(1<<r)-1);let n=te(o);for(;n>=e;)crypto.getRandomValues(o),r!==0&&(o[0]&=(1<<r)-1),n=te(o);return n}function re(e,t){let r="";for(let o=0;o<e;o++)r+=t[ot(t.length)];return r}function oe(...e){let t=new Set(e),r="";for(let o of t)o==="a-z"?r+="abcdefghijklmnopqrstuvwxyz":o==="A-Z"?r+="ABCDEFGHIJKLMNOPQRSTUVWXYZ":o==="0-9"?r+="0123456789":r+=o;return r}async function N(e,t){let r=new TextEncoder,o={name:"HMAC",hash:"SHA-256"},n=await crypto.subtle.importKey("raw",r.encode(e),o,!1,["sign","verify"]),i=await crypto.subtle.sign(o.name,n,r.encode(t));return btoa(String.fromCharCode(...new Uint8Array(i)))}import{createEndpointCreator as nt,createMiddleware as ne,createMiddlewareCreator as it}from"better-call";var ie=ne(async()=>({})),$=it({use:[ie,ne(async()=>({}))]}),p=nt({use:[ie]});var ae=$({body:se.object({csrfToken:se.string().optional()}).optional()},async e=>{if(e.request?.method!=="POST"||e.context.options.advanced?.disableCSRFCheck)return;let t=new URL(e.request.url);if(e.context.trustedOrigins.includes(t.origin))return;let r=e.body?.csrfToken;if(!r)throw new W("UNAUTHORIZED",{message:"CSRF Token is required"});let o=await e.getSignedCookie(e.context.authCookies.csrfToken.name,e.context.secret),[n,i]=o?.split("!")||[null,null];if(!r||!o||!n||!i||n!==r)throw e.setCookie(e.context.authCookies.csrfToken.name,"",{maxAge:0}),new W("UNAUTHORIZED",{message:"Invalid CSRF Token"});let s=await N(e.context.secret,n);if(i!==s)throw e.setCookie(e.context.authCookies.csrfToken.name,"",{maxAge:0}),new W("UNAUTHORIZED",{message:"Invalid CSRF Token"})});import{APIError as P}from"better-call";import{generateCodeVerifier as vt}from"oslo/oauth2";import{z as x}from"zod";import{generateState as st}from"oslo/oauth2";import{z as M}from"zod";import{sha256 as ce}from"oslo/crypto";async function de(e){let t=await ce(typeof e=="string"?new TextEncoder().encode(e):e);return Buffer.from(t).toString("base64")}async function le(e,t){let r=await ce(typeof e=="string"?new TextEncoder().encode(e):e),o=Buffer.from(t,"base64");return Z(r,o)}import"better-call";async function ue(e){let t=st(),r=JSON.stringify({code:t,callbackURL:e}),o=await de(r);return{raw:r,hash:o}}function J(e){return M.object({code:M.string(),callbackURL:M.string().optional(),currentURL:M.string().optional()}).safeParse(JSON.parse(e))}import{TimeSpan as Pr}from"oslo";var C=class extends Error{constructor(t,r){super(t),this.name="BetterAuthError",this.message=t,this.cause=r,this.stack=""}};async function _(e,t,r,o){let n=e.context.authCookies.sessionToken.options;n.maxAge=r?void 0:e.context.sessionConfig.expiresIn,await e.setSignedCookie(e.context.authCookies.sessionToken.name,t,e.context.secret,{...n,...o}),r&&await e.setSignedCookie(e.context.authCookies.dontRememberToken.name,"true",e.context.secret,e.context.authCookies.dontRememberToken.options)}function j(e){e.setCookie(e.context.authCookies.sessionToken.name,"",{maxAge:0}),e.setCookie(e.context.authCookies.dontRememberToken.name,"",{maxAge:0})}import{APIError as pe}from"better-call";import{createConsola as at}from"consola";var B=at({formatOptions:{date:!1,colors:!0,compact:!0},defaults:{tag:"Better Auth"}}),ct=e=>({log:(...t)=>{!e?.disabled&&B.log("",...t)},error:(...t)=>{!e?.disabled&&B.error("",...t)},warn:(...t)=>{!e?.disabled&&B.warn("",...t)},info:(...t)=>{!e?.disabled&&B.info("",...t)},debug:(...t)=>{!e?.disabled&&B.debug("",...t)},box:(...t)=>{!e?.disabled&&B.box("",...t)},success:(...t)=>{!e?.disabled&&B.success("",...t)},break:(...t)=>{!e?.disabled&&console.log(`
1
+ import{APIError as et,createRouter as $t,statusCode as Vt}from"better-call";import{APIError as W}from"better-call";import{z as se}from"zod";import{xchacha20poly1305 as Jt}from"@noble/ciphers/chacha";import{bytesToHex as Xt,hexToBytes as Yt,utf8ToBytes as er}from"@noble/ciphers/utils";import{managedNonce as rr}from"@noble/ciphers/webcrypto";import{sha256 as nr}from"oslo/crypto";function Z(e,t){let r=new Uint8Array(e),o=new Uint8Array(t);if(r.length!==o.length)return!1;let n=0;for(let i=0;i<r.length;i++)n|=r[i]^o[i];return n===0}import{decodeHex as Nt,encodeHex as Mt}from"oslo/encoding";import{scryptAsync as Qt}from"@noble/hashes/scrypt";function tt(e){return e.toString(2).padStart(8,"0")}function rt(e){return[...e].map(t=>tt(t)).join("")}function te(e){return parseInt(rt(e),2)}function ot(e){if(e<0||!Number.isInteger(e))throw new Error("Argument 'max' must be an integer greater than or equal to 0");let t=(e-1).toString(2).length,r=t%8,o=new Uint8Array(Math.ceil(t/8));crypto.getRandomValues(o),r!==0&&(o[0]&=(1<<r)-1);let n=te(o);for(;n>=e;)crypto.getRandomValues(o),r!==0&&(o[0]&=(1<<r)-1),n=te(o);return n}function re(e,t){let r="";for(let o=0;o<e;o++)r+=t[ot(t.length)];return r}function oe(...e){let t=new Set(e),r="";for(let o of t)o==="a-z"?r+="abcdefghijklmnopqrstuvwxyz":o==="A-Z"?r+="ABCDEFGHIJKLMNOPQRSTUVWXYZ":o==="0-9"?r+="0123456789":r+=o;return r}async function N(e,t){let r=new TextEncoder,o={name:"HMAC",hash:"SHA-256"},n=await crypto.subtle.importKey("raw",r.encode(e),o,!1,["sign","verify"]),i=await crypto.subtle.sign(o.name,n,r.encode(t));return btoa(String.fromCharCode(...new Uint8Array(i)))}import{createEndpointCreator as nt,createMiddleware as ne,createMiddlewareCreator as it}from"better-call";var ie=ne(async()=>({})),$=it({use:[ie,ne(async()=>({}))]}),p=nt({use:[ie]});var ae=$({body:se.object({csrfToken:se.string().optional()}).optional()},async e=>{if(e.request?.method!=="POST"||e.context.options.advanced?.disableCSRFCheck)return;let t=new URL(e.request.url);if(e.context.trustedOrigins.includes(t.origin))return;let r=e.body?.csrfToken;if(!r)throw new W("UNAUTHORIZED",{message:"CSRF Token is required"});let o=await e.getSignedCookie(e.context.authCookies.csrfToken.name,e.context.secret),[n,i]=o?.split("!")||[null,null];if(!r||!n||!i||n!==r)throw e.setCookie(e.context.authCookies.csrfToken.name,"",{maxAge:0}),new W("UNAUTHORIZED",{message:"Invalid CSRF Token"});let s=await N(e.context.secret,n);if(i!==s)throw e.setCookie(e.context.authCookies.csrfToken.name,"",{maxAge:0}),new W("UNAUTHORIZED",{message:"Invalid CSRF Token"})});import{APIError as P}from"better-call";import{generateCodeVerifier as vt}from"oslo/oauth2";import{z as x}from"zod";import{generateState as st}from"oslo/oauth2";import{z as M}from"zod";import{sha256 as ce}from"oslo/crypto";async function de(e){let t=await ce(typeof e=="string"?new TextEncoder().encode(e):e);return Buffer.from(t).toString("base64")}async function le(e,t){let r=await ce(typeof e=="string"?new TextEncoder().encode(e):e),o=Buffer.from(t,"base64");return Z(r,o)}import"better-call";async function ue(e){let t=st(),r=JSON.stringify({code:t,callbackURL:e}),o=await de(r);return{raw:r,hash:o}}function J(e){return M.object({code:M.string(),callbackURL:M.string().optional(),currentURL:M.string().optional()}).safeParse(JSON.parse(e))}import{TimeSpan as Pr}from"oslo";var C=class extends Error{constructor(t,r){super(t),this.name="BetterAuthError",this.message=t,this.cause=r,this.stack=""}};async function _(e,t,r,o){let n=e.context.authCookies.sessionToken.options;n.maxAge=r?void 0:e.context.sessionConfig.expiresIn,await e.setSignedCookie(e.context.authCookies.sessionToken.name,t,e.context.secret,{...n,...o}),r&&await e.setSignedCookie(e.context.authCookies.dontRememberToken.name,"true",e.context.secret,e.context.authCookies.dontRememberToken.options)}function j(e){e.setCookie(e.context.authCookies.sessionToken.name,"",{maxAge:0}),e.setCookie(e.context.authCookies.dontRememberToken.name,"",{maxAge:0})}import{APIError as pe}from"better-call";import{createConsola as at}from"consola";var B=at({formatOptions:{date:!1,colors:!0,compact:!0},defaults:{tag:"Better Auth"}}),ct=e=>({log:(...t)=>{!e?.disabled&&B.log("",...t)},error:(...t)=>{!e?.disabled&&B.error("",...t)},warn:(...t)=>{!e?.disabled&&B.warn("",...t)},info:(...t)=>{!e?.disabled&&B.info("",...t)},debug:(...t)=>{!e?.disabled&&B.debug("",...t)},box:(...t)=>{!e?.disabled&&B.box("",...t)},success:(...t)=>{!e?.disabled&&B.success("",...t)},break:(...t)=>{!e?.disabled&&console.log(`
2
2
  `)}}),y=ct();var U=$(async e=>{let t=e.body?.callbackURL||e.query?.callbackURL||e.query?.redirectTo||e.body?.redirectTo,r=e.headers?.get("referer"),o=e.query?.currentURL||r||e.context.baseURL,n=e.context.trustedOrigins;if(t?.includes("http")){let i=new URL(t).origin;if(!n.includes(i))throw y.error("Invalid callback URL",{callbackURL:t,trustedOrigins:n}),new pe("FORBIDDEN",{message:"Invalid callback URL"})}if(o!==e.context.baseURL){let i=new URL(o).origin;if(!n.includes(i))throw y.error("Invalid current URL",{currentURL:o,trustedOrigins:n}),new pe("FORBIDDEN",{message:"Invalid callback URL"})}});import{parseJWT as pt}from"oslo/jwt";import{sha256 as dt}from"oslo/crypto";import{base64url as lt}from"oslo/encoding";async function me(e){let t=await dt(new TextEncoder().encode(e));return lt.encode(new Uint8Array(t),{includePadding:!1})}function fe(e){return{tokenType:e.token_type,accessToken:e.access_token,refreshToken:e.refresh_token,accessTokenExpiresAt:e.expires_at?new Date((Date.now()+e.expires_in)*1e3):void 0,scopes:e?.scope?typeof e.scope=="string"?e.scope.split(" "):e.scope:[],idToken:e.id_token}}async function E({id:e,options:t,authorizationEndpoint:r,state:o,codeVerifier:n,scopes:i,claims:s,disablePkce:d,redirectURI:a}){let c=new URL(r);if(c.searchParams.set("response_type","code"),c.searchParams.set("client_id",t.clientId),c.searchParams.set("state",o),c.searchParams.set("scope",i.join(" ")),c.searchParams.set("redirect_uri",t.redirectURI||a),!d&&n){let u=await me(n);c.searchParams.set("code_challenge_method","S256"),c.searchParams.set("code_challenge",u)}if(s){let u=s.reduce((b,w)=>(b[w]=null,b),{});c.searchParams.set("claims",JSON.stringify({id_token:{email:null,email_verified:null,...u}}))}return c}import{betterFetch as ut}from"@better-fetch/fetch";async function A({code:e,codeVerifier:t,redirectURI:r,options:o,tokenEndpoint:n}){let i=new URLSearchParams;i.set("grant_type","authorization_code"),i.set("code",e),t&&i.set("code_verifier",t),i.set("redirect_uri",r),i.set("client_id",o.clientId),i.set("client_secret",o.clientSecret);let{data:s,error:d}=await ut(n,{method:"POST",body:i,headers:{"content-type":"application/x-www-form-urlencoded",accept:"application/json","user-agent":"better-auth"}});if(d)throw d;return fe(s)}function K(e){let t=e.accessToken,r=e.refreshToken,o;try{o=e.accessTokenExpiresAt}catch{}return{accessToken:t,refreshToken:r,expiresAt:o}}var ge=e=>{let t="https://appleid.apple.com/auth/token";return{id:"apple",name:"Apple",createAuthorizationURL({state:r,scopes:o,redirectURI:n}){let i=e.scope||o||["email","name","openid"];return new URL(`https://appleid.apple.com/auth/authorize?client_id=${e.clientId}&response_type=code&redirect_uri=${n||e.redirectURI}&scope=${i.join(" ")}&state=${r}`)},validateAuthorizationCode:async({code:r,codeVerifier:o,redirectURI:n})=>A({code:r,codeVerifier:o,redirectURI:e.redirectURI||n,options:e,tokenEndpoint:t}),async getUserInfo(r){if(!r.idToken)return null;let o=pt(r.idToken)?.payload;return o?{user:{id:o.sub,name:o.name,email:o.email,emailVerified:o.email_verified==="true"},data:o}:null}}};import{betterFetch as mt}from"@better-fetch/fetch";var he=e=>({id:"discord",name:"Discord",createAuthorizationURL({state:t,scopes:r,redirectURI:o}){let n=e.scope||r||["identify","email"];return new URL(`https://discord.com/api/oauth2/authorize?scope=${n.join("+")}&response_type=code&client_id=${e.clientId}&redirect_uri=${encodeURIComponent(e.redirectURI||o)}&state=${t}`)},validateAuthorizationCode:async({code:t,redirectURI:r})=>A({code:t,redirectURI:e.redirectURI||r,options:e,tokenEndpoint:"https://discord.com/api/oauth2/token"}),async getUserInfo(t){let{data:r,error:o}=await mt("https://discord.com/api/users/@me",{headers:{authorization:`Bearer ${t.accessToken}`}});if(o)return null;if(r.avatar===null){let n=r.discriminator==="0"?Number(BigInt(r.id)>>BigInt(22))%6:parseInt(r.discriminator)%5;r.image_url=`https://cdn.discordapp.com/embed/avatars/${n}.png`}else{let n=r.avatar.startsWith("a_")?"gif":"png";r.image_url=`https://cdn.discordapp.com/avatars/${r.id}/${r.avatar}.${n}`}return{user:{id:r.id,name:r.display_name||r.username||"",email:r.email,emailVerified:r.verified,image:r.image_url},data:r}}});import{betterFetch as ft}from"@better-fetch/fetch";var we=e=>({id:"facebook",name:"Facebook",async createAuthorizationURL({state:t,scopes:r,redirectURI:o}){let n=e.scope||r||["email","public_profile"];return await E({id:"facebook",options:e,authorizationEndpoint:"https://www.facebook.com/v21.0/dialog/oauth",scopes:n,state:t,redirectURI:o})},validateAuthorizationCode:async({code:t,redirectURI:r})=>A({code:t,redirectURI:e.redirectURI||r,options:e,tokenEndpoint:"https://graph.facebook.com/oauth/access_token"}),async getUserInfo(t){let{data:r,error:o}=await ft("https://graph.facebook.com/me?fields=id,name,email,picture",{auth:{type:"Bearer",token:t.accessToken}});return o?null:{user:{id:r.id,name:r.name,email:r.email,emailVerified:r.email_verified},data:r}}});import{betterFetch as ye}from"@better-fetch/fetch";var be=e=>{let t="https://github.com/login/oauth/access_token";return{id:"github",name:"Github",createAuthorizationURL({state:r,scopes:o,codeVerifier:n,redirectURI:i}){let s=e.scope||o||["user:email"];return E({id:"github",options:e,authorizationEndpoint:"https://github.com/login/oauth/authorize",scopes:s,state:r,redirectURI:i,codeVerifier:n})},validateAuthorizationCode:async({code:r,redirectURI:o})=>A({code:r,redirectURI:e.redirectURI||o,options:e,tokenEndpoint:t}),async getUserInfo(r){let{data:o,error:n}=await ye("https://api.github.com/user",{headers:{"User-Agent":"better-auth",authorization:`Bearer ${r.accessToken}`}});if(n)return null;let i=!1;if(!o.email){let{data:s,error:d}=await ye("https://api.github.com/user/emails",{headers:{authorization:`Bearer ${r.accessToken}`,"User-Agent":"better-auth"}});d||(o.email=(s.find(a=>a.primary)??s[0])?.email,i=s.find(a=>a.email===o.email)?.verified??!1)}return{user:{id:o.id.toString(),name:o.name||o.login,email:o.email,image:o.avatar_url,emailVerified:i},data:o}}}};import{parseJWT as gt}from"oslo/jwt";var Ae=e=>({id:"google",name:"Google",createAuthorizationURL({state:t,scopes:r,codeVerifier:o,redirectURI:n}){if(!e.clientId||!e.clientSecret)throw y.error("Client Id and Client Secret is required for Google. Make sure to provide them in the options."),new C("CLIENT_ID_AND_SECRET_REQUIRED");if(!o)throw new C("codeVerifier is required for Google");let i=e.scope||r||["email","profile"];return E({id:"google",options:e,authorizationEndpoint:"https://accounts.google.com/o/oauth2/auth",scopes:i,state:t,codeVerifier:o,redirectURI:n})},validateAuthorizationCode:async({code:t,codeVerifier:r,redirectURI:o})=>A({code:t,codeVerifier:r,redirectURI:e.redirectURI||o,options:e,tokenEndpoint:"https://oauth2.googleapis.com/token"}),async getUserInfo(t){if(!t.idToken)return null;let r=gt(t.idToken)?.payload;return{user:{id:r.sub,name:r.name,email:r.email,image:r.picture,emailVerified:r.email_verified},data:r}}});import{betterFetch as ht}from"@better-fetch/fetch";import{parseJWT as wt}from"oslo/jwt";var Re=e=>{let t=e.tenantId||"common",r=`https://login.microsoftonline.com/${t}/oauth2/v2.0/authorize`,o=`https://login.microsoftonline.com/${t}/oauth2/v2.0/token`;return{id:"microsoft",name:"Microsoft EntraID",createAuthorizationURL(n){let i=e.scope||n.scopes||["openid","profile","email","User.Read"];return E({id:"microsoft",options:e,authorizationEndpoint:r,state:n.state,codeVerifier:n.codeVerifier,scopes:i,redirectURI:n.redirectURI})},validateAuthorizationCode({code:n,codeVerifier:i,redirectURI:s}){return A({code:n,codeVerifier:i,redirectURI:e.redirectURI||s,options:e,tokenEndpoint:o})},async getUserInfo(n){if(!n.idToken)return null;let i=wt(n.idToken)?.payload,s=e.profilePhotoSize||48;return await ht(`https://graph.microsoft.com/v1.0/me/photos/${s}x${s}/$value`,{headers:{Authorization:`Bearer ${n.accessToken}`},async onResponse(d){if(!(e.disableProfilePhoto||!d.response.ok))try{let c=await d.response.clone().arrayBuffer(),u=Buffer.from(c).toString("base64");i.picture=`data:image/jpeg;base64, ${u}`}catch(a){y.error(a)}}}),{user:{id:i.sub,name:i.name,email:i.email,image:i.picture,emailVerified:!0},data:i}}}};import{betterFetch as yt}from"@better-fetch/fetch";var ke=e=>({id:"spotify",name:"Spotify",createAuthorizationURL({state:t,scopes:r,codeVerifier:o,redirectURI:n}){let i=e.scope||r||["user-read-email"];return E({id:"spotify",options:e,authorizationEndpoint:"https://accounts.spotify.com/authorize",scopes:i,state:t,codeVerifier:o,redirectURI:n})},validateAuthorizationCode:async({code:t,codeVerifier:r,redirectURI:o})=>A({code:t,codeVerifier:r,redirectURI:e.redirectURI||o,options:e,tokenEndpoint:"https://accounts.spotify.com/api/token"}),async getUserInfo(t){let{data:r,error:o}=await yt("https://api.spotify.com/v1/me",{method:"GET",headers:{Authorization:`Bearer ${t.accessToken}`}});return o?null:{user:{id:r.id,name:r.display_name,email:r.email,image:r.images[0]?.url,emailVerified:!1},data:r}}});import"@better-fetch/fetch";var I={isAction:!1};import{nanoid as bt}from"nanoid";var Ue=e=>bt(e);import{parseJWT as At}from"oslo/jwt";var Ee=e=>({id:"twitch",name:"Twitch",createAuthorizationURL({state:t,scopes:r,redirectURI:o}){let n=e.scope||r||["user:read:email","openid"];return E({id:"twitch",redirectURI:o,options:e,authorizationEndpoint:"https://id.twitch.tv/oauth2/authorize",scopes:n,state:t,claims:e.claims||["email","email_verified","preferred_username","picture"]})},validateAuthorizationCode:async({code:t,redirectURI:r})=>A({code:t,redirectURI:e.redirectURI||r,options:e,tokenEndpoint:"https://id.twitch.tv/oauth2/token"}),async getUserInfo(t){let r=t.idToken;if(!r)return y.error("No idToken found in token"),null;let o=At(r)?.payload;return{user:{id:o.sub,name:o.preferred_username,email:o.email,image:o.picture,emailVerified:!1},data:o}}});import{betterFetch as Rt}from"@better-fetch/fetch";var Te=e=>({id:"twitter",name:"Twitter",createAuthorizationURL(t){let r=e.scope||t.scopes||["account_info.read"];return E({id:"twitter",options:e,authorizationEndpoint:"https://twitter.com/i/oauth2/authorize",scopes:r,state:t.state,codeVerifier:t.codeVerifier,redirectURI:t.redirectURI})},validateAuthorizationCode:async({code:t,codeVerifier:r,redirectURI:o})=>A({code:t,codeVerifier:r,redirectURI:e.redirectURI||o,options:e,tokenEndpoint:"https://id.twitch.tv/oauth2/token"}),async getUserInfo(t){let{data:r,error:o}=await Rt("https://api.x.com/2/users/me?user.fields=profile_image_url",{method:"GET",headers:{Authorization:`Bearer ${t.accessToken}`}});return o||!r.data.email?null:{user:{id:r.data.id,name:r.data.name,email:r.data.email,image:r.data.profile_image_url,emailVerified:r.data.verified||!1},data:r}}});var kt={apple:ge,discord:he,facebook:we,github:be,microsoft:Re,google:Ae,spotify:ke,twitch:Ee,twitter:Te},ve=Object.keys(kt);import{TimeSpan as Ut}from"oslo";import{createJWT as Et,validateJWT as Tt}from"oslo/jwt";import{z as v}from"zod";import{APIError as V}from"better-call";import{APIError as q}from"better-call";var F=(e,t="ms")=>new Date(Date.now()+(t==="sec"?e*1e3:e));import{z as xe}from"zod";var X=()=>p("/session",{method:"GET",requireHeaders:!0},async e=>{try{let t=await e.getSignedCookie(e.context.authCookies.sessionToken.name,e.context.secret);if(!t)return e.json(null,{status:401});let r=await e.context.internalAdapter.findSession(t);if(!r||r.session.expiresAt<new Date)return j(e),r&&await e.context.internalAdapter.deleteSession(r.session.id),e.json(null,{status:401});if(await e.getSignedCookie(e.context.authCookies.dontRememberToken.name,e.context.secret))return e.json(r);let n=e.context.sessionConfig.expiresIn,i=e.context.sessionConfig.updateAge;if(r.session.expiresAt.valueOf()-n*1e3+i*1e3<=Date.now()){let a=await e.context.internalAdapter.updateSession(r.session.id,{expiresAt:F(e.context.sessionConfig.expiresIn,"sec")});if(!a)return j(e),e.json(null,{status:401});let c=(a.expiresAt.valueOf()-Date.now())/1e3;return await _(e,a.id,!1,{maxAge:c}),e.json({session:a,user:r.user})}return e.json(r)}catch(t){return e.context.logger.error(t),e.json(null,{status:500})}}),Y=async e=>await X()({...e,_flag:"json",headers:e.headers}),L=$(async e=>{let t=await Y(e);if(!t?.session)throw new q("UNAUTHORIZED");return{session:t}}),_e=()=>p("/user/list-sessions",{method:"GET",use:[L],requireHeaders:!0},async e=>{let r=(await e.context.internalAdapter.listSessions(e.context.session.user.id)).filter(o=>o.expiresAt>new Date);return e.json(r)}),Pe=p("/user/revoke-session",{method:"POST",body:xe.object({id:xe.string()}),use:[L],requireHeaders:!0},async e=>{let t=e.body.id,r=await e.context.internalAdapter.findSession(t);if(!r)throw new q("BAD_REQUEST",{message:"Session not found"});if(r.session.userId!==e.context.session.user.id)throw new q("UNAUTHORIZED");try{await e.context.internalAdapter.deleteSession(t)}catch(o){throw e.context.logger.error(o),new q("INTERNAL_SERVER_ERROR")}return e.json({status:!0})}),Se=p("/user/revoke-sessions",{method:"POST",use:[L],requireHeaders:!0},async e=>{try{await e.context.internalAdapter.deleteSessions(e.context.session.user.id)}catch(t){throw e.context.logger.error(t),new q("INTERNAL_SERVER_ERROR")}return e.json({status:!0})});async function O(e,t,r){return await Et("HS256",Buffer.from(e),{email:t.toLowerCase(),updateTo:r},{expiresIn:new Ut(1,"h"),issuer:"better-auth",subject:"verify-email",audiences:[t],includeIssuedTimestamp:!0})}var Le=p("/send-verification-email",{method:"POST",query:v.object({currentURL:v.string().optional()}).optional(),body:v.object({email:v.string().email(),callbackURL:v.string().optional()}),use:[U]},async e=>{if(!e.context.options.emailVerification?.sendVerificationEmail)throw e.context.logger.error("Verification email isn't enabled."),new V("BAD_REQUEST",{message:"Verification email isn't enabled"});let{email:t}=e.body,r=await e.context.internalAdapter.findUserByEmail(t);if(!r)throw new V("BAD_REQUEST",{message:"User not found"});let o=await O(e.context.secret,t),n=`${e.context.baseURL}/verify-email?token=${o}&callbackURL=${e.body.callbackURL||e.query?.currentURL||"/"}`;return await e.context.options.emailVerification.sendVerificationEmail(r.user,n,o),e.json({status:!0})}),Oe=p("/verify-email",{method:"GET",query:v.object({token:v.string(),callbackURL:v.string().optional()}),use:[U]},async e=>{let{token:t}=e.query,r;try{r=await Tt("HS256",Buffer.from(e.context.secret),t)}catch(s){throw e.context.logger.error("Failed to verify email",s),new V("BAD_REQUEST",{message:"Invalid token"})}let n=v.object({email:v.string().email(),updateTo:v.string().optional()}).parse(r.payload);if(!await e.context.internalAdapter.findUserByEmail(n.email))throw new V("BAD_REQUEST",{message:"User not found"});if(n.updateTo){let s=await Y(e);if(!s)throw e.query.callbackURL?e.redirect(`${e.query.callbackURL}?error=unauthorized`):new V("UNAUTHORIZED",{message:"Session not found"});if(s.user.email!==n.email)throw e.query.callbackURL?e.redirect(`${e.query.callbackURL}?error=unauthorized`):new V("UNAUTHORIZED",{message:"Invalid session"});let d=await e.context.internalAdapter.updateUserByEmail(n.email,{email:n.updateTo});if(await e.context.options.emailVerification?.sendVerificationEmail?.(d,`${e.context.baseURL}/verify-email?token=${t}`,t),e.query.callbackURL)throw e.redirect(e.query.callbackURL);return e.json({user:d,status:!0})}if(await e.context.internalAdapter.updateUserByEmail(n.email,{emailVerified:!0}),e.query.callbackURL)throw e.redirect(e.query.callbackURL);return e.json({user:null,status:!0})});var Ie=p("/sign-in/social",{method:"POST",requireHeaders:!0,query:x.object({currentURL:x.string().optional()}).optional(),body:x.object({callbackURL:x.string().optional(),provider:x.enum(ve)}),use:[U]},async e=>{let t=e.context.socialProviders.find(a=>a.id===e.body.provider);if(!t)throw e.context.logger.error("Provider not found. Make sure to add the provider in your auth config",{provider:e.body.provider}),new P("NOT_FOUND",{message:"Provider not found"});let r=e.context.authCookies,o=e.query?.currentURL?new URL(e.query?.currentURL):null,n=e.body.callbackURL?.startsWith("http")?e.body.callbackURL:`${o?.origin}${e.body.callbackURL||""}`,i=await ue(n||o?.origin||e.context.options.baseURL);await e.setSignedCookie(r.state.name,i.hash,e.context.secret,r.state.options);let s=vt();await e.setSignedCookie(r.pkCodeVerifier.name,s,e.context.secret,r.pkCodeVerifier.options);let d=await t.createAuthorizationURL({state:i.raw,codeVerifier:s,redirectURI:`${e.context.baseURL}/callback/${t.id}`});return e.json({url:d.toString(),state:i,codeVerifier:s,redirect:!0})}),Ce=p("/sign-in/email",{method:"POST",body:x.object({email:x.string().email(),password:x.string(),callbackURL:x.string().optional(),dontRememberMe:x.boolean().default(!1).optional()}),use:[U]},async e=>{if(!e.context.options?.emailAndPassword?.enabled)throw e.context.logger.error("Email and password is not enabled. Make sure to enable it in the options on you `auth.ts` file. Check `https://better-auth.com/docs/authentication/email-password` for more!"),new P("BAD_REQUEST",{message:"Email and password is not enabled"});let{email:t,password:r}=e.body;if(!x.string().email().safeParse(t).success)throw new P("BAD_REQUEST",{message:"Invalid email"});let n=await e.context.internalAdapter.findUserByEmail(t,{includeAccounts:!0});if(!n)throw await e.context.password.hash(r),e.context.logger.error("User not found",{email:t}),new P("UNAUTHORIZED",{message:"Invalid email or password"});if(e.context.options?.emailAndPassword?.requireEmailVerification&&!n.user.emailVerified){if(!e.context.options?.emailVerification?.sendVerificationEmail)throw y.error("Email verification is required but no email verification handler is provided"),new P("INTERNAL_SERVER_ERROR",{message:"Email is not verified."});let c=await O(e.context.secret,n.user.email),u=`${e.context.options.baseURL}/verify-email?token=${c}`;throw await e.context.options.emailVerification.sendVerificationEmail(n.user,u,c),e.context.logger.error("Email not verified",{email:t}),new P("FORBIDDEN",{message:"Email is not verified. Check your email for a verification link"})}let i=n.accounts.find(c=>c.providerId==="credential");if(!i)throw e.context.logger.error("Credential account not found",{email:t}),new P("UNAUTHORIZED",{message:"Invalid email or password"});let s=i?.password;if(!s)throw e.context.logger.error("Password not found",{email:t}),new P("UNAUTHORIZED",{message:"Unexpected error"});if(!await e.context.password.verify(s,r))throw e.context.logger.error("Invalid password"),new P("UNAUTHORIZED",{message:"Invalid email or password"});let a=await e.context.internalAdapter.createSession(n.user.id,e.headers,e.body.dontRememberMe);if(!a)throw e.context.logger.error("Failed to create session"),new P("UNAUTHORIZED",{message:"Failed to create session"});return await _(e,a.id,e.body.dontRememberMe),e.json({user:n.user,session:a,redirect:!!e.body.callbackURL,url:e.body.callbackURL})});import{APIError as _t}from"better-call";import{z as H}from"zod";import{z as f}from"zod";var Qn=f.object({id:f.string(),providerId:f.string(),accountId:f.string(),userId:f.string(),accessToken:f.string().nullable().optional(),refreshToken:f.string().nullable().optional(),idToken:f.string().nullable().optional(),expiresAt:f.date().nullable().optional(),password:f.string().optional().nullable()}),Be=f.object({id:f.string(),email:f.string().transform(e=>e.toLowerCase()),emailVerified:f.boolean().default(!1),name:f.string(),image:f.string().optional(),createdAt:f.date().default(new Date),updatedAt:f.date().default(new Date)}),Gn=f.object({id:f.string(),userId:f.string(),expiresAt:f.date(),ipAddress:f.string().optional(),userAgent:f.string().optional()}),Zn=f.object({id:f.string(),value:f.string(),expiresAt:f.date(),identifier:f.string()});function xt(e,t){let r=t.fields,o={};for(let n in r){if(n in e){if(r[n].input===!1){if(r[n].defaultValue){o[n]=r[n].defaultValue;continue}continue}o[n]=e[n];continue}if(r[n].defaultValue){o[n]=r[n].defaultValue;continue}}return o}function De(e,t){let r={...e.user?.additionalFields};return xt(t||{},{fields:r})}var $e=p("/callback/:id",{method:"GET",query:H.object({state:H.string(),code:H.string().optional(),error:H.string().optional()}),metadata:I},async e=>{if(e.query.error||!e.query.code){let g=J(e.query.state).data?.callbackURL||`${e.context.baseURL}/error`;throw e.context.logger.error(e.query.error,e.params.id),e.redirect(`${g}?error=${e.query.error||"oAuth_code_missing"}`)}let t=e.context.socialProviders.find(l=>l.id===e.params.id);if(!t)throw e.context.logger.error("Oauth provider with id",e.params.id,"not found"),e.redirect(`${e.context.baseURL}/error?error=oauth_provider_not_found`);let r=J(e.query.state);if(!r.success)throw e.context.logger.error("Unable to parse state"),e.redirect(`${e.context.baseURL}/error?error=please_restart_the_process`);let{data:{callbackURL:o,currentURL:n}}=r,i=await e.getSignedCookie(e.context.authCookies.state.name,e.context.secret);if(!i)throw y.error("No stored state found"),e.redirect(`${e.context.baseURL}/error?error=please_restart_the_process`);if(!await le(e.query.state,i))throw y.error("OAuth state mismatch"),e.redirect(`${e.context.baseURL}/error?error=please_restart_the_process`);let d=await e.getSignedCookie(e.context.authCookies.pkCodeVerifier.name,e.context.secret),a;try{a=await t.validateAuthorizationCode({code:e.query.code,codeVerifier:d,redirectURI:`${e.context.baseURL}/callback/${t.id}`})}catch(l){throw e.context.logger.error(l),e.redirect(`${e.context.baseURL}/error?error=please_restart_the_process`)}let c=await t.getUserInfo(a).then(l=>l?.user),u=Ue(),b=Be.safeParse({...c,id:u});if(!c||b.success===!1)throw y.error("Unable to get user info",b.error),e.redirect(`${e.context.baseURL}/error?error=please_restart_the_process`);if(!o)throw e.redirect(`${e.context.baseURL}/error?error=please_restart_the_process`);let w=await e.context.internalAdapter.findUserByEmail(c.email,{includeAccounts:!0}).catch(l=>{throw y.error(`Better auth was unable to query your database.
3
3
  Error: `,l),e.redirect(`${e.context.baseURL}/error?error=internal_server_error`)}),m=w?.user.id;if(w){let l=w.accounts.find(R=>R.providerId===t.id),g=e.context.options.account?.accountLinking?.trustedProviders,h=g?g.includes(t.id):!0;if(!l&&(!c.emailVerified||!h)){let R;try{R=new URL(n||o),R.searchParams.set("error","account_not_linked")}catch{throw e.redirect(`${e.context.baseURL}/error?error=account_not_linked`)}throw e.redirect(R.toString())}if(!l)try{await e.context.internalAdapter.linkAccount({providerId:t.id,accountId:c.id.toString(),id:`${t.id}:${c.id}`,userId:w.user.id,...K(a)})}catch(R){throw console.log(R),e.redirect(`${e.context.baseURL}/error?error=failed_linking_account`)}}else try{let l=c.emailVerified,g=await e.context.internalAdapter.createOAuthUser({...b.data,emailVerified:l},{...K(a),id:`${t.id}:${c.id}`,providerId:t.id,accountId:c.id.toString()});if(!l&&g&&e.context.options.emailVerification?.sendOnSignUp){let h=await O(e.context.secret,c.email),R=`${e.context.baseURL}/verify-email?token=${h}&callbackURL=${o}`;await e.context.options.emailVerification?.sendVerificationEmail?.(g.user,R,h)}}catch{let g=new URL(n||o);throw g.searchParams.set("error","unable_to_create_user"),e.redirect(g.toString())}if(!m&&!u)throw new _t("INTERNAL_SERVER_ERROR",{message:"Unable to create user"});try{let l=await e.context.internalAdapter.createSession(m||u,e.request);if(!l){let g=new URL(n||o);throw g.searchParams.set("error","unable_to_create_session"),e.redirect(g.toString())}try{await _(e,l.id)}catch(g){e.context.logger.error("Unable to set session cookie",g);let h=new URL(n||o);throw h.searchParams.set("error","unable_to_create_session"),e.redirect(h.toString())}}catch{let l=new URL(n||o||"");throw l.searchParams.set("error","unable_to_create_session"),e.redirect(l.toString())}throw e.redirect(o)});import"zod";import{APIError as Pt}from"better-call";var Ve=p("/sign-out",{method:"POST"},async e=>{let t=await e.getSignedCookie(e.context.authCookies.sessionToken.name,e.context.secret);if(!t)throw new Pt("BAD_REQUEST",{message:"Session not found"});return await e.context.internalAdapter.deleteSession(t),j(e),e.json({success:!0})});import{z as S}from"zod";import{APIError as Q}from"better-call";var ze=p("/forget-password",{method:"POST",body:S.object({email:S.string().email(),redirectTo:S.string()}),use:[U]},async e=>{if(!e.context.options.emailAndPassword?.sendResetPassword)throw e.context.logger.error("Reset password isn't enabled.Please pass an emailAndPassword.sendResetPasswordToken function in your auth config!"),new Q("BAD_REQUEST",{message:"Reset password isn't enabled"});let{email:t,redirectTo:r}=e.body,o=await e.context.internalAdapter.findUserByEmail(t,{includeAccounts:!0});if(!o)return e.context.logger.error("Reset Password: User not found",{email:t}),e.json({status:!1},{body:{status:!0}});let n=60*60*1,i=new Date(Date.now()+1e3*(e.context.options.emailAndPassword.resetPasswordTokenExpiresIn||n)),s=e.context.uuid();await e.context.internalAdapter.createVerificationValue({value:o.user.id,identifier:`reset-password:${s}`,expiresAt:i});let d=`${e.context.baseURL}/reset-password/${s}?callbackURL=${r}`;return await e.context.options.emailAndPassword.sendResetPassword(o.user,d),e.json({status:!0})}),je=p("/reset-password/:token",{method:"GET",query:S.object({callbackURL:S.string()}),use:[U]},async e=>{let{token:t}=e.params,r=e.query.callbackURL,o=r.startsWith("http")?r:`${e.context.options.baseURL}${r}`;if(!t||!r)throw e.redirect(`${e.context.baseURL}/error?error=INVALID_TOKEN`);let n=await e.context.internalAdapter.findVerificationValue(`reset-password:${t}`);throw!n||n.expiresAt<new Date?e.redirect(`${o}?error=INVALID_TOKEN`):e.redirect(`${o}?token=${t}`)}),qe=p("/reset-password",{query:S.optional(S.object({token:S.string()})),method:"POST",body:S.object({newPassword:S.string()})},async e=>{let t=e.query?.token;if(!t)throw new Q("BAD_REQUEST",{message:"Token not found"});let{newPassword:r}=e.body,o=`reset-password:${t}`,n=await e.context.internalAdapter.findVerificationValue(o);if(!n||n.expiresAt<new Date)throw new Q("BAD_REQUEST",{message:"Invalid token"});await e.context.internalAdapter.deleteVerificationValue(n.id);let i=n.value,s=await e.context.password.hash(r);if(!(await e.context.internalAdapter.findAccounts(i)).find(u=>u.providerId==="credential"))return await e.context.internalAdapter.createAccount({userId:i,providerId:"credential",password:s,accountId:e.context.uuid()}),e.json({status:!0});if(!await e.context.internalAdapter.updatePassword(i,s))throw new Q("BAD_REQUEST",{message:"Failed to update password"});return e.json({status:!0})});import{z as k}from"zod";import{APIError as T}from"better-call";var Ne=p("/user/update",{method:"POST",body:k.object({name:k.string().optional(),image:k.string().optional()}),use:[L,U]},async e=>{let{name:t,image:r}=e.body,o=e.context.session;if(!r&&!t)return e.json({user:o.user});let n=await e.context.internalAdapter.updateUserByEmail(o.user.email,{name:t,image:r});return e.json({user:n})}),Me=p("/user/change-password",{method:"POST",body:k.object({newPassword:k.string(),currentPassword:k.string(),revokeOtherSessions:k.boolean().optional()}),use:[L]},async e=>{let{newPassword:t,currentPassword:r,revokeOtherSessions:o}=e.body,n=e.context.session,i=e.context.password.config.minPasswordLength;if(t.length<i)throw e.context.logger.error("Password is too short"),new T("BAD_REQUEST",{message:"Password is too short"});let s=e.context.password.config.maxPasswordLength;if(t.length>s)throw e.context.logger.error("Password is too long"),new T("BAD_REQUEST",{message:"Password too long"});let a=(await e.context.internalAdapter.findAccounts(n.user.id)).find(b=>b.providerId==="credential"&&b.password);if(!a||!a.password)throw new T("BAD_REQUEST",{message:"User does not have a password"});let c=await e.context.password.hash(t);if(!await e.context.password.verify(a.password,r))throw new T("BAD_REQUEST",{message:"Incorrect password"});if(await e.context.internalAdapter.updateAccount(a.id,{password:c}),o){await e.context.internalAdapter.deleteSessions(n.user.id);let b=await e.context.internalAdapter.createSession(n.user.id,e.headers);if(!b)throw new T("INTERNAL_SERVER_ERROR",{message:"Unable to create session"});await _(e,b.id)}return e.json(n.user)}),Fe=p("/user/set-password",{method:"POST",body:k.object({newPassword:k.string()}),use:[L]},async e=>{let{newPassword:t}=e.body,r=e.context.session,o=e.context.password.config.minPasswordLength;if(t.length<o)throw e.context.logger.error("Password is too short"),new T("BAD_REQUEST",{message:"Password is too short"});let n=e.context.password.config.maxPasswordLength;if(t.length>n)throw e.context.logger.error("Password is too long"),new T("BAD_REQUEST",{message:"Password too long"});let s=(await e.context.internalAdapter.findAccounts(r.user.id)).find(a=>a.providerId==="credential"&&a.password),d=await e.context.password.hash(t);if(!s)return await e.context.internalAdapter.linkAccount({userId:r.user.id,providerId:"credential",accountId:r.user.id,password:d}),e.json(r.user);throw new T("BAD_REQUEST",{message:"user already has a password"})}),He=p("/user/delete",{method:"POST",body:k.object({password:k.string()}),use:[L]},async e=>{let{password:t}=e.body,r=e.context.session,n=(await e.context.internalAdapter.findAccounts(r.user.id)).find(s=>s.providerId==="credential"&&s.password);if(!n||!n.password)throw new T("BAD_REQUEST",{message:"User does not have a password"});if(!await e.context.password.verify(n.password,t))throw new T("BAD_REQUEST",{message:"Incorrect password"});return await e.context.internalAdapter.deleteUser(r.user.id),await e.context.internalAdapter.deleteSessions(r.user.id),e.json(null)}),Qe=p("/user/change-email",{method:"POST",query:k.object({currentURL:k.string().optional()}).optional(),body:k.object({newEmail:k.string().email(),callbackURL:k.string().optional()}),use:[L,U]},async e=>{if(e.context.options.user?.changeEmail?.disable===!0)throw e.context.logger.error("Change email is disabled."),new T("BAD_REQUEST",{message:"Change email is disabled"});if(e.body.newEmail===e.context.session.user.email)throw e.context.logger.error("Email is the same"),new T("BAD_REQUEST",{message:"Email is the same"});if(await e.context.internalAdapter.findUserByEmail(e.body.newEmail))throw e.context.logger.error("Email already exists"),new T("BAD_REQUEST",{message:"Couldn't update your email"});if(e.context.options.user?.changeEmail?.sendVerificationEmail===!1||e.context.session.user.emailVerified!==!0){let n=await e.context.internalAdapter.updateUserByEmail(e.context.session.user.email,{email:e.body.newEmail});return e.json({user:n,status:!0})}if(!e.context.options.emailVerification?.sendVerificationEmail)throw e.context.logger.error("Verification email isn't enabled."),new T("BAD_REQUEST",{message:"Verification email isn't enabled"});let r=await O(e.context.secret,e.context.session.user.email,e.body.newEmail),o=`${e.context.baseURL}/verify-email?token=${r}&callbackURL=${e.body.callbackURL||e.query?.currentURL||"/"}`;return await e.context.options.emailVerification.sendVerificationEmail(e.context.session.user,o,r),e.json({user:null,status:!0})});var Ge=p("/csrf",{method:"GET",metadata:I},async e=>{let t=await e.getSignedCookie(e.context.authCookies.csrfToken.name,e.context.secret);if(t){let[i,s]=t.split("!")||[null,null];return e.json({csrfToken:i})}let r=re(32,oe("a-z","0-9","A-Z")),o=await N(e.context.secret,r),n=`${r}!${o}`;return await e.setSignedCookie(e.context.authCookies.csrfToken.name,n,e.context.secret,e.context.authCookies.csrfToken.options),e.json({csrfToken:r})});var St=(e="Unknown")=>`<!DOCTYPE html>
4
4
  <html lang="en">
@@ -80,4 +80,4 @@ Error: `,l),e.redirect(`${e.context.baseURL}/error?error=internal_server_error`)
80
80
  <div class="error-code">Error Code: <span id="errorCode">${e}</span></div>
81
81
  </div>
82
82
  </body>
83
- </html>`,Ze=p("/error",{method:"GET",metadata:I},async e=>{let t=new URL(e.request?.url||"").searchParams.get("error")||"Unknown";return new Response(St(t),{headers:{"Content-Type":"text/html"}})});var We=p("/ok",{method:"GET",metadata:I},async e=>e.json({ok:!0}));import{z}from"zod";import{APIError as D}from"better-call";var Je=()=>p("/sign-up/email",{method:"POST",query:z.object({currentURL:z.string().optional()}).optional(),body:z.record(z.string(),z.any()),use:[U]},async e=>{if(!e.context.options.emailAndPassword?.enabled)throw new D("BAD_REQUEST",{message:"Email and password sign up is not enabled"});let t=e.body,{name:r,email:o,password:n,image:i,callbackURL:s,...d}=t;if(!z.string().email().safeParse(o).success)throw new D("BAD_REQUEST",{message:"Invalid email"});let c=e.context.password.config.minPasswordLength;if(n.length<c)throw e.context.logger.error("Password is too short"),new D("BAD_REQUEST",{message:"Password is too short"});let u=e.context.password.config.maxPasswordLength;if(n.length>u)throw e.context.logger.error("Password is too long"),new D("BAD_REQUEST",{message:"Password is too long"});if((await e.context.internalAdapter.findUserByEmail(o))?.user)throw e.context.logger.info(`Sign-up attempt for existing email: ${o}`),new D("UNPROCESSABLE_ENTITY",{message:"Failed to create user"});let w=De(e.context.options,d),m=await e.context.internalAdapter.createUser({email:o.toLowerCase(),name:r,image:i,...w,emailVerified:!1});if(!m)throw new D("BAD_REQUEST",{message:"Failed to create user"});let l=await e.context.password.hash(n);if(await e.context.internalAdapter.linkAccount({userId:m.id,providerId:"credential",accountId:m.id,password:l,expiresAt:F(60*60*24*30,"sec")}),e.context.options.emailVerification?.sendOnSignUp){let h=await O(e.context.secret,m.email),R=`${e.context.baseURL}/verify-email?token=${h}&callbackURL=${t.callbackURL||e.query?.currentURL||"/"}`;await e.context.options.emailVerification?.sendVerificationEmail?.(m,R,h)}if(!e.context.options.emailAndPassword.autoSignIn)return e.json({user:m,session:null},{body:t.callbackURL?{url:t.callbackURL,redirect:!0}:{user:m,session:null}});let g=await e.context.internalAdapter.createSession(m.id,e.request);if(!g)throw new D("BAD_REQUEST",{message:"Failed to create session"});return await _(e,g.id),e.json({user:m,session:g},{body:t.callbackURL?{url:t.callbackURL,redirect:!0}:{user:m,session:g}})});function Ke(e){let t="127.0.0.1";if(process.env.NODE_ENV==="test")return t;let r=["x-client-ip","x-forwarded-for","cf-connecting-ip","fastly-client-ip","x-real-ip","x-cluster-client-ip","x-forwarded","forwarded-for","forwarded"];for(let o of r){let n=e.headers.get(o);if(typeof n=="string"){let i=n.split(",")[0].trim();if(i)return i}}return null}function Lt(e,t,r){let o=Date.now(),n=t*1e3;return o-r.lastRequest<n&&r.count>=e}function Ot(e){return new Response(JSON.stringify({message:"Too many requests. Please try again later."}),{status:429,statusText:"Too Many Requests",headers:{"X-Retry-After":e.toString()}})}function It(e,t){let r=Date.now(),o=t*1e3;return Math.ceil((e+o-r)/1e3)}function Ct(e,t){let r=t??"rateLimit",o=e.adapter;return{get:async n=>await o.findOne({model:r,where:[{field:"key",value:n}]}),set:async(n,i,s)=>{try{s?await o.update({model:t??"rateLimit",where:[{field:"key",value:n}],update:{count:i.count,lastRequest:i.lastRequest}}):await o.create({model:t??"rateLimit",data:{key:n,count:i.count,lastRequest:i.lastRequest}})}catch(d){y.error("Error setting rate limit",d)}}}}var Xe=new Map;function Bt(e){return e.rateLimit.storage==="secondary-storage"?{get:async r=>{let o=await e.options.secondaryStorage?.get(r);return o?JSON.parse(o):void 0},set:async(r,o)=>{await e.options.secondaryStorage?.set?.(r,JSON.stringify(o))}}:e.rateLimit.storage==="memory"?{async get(r){return Xe.get(r)},async set(r,o,n){Xe.set(r,o)}}:Ct(e,e.rateLimit.tableName)}async function Ye(e,t){if(!t.rateLimit.enabled)return;let r=t.baseURL,o=e.url.replace(r,""),n=t.rateLimit.window,i=t.rateLimit.max,s=Ke(e)+o,a=Dt().find(w=>w.pathMatcher(o));a&&(n=a.window,i=a.max);for(let w of t.options.plugins||[])if(w.rateLimit){let m=w.rateLimit.find(l=>l.pathMatcher(o));if(m){n=m.window,i=m.max;break}}if(t.rateLimit.customRules){let w=t.rateLimit.customRules[o];w&&(n=w.window,i=w.max)}let c=Bt(t),u=await c.get(s),b=Date.now();if(!u)await c.set(s,{key:s,count:1,lastRequest:b});else{let w=b-u.lastRequest;if(Lt(i,n,u)){let m=It(u.lastRequest,n);return Ot(m)}else w>n*1e3?await c.set(s,{...u,count:1,lastRequest:b}):await c.set(s,{...u,count:u.count+1,lastRequest:b})}}function Dt(){return[{pathMatcher(t){return t.startsWith("/sign-in")||t.startsWith("/sign-up")},window:10,max:7}]}import{APIError as Ds}from"better-call";function zt(e,t){let r=t.plugins?.reduce((d,a)=>({...d,...a.endpoints}),{}),o=t.plugins?.map(d=>d.middlewares?.map(a=>{let c=async u=>a.middleware({...u,context:{...e,...u.context}});return c.path=a.path,c.options=a.middleware.options,c.headers=a.middleware.headers,{path:a.path,middleware:c}})).filter(d=>d!==void 0).flat()||[],i={...{signInOAuth:Ie,callbackOAuth:$e,getCSRFToken:Ge,getSession:X(),signOut:Ve,signUpEmail:Je(),signInEmail:Ce,forgetPassword:ze,resetPassword:qe,verifyEmail:Oe,sendVerificationEmail:Le,changeEmail:Qe,changePassword:Me,setPassword:Fe,updateUser:Ne,deleteUser:He,forgetPasswordCallback:je,listSessions:_e(),revokeSession:Pe,revokeSessions:Se},...r,ok:We,error:Ze},s={};for(let[d,a]of Object.entries(i))s[d]=async(c={})=>{let u=await e;for(let m of t.plugins||[])if(m.hooks?.before){for(let l of m.hooks.before)if(l.matcher({...a,...c,context:u})){let h=await l.handler({...c,context:{...u,...c?.context}});h&&"context"in h&&(u={...u,...h.context})}}let b;try{b=await a({...c,context:{...u,...c.context}})}catch(m){if(m instanceof et){let l=t.plugins?.map(h=>{if(h.hooks?.after)return h.hooks.after}).filter(h=>h!==void 0).flat();if(!l?.length)throw m;let g=new Response(JSON.stringify(m.body),{status:Vt[m.status],headers:m.headers});for(let h of l||[])if(h.matcher(c)){let ee=Object.assign(c,{context:{...e,returned:g}}),G=await h.handler(ee);G&&"response"in G&&(g=G.response)}return g}throw m}let w=b;for(let m of t.plugins||[])if(m.hooks?.after){for(let l of m.hooks.after)if(l.matcher(c)){let h=Object.assign(c,{context:{...e,returned:w}}),R=await l.handler(h);R&&"response"in R&&(w=R.response)}}return w},s[d].path=a.path,s[d].method=a.method,s[d].options=a.options,s[d].headers=a.headers;return{api:s,middlewares:o}}var Ss=(e,t)=>{let{api:r,middlewares:o}=zt(e,t),n=new URL(e.baseURL).pathname;return $t(r,{extraContext:e,basePath:n,routerMiddleware:[{path:"/**",middleware:ae},...o],async onRequest(i){for(let s of e.options.plugins||[])if(s.onRequest){let d=await s.onRequest(i,e);if(d)return d}return Ye(i,e)},async onResponse(i){for(let s of e.options.plugins||[])if(s.onResponse){let d=await s.onResponse(i,e);if(d)return d.response}return i},onError(i){if(t.onAPIError?.throw)throw i;if(t.onAPIError?.onError){t.onAPIError.onError(i,e);return}let s=t.logger?.verboseLogging?y:void 0;t.logger?.disabled!==!0&&(i instanceof et?(i.status==="INTERNAL_SERVER_ERROR"&&y.error(i),s?.error(i.message)):y?.error(i))}})};export{Ds as APIError,$e as callbackOAuth,Qe as changeEmail,Me as changePassword,p as createAuthEndpoint,$ as createAuthMiddleware,O as createEmailVerificationToken,ae as csrfMiddleware,He as deleteUser,Ze as error,ze as forgetPassword,je as forgetPasswordCallback,Ge as getCSRFToken,zt as getEndpoints,X as getSession,Y as getSessionFromCtx,_e as listSessions,We as ok,ie as optionsMiddleware,qe as resetPassword,Pe as revokeSession,Se as revokeSessions,Ss as router,Le as sendVerificationEmail,L as sessionMiddleware,Fe as setPassword,Ce as signInEmail,Ie as signInOAuth,Ve as signOut,Je as signUpEmail,Ne as updateUser,Oe as verifyEmail};
83
+ </html>`,Ze=p("/error",{method:"GET",metadata:I},async e=>{let t=new URL(e.request?.url||"").searchParams.get("error")||"Unknown";return new Response(St(t),{headers:{"Content-Type":"text/html"}})});var We=p("/ok",{method:"GET",metadata:I},async e=>e.json({ok:!0}));import{z}from"zod";import{APIError as D}from"better-call";var Je=()=>p("/sign-up/email",{method:"POST",query:z.object({currentURL:z.string().optional()}).optional(),body:z.record(z.string(),z.any()),use:[U]},async e=>{if(!e.context.options.emailAndPassword?.enabled)throw new D("BAD_REQUEST",{message:"Email and password sign up is not enabled"});let t=e.body,{name:r,email:o,password:n,image:i,callbackURL:s,...d}=t;if(!z.string().email().safeParse(o).success)throw new D("BAD_REQUEST",{message:"Invalid email"});let c=e.context.password.config.minPasswordLength;if(n.length<c)throw e.context.logger.error("Password is too short"),new D("BAD_REQUEST",{message:"Password is too short"});let u=e.context.password.config.maxPasswordLength;if(n.length>u)throw e.context.logger.error("Password is too long"),new D("BAD_REQUEST",{message:"Password is too long"});if((await e.context.internalAdapter.findUserByEmail(o))?.user)throw e.context.logger.info(`Sign-up attempt for existing email: ${o}`),new D("UNPROCESSABLE_ENTITY",{message:"Failed to create user"});let w=De(e.context.options,d),m=await e.context.internalAdapter.createUser({email:o.toLowerCase(),name:r,image:i,...w,emailVerified:!1});if(!m)throw new D("BAD_REQUEST",{message:"Failed to create user"});let l=await e.context.password.hash(n);if(await e.context.internalAdapter.linkAccount({userId:m.id,providerId:"credential",accountId:m.id,password:l,expiresAt:F(60*60*24*30,"sec")}),e.context.options.emailVerification?.sendOnSignUp){let h=await O(e.context.secret,m.email),R=`${e.context.baseURL}/verify-email?token=${h}&callbackURL=${t.callbackURL||e.query?.currentURL||"/"}`;await e.context.options.emailVerification?.sendVerificationEmail?.(m,R,h)}if(!e.context.options.emailAndPassword.autoSignIn)return e.json({user:m,session:null},{body:t.callbackURL?{url:t.callbackURL,redirect:!0}:{user:m,session:null}});let g=await e.context.internalAdapter.createSession(m.id,e.request);if(!g)throw new D("BAD_REQUEST",{message:"Failed to create session"});return await _(e,g.id),e.json({user:m,session:g},{body:t.callbackURL?{url:t.callbackURL,redirect:!0}:{user:m,session:g}})});function Ke(e){let t="127.0.0.1";if(process.env.NODE_ENV==="test")return t;let r=["x-client-ip","x-forwarded-for","cf-connecting-ip","fastly-client-ip","x-real-ip","x-cluster-client-ip","x-forwarded","forwarded-for","forwarded"],o=e instanceof Request?e.headers:e;for(let n of r){let i=o.get(n);if(typeof i=="string"){let s=i.split(",")[0].trim();if(s)return s}}return null}function Lt(e,t,r){let o=Date.now(),n=t*1e3;return o-r.lastRequest<n&&r.count>=e}function Ot(e){return new Response(JSON.stringify({message:"Too many requests. Please try again later."}),{status:429,statusText:"Too Many Requests",headers:{"X-Retry-After":e.toString()}})}function It(e,t){let r=Date.now(),o=t*1e3;return Math.ceil((e+o-r)/1e3)}function Ct(e,t){let r=t??"rateLimit",o=e.adapter;return{get:async n=>await o.findOne({model:r,where:[{field:"key",value:n}]}),set:async(n,i,s)=>{try{s?await o.update({model:t??"rateLimit",where:[{field:"key",value:n}],update:{count:i.count,lastRequest:i.lastRequest}}):await o.create({model:t??"rateLimit",data:{key:n,count:i.count,lastRequest:i.lastRequest}})}catch(d){y.error("Error setting rate limit",d)}}}}var Xe=new Map;function Bt(e){return e.rateLimit.storage==="secondary-storage"?{get:async r=>{let o=await e.options.secondaryStorage?.get(r);return o?JSON.parse(o):void 0},set:async(r,o)=>{await e.options.secondaryStorage?.set?.(r,JSON.stringify(o))}}:e.rateLimit.storage==="memory"?{async get(r){return Xe.get(r)},async set(r,o,n){Xe.set(r,o)}}:Ct(e,e.rateLimit.tableName)}async function Ye(e,t){if(!t.rateLimit.enabled)return;let r=t.baseURL,o=e.url.replace(r,""),n=t.rateLimit.window,i=t.rateLimit.max,s=Ke(e)+o,a=Dt().find(w=>w.pathMatcher(o));a&&(n=a.window,i=a.max);for(let w of t.options.plugins||[])if(w.rateLimit){let m=w.rateLimit.find(l=>l.pathMatcher(o));if(m){n=m.window,i=m.max;break}}if(t.rateLimit.customRules){let w=t.rateLimit.customRules[o];w&&(n=w.window,i=w.max)}let c=Bt(t),u=await c.get(s),b=Date.now();if(!u)await c.set(s,{key:s,count:1,lastRequest:b});else{let w=b-u.lastRequest;if(Lt(i,n,u)){let m=It(u.lastRequest,n);return Ot(m)}else w>n*1e3?await c.set(s,{...u,count:1,lastRequest:b}):await c.set(s,{...u,count:u.count+1,lastRequest:b})}}function Dt(){return[{pathMatcher(t){return t.startsWith("/sign-in")||t.startsWith("/sign-up")},window:10,max:7}]}import{APIError as Ds}from"better-call";function zt(e,t){let r=t.plugins?.reduce((d,a)=>({...d,...a.endpoints}),{}),o=t.plugins?.map(d=>d.middlewares?.map(a=>{let c=async u=>a.middleware({...u,context:{...e,...u.context}});return c.path=a.path,c.options=a.middleware.options,c.headers=a.middleware.headers,{path:a.path,middleware:c}})).filter(d=>d!==void 0).flat()||[],i={...{signInOAuth:Ie,callbackOAuth:$e,getCSRFToken:Ge,getSession:X(),signOut:Ve,signUpEmail:Je(),signInEmail:Ce,forgetPassword:ze,resetPassword:qe,verifyEmail:Oe,sendVerificationEmail:Le,changeEmail:Qe,changePassword:Me,setPassword:Fe,updateUser:Ne,deleteUser:He,forgetPasswordCallback:je,listSessions:_e(),revokeSession:Pe,revokeSessions:Se},...r,ok:We,error:Ze},s={};for(let[d,a]of Object.entries(i))s[d]=async(c={})=>{let u=await e;for(let m of t.plugins||[])if(m.hooks?.before){for(let l of m.hooks.before)if(l.matcher({...a,...c,context:u})){let h=await l.handler({...c,context:{...u,...c?.context}});h&&"context"in h&&(u={...u,...h.context})}}let b;try{b=await a({...c,context:{...u,...c.context}})}catch(m){if(m instanceof et){let l=t.plugins?.map(h=>{if(h.hooks?.after)return h.hooks.after}).filter(h=>h!==void 0).flat();if(!l?.length)throw m;let g=new Response(JSON.stringify(m.body),{status:Vt[m.status],headers:m.headers});for(let h of l||[])if(h.matcher(c)){let ee=Object.assign(c,{context:{...e,returned:g}}),G=await h.handler(ee);G&&"response"in G&&(g=G.response)}return g}throw m}let w=b;for(let m of t.plugins||[])if(m.hooks?.after){for(let l of m.hooks.after)if(l.matcher(c)){let h=Object.assign(c,{context:{...e,returned:w}}),R=await l.handler(h);R&&"response"in R&&(w=R.response)}}return w},s[d].path=a.path,s[d].method=a.method,s[d].options=a.options,s[d].headers=a.headers;return{api:s,middlewares:o}}var Ss=(e,t)=>{let{api:r,middlewares:o}=zt(e,t),n=new URL(e.baseURL).pathname;return $t(r,{extraContext:e,basePath:n,routerMiddleware:[{path:"/**",middleware:ae},...o],async onRequest(i){for(let s of e.options.plugins||[])if(s.onRequest){let d=await s.onRequest(i,e);if(d)return d}return Ye(i,e)},async onResponse(i){for(let s of e.options.plugins||[])if(s.onResponse){let d=await s.onResponse(i,e);if(d)return d.response}return i},onError(i){if(t.onAPIError?.throw)throw i;if(t.onAPIError?.onError){t.onAPIError.onError(i,e);return}let s=t.logger?.verboseLogging?y:void 0;t.logger?.disabled!==!0&&(i instanceof et?(i.status==="INTERNAL_SERVER_ERROR"&&y.error(i),s?.error(i.message)):y?.error(i))}})};export{Ds as APIError,$e as callbackOAuth,Qe as changeEmail,Me as changePassword,p as createAuthEndpoint,$ as createAuthMiddleware,O as createEmailVerificationToken,ae as csrfMiddleware,He as deleteUser,Ze as error,ze as forgetPassword,je as forgetPasswordCallback,Ge as getCSRFToken,zt as getEndpoints,X as getSession,Y as getSessionFromCtx,_e as listSessions,We as ok,ie as optionsMiddleware,qe as resetPassword,Pe as revokeSession,Se as revokeSessions,Ss as router,Le as sendVerificationEmail,L as sessionMiddleware,Fe as setPassword,Ce as signInEmail,Ie as signInOAuth,Ve as signOut,Je as signUpEmail,Ne as updateUser,Oe as verifyEmail};
@@ -1246,12 +1246,12 @@ declare const signInOAuth: {
1246
1246
  /**
1247
1247
  * OAuth2 provider to use`
1248
1248
  */
1249
- provider: z.ZodEnum<["github", ...("github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter")[]]>;
1249
+ provider: z.ZodEnum<["github", ...("apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter")[]]>;
1250
1250
  }, "strip", z.ZodTypeAny, {
1251
- provider: "github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter";
1251
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter";
1252
1252
  callbackURL?: string | undefined;
1253
1253
  }, {
1254
- provider: "github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter";
1254
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter";
1255
1255
  callbackURL?: string | undefined;
1256
1256
  }>;
1257
1257
  use: better_call.Endpoint<better_call.Handler<string, better_call.EndpointOptions, void>, better_call.EndpointOptions>[];
@@ -1289,12 +1289,12 @@ declare const signInOAuth: {
1289
1289
  /**
1290
1290
  * OAuth2 provider to use`
1291
1291
  */
1292
- provider: z.ZodEnum<["github", ...("github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter")[]]>;
1292
+ provider: z.ZodEnum<["github", ...("apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter")[]]>;
1293
1293
  }, "strip", z.ZodTypeAny, {
1294
- provider: "github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter";
1294
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter";
1295
1295
  callbackURL?: string | undefined;
1296
1296
  }, {
1297
- provider: "github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter";
1297
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter";
1298
1298
  callbackURL?: string | undefined;
1299
1299
  }>;
1300
1300
  use: better_call.Endpoint<better_call.Handler<string, better_call.EndpointOptions, void>, better_call.EndpointOptions>[];
@@ -2588,12 +2588,12 @@ declare function getEndpoints<C extends AuthContext, Option extends BetterAuthOp
2588
2588
  }>>;
2589
2589
  body: zod.ZodObject<{
2590
2590
  callbackURL: zod.ZodOptional<zod.ZodString>;
2591
- provider: zod.ZodEnum<["github", ...("github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter")[]]>;
2591
+ provider: zod.ZodEnum<["github", ...("apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter")[]]>;
2592
2592
  }, "strip", zod.ZodTypeAny, {
2593
- provider: "github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter";
2593
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter";
2594
2594
  callbackURL?: string | undefined;
2595
2595
  }, {
2596
- provider: "github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter";
2596
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter";
2597
2597
  callbackURL?: string | undefined;
2598
2598
  }>;
2599
2599
  use: Endpoint<better_call.Handler<string, better_call.EndpointOptions, void>, better_call.EndpointOptions>[];
@@ -2621,12 +2621,12 @@ declare function getEndpoints<C extends AuthContext, Option extends BetterAuthOp
2621
2621
  }>>;
2622
2622
  body: zod.ZodObject<{
2623
2623
  callbackURL: zod.ZodOptional<zod.ZodString>;
2624
- provider: zod.ZodEnum<["github", ...("github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter")[]]>;
2624
+ provider: zod.ZodEnum<["github", ...("apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter")[]]>;
2625
2625
  }, "strip", zod.ZodTypeAny, {
2626
- provider: "github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter";
2626
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter";
2627
2627
  callbackURL?: string | undefined;
2628
2628
  }, {
2629
- provider: "github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter";
2629
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter";
2630
2630
  callbackURL?: string | undefined;
2631
2631
  }>;
2632
2632
  use: Endpoint<better_call.Handler<string, better_call.EndpointOptions, void>, better_call.EndpointOptions>[];
@@ -3776,12 +3776,12 @@ declare const router: <C extends AuthContext, Option extends BetterAuthOptions>(
3776
3776
  }>>;
3777
3777
  body: zod.ZodObject<{
3778
3778
  callbackURL: zod.ZodOptional<zod.ZodString>;
3779
- provider: zod.ZodEnum<["github", ...("github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter")[]]>;
3779
+ provider: zod.ZodEnum<["github", ...("apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter")[]]>;
3780
3780
  }, "strip", zod.ZodTypeAny, {
3781
- provider: "github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter";
3781
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter";
3782
3782
  callbackURL?: string | undefined;
3783
3783
  }, {
3784
- provider: "github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter";
3784
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter";
3785
3785
  callbackURL?: string | undefined;
3786
3786
  }>;
3787
3787
  use: Endpoint<better_call.Handler<string, better_call.EndpointOptions, void>, better_call.EndpointOptions>[];
@@ -3809,12 +3809,12 @@ declare const router: <C extends AuthContext, Option extends BetterAuthOptions>(
3809
3809
  }>>;
3810
3810
  body: zod.ZodObject<{
3811
3811
  callbackURL: zod.ZodOptional<zod.ZodString>;
3812
- provider: zod.ZodEnum<["github", ...("github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter")[]]>;
3812
+ provider: zod.ZodEnum<["github", ...("apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter")[]]>;
3813
3813
  }, "strip", zod.ZodTypeAny, {
3814
- provider: "github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter";
3814
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter";
3815
3815
  callbackURL?: string | undefined;
3816
3816
  }, {
3817
- provider: "github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter";
3817
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter";
3818
3818
  callbackURL?: string | undefined;
3819
3819
  }>;
3820
3820
  use: Endpoint<better_call.Handler<string, better_call.EndpointOptions, void>, better_call.EndpointOptions>[];
@@ -4966,12 +4966,12 @@ declare const betterAuth: <O extends BetterAuthOptions>(options: O) => {
4966
4966
  }>>;
4967
4967
  body: zod.ZodObject<{
4968
4968
  callbackURL: zod.ZodOptional<zod.ZodString>;
4969
- provider: zod.ZodEnum<["github", ...("github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter")[]]>;
4969
+ provider: zod.ZodEnum<["github", ...("apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter")[]]>;
4970
4970
  }, "strip", zod.ZodTypeAny, {
4971
- provider: "github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter";
4971
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter";
4972
4972
  callbackURL?: string | undefined;
4973
4973
  }, {
4974
- provider: "github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter";
4974
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter";
4975
4975
  callbackURL?: string | undefined;
4976
4976
  }>;
4977
4977
  use: Endpoint<better_call.Handler<string, better_call.EndpointOptions, void>, better_call.EndpointOptions>[];
@@ -4999,12 +4999,12 @@ declare const betterAuth: <O extends BetterAuthOptions>(options: O) => {
4999
4999
  }>>;
5000
5000
  body: zod.ZodObject<{
5001
5001
  callbackURL: zod.ZodOptional<zod.ZodString>;
5002
- provider: zod.ZodEnum<["github", ...("github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter")[]]>;
5002
+ provider: zod.ZodEnum<["github", ...("apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter")[]]>;
5003
5003
  }, "strip", zod.ZodTypeAny, {
5004
- provider: "github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter";
5004
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter";
5005
5005
  callbackURL?: string | undefined;
5006
5006
  }, {
5007
- provider: "github" | "apple" | "discord" | "facebook" | "microsoft" | "google" | "spotify" | "twitch" | "twitter";
5007
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "microsoft" | "spotify" | "twitch" | "twitter";
5008
5008
  callbackURL?: string | undefined;
5009
5009
  }>;
5010
5010
  use: Endpoint<better_call.Handler<string, better_call.EndpointOptions, void>, better_call.EndpointOptions>[];
@@ -2,10 +2,10 @@ import * as nanostores from 'nanostores';
2
2
  import { A as AccessControl, S as StatementsPrimitive, R as Role } from '../statement-CfnyN34h.js';
3
3
  import * as _better_fetch_fetch from '@better-fetch/fetch';
4
4
  import { BetterFetchOption } from '@better-fetch/fetch';
5
- import { o as organization, l as Organization, M as Member, I as Invitation, u as username, m as magicLink, d as phoneNumber, e as anonymous, i as admin, j as genericOAuth, k as multiSession } from '../index-Cxv56NjA.js';
6
- export { g as getPasskeyActions, c as passkeyClient, a as twoFactorClient } from '../index-Cxv56NjA.js';
5
+ import { o as organization, l as Organization, M as Member, I as Invitation, u as username, m as magicLink, d as phoneNumber, e as anonymous, i as admin, j as genericOAuth, k as multiSession } from '../index-C8gaT3LO.js';
6
+ export { g as getPasskeyActions, c as passkeyClient, a as twoFactorClient } from '../index-C8gaT3LO.js';
7
7
  import { P as Prettify } from '../helper-DPDj8Nix.js';
8
- import { F as FieldAttribute, B as BetterAuthOptions, b as BetterAuthPlugin } from '../auth-D8X910LZ.js';
8
+ import { F as FieldAttribute, B as BetterAuthOptions, b as BetterAuthPlugin } from '../auth-BygKDI7g.js';
9
9
  import 'zod';
10
10
  import '../schema-Dkt0LqYs.js';
11
11
  import 'better-call';
package/dist/client.d.ts CHANGED
@@ -6,7 +6,7 @@ import { BetterFetch, BetterFetchError, BetterFetchOption } from '@better-fetch/
6
6
  import { U as UnionToIntersection, P as Prettify, S as StripEmptyObjects } from './helper-DPDj8Nix.js';
7
7
  import { ClientOptions, InferClientAPI, InferActions, InferAdditionalFromClient, InferSessionFromClient, InferUserFromClient, BetterAuthClientPlugin, IsSignal } from './types.js';
8
8
  export { AtomListener, InferPluginsFromClient } from './types.js';
9
- import './auth-D8X910LZ.js';
9
+ import './auth-BygKDI7g.js';
10
10
  import 'kysely';
11
11
  import './schema-Dkt0LqYs.js';
12
12
  import 'better-call';
package/dist/cookies.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import 'better-call';
2
- export { s as BetterAuthCookies, E as EligibleCookies, r as createCookieGetter, u as deleteSessionCookie, q as getCookies, w as parseCookies, v as parseSetCookieHeader, t as setSessionCookie } from './auth-D8X910LZ.js';
2
+ export { s as BetterAuthCookies, E as EligibleCookies, r as createCookieGetter, u as deleteSessionCookie, q as getCookies, w as parseCookies, v as parseSetCookieHeader, t as setSessionCookie } from './auth-BygKDI7g.js';
3
3
  import 'zod';
4
4
  import 'kysely';
5
5
  import './schema-Dkt0LqYs.js';
package/dist/cookies.js CHANGED
@@ -1 +1 @@
1
- import{TimeSpan as m}from"oslo";var u=class extends Error{constructor(i,o){super(i),this.name="BetterAuthError",this.message=i,this.cause=o,this.stack=""}};function l(e){let o=(e.advanced?.useSecureCookies!==void 0?e.advanced?.useSecureCookies:(e.baseURL?e.baseURL.startsWith("https://"):!1)||process.env.NODE_ENV==="production")?"__Secure-":"",t="better-auth",r=e.session?.expiresIn||new m(7,"d").seconds(),s=!!e.advanced?.crossSubDomainCookies?.enabled,n=s?e.advanced?.crossSubDomainCookies?.domain||(e.baseURL?new URL(e.baseURL).hostname:void 0):void 0;if(s&&!n)throw new u("baseURL is required when crossSubdomainCookies are enabled");let a=s?"none":"lax";return{sessionToken:{name:`${o}${t}.session_token`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:r,...s?{domain:n}:{}}},csrfToken:{name:`${o}${t}.csrf_token`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*60*24*7,...s?{domain:n}:{}}},state:{name:`${o}${t}.state`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*15,...s?{domain:n}:{}}},pkCodeVerifier:{name:`${o}${t}.pk_code_verifier`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*15,...s?{domain:n}:{}}},dontRememberToken:{name:`${o}${t}.dont_remember`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,...s?{domain:n}:{}}},nonce:{name:`${o}${t}.nonce`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*15,...s?{domain:n}:{}}}}}function b(e){let o=(e.advanced?.useSecureCookies!==void 0?e.advanced?.useSecureCookies:e.baseURL?.startsWith("https://")||process.env.NODE_ENV==="production")?"__Secure-":"",t="better-auth",r=e.advanced?.crossSubDomainCookies?.domain||(e.baseURL?new URL(e.baseURL).hostname:void 0);function s(n,a){let c=e.advanced?.crossSubDomainCookies?.enabled?e.advanced.crossSubDomainCookies.additionalCookies?.includes(n):void 0;return{name:process.env.NODE_ENV==="production"?`${o}${t}.${n}`:`${t}.${n}`,options:{secure:!!o,sameSite:"lax",path:"/",maxAge:60*15,...a,...c?{domain:r}:{}}}}return s}async function x(e,i,o,t){let r=e.context.authCookies.sessionToken.options;r.maxAge=o?void 0:e.context.sessionConfig.expiresIn,await e.setSignedCookie(e.context.authCookies.sessionToken.name,i,e.context.secret,{...r,...t}),o&&await e.setSignedCookie(e.context.authCookies.dontRememberToken.name,"true",e.context.secret,e.context.authCookies.dontRememberToken.options)}function g(e){e.setCookie(e.context.authCookies.sessionToken.name,"",{maxAge:0}),e.setCookie(e.context.authCookies.dontRememberToken.name,"",{maxAge:0})}function O(e){let i=new Map;return e.split(", ").forEach(t=>{let[r,...s]=t.split("; "),[n,a]=r.split("="),c={value:a};s.forEach(p=>{let[k,d]=p.split("=");c[k.toLowerCase()]=d||!0}),i.set(n,c)}),i}function S(e){let i=e.split("; "),o=new Map;return i.forEach(t=>{let[r,s]=t.split("=");o.set(r,s)}),o}export{b as createCookieGetter,g as deleteSessionCookie,l as getCookies,S as parseCookies,O as parseSetCookieHeader,x as setSessionCookie};
1
+ import{TimeSpan as m}from"oslo";var u=class extends Error{constructor(i,o){super(i),this.name="BetterAuthError",this.message=i,this.cause=o,this.stack=""}};function l(e){let o=(e.advanced?.useSecureCookies!==void 0?e.advanced?.useSecureCookies:e.baseURL!==void 0?!!e.baseURL.startsWith("https://"):process.env.NODE_ENV==="production")?"__Secure-":"",t="better-auth",r=e.session?.expiresIn||new m(7,"d").seconds(),s=!!e.advanced?.crossSubDomainCookies?.enabled,n=s?e.advanced?.crossSubDomainCookies?.domain||(e.baseURL?new URL(e.baseURL).hostname:void 0):void 0;if(s&&!n)throw new u("baseURL is required when crossSubdomainCookies are enabled");let a=s?"none":"lax";return{sessionToken:{name:`${o}${t}.session_token`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:r,...s?{domain:n}:{}}},csrfToken:{name:`${o}${t}.csrf_token`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*60*24*7,...s?{domain:n}:{}}},state:{name:`${o}${t}.state`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*15,...s?{domain:n}:{}}},pkCodeVerifier:{name:`${o}${t}.pk_code_verifier`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*15,...s?{domain:n}:{}}},dontRememberToken:{name:`${o}${t}.dont_remember`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,...s?{domain:n}:{}}},nonce:{name:`${o}${t}.nonce`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*15,...s?{domain:n}:{}}}}}function b(e){let o=(e.advanced?.useSecureCookies!==void 0?e.advanced?.useSecureCookies:e.baseURL?.startsWith("https://")||process.env.NODE_ENV==="production")?"__Secure-":"",t="better-auth",r=e.advanced?.crossSubDomainCookies?.domain||(e.baseURL?new URL(e.baseURL).hostname:void 0);function s(n,a){let c=e.advanced?.crossSubDomainCookies?.enabled?e.advanced.crossSubDomainCookies.additionalCookies?.includes(n):void 0;return{name:process.env.NODE_ENV==="production"?`${o}${t}.${n}`:`${t}.${n}`,options:{secure:!!o,sameSite:"lax",path:"/",maxAge:60*15,...a,...c?{domain:r}:{}}}}return s}async function x(e,i,o,t){let r=e.context.authCookies.sessionToken.options;r.maxAge=o?void 0:e.context.sessionConfig.expiresIn,await e.setSignedCookie(e.context.authCookies.sessionToken.name,i,e.context.secret,{...r,...t}),o&&await e.setSignedCookie(e.context.authCookies.dontRememberToken.name,"true",e.context.secret,e.context.authCookies.dontRememberToken.options)}function g(e){e.setCookie(e.context.authCookies.sessionToken.name,"",{maxAge:0}),e.setCookie(e.context.authCookies.dontRememberToken.name,"",{maxAge:0})}function O(e){let i=new Map;return e.split(", ").forEach(t=>{let[r,...s]=t.split("; "),[n,a]=r.split("="),c={value:a};s.forEach(p=>{let[d,k]=p.split("=");c[d.toLowerCase()]=k||!0}),i.set(n,c)}),i}function S(e){let i=e.split("; "),o=new Map;return i.forEach(t=>{let[r,s]=t.split("=");o.set(r,s)}),o}export{b as createCookieGetter,g as deleteSessionCookie,l as getCookies,S as parseCookies,O as parseSetCookieHeader,x as setSessionCookie};
package/dist/db.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { A as Adapter, B as BetterAuthOptions, W as Where, F as FieldAttribute, z as FieldType, K as KyselyDatabaseType } from './auth-D8X910LZ.js';
2
- export { X as BetterAuthDbSchema, J as FieldAttributeConfig, V as InferFieldsFromOptions, U as InferFieldsFromPlugins, O as InferFieldsInput, Q as InferFieldsInputClient, N as InferFieldsOutput, M as InferValueType, D as InternalAdapter, T as PluginFieldAttribute, L as createFieldAttribute, C as createInternalAdapter, Y as getAuthTables } from './auth-D8X910LZ.js';
1
+ import { A as Adapter, B as BetterAuthOptions, W as Where, F as FieldAttribute, z as FieldType, K as KyselyDatabaseType } from './auth-BygKDI7g.js';
2
+ export { X as BetterAuthDbSchema, J as FieldAttributeConfig, V as InferFieldsFromOptions, U as InferFieldsFromPlugins, O as InferFieldsInput, Q as InferFieldsInputClient, N as InferFieldsOutput, M as InferValueType, D as InternalAdapter, T as PluginFieldAttribute, L as createFieldAttribute, C as createInternalAdapter, Y as getAuthTables } from './auth-BygKDI7g.js';
3
3
  import { z } from 'zod';
4
4
  import 'kysely';
5
5
  import './schema-Dkt0LqYs.js';
package/dist/db.js CHANGED
@@ -1,4 +1,4 @@
1
- var v=(e,r="ms")=>new Date(Date.now()+(r==="sec"?e*1e3:e));var g=e=>{let r=e.plugins?.reduce((t,a)=>{let o=a.schema;if(!o)return t;for(let[l,u]of Object.entries(o))t[l]={fields:{...t[l]?.fields,...u.fields},tableName:u.tableName||l};return t},{}),i=e.rateLimit?.storage==="database",n={rateLimit:{tableName:e.rateLimit?.tableName||"rateLimit",fields:{key:{type:"string",fieldName:e.rateLimit?.fields?.key||"key"},count:{type:"number",fieldName:e.rateLimit?.fields?.count||"count"},lastRequest:{type:"number",fieldName:e.rateLimit?.fields?.lastRequest||"lastRequest"}}}},{user:d,session:s,account:c,...f}=r||{};return{user:{tableName:e.user?.modelName||"user",fields:{name:{type:"string",required:!0,fieldName:e.user?.fields?.name||"name"},email:{type:"string",unique:!0,required:!0,fieldName:e.user?.fields?.email||"email"},emailVerified:{type:"boolean",defaultValue:()=>!1,required:!0,fieldName:e.user?.fields?.emailVerified||"emailVerified"},image:{type:"string",required:!1,fieldName:e.user?.fields?.image||"image"},createdAt:{type:"date",defaultValue:()=>new Date,required:!0,fieldName:e.user?.fields?.createdAt||"createdAt"},updatedAt:{type:"date",defaultValue:()=>new Date,required:!0,fieldName:e.user?.fields?.updatedAt||"updatedAt"},...d?.fields,...e.user?.additionalFields},order:1},session:{tableName:e.session?.modelName||"session",fields:{expiresAt:{type:"date",required:!0,fieldName:e.session?.fields?.expiresAt||"expiresAt"},ipAddress:{type:"string",required:!1,fieldName:e.session?.fields?.ipAddress||"ipAddress"},userAgent:{type:"string",required:!1,fieldName:e.session?.fields?.userAgent||"userAgent"},userId:{type:"string",fieldName:e.session?.fields?.userId||"userId",references:{model:e.user?.modelName||"user",field:"id",onDelete:"cascade"},required:!0},...s?.fields,...e.session?.additionalFields},order:2},account:{tableName:e.account?.modelName||"account",fields:{accountId:{type:"string",required:!0,fieldName:e.account?.fields?.accountId||"accountId"},providerId:{type:"string",required:!0,fieldName:e.account?.fields?.providerId||"providerId"},userId:{type:"string",references:{model:e.user?.modelName||"user",field:"id",onDelete:"cascade"},required:!0,fieldName:e.account?.fields?.userId||"userId"},accessToken:{type:"string",required:!1,fieldName:e.account?.fields?.accessToken||"accessToken"},refreshToken:{type:"string",required:!1,fieldName:e.account?.fields?.refreshToken||"refreshToken"},idToken:{type:"string",required:!1,fieldName:e.account?.fields?.idToken||"idToken"},expiresAt:{type:"date",required:!1,fieldName:e.account?.fields?.expiresAt||"expiresAt"},password:{type:"string",required:!1,fieldName:e.account?.fields?.password||"password"},...c?.fields},order:3},verification:{tableName:e.verification?.modelName||"verification",fields:{identifier:{type:"string",required:!0,fieldName:e.verification?.fields?.identifier||"identifier"},value:{type:"string",required:!0,fieldName:e.verification?.fields?.value||"value"},expiresAt:{type:"date",required:!0,fieldName:e.verification?.fields?.expiresAt||"expiresAt"}},order:4},...f,...i?n:{}}};import{nanoid as P}from"nanoid";var A=e=>P(e);var T=class extends Error{constructor(r,i){super(r),this.name="BetterAuthError",this.message=r,this.cause=i,this.stack=""}};import{Kysely as R,MssqlDialect as E}from"kysely";import{MysqlDialect as D,PostgresDialect as B,SqliteDialect as V}from"kysely";function U(e){if("dialect"in e)return U(e.dialect);if("createDriver"in e){if(e instanceof V)return"sqlite";if(e instanceof D)return"mysql";if(e instanceof B)return"postgres";if(e instanceof E)return"mssql"}return"aggregate"in e?"sqlite":"getConnection"in e?"mysql":"connect"in e?"postgres":null}var N=async e=>{let r=e.database;if("db"in r)return{kysely:r.db,databaseType:r.type};if("dialect"in r)return{kysely:new R({dialect:r.dialect}),databaseType:r.type};let i,n=U(r);return"createDriver"in r&&(i=r),"aggregate"in r&&(i=new V({database:r})),"getConnection"in r&&(i=new D({pool:r})),"connect"in r&&(i=new B({pool:r})),{kysely:i?new R({dialect:i}):null,databaseType:n}};function I(e){if(!e)return{and:null,or:null};let r=e?.filter(n=>n.connector==="AND"||!n.connector).reduce((n,d)=>({...n,[d.field]:d.value}),{}),i=e?.filter(n=>n.connector==="OR").reduce((n,d)=>({...n,[d.field]:d.value}),{});return{and:Object.keys(r).length?r:null,or:Object.keys(i).length?i:null}}function k(e,r,i){for(let n in e)e[n]===0&&r[n]?.type==="boolean"&&i?.boolean&&(e[n]=!1),e[n]===1&&r[n]?.type==="boolean"&&i?.boolean&&(e[n]=!0),r[n]?.type==="date"&&(e[n]instanceof Date||(e[n]=new Date(e[n])));return e}function K(e,r){for(let i in e)typeof e[i]=="boolean"&&r?.boolean&&(e[i]=e[i]?1:0),e[i]instanceof Date&&(e[i]=e[i].toISOString());return e}var M=(e,r)=>({id:"kysely",async create(i){let{model:n,data:d,select:s}=i;r?.transform&&(d=K(d,r.transform)),r?.generateId!==void 0&&(d.id=r.generateId?r.generateId():void 0);let c=await e.insertInto(n).values(d).returningAll().executeTakeFirst();if(r?.transform){let f=r.transform.schema[n];c=f?k(d,f,r.transform):c}return s?.length&&(c=c?s.reduce((t,a)=>c?.[a]?{...t,[a]:c[a]}:t,{}):null),c},async findOne(i){let{model:n,where:d,select:s}=i,{and:c,or:f}=I(d),t=e.selectFrom(n).selectAll();f&&(t=t.where(o=>o.or(f))),c&&(t=t.where(o=>o.and(c)));let a=await t.executeTakeFirst();if(s?.length&&(a=a?s.reduce((l,u)=>a?.[u]?{...l,[u]:a[u]}:l,{}):null),r?.transform){let o=r.transform.schema[n];return a=a&&o?k(a,o,r.transform):a,a||null}return a||null},async findMany(i){let{model:n,where:d,limit:s,offset:c,sortBy:f}=i,t=e.selectFrom(n),{and:a,or:o}=I(d);a&&(t=t.where(u=>u.and(a))),o&&(t=t.where(u=>u.or(o))),t=t.limit(s||100),c&&(t=t.offset(c)),f&&(t=t.orderBy(f.field,f.direction));let l=await t.selectAll().execute();if(r?.transform){let u=r.transform.schema[n];return u?l.map(y=>k(y,u,r.transform)):l}return l},async update(i){let{model:n,where:d,update:s}=i,{and:c,or:f}=I(d);r?.transform&&(s=K(s,r.transform));let t=e.updateTable(n).set(s);c&&(t=t.where(o=>o.and(c))),f&&(t=t.where(o=>o.or(f)));let a=await t.returningAll().executeTakeFirst()||null;if(r?.transform){let o=r.transform.schema[n];return o?k(a,o,r.transform):a}return a},async delete(i){let{model:n,where:d}=i,{and:s,or:c}=I(d),f=e.deleteFrom(n);s&&(f=f.where(t=>t.and(s))),c&&(f=f.where(t=>t.or(c))),await f.execute()}});async function pe(e){if(!e.database)throw new T("Database configuration is required");if("create"in e.database)return e.database;let{kysely:r,databaseType:i}=await N(e);if(!r)throw new T("Failed to initialize database adapter");let n=g(e),d={};for(let s of Object.values(n))d[s.tableName]=s.fields;return M(r,{transform:{schema:d,date:!0,boolean:i==="sqlite"},generateId:"generateId"in e.database?e.database.generateId:void 0})}function q(e,r){let i={id:r.id};for(let n in e){let d=e[n],s=r[n];i[d.fieldName||n]=s}return i}function S(e,r){if(!r)return null;let i={id:r.id};for(let[n,d]of Object.entries(e))i[n]=r[d.fieldName||n];return i}function C(e,r){let i=r.hooks,n=g(r.options);async function d(c,f,t){let a=c,o=n[f];for(let y of i||[]){let m=y[f]?.create?.before;if(m){let p=await m(c);if(p===!1)return null;typeof p=="object"&&"data"in p&&(a=p.data)}}let l=t?await t.fn(a):null,u=!t||t.executeMainFn?await e.create({model:o.tableName,data:{id:A(),...q(o.fields,a)}}):l;for(let y of i||[]){let m=y[f]?.create?.after;m&&await m(u)}return S(o.fields,u)}async function s(c,f,t,a){let o=c;for(let y of i||[]){let m=y[t]?.update?.before;if(m){let p=await m(c);if(p===!1)return null;o=typeof p=="object"?p.data:p}}let l=a?await a.fn(o):null,u=!a||a.executeMainFn?await e.update({model:n[t].tableName,update:q(n[t].fields,o),where:f}):l;for(let y of i||[]){let m=y[t]?.update?.after;m&&await m(u)}return S(n[t].fields,u)}return{createWithHooks:d,updateWithHooks:s}}var Ie=(e,r)=>{let i=r.options,n=i.secondaryStorage,d=i.session?.expiresIn||60*60*24*7,s=g(i),{createWithHooks:c,updateWithHooks:f}=C(e,r);return{createOAuthUser:async(t,a)=>{try{let o=await c(t,"user"),l=await c(a,"account");return{user:o,account:{...l,userId:o.id}}}catch(o){return console.log(o),null}},createUser:async t=>await c({id:A(),createdAt:new Date,updatedAt:new Date,emailVerified:!1,...t},"user"),createAccount:async t=>await c({id:A(),createdAt:new Date,updatedAt:new Date,...t},"account"),listSessions:async t=>await e.findMany({model:s.session.tableName,where:[{field:s.session.fields.userId.fieldName||"userId",value:t}]}),listUsers:async(t,a,o,l)=>await e.findMany({model:s.user.tableName,limit:t,offset:a,sortBy:o,where:l}),deleteUser:async t=>{await e.delete({model:s.account.tableName,where:[{field:s.account.fields.userId.fieldName||"userId",value:t}]}),await e.delete({model:s.session.tableName,where:[{field:s.session.fields.userId.fieldName||"userId",value:t}]}),await e.delete({model:s.user.tableName,where:[{field:"id",value:t}]})},createSession:async(t,a,o,l)=>{let u=a instanceof Request?a.headers:a,y={id:A(),userId:t,expiresAt:o?v(60*60*24,"sec"):v(d,"sec"),ipAddress:u?.get("x-forwarded-for")||"",userAgent:u?.get("user-agent")||"",...l};return await c(y,"session",n?{fn:async p=>{let b=await e.findOne({model:s.user.tableName,where:[{field:"id",value:t}]});return n.set(p.id,JSON.stringify({session:p,user:b}),d),p},executeMainFn:i.session?.storeSessionInDatabase}:void 0)},findSession:async t=>{if(n){let l=await n.get(t);if(l){let u=JSON.parse(l);return{session:{...u.session,expiresAt:new Date(u.session.expiresAt)},user:{...u.user,createdAt:new Date(u.user.createdAt),updatedAt:new Date(u.user.updatedAt)}}}}let a=await e.findOne({model:s.session.tableName,where:[{value:t,field:"id"}]});if(!a)return null;let o=await e.findOne({model:s.user.tableName,where:[{value:a.userId,field:"id"}]});return o?{session:a,user:o}:null},updateSession:async(t,a)=>await f(a,[{field:"id",value:t}],"session",n?{async fn(l){let u=await n.get(t),y=null;if(u){let m=JSON.parse(u);y={...m.session,...l},await n.set(t,JSON.stringify({session:y,user:m.user}),m.session.expiresAt?new Date(m.session.expiresAt).getTime():void 0)}else return null},executeMainFn:i.session?.storeSessionInDatabase}:void 0),deleteSession:async t=>{if(n){await n.delete(t),i.session?.storeSessionInDatabase&&await e.delete({model:s.session.tableName,where:[{field:"id",value:t}]});return}await e.delete({model:s.session.tableName,where:[{field:"id",value:t}]})},deleteSessions:async t=>{if(n){let a=await e.findMany({model:s.session.tableName,where:[{field:s.session.fields.userId.fieldName||"userId",value:t}]});for(let o of a)await n.delete(o.id);i.session?.storeSessionInDatabase&&await e.delete({model:s.session.tableName,where:[{field:s.session.fields.userId.fieldName||"userId",value:t}]});return}await e.delete({model:s.session.tableName,where:[{field:s.session.fields.userId.fieldName||"userId",value:t}]})},findUserByEmail:async(t,a)=>{let o=await e.findOne({model:s.user.tableName,where:[{value:t.toLowerCase(),field:s.user.fields.email.fieldName||"email"}]});if(!o)return null;if(a?.includeAccounts){let l=await e.findMany({model:s.account.tableName,where:[{value:o.id,field:s.account.fields.userId.fieldName||"userId"}]});return{user:o,accounts:l}}return{user:o,accounts:[]}},findUserById:async t=>await e.findOne({model:s.user.tableName,where:[{field:"id",value:t}]}),linkAccount:async t=>await c({id:A(),...t},"account"),updateUser:async(t,a)=>await f(a,[{field:"id",value:t}],"user"),updateUserByEmail:async(t,a)=>await f(a,[{field:"email",value:t}],"user"),updatePassword:async(t,a)=>await f({password:a},[{field:s.account.fields.userId.fieldName||"userId",value:t},{field:s.account.fields.providerId.fieldName||"providerId",value:"credential"}],"account"),findAccounts:async t=>await e.findMany({model:s.account.tableName,where:[{field:s.account.fields.userId.fieldName||"userId",value:t}]}),updateAccount:async(t,a)=>await f(a,[{field:"id",value:t}],"account"),createVerificationValue:async t=>await c({id:A(),...t},"verification"),findVerificationValue:async t=>await e.findOne({model:s.verification.tableName,where:[{field:s.verification.fields.identifier.fieldName||"identifier",value:t}]}),deleteVerificationValue:async t=>{await e.delete({model:s.verification.tableName,where:[{field:"id",value:t}]})},updateVerificationValue:async(t,a)=>await f(a,[{field:"id",value:t}],"verification")}};var Oe=(e,r)=>({type:e,...r});import{z as F}from"zod";function Se(e){return F.object({...Object.keys(e).reduce((i,n)=>{let d=e[n];if(!d)return i;if(d.type==="string[]"||d.type==="number[]")return{...i,[n]:F.array(d.type==="string[]"?F.string():F.number())};let s=F[d.type]();return d?.required===!1&&(s=s.optional()),d?.returned===!1?i:{...i,[n]:s}},{})})}import"kysely";import{createConsola as L}from"consola";var h=L({formatOptions:{date:!1,colors:!0,compact:!0},defaults:{tag:"Better Auth"}}),W=e=>({log:(...r)=>{!e?.disabled&&h.log("",...r)},error:(...r)=>{!e?.disabled&&h.error("",...r)},warn:(...r)=>{!e?.disabled&&h.warn("",...r)},info:(...r)=>{!e?.disabled&&h.info("",...r)},debug:(...r)=>{!e?.disabled&&h.debug("",...r)},box:(...r)=>{!e?.disabled&&h.box("",...r)},success:(...r)=>{!e?.disabled&&h.success("",...r)},break:(...r)=>{!e?.disabled&&console.log(`
2
- `)}}),O=W();function j(e){let r=g(e),i={};for(let n in r){let d=r[n],s=d.fields,c={};if(Object.entries(s).forEach(([f,t])=>{c[t.fieldName||f]=t}),i[d.tableName]){i[d.tableName].fields={...i[d.tableName].fields,...c};continue}i[d.tableName]={fields:c,order:d.order||1/0}}return i}var $={string:["character varying","text"],number:["int4","integer","bigint","smallint","numeric","real","double precision"],boolean:["bool","boolean"],date:["timestamp","date"]},H={string:["varchar","text"],number:["integer","int","bigint","smallint","decimal","float","double"],boolean:["boolean"],date:["date","datetime"]},Z={string:["TEXT"],number:["INTEGER","REAL"],boolean:["INTEGER","BOOLEAN"],date:["DATE","INTEGER"]},z={string:["nvarchar","varchar"],number:["int","bigint","smallint","decimal","float","double"],boolean:["bit","boolean"],date:["datetime","date"]},J={postgres:$,mysql:H,sqlite:Z,mssql:z};function G(e,r,i){return r==="string[]"||r==="number[]"?e.toLowerCase().includes("json"):J[i][r].map(c=>c.toLowerCase()).includes(e.toLowerCase())}async function Pe(e){let r=j(e),{kysely:i,databaseType:n}=await N(e);n||(O.warn("Could not determine database type, defaulting to sqlite. Please provide a type in the database options to avoid this."),n="sqlite"),i||(O.error("Only kysely adapter is supported for migrations. You can use `generate` command to generate the schema, if you're using a different adapter."),process.exit(1));let d=await i.introspection.getTables(),s=[],c=[];for(let[l,u]of Object.entries(r)){let y=d.find(p=>p.name===l);if(!y){let p=s.findIndex(w=>w.table===l),b={table:l,fields:u.fields,order:u.order||1/0},x=s.findIndex(w=>(w.order||1/0)>b.order);x===-1?p===-1?s.push(b):s[p].fields={...s[p].fields,...u.fields}:s.splice(x,0,b);continue}let m={};for(let[p,b]of Object.entries(u.fields)){let x=y.columns.find(w=>w.name===p);if(!x){m[p]=b;continue}G(x.dataType,b.type,n)||O.warn(`Field ${p} in table ${l} has a different type in the database. Expected ${b.type} but got ${x.dataType}.`)}Object.keys(m).length>0&&c.push({table:l,fields:m,order:u.order||1/0})}let f=[];function t(l){let u={string:"text",boolean:"boolean",number:"integer",date:"date"};return n==="mysql"&&l==="string"?"varchar(255)":n==="sqlite"&&(l==="string[]"||l==="number[]")?"text":l==="string[]"||l==="number[]"?"jsonb":u[l]}if(c.length)for(let l of c)for(let[u,y]of Object.entries(l.fields)){let m=t(y.type),p=i.schema.alterTable(l.table).addColumn(u,m,b=>(b=y.required!==!1?b.notNull():b,y.references&&(b=b.references(`${y.references.model}.${y.references.field}`)),b));f.push(p)}if(s.length)for(let l of s){let u=i.schema.createTable(l.table).addColumn("id",t("string"),y=>y.primaryKey().notNull());for(let[y,m]of Object.entries(l.fields)){let p=t(m.type);u=u.addColumn(y,p,b=>(b=m.required!==!1?b.notNull():b,m.references&&(b=b.references(`${m.references.model}.${m.references.field}`)),m.unique&&(b=b.unique()),b))}f.push(u)}async function a(){for(let l of f)await l.execute()}async function o(){return f.map(u=>u.compile().sql).join(`;
1
+ var v=(e,r="ms")=>new Date(Date.now()+(r==="sec"?e*1e3:e));var g=e=>{let r=e.plugins?.reduce((t,a)=>{let o=a.schema;if(!o)return t;for(let[u,c]of Object.entries(o))t[u]={fields:{...t[u]?.fields,...c.fields},tableName:c.tableName||u};return t},{}),s=e.rateLimit?.storage==="database",n={rateLimit:{tableName:e.rateLimit?.tableName||"rateLimit",fields:{key:{type:"string",fieldName:e.rateLimit?.fields?.key||"key"},count:{type:"number",fieldName:e.rateLimit?.fields?.count||"count"},lastRequest:{type:"number",fieldName:e.rateLimit?.fields?.lastRequest||"lastRequest"}}}},{user:d,session:i,account:l,...f}=r||{};return{user:{tableName:e.user?.modelName||"user",fields:{name:{type:"string",required:!0,fieldName:e.user?.fields?.name||"name"},email:{type:"string",unique:!0,required:!0,fieldName:e.user?.fields?.email||"email"},emailVerified:{type:"boolean",defaultValue:()=>!1,required:!0,fieldName:e.user?.fields?.emailVerified||"emailVerified"},image:{type:"string",required:!1,fieldName:e.user?.fields?.image||"image"},createdAt:{type:"date",defaultValue:()=>new Date,required:!0,fieldName:e.user?.fields?.createdAt||"createdAt"},updatedAt:{type:"date",defaultValue:()=>new Date,required:!0,fieldName:e.user?.fields?.updatedAt||"updatedAt"},...d?.fields,...e.user?.additionalFields},order:1},session:{tableName:e.session?.modelName||"session",fields:{expiresAt:{type:"date",required:!0,fieldName:e.session?.fields?.expiresAt||"expiresAt"},ipAddress:{type:"string",required:!1,fieldName:e.session?.fields?.ipAddress||"ipAddress"},userAgent:{type:"string",required:!1,fieldName:e.session?.fields?.userAgent||"userAgent"},userId:{type:"string",fieldName:e.session?.fields?.userId||"userId",references:{model:e.user?.modelName||"user",field:"id",onDelete:"cascade"},required:!0},...i?.fields,...e.session?.additionalFields},order:2},account:{tableName:e.account?.modelName||"account",fields:{accountId:{type:"string",required:!0,fieldName:e.account?.fields?.accountId||"accountId"},providerId:{type:"string",required:!0,fieldName:e.account?.fields?.providerId||"providerId"},userId:{type:"string",references:{model:e.user?.modelName||"user",field:"id",onDelete:"cascade"},required:!0,fieldName:e.account?.fields?.userId||"userId"},accessToken:{type:"string",required:!1,fieldName:e.account?.fields?.accessToken||"accessToken"},refreshToken:{type:"string",required:!1,fieldName:e.account?.fields?.refreshToken||"refreshToken"},idToken:{type:"string",required:!1,fieldName:e.account?.fields?.idToken||"idToken"},expiresAt:{type:"date",required:!1,fieldName:e.account?.fields?.expiresAt||"expiresAt"},password:{type:"string",required:!1,fieldName:e.account?.fields?.password||"password"},...l?.fields},order:3},verification:{tableName:e.verification?.modelName||"verification",fields:{identifier:{type:"string",required:!0,fieldName:e.verification?.fields?.identifier||"identifier"},value:{type:"string",required:!0,fieldName:e.verification?.fields?.value||"value"},expiresAt:{type:"date",required:!0,fieldName:e.verification?.fields?.expiresAt||"expiresAt"}},order:4},...f,...s?n:{}}};import{nanoid as P}from"nanoid";var h=e=>P(e);var T=class extends Error{constructor(r,s){super(r),this.name="BetterAuthError",this.message=r,this.cause=s,this.stack=""}};import{Kysely as S,MssqlDialect as L}from"kysely";import{MysqlDialect as D,PostgresDialect as B,SqliteDialect as V}from"kysely";function U(e){if("dialect"in e)return U(e.dialect);if("createDriver"in e){if(e instanceof V)return"sqlite";if(e instanceof D)return"mysql";if(e instanceof B)return"postgres";if(e instanceof L)return"mssql"}return"aggregate"in e?"sqlite":"getConnection"in e?"mysql":"connect"in e?"postgres":null}var N=async e=>{let r=e.database;if("db"in r)return{kysely:r.db,databaseType:r.type};if("dialect"in r)return{kysely:new S({dialect:r.dialect}),databaseType:r.type};let s,n=U(r);return"createDriver"in r&&(s=r),"aggregate"in r&&(s=new V({database:r})),"getConnection"in r&&(s=new D({pool:r})),"connect"in r&&(s=new B({pool:r})),{kysely:s?new S({dialect:s}):null,databaseType:n}};function I(e){if(!e)return{and:null,or:null};let r=e?.filter(n=>n.connector==="AND"||!n.connector).reduce((n,d)=>({...n,[d.field]:d.value}),{}),s=e?.filter(n=>n.connector==="OR").reduce((n,d)=>({...n,[d.field]:d.value}),{});return{and:Object.keys(r).length?r:null,or:Object.keys(s).length?s:null}}function k(e,r,s){for(let n in e)e[n]===0&&r[n]?.type==="boolean"&&s?.boolean&&(e[n]=!1),e[n]===1&&r[n]?.type==="boolean"&&s?.boolean&&(e[n]=!0),r[n]?.type==="date"&&(e[n]instanceof Date||(e[n]=new Date(e[n])));return e}function K(e,r){for(let s in e)typeof e[s]=="boolean"&&r?.boolean&&(e[s]=e[s]?1:0),e[s]instanceof Date&&(e[s]=e[s].toISOString());return e}var M=(e,r)=>({id:"kysely",async create(s){let{model:n,data:d,select:i}=s;r?.transform&&(d=K(d,r.transform)),r?.generateId!==void 0&&(d.id=r.generateId?r.generateId():void 0);let l=await e.insertInto(n).values(d).returningAll().executeTakeFirst();if(r?.transform){let f=r.transform.schema[n];l=f?k(d,f,r.transform):l}return i?.length&&(l=l?i.reduce((t,a)=>l?.[a]?{...t,[a]:l[a]}:t,{}):null),l},async findOne(s){let{model:n,where:d,select:i}=s,{and:l,or:f}=I(d),t=e.selectFrom(n).selectAll();f&&(t=t.where(o=>o.or(f))),l&&(t=t.where(o=>o.and(l)));let a=await t.executeTakeFirst();if(i?.length&&(a=a?i.reduce((u,c)=>a?.[c]?{...u,[c]:a[c]}:u,{}):null),r?.transform){let o=r.transform.schema[n];return a=a&&o?k(a,o,r.transform):a,a||null}return a||null},async findMany(s){let{model:n,where:d,limit:i,offset:l,sortBy:f}=s,t=e.selectFrom(n),{and:a,or:o}=I(d);a&&(t=t.where(c=>c.and(a))),o&&(t=t.where(c=>c.or(o))),t=t.limit(i||100),l&&(t=t.offset(l)),f&&(t=t.orderBy(f.field,f.direction));let u=await t.selectAll().execute();if(r?.transform){let c=r.transform.schema[n];return c?u.map(y=>k(y,c,r.transform)):u}return u},async update(s){let{model:n,where:d,update:i}=s,{and:l,or:f}=I(d);r?.transform&&(i=K(i,r.transform));let t=e.updateTable(n).set(i);l&&(t=t.where(o=>o.and(l))),f&&(t=t.where(o=>o.or(f)));let a=await t.returningAll().executeTakeFirst()||null;if(r?.transform){let o=r.transform.schema[n];return o?k(a,o,r.transform):a}return a},async delete(s){let{model:n,where:d}=s,{and:i,or:l}=I(d),f=e.deleteFrom(n);i&&(f=f.where(t=>t.and(i))),l&&(f=f.where(t=>t.or(l))),await f.execute()}});async function be(e){if(!e.database)throw new T("Database configuration is required");if("create"in e.database)return e.database;let{kysely:r,databaseType:s}=await N(e);if(!r)throw new T("Failed to initialize database adapter");let n=g(e),d={};for(let i of Object.values(n))d[i.tableName]=i.fields;return M(r,{transform:{schema:d,date:!0,boolean:s==="sqlite"},generateId:"generateId"in e.database?e.database.generateId:void 0})}function q(e,r){let s={id:r.id};for(let n in e){let d=e[n],i=r[n];s[d.fieldName||n]=i}return s}function R(e,r){if(!r)return null;let s={id:r.id};for(let[n,d]of Object.entries(e))s[n]=r[d.fieldName||n];return s}function C(e,r){let s=r.hooks,n=g(r.options);async function d(l,f,t){let a=l,o=n[f];for(let y of s||[]){let m=y[f]?.create?.before;if(m){let p=await m(l);if(p===!1)return null;typeof p=="object"&&"data"in p&&(a=p.data)}}let u=t?await t.fn(a):null,c=!t||t.executeMainFn?await e.create({model:o.tableName,data:{id:h(),...q(o.fields,a)}}):u;for(let y of s||[]){let m=y[f]?.create?.after;m&&await m(c)}return R(o.fields,c)}async function i(l,f,t,a){let o=l;for(let y of s||[]){let m=y[t]?.update?.before;if(m){let p=await m(l);if(p===!1)return null;o=typeof p=="object"?p.data:p}}let u=a?await a.fn(o):null,c=!a||a.executeMainFn?await e.update({model:n[t].tableName,update:q(n[t].fields,o),where:f}):u;for(let y of s||[]){let m=y[t]?.update?.after;m&&await m(c)}return R(n[t].fields,c)}return{createWithHooks:d,updateWithHooks:i}}function j(e){let r="127.0.0.1";if(process.env.NODE_ENV==="test")return r;let s=["x-client-ip","x-forwarded-for","cf-connecting-ip","fastly-client-ip","x-real-ip","x-cluster-client-ip","x-forwarded","forwarded-for","forwarded"],n=e instanceof Request?e.headers:e;for(let d of s){let i=n.get(d);if(typeof i=="string"){let l=i.split(",")[0].trim();if(l)return l}}return null}var ve=(e,r)=>{let s=r.options,n=s.secondaryStorage,d=s.session?.expiresIn||60*60*24*7,i=g(s),{createWithHooks:l,updateWithHooks:f}=C(e,r);return{createOAuthUser:async(t,a)=>{try{let o=await l(t,"user"),u=await l(a,"account");return{user:o,account:{...u,userId:o.id}}}catch(o){return console.log(o),null}},createUser:async t=>await l({id:h(),createdAt:new Date,updatedAt:new Date,emailVerified:!1,...t},"user"),createAccount:async t=>await l({id:h(),createdAt:new Date,updatedAt:new Date,...t},"account"),listSessions:async t=>await e.findMany({model:i.session.tableName,where:[{field:i.session.fields.userId.fieldName||"userId",value:t}]}),listUsers:async(t,a,o,u)=>await e.findMany({model:i.user.tableName,limit:t,offset:a,sortBy:o,where:u}),deleteUser:async t=>{await e.delete({model:i.account.tableName,where:[{field:i.account.fields.userId.fieldName||"userId",value:t}]}),await e.delete({model:i.session.tableName,where:[{field:i.session.fields.userId.fieldName||"userId",value:t}]}),await e.delete({model:i.user.tableName,where:[{field:"id",value:t}]})},createSession:async(t,a,o,u)=>{let c=a instanceof Request?a.headers:a,y={id:h(),userId:t,expiresAt:o?v(60*60*24,"sec"):v(d,"sec"),ipAddress:a&&j(a)||"",userAgent:c?.get("user-agent")||"",...u};return await l(y,"session",n?{fn:async p=>{let b=await e.findOne({model:i.user.tableName,where:[{field:"id",value:t}]});return n.set(p.id,JSON.stringify({session:p,user:b}),d),p},executeMainFn:s.session?.storeSessionInDatabase}:void 0)},findSession:async t=>{if(n){let u=await n.get(t);if(u){let c=JSON.parse(u);return{session:{...c.session,expiresAt:new Date(c.session.expiresAt)},user:{...c.user,createdAt:new Date(c.user.createdAt),updatedAt:new Date(c.user.updatedAt)}}}}let a=await e.findOne({model:i.session.tableName,where:[{value:t,field:"id"}]});if(!a)return null;let o=await e.findOne({model:i.user.tableName,where:[{value:a.userId,field:"id"}]});return o?{session:a,user:o}:null},updateSession:async(t,a)=>await f(a,[{field:"id",value:t}],"session",n?{async fn(u){let c=await n.get(t),y=null;if(c){let m=JSON.parse(c);y={...m.session,...u},await n.set(t,JSON.stringify({session:y,user:m.user}),m.session.expiresAt?new Date(m.session.expiresAt).getTime():void 0)}else return null},executeMainFn:s.session?.storeSessionInDatabase}:void 0),deleteSession:async t=>{if(n){await n.delete(t),s.session?.storeSessionInDatabase&&await e.delete({model:i.session.tableName,where:[{field:"id",value:t}]});return}await e.delete({model:i.session.tableName,where:[{field:"id",value:t}]})},deleteSessions:async t=>{if(n){let a=await e.findMany({model:i.session.tableName,where:[{field:i.session.fields.userId.fieldName||"userId",value:t}]});for(let o of a)await n.delete(o.id);s.session?.storeSessionInDatabase&&await e.delete({model:i.session.tableName,where:[{field:i.session.fields.userId.fieldName||"userId",value:t}]});return}await e.delete({model:i.session.tableName,where:[{field:i.session.fields.userId.fieldName||"userId",value:t}]})},findUserByEmail:async(t,a)=>{let o=await e.findOne({model:i.user.tableName,where:[{value:t.toLowerCase(),field:i.user.fields.email.fieldName||"email"}]});if(!o)return null;if(a?.includeAccounts){let u=await e.findMany({model:i.account.tableName,where:[{value:o.id,field:i.account.fields.userId.fieldName||"userId"}]});return{user:o,accounts:u}}return{user:o,accounts:[]}},findUserById:async t=>await e.findOne({model:i.user.tableName,where:[{field:"id",value:t}]}),linkAccount:async t=>await l({id:h(),...t},"account"),updateUser:async(t,a)=>await f(a,[{field:"id",value:t}],"user"),updateUserByEmail:async(t,a)=>await f(a,[{field:"email",value:t}],"user"),updatePassword:async(t,a)=>await f({password:a},[{field:i.account.fields.userId.fieldName||"userId",value:t},{field:i.account.fields.providerId.fieldName||"providerId",value:"credential"}],"account"),findAccounts:async t=>await e.findMany({model:i.account.tableName,where:[{field:i.account.fields.userId.fieldName||"userId",value:t}]}),updateAccount:async(t,a)=>await f(a,[{field:"id",value:t}],"account"),createVerificationValue:async t=>await l({id:h(),...t},"verification"),findVerificationValue:async t=>await e.findOne({model:i.verification.tableName,where:[{field:i.verification.fields.identifier.fieldName||"identifier",value:t}]}),deleteVerificationValue:async t=>{await e.delete({model:i.verification.tableName,where:[{field:"id",value:t}]})},updateVerificationValue:async(t,a)=>await f(a,[{field:"id",value:t}],"verification")}};var Re=(e,r)=>({type:e,...r});import{z as F}from"zod";function Be(e){return F.object({...Object.keys(e).reduce((s,n)=>{let d=e[n];if(!d)return s;if(d.type==="string[]"||d.type==="number[]")return{...s,[n]:F.array(d.type==="string[]"?F.string():F.number())};let i=F[d.type]();return d?.required===!1&&(i=i.optional()),d?.returned===!1?s:{...s,[n]:i}},{})})}import"kysely";import{createConsola as W}from"consola";var A=W({formatOptions:{date:!1,colors:!0,compact:!0},defaults:{tag:"Better Auth"}}),H=e=>({log:(...r)=>{!e?.disabled&&A.log("",...r)},error:(...r)=>{!e?.disabled&&A.error("",...r)},warn:(...r)=>{!e?.disabled&&A.warn("",...r)},info:(...r)=>{!e?.disabled&&A.info("",...r)},debug:(...r)=>{!e?.disabled&&A.debug("",...r)},box:(...r)=>{!e?.disabled&&A.box("",...r)},success:(...r)=>{!e?.disabled&&A.success("",...r)},break:(...r)=>{!e?.disabled&&console.log(`
2
+ `)}}),O=H();function E(e){let r=g(e),s={};for(let n in r){let d=r[n],i=d.fields,l={};if(Object.entries(i).forEach(([f,t])=>{l[t.fieldName||f]=t}),s[d.tableName]){s[d.tableName].fields={...s[d.tableName].fields,...l};continue}s[d.tableName]={fields:l,order:d.order||1/0}}return s}var $={string:["character varying","text"],number:["int4","integer","bigint","smallint","numeric","real","double precision"],boolean:["bool","boolean"],date:["timestamp","date"]},Z={string:["varchar","text"],number:["integer","int","bigint","smallint","decimal","float","double"],boolean:["boolean"],date:["date","datetime"]},z={string:["TEXT"],number:["INTEGER","REAL"],boolean:["INTEGER","BOOLEAN"],date:["DATE","INTEGER"]},J={string:["nvarchar","varchar"],number:["int","bigint","smallint","decimal","float","double"],boolean:["bit","boolean"],date:["datetime","date"]},G={postgres:$,mysql:Z,sqlite:z,mssql:J};function _(e,r,s){return r==="string[]"||r==="number[]"?e.toLowerCase().includes("json"):G[s][r].map(l=>l.toLowerCase()).includes(e.toLowerCase())}async function We(e){let r=E(e),{kysely:s,databaseType:n}=await N(e);n||(O.warn("Could not determine database type, defaulting to sqlite. Please provide a type in the database options to avoid this."),n="sqlite"),s||(O.error("Only kysely adapter is supported for migrations. You can use `generate` command to generate the schema, if you're using a different adapter."),process.exit(1));let d=await s.introspection.getTables(),i=[],l=[];for(let[u,c]of Object.entries(r)){let y=d.find(p=>p.name===u);if(!y){let p=i.findIndex(w=>w.table===u),b={table:u,fields:c.fields,order:c.order||1/0},x=i.findIndex(w=>(w.order||1/0)>b.order);x===-1?p===-1?i.push(b):i[p].fields={...i[p].fields,...c.fields}:i.splice(x,0,b);continue}let m={};for(let[p,b]of Object.entries(c.fields)){let x=y.columns.find(w=>w.name===p);if(!x){m[p]=b;continue}_(x.dataType,b.type,n)||O.warn(`Field ${p} in table ${u} has a different type in the database. Expected ${b.type} but got ${x.dataType}.`)}Object.keys(m).length>0&&l.push({table:u,fields:m,order:c.order||1/0})}let f=[];function t(u){let c={string:"text",boolean:"boolean",number:"integer",date:"date"};return n==="mysql"&&u==="string"?"varchar(255)":n==="sqlite"&&(u==="string[]"||u==="number[]")?"text":u==="string[]"||u==="number[]"?"jsonb":c[u]}if(l.length)for(let u of l)for(let[c,y]of Object.entries(u.fields)){let m=t(y.type),p=s.schema.alterTable(u.table).addColumn(c,m,b=>(b=y.required!==!1?b.notNull():b,y.references&&(b=b.references(`${y.references.model}.${y.references.field}`)),b));f.push(p)}if(i.length)for(let u of i){let c=s.schema.createTable(u.table).addColumn("id",t("string"),y=>y.primaryKey().notNull());for(let[y,m]of Object.entries(u.fields)){let p=t(m.type);c=c.addColumn(y,p,b=>(b=m.required!==!1?b.notNull():b,m.references&&(b=b.references(`${m.references.model}.${m.references.field}`)),m.unique&&(b=b.unique()),b))}f.push(c)}async function a(){for(let u of f)await u.execute()}async function o(){return f.map(c=>c.compile().sql).join(`;
3
3
 
4
- `)}return{toBeCreated:s,toBeAdded:c,runMigrations:a,compileMigrations:o}}export{S as convertFromDB,q as convertToDB,Oe as createFieldAttribute,Ie as createInternalAdapter,pe as getAdapter,g as getAuthTables,Pe as getMigrations,j as getSchema,C as getWithHooks,G as matchType,Se as toZodSchema};
4
+ `)}return{toBeCreated:i,toBeAdded:l,runMigrations:a,compileMigrations:o}}export{R as convertFromDB,q as convertToDB,Re as createFieldAttribute,ve as createInternalAdapter,be as getAdapter,g as getAuthTables,We as getMigrations,E as getSchema,C as getWithHooks,_ as matchType,Be as toZodSchema};
@@ -5,7 +5,7 @@ import { P as Prettify } from './helper-DPDj8Nix.js';
5
5
  import { A as AccessControl, R as Role, S as StatementsPrimitive, g as defaultRoles } from './statement-CfnyN34h.js';
6
6
  import * as _better_fetch_fetch from '@better-fetch/fetch';
7
7
  import { BetterFetch, BetterFetchOption } from '@better-fetch/fetch';
8
- import { H as HookEndpointContext, p as AuthContext } from './auth-D8X910LZ.js';
8
+ import { H as HookEndpointContext, p as AuthContext } from './auth-BygKDI7g.js';
9
9
  import * as nanostores from 'nanostores';
10
10
  import { atom } from 'nanostores';
11
11
  import * as _simplewebauthn_types from '@simplewebauthn/types';
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as Adapter, j as AdditionalSessionFieldsInput, k as AdditionalSessionFieldsOutput, h as AdditionalUserFieldsInput, i as AdditionalUserFieldsOutput, a as Auth, p as AuthContext, s as BetterAuthCookies, B as BetterAuthOptions, b as BetterAuthPlugin, E as EligibleCookies, G as GenericEndpointContext, H as HookEndpointContext, m as InferPluginTypes, l as InferSession, I as InferUser, P as PluginSchema, R as RateLimit, S as SecondaryStorage, W as Where, g as betterAuth, r as createCookieGetter, x as createLogger, u as deleteSessionCookie, q as getCookies, n as init, y as logger, w as parseCookies, v as parseSetCookieHeader, t as setSessionCookie } from './auth-D8X910LZ.js';
1
+ export { A as Adapter, j as AdditionalSessionFieldsInput, k as AdditionalSessionFieldsOutput, h as AdditionalUserFieldsInput, i as AdditionalUserFieldsOutput, a as Auth, p as AuthContext, s as BetterAuthCookies, B as BetterAuthOptions, b as BetterAuthPlugin, E as EligibleCookies, G as GenericEndpointContext, H as HookEndpointContext, m as InferPluginTypes, l as InferSession, I as InferUser, P as PluginSchema, R as RateLimit, S as SecondaryStorage, W as Where, g as betterAuth, r as createCookieGetter, x as createLogger, u as deleteSessionCookie, q as getCookies, n as init, y as logger, w as parseCookies, v as parseSetCookieHeader, t as setSessionCookie } from './auth-BygKDI7g.js';
2
2
  export { D as DeepPartial, H as HasRequiredKeys, L as LiteralString, a as LiteralUnion, P as Prettify, R as RequiredKeysOf, S as StripEmptyObjects, U as UnionToIntersection, W as WithoutEmpty } from './helper-DPDj8Nix.js';
3
3
  export { AtomListener, BetterAuthClientPlugin, ClientOptions, InferActions, InferAdditionalFromClient, InferClientAPI, InferPluginsFromClient, InferSessionFromClient, InferUserFromClient, IsSignal } from './types.js';
4
4
  export { H as HIDE_METADATA } from './hide-metadata-DEHJp1rk.js';