better-auth 1.0.6 → 1.0.7

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.
package/dist/api.cjs CHANGED
@@ -80,4 +80,4 @@ Error: `,c),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>`,Ve=g("/error",{method:"GET",metadata:{...Q,openapi:{description:"Displays an error page",responses:{200:{description:"Success",content:{"text/html":{schema:{type:"string"}}}}}}}},async e=>{let t=new URL(e.request?.url||"").searchParams.get("error")||"Unknown";return new Response(cr(t),{headers:{"Content-Type":"text/html"}})});var ze=g("/ok",{method:"GET",metadata:{...Q,openapi:{description:"Check if the API is working",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{ok:{type:"boolean"}}}}}}}}}},async e=>e.json({ok:!0}));var H=require("zod");var D=require("better-call");var $e=()=>g("/sign-up/email",{method:"POST",query:H.z.object({currentURL:H.z.string().optional()}).optional(),body:H.z.record(H.z.string(),H.z.any()),metadata:{openapi:{description:"Sign up a user using email and password",requestBody:{content:{"application/json":{schema:{type:"object",properties:{name:{type:"string",description:"The name of the user"},email:{type:"string",description:"The email of the user"},password:{type:"string",description:"The password of the user"},callbackURL:{type:"string",description:"The URL to use for email verification callback"}},required:["name","email","password"]}}}},responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{user:{type:"object"},session:{type:"object"}}}}}}}}}},async e=>{if(!e.context.options.emailAndPassword?.enabled)throw new D.APIError("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,...c}=t;if(!H.z.string().email().safeParse(o).success)throw new D.APIError("BAD_REQUEST",{message:"Invalid email"});let d=e.context.password.config.minPasswordLength;if(n.length<d)throw e.context.logger.error("Password is too short"),new D.APIError("BAD_REQUEST",{message:"Password is too short"});let l=e.context.password.config.maxPasswordLength;if(n.length>l)throw e.context.logger.error("Password is too long"),new D.APIError("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.APIError("UNPROCESSABLE_ENTITY",{message:"User with this email already exists"});let p=pe(e.context.options,c),w;try{if(w=await e.context.internalAdapter.createUser({email:o.toLowerCase(),name:r,image:i,...p,emailVerified:!1}),!w)throw new D.APIError("BAD_REQUEST",{message:"Failed to create user"})}catch(h){throw e.context.logger.error("Failed to create user",h),new D.APIError("UNPROCESSABLE_ENTITY",{message:"Failed to create user",details:h})}if(!w)throw new D.APIError("UNPROCESSABLE_ENTITY",{message:"Failed to create user"});let O=await e.context.password.hash(n);if(await e.context.internalAdapter.linkAccount({userId:w.id,providerId:"credential",accountId:w.id,password:O}),e.context.options.emailVerification?.sendOnSignUp){let h=await j(e.context.secret,w.email),f=`${e.context.baseURL}/verify-email?token=${h}&callbackURL=${t.callbackURL||e.query?.currentURL||"/"}`;await e.context.options.emailVerification?.sendVerificationEmail?.({user:w,url:f,token:h},e.request)}if(!e.context.options.emailAndPassword.autoSignIn||e.context.options.emailAndPassword.requireEmailVerification)return e.json({user:w,session:null});let I=await e.context.internalAdapter.createSession(w.id,e.request);if(!I)throw new D.APIError("BAD_REQUEST",{message:"Failed to create session"});return await T(e,{session:I,user:w}),e.json({user:w,session:I})});var K=require("zod");var qe=require("better-call");var Ne=g("/list-accounts",{method:"GET",use:[S],metadata:{openapi:{description:"List all accounts linked to the user",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"array",items:{type:"object",properties:{id:{type:"string"},provider:{type:"string"}}}}}}}}}}},async e=>{let t=e.context.session,r=await e.context.internalAdapter.findAccounts(t.user.id);return e.json(r.map(o=>({id:o.id,provider:o.providerId})))}),Fe=g("/link-social",{method:"POST",requireHeaders:!0,query:K.z.object({currentURL:K.z.string().optional()}).optional(),body:K.z.object({callbackURL:K.z.string({description:"The URL to redirect to after the user has signed in"}).optional(),provider:K.z.enum(ie,{description:"The OAuth2 provider to use"})}),use:[S],metadata:{openapi:{description:"Link a social account to the user",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{url:{type:"string"},redirect:{type:"boolean"}},required:["url","redirect"]}}}}}}}},async e=>{let t=e.context.session;if((await e.context.internalAdapter.findAccounts(t.user.id)).find(c=>c.providerId===e.body.provider))throw new qe.APIError("BAD_REQUEST",{message:"Social Account is already linked."});let n=e.context.socialProviders.find(c=>c.id===e.body.provider);if(!n)throw e.context.logger.error("Provider not found. Make sure to add the provider in your auth config",{provider:e.body.provider}),new qe.APIError("NOT_FOUND",{message:"Provider not found"});let i=await oe(e,{userId:t.user.id,email:t.user.email}),s=await n.createAuthorizationURL({state:i.state,codeVerifier:i.codeVerifier,redirectURI:`${e.context.baseURL}/callback/${n.id}`});return e.json({url:s.toString(),redirect:!0})});function Vt(e,t){if(t.advanced?.ipAddress?.disableIpTracking)return null;let r="127.0.0.1";if(Qe)return r;let n=t.advanced?.ipAddress?.ipAddressHeaders||["x-client-ip","x-forwarded-for","cf-connecting-ip","fastly-client-ip","x-real-ip","x-cluster-client-ip","x-forwarded","forwarded-for","forwarded"],i=e instanceof Request?e.headers:e;for(let s of n){let c=i.get(s);if(typeof c=="string"){let a=c.split(",")[0].trim();if(a)return a}}return null}function dr(e,t,r){let o=Date.now(),n=t*1e3;return o-r.lastRequest<n&&r.count>=e}function pr(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 lr(e,t){let r=Date.now(),o=t*1e3;return Math.ceil((e+o-r)/1e3)}function ur(e,t){let r="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(c){e.logger.error("Error setting rate limit",c)}}}}var zt=new Map;function mr(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 zt.get(r)},async set(r,o,n){zt.set(r,o)}}:ur(e,e.rateLimit.modelName)}async function $t(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=Vt(e,t.options)+o,a=fr().find(p=>p.pathMatcher(o));a&&(n=a.window,i=a.max);for(let p of t.options.plugins||[])if(p.rateLimit){let w=p.rateLimit.find(O=>O.pathMatcher(o));if(w){n=w.window,i=w.max;break}}if(t.rateLimit.customRules){let p=t.rateLimit.customRules[o];p&&(n=p.window,i=p.max)}let d=mr(t),l=await d.get(s),m=Date.now();if(!l)await d.set(s,{key:s,count:1,lastRequest:m});else{let p=m-l.lastRequest;if(dr(i,n,l)){let w=lr(l.lastRequest,n);return pr(w)}else p>n*1e3?await d.set(s,{...l,count:1,lastRequest:m}):await d.set(s,{...l,count:l.count+1,lastRequest:m})}}function fr(){return[{pathMatcher(t){return t.startsWith("/sign-in")||t.startsWith("/sign-up")||t.startsWith("/change-password")||t.startsWith("/change-email")},window:10,max:3}]}var Nt=require("better-call");function qt(e,t){let r=t.plugins?.reduce((c,a)=>({...c,...a.endpoints}),{}),o=t.plugins?.map(c=>c.middlewares?.map(a=>{let d=async l=>a.middleware({...l,context:{...e,...l.context}});return d.path=a.path,d.options=a.middleware.options,d.headers=a.middleware.headers,{path:a.path,middleware:d}})).filter(c=>c!==void 0).flat()||[],i={...{signInSocial:Te,callbackOAuth:_e,getSession:ne(),signOut:Se,signUpEmail:$e(),signInEmail:xe,forgetPassword:Pe,resetPassword:Le,verifyEmail:Ee,sendVerificationEmail:ve,changeEmail:Be,changePassword:Ce,setPassword:je,updateUser:Oe(),deleteUser:De,forgetPasswordCallback:Ie,listSessions:ke(),revokeSession:Ae,revokeSessions:Ue,revokeOtherSessions:Re,linkSocialAccount:Fe,listUserAccounts:Ne},...r,ok:ze,error:Ve},s={};for(let[c,a]of Object.entries(i))s[c]=async(d={})=>{a.headers=new Headers;let l={setHeader(h,f){a.headers.set(h,f)},setCookie(h,f,y){(0,R.setCookie)(a.headers,h,f,y)},getCookie(h,f){let k=d.headers?.get("cookie");return(0,R.getCookie)(k||"",h,f)},getSignedCookie(h,f,y){let k=d.headers;return k?(0,R.getSignedCookie)(k,f,h,y):null},async setSignedCookie(h,f,y,k){await(0,R.setSignedCookie)(a.headers,h,f,y,k)},redirect(h){return a.headers.set("Location",h),new R.APIError("FOUND")},responseHeader:a.headers},m=await e,p={...l,...d,path:a.path,context:{...m,...d.context,endpoint:a}};m.session=null;let w=t.plugins||[];for(let h of w){let f=h.hooks?.before??[];for(let y of f){if(!y.matcher(p))continue;let k=await y.handler(p);if(k&&"context"in k){p={...p,...k.context};continue}if(k)return k}}let O;try{O=await a(p)}catch(h){if(h instanceof R.APIError){let f=t.plugins?.map(y=>{if(y.hooks?.after)return y.hooks.after}).filter(y=>y!==void 0).flat();if(!f?.length)throw h.headers=a.headers,h;p.context.returned=h,p.context.returned.headers=a.headers;for(let y of f||[])if(y.matcher(p))try{let B=await y.handler(p);B&&"response"in B&&(p.context.returned=B.response)}catch(B){if(B instanceof R.APIError){p.context.returned=B;continue}throw B}if(p.context.returned instanceof R.APIError)throw p.context.returned.headers=a.headers,p.context.returned;return p.context.returned}throw h}p.context.returned=O,p.responseHeader=a.headers;for(let h of t.plugins||[])if(h.hooks?.after){for(let f of h.hooks.after)if(f.matcher(p))try{let k=await f.handler(p);k&&(p.context.returned=k)}catch(k){if(k instanceof R.APIError){p.context.returned=k;continue}throw k}}let I=p.context.returned;return I instanceof Response&&a.headers.forEach((h,f)=>{f==="set-cookie"?I.headers.append(f,h):I.headers.set(f,h)}),I},s[c].path=a.path,s[c].method=a.method,s[c].options=a.options,s[c].headers=a.headers;return{api:s,middlewares:o}}var gr=(e,t)=>{let{api:r,middlewares:o}=qt(e,t),n=new URL(e.baseURL).pathname;return(0,R.createRouter)(r,{extraContext:e,basePath:n,routerMiddleware:[{path:"/**",middleware:me},...o],async onRequest(i){for(let s of e.options.plugins||[])if(s.onRequest){let c=await s.onRequest(i,e);if(c&&"response"in c)return c.response}return $t(i,e)},async onResponse(i){for(let s of e.options.plugins||[])if(s.onResponse){let c=await s.onResponse(i,e);if(c)return c.response}return i},onError(i){if(i instanceof R.APIError&&i.status==="FOUND")return;if(t.onAPIError?.throw)throw i;if(t.onAPIError?.onError){t.onAPIError.onError(i,e);return}let s=t.logger?.level,c=s==="error"||s==="warn"||s==="debug"?_:void 0;if(t.logger?.disabled!==!0){if(i&&typeof i=="object"&&"message"in i&&typeof i.message=="string"&&(i.message.includes("no column")||i.message.includes("column")||i.message.includes("relation")||i.message.includes("table")||i.message.includes("does not exist"))){e.logger?.error(i.message),e.logger?.error("If you are seeing this error, it is likely that you need to run the migrations for the database or you need to update your database schema. If you recently updated the package, make sure to run the migrations.");return}i instanceof R.APIError?(i.status==="INTERNAL_SERVER_ERROR"&&e.logger.error(i.status,i),c?.error(i.message)):e.logger?.error(i&&typeof i=="object"&&"name"in i?i.name:"",i)}}})};0&&(module.exports={APIError,callbackOAuth,changeEmail,changePassword,createAuthEndpoint,createAuthMiddleware,createEmailVerificationToken,deleteUser,error,forgetPassword,forgetPasswordCallback,freshSessionMiddleware,getEndpoints,getSession,getSessionFromCtx,linkSocialAccount,listSessions,listUserAccounts,ok,optionsMiddleware,originCheckMiddleware,resetPassword,revokeOtherSessions,revokeSession,revokeSessions,router,sendVerificationEmail,sendVerificationEmailFn,sessionMiddleware,setPassword,signInEmail,signInSocial,signOut,signUpEmail,updateUser,verifyEmail});
83
+ </html>`,Ve=g("/error",{method:"GET",metadata:{...Q,openapi:{description:"Displays an error page",responses:{200:{description:"Success",content:{"text/html":{schema:{type:"string"}}}}}}}},async e=>{let t=new URL(e.request?.url||"").searchParams.get("error")||"Unknown";return new Response(cr(t),{headers:{"Content-Type":"text/html"}})});var ze=g("/ok",{method:"GET",metadata:{...Q,openapi:{description:"Check if the API is working",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{ok:{type:"boolean"}}}}}}}}}},async e=>e.json({ok:!0}));var H=require("zod");var D=require("better-call");var $e=()=>g("/sign-up/email",{method:"POST",query:H.z.object({currentURL:H.z.string().optional()}).optional(),body:H.z.record(H.z.string(),H.z.any()),metadata:{openapi:{description:"Sign up a user using email and password",requestBody:{content:{"application/json":{schema:{type:"object",properties:{name:{type:"string",description:"The name of the user"},email:{type:"string",description:"The email of the user"},password:{type:"string",description:"The password of the user"},callbackURL:{type:"string",description:"The URL to use for email verification callback"}},required:["name","email","password"]}}}},responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{user:{type:"object"},session:{type:"object"}}}}}}}}}},async e=>{if(!e.context.options.emailAndPassword?.enabled)throw new D.APIError("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,...c}=t;if(!H.z.string().email().safeParse(o).success)throw new D.APIError("BAD_REQUEST",{message:"Invalid email"});let d=e.context.password.config.minPasswordLength;if(n.length<d)throw e.context.logger.error("Password is too short"),new D.APIError("BAD_REQUEST",{message:"Password is too short"});let l=e.context.password.config.maxPasswordLength;if(n.length>l)throw e.context.logger.error("Password is too long"),new D.APIError("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.APIError("UNPROCESSABLE_ENTITY",{message:"User with this email already exists"});let p=pe(e.context.options,c),w;try{if(w=await e.context.internalAdapter.createUser({email:o.toLowerCase(),name:r,image:i,...p,emailVerified:!1}),!w)throw new D.APIError("BAD_REQUEST",{message:"Failed to create user"})}catch(h){throw e.context.logger.error("Failed to create user",h),new D.APIError("UNPROCESSABLE_ENTITY",{message:"Failed to create user",details:h})}if(!w)throw new D.APIError("UNPROCESSABLE_ENTITY",{message:"Failed to create user"});let O=await e.context.password.hash(n);if(await e.context.internalAdapter.linkAccount({userId:w.id,providerId:"credential",accountId:w.id,password:O}),e.context.options.emailVerification?.sendOnSignUp){let h=await j(e.context.secret,w.email),f=`${e.context.baseURL}/verify-email?token=${h}&callbackURL=${t.callbackURL||e.query?.currentURL||"/"}`;await e.context.options.emailVerification?.sendVerificationEmail?.({user:w,url:f,token:h},e.request)}if(!e.context.options.emailAndPassword.autoSignIn||e.context.options.emailAndPassword.requireEmailVerification)return e.json({user:w,session:null});let I=await e.context.internalAdapter.createSession(w.id,e.request);if(!I)throw new D.APIError("BAD_REQUEST",{message:"Failed to create session"});return await T(e,{session:I,user:w}),e.json({user:w,session:I})});var K=require("zod");var qe=require("better-call");var Ne=g("/list-accounts",{method:"GET",use:[S],metadata:{openapi:{description:"List all accounts linked to the user",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"array",items:{type:"object",properties:{id:{type:"string"},provider:{type:"string"}}}}}}}}}}},async e=>{let t=e.context.session,r=await e.context.internalAdapter.findAccounts(t.user.id);return e.json(r.map(o=>({id:o.id,provider:o.providerId})))}),Fe=g("/link-social",{method:"POST",requireHeaders:!0,query:K.z.object({currentURL:K.z.string().optional()}).optional(),body:K.z.object({callbackURL:K.z.string({description:"The URL to redirect to after the user has signed in"}).optional(),provider:K.z.enum(ie,{description:"The OAuth2 provider to use"})}),use:[S],metadata:{openapi:{description:"Link a social account to the user",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{url:{type:"string"},redirect:{type:"boolean"}},required:["url","redirect"]}}}}}}}},async e=>{let t=e.context.session;if((await e.context.internalAdapter.findAccounts(t.user.id)).find(c=>c.providerId===e.body.provider))throw new qe.APIError("BAD_REQUEST",{message:"Social Account is already linked."});let n=e.context.socialProviders.find(c=>c.id===e.body.provider);if(!n)throw e.context.logger.error("Provider not found. Make sure to add the provider in your auth config",{provider:e.body.provider}),new qe.APIError("NOT_FOUND",{message:"Provider not found"});let i=await oe(e,{userId:t.user.id,email:t.user.email}),s=await n.createAuthorizationURL({state:i.state,codeVerifier:i.codeVerifier,redirectURI:`${e.context.baseURL}/callback/${n.id}`});return e.json({url:s.toString(),redirect:!0})});function Vt(e,t){if(t.advanced?.ipAddress?.disableIpTracking)return null;let r="127.0.0.1";if(Qe)return r;let n=t.advanced?.ipAddress?.ipAddressHeaders||["x-client-ip","x-forwarded-for","cf-connecting-ip","fastly-client-ip","x-real-ip","x-cluster-client-ip","x-forwarded","forwarded-for","forwarded"],i=e instanceof Request?e.headers:e;for(let s of n){let c=i.get(s);if(typeof c=="string"){let a=c.split(",")[0].trim();if(a)return a}}return null}function dr(e,t,r){let o=Date.now(),n=t*1e3;return o-r.lastRequest<n&&r.count>=e}function pr(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 lr(e,t){let r=Date.now(),o=t*1e3;return Math.ceil((e+o-r)/1e3)}function ur(e,t){let r="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(c){e.logger.error("Error setting rate limit",c)}}}}var zt=new Map;function mr(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 zt.get(r)},async set(r,o,n){zt.set(r,o)}}:ur(e,e.rateLimit.modelName)}async function $t(e,t){if(!t.rateLimit.enabled)return;let r=t.baseURL,o=e.url.replace(r,"").split("?")[0],n=t.rateLimit.window,i=t.rateLimit.max,s=Vt(e,t.options)+o,a=fr().find(p=>p.pathMatcher(o));a&&(n=a.window,i=a.max);for(let p of t.options.plugins||[])if(p.rateLimit){let w=p.rateLimit.find(O=>O.pathMatcher(o));if(w){n=w.window,i=w.max;break}}if(t.rateLimit.customRules){let p=t.rateLimit.customRules[o];p&&(n=p.window,i=p.max)}let d=mr(t),l=await d.get(s),m=Date.now();if(!l)await d.set(s,{key:s,count:1,lastRequest:m});else{let p=m-l.lastRequest;if(dr(i,n,l)){let w=lr(l.lastRequest,n);return pr(w)}else p>n*1e3?await d.set(s,{...l,count:1,lastRequest:m}):await d.set(s,{...l,count:l.count+1,lastRequest:m})}}function fr(){return[{pathMatcher(t){return t.startsWith("/sign-in")||t.startsWith("/sign-up")||t.startsWith("/change-password")||t.startsWith("/change-email")},window:10,max:3}]}var Nt=require("better-call");function qt(e,t){let r=t.plugins?.reduce((c,a)=>({...c,...a.endpoints}),{}),o=t.plugins?.map(c=>c.middlewares?.map(a=>{let d=async l=>a.middleware({...l,context:{...e,...l.context}});return d.path=a.path,d.options=a.middleware.options,d.headers=a.middleware.headers,{path:a.path,middleware:d}})).filter(c=>c!==void 0).flat()||[],i={...{signInSocial:Te,callbackOAuth:_e,getSession:ne(),signOut:Se,signUpEmail:$e(),signInEmail:xe,forgetPassword:Pe,resetPassword:Le,verifyEmail:Ee,sendVerificationEmail:ve,changeEmail:Be,changePassword:Ce,setPassword:je,updateUser:Oe(),deleteUser:De,forgetPasswordCallback:Ie,listSessions:ke(),revokeSession:Ae,revokeSessions:Ue,revokeOtherSessions:Re,linkSocialAccount:Fe,listUserAccounts:Ne},...r,ok:ze,error:Ve},s={};for(let[c,a]of Object.entries(i))s[c]=async(d={})=>{a.headers=new Headers;let l={setHeader(h,f){a.headers.set(h,f)},setCookie(h,f,y){(0,R.setCookie)(a.headers,h,f,y)},getCookie(h,f){let k=d.headers?.get("cookie");return(0,R.getCookie)(k||"",h,f)},getSignedCookie(h,f,y){let k=d.headers;return k?(0,R.getSignedCookie)(k,f,h,y):null},async setSignedCookie(h,f,y,k){await(0,R.setSignedCookie)(a.headers,h,f,y,k)},redirect(h){return a.headers.set("Location",h),new R.APIError("FOUND")},responseHeader:a.headers},m=await e,p={...l,...d,path:a.path,context:{...m,...d.context,endpoint:a}};m.session=null;let w=t.plugins||[];for(let h of w){let f=h.hooks?.before??[];for(let y of f){if(!y.matcher(p))continue;let k=await y.handler(p);if(k&&"context"in k){p={...p,...k.context};continue}if(k)return k}}let O;try{O=await a(p)}catch(h){if(h instanceof R.APIError){let f=t.plugins?.map(y=>{if(y.hooks?.after)return y.hooks.after}).filter(y=>y!==void 0).flat();if(!f?.length)throw h.headers=a.headers,h;p.context.returned=h,p.context.returned.headers=a.headers;for(let y of f||[])if(y.matcher(p))try{let B=await y.handler(p);B&&"response"in B&&(p.context.returned=B.response)}catch(B){if(B instanceof R.APIError){p.context.returned=B;continue}throw B}if(p.context.returned instanceof R.APIError)throw p.context.returned.headers=a.headers,p.context.returned;return p.context.returned}throw h}p.context.returned=O,p.responseHeader=a.headers;for(let h of t.plugins||[])if(h.hooks?.after){for(let f of h.hooks.after)if(f.matcher(p))try{let k=await f.handler(p);k&&(p.context.returned=k)}catch(k){if(k instanceof R.APIError){p.context.returned=k;continue}throw k}}let I=p.context.returned;return I instanceof Response&&a.headers.forEach((h,f)=>{f==="set-cookie"?I.headers.append(f,h):I.headers.set(f,h)}),I},s[c].path=a.path,s[c].method=a.method,s[c].options=a.options,s[c].headers=a.headers;return{api:s,middlewares:o}}var gr=(e,t)=>{let{api:r,middlewares:o}=qt(e,t),n=new URL(e.baseURL).pathname;return(0,R.createRouter)(r,{extraContext:e,basePath:n,routerMiddleware:[{path:"/**",middleware:me},...o],async onRequest(i){for(let s of e.options.plugins||[])if(s.onRequest){let c=await s.onRequest(i,e);if(c&&"response"in c)return c.response}return $t(i,e)},async onResponse(i){for(let s of e.options.plugins||[])if(s.onResponse){let c=await s.onResponse(i,e);if(c)return c.response}return i},onError(i){if(i instanceof R.APIError&&i.status==="FOUND")return;if(t.onAPIError?.throw)throw i;if(t.onAPIError?.onError){t.onAPIError.onError(i,e);return}let s=t.logger?.level,c=s==="error"||s==="warn"||s==="debug"?_:void 0;if(t.logger?.disabled!==!0){if(i&&typeof i=="object"&&"message"in i&&typeof i.message=="string"&&(i.message.includes("no column")||i.message.includes("column")||i.message.includes("relation")||i.message.includes("table")||i.message.includes("does not exist"))){e.logger?.error(i.message),e.logger?.error("If you are seeing this error, it is likely that you need to run the migrations for the database or you need to update your database schema. If you recently updated the package, make sure to run the migrations.");return}i instanceof R.APIError?(i.status==="INTERNAL_SERVER_ERROR"&&e.logger.error(i.status,i),c?.error(i.message)):e.logger?.error(i&&typeof i=="object"&&"name"in i?i.name:"",i)}}})};0&&(module.exports={APIError,callbackOAuth,changeEmail,changePassword,createAuthEndpoint,createAuthMiddleware,createEmailVerificationToken,deleteUser,error,forgetPassword,forgetPasswordCallback,freshSessionMiddleware,getEndpoints,getSession,getSessionFromCtx,linkSocialAccount,listSessions,listUserAccounts,ok,optionsMiddleware,originCheckMiddleware,resetPassword,revokeOtherSessions,revokeSession,revokeSessions,router,sendVerificationEmail,sendVerificationEmailFn,sessionMiddleware,setPassword,signInEmail,signInSocial,signOut,signUpEmail,updateUser,verifyEmail});
package/dist/api.js CHANGED
@@ -80,4 +80,4 @@ Error: `,c),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>`,rt=h("/error",{method:"GET",metadata:{...F,openapi:{description:"Displays an error page",responses:{200:{description:"Success",content:{"text/html":{schema:{type:"string"}}}}}}}},async e=>{let t=new URL(e.request?.url||"").searchParams.get("error")||"Unknown";return new Response(ir(t),{headers:{"Content-Type":"text/html"}})});var ot=h("/ok",{method:"GET",metadata:{...F,openapi:{description:"Check if the API is working",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{ok:{type:"boolean"}}}}}}}}}},async e=>e.json({ok:!0}));import{z as H}from"zod";import{APIError as B}from"better-call";var it=()=>h("/sign-up/email",{method:"POST",query:H.object({currentURL:H.string().optional()}).optional(),body:H.record(H.string(),H.any()),metadata:{openapi:{description:"Sign up a user using email and password",requestBody:{content:{"application/json":{schema:{type:"object",properties:{name:{type:"string",description:"The name of the user"},email:{type:"string",description:"The email of the user"},password:{type:"string",description:"The password of the user"},callbackURL:{type:"string",description:"The URL to use for email verification callback"}},required:["name","email","password"]}}}},responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{user:{type:"object"},session:{type:"object"}}}}}}}}}},async e=>{if(!e.context.options.emailAndPassword?.enabled)throw new B("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,...c}=t;if(!H.string().email().safeParse(o).success)throw new B("BAD_REQUEST",{message:"Invalid email"});let d=e.context.password.config.minPasswordLength;if(n.length<d)throw e.context.logger.error("Password is too short"),new B("BAD_REQUEST",{message:"Password is too short"});let l=e.context.password.config.maxPasswordLength;if(n.length>l)throw e.context.logger.error("Password is too long"),new B("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 B("UNPROCESSABLE_ENTITY",{message:"User with this email already exists"});let p=oe(e.context.options,c),w;try{if(w=await e.context.internalAdapter.createUser({email:o.toLowerCase(),name:r,image:i,...p,emailVerified:!1}),!w)throw new B("BAD_REQUEST",{message:"Failed to create user"})}catch(g){throw e.context.logger.error("Failed to create user",g),new B("UNPROCESSABLE_ENTITY",{message:"Failed to create user",details:g})}if(!w)throw new B("UNPROCESSABLE_ENTITY",{message:"Failed to create user"});let L=await e.context.password.hash(n);if(await e.context.internalAdapter.linkAccount({userId:w.id,providerId:"credential",accountId:w.id,password:L}),e.context.options.emailVerification?.sendOnSignUp){let g=await D(e.context.secret,w.email),f=`${e.context.baseURL}/verify-email?token=${g}&callbackURL=${t.callbackURL||e.query?.currentURL||"/"}`;await e.context.options.emailVerification?.sendVerificationEmail?.({user:w,url:f,token:g},e.request)}if(!e.context.options.emailAndPassword.autoSignIn||e.context.options.emailAndPassword.requireEmailVerification)return e.json({user:w,session:null});let _=await e.context.internalAdapter.createSession(w.id,e.request);if(!_)throw new B("BAD_REQUEST",{message:"Failed to create session"});return await E(e,{session:_,user:w}),e.json({user:w,session:_})});import{z as W}from"zod";import{APIError as nt}from"better-call";var st=h("/list-accounts",{method:"GET",use:[S],metadata:{openapi:{description:"List all accounts linked to the user",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"array",items:{type:"object",properties:{id:{type:"string"},provider:{type:"string"}}}}}}}}}}},async e=>{let t=e.context.session,r=await e.context.internalAdapter.findAccounts(t.user.id);return e.json(r.map(o=>({id:o.id,provider:o.providerId})))}),at=h("/link-social",{method:"POST",requireHeaders:!0,query:W.object({currentURL:W.string().optional()}).optional(),body:W.object({callbackURL:W.string({description:"The URL to redirect to after the user has signed in"}).optional(),provider:W.enum(ee,{description:"The OAuth2 provider to use"})}),use:[S],metadata:{openapi:{description:"Link a social account to the user",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{url:{type:"string"},redirect:{type:"boolean"}},required:["url","redirect"]}}}}}}}},async e=>{let t=e.context.session;if((await e.context.internalAdapter.findAccounts(t.user.id)).find(c=>c.providerId===e.body.provider))throw new nt("BAD_REQUEST",{message:"Social Account is already linked."});let n=e.context.socialProviders.find(c=>c.id===e.body.provider);if(!n)throw e.context.logger.error("Provider not found. Make sure to add the provider in your auth config",{provider:e.body.provider}),new nt("NOT_FOUND",{message:"Provider not found"});let i=await X(e,{userId:t.user.id,email:t.user.email}),s=await n.createAuthorizationURL({state:i.state,codeVerifier:i.codeVerifier,redirectURI:`${e.context.baseURL}/callback/${n.id}`});return e.json({url:s.toString(),redirect:!0})});function ct(e,t){if(t.advanced?.ipAddress?.disableIpTracking)return null;let r="127.0.0.1";if(ge)return r;let n=t.advanced?.ipAddress?.ipAddressHeaders||["x-client-ip","x-forwarded-for","cf-connecting-ip","fastly-client-ip","x-real-ip","x-cluster-client-ip","x-forwarded","forwarded-for","forwarded"],i=e instanceof Request?e.headers:e;for(let s of n){let c=i.get(s);if(typeof c=="string"){let a=c.split(",")[0].trim();if(a)return a}}return null}function nr(e,t,r){let o=Date.now(),n=t*1e3;return o-r.lastRequest<n&&r.count>=e}function sr(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 ar(e,t){let r=Date.now(),o=t*1e3;return Math.ceil((e+o-r)/1e3)}function cr(e,t){let r="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(c){e.logger.error("Error setting rate limit",c)}}}}var dt=new Map;function dr(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 dt.get(r)},async set(r,o,n){dt.set(r,o)}}:cr(e,e.rateLimit.modelName)}async function pt(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=ct(e,t.options)+o,a=pr().find(p=>p.pathMatcher(o));a&&(n=a.window,i=a.max);for(let p of t.options.plugins||[])if(p.rateLimit){let w=p.rateLimit.find(L=>L.pathMatcher(o));if(w){n=w.window,i=w.max;break}}if(t.rateLimit.customRules){let p=t.rateLimit.customRules[o];p&&(n=p.window,i=p.max)}let d=dr(t),l=await d.get(s),m=Date.now();if(!l)await d.set(s,{key:s,count:1,lastRequest:m});else{let p=m-l.lastRequest;if(nr(i,n,l)){let w=ar(l.lastRequest,n);return sr(w)}else p>n*1e3?await d.set(s,{...l,count:1,lastRequest:m}):await d.set(s,{...l,count:l.count+1,lastRequest:m})}}function pr(){return[{pathMatcher(t){return t.startsWith("/sign-in")||t.startsWith("/sign-up")||t.startsWith("/change-password")||t.startsWith("/change-email")},window:10,max:3}]}import{APIError as ra}from"better-call";function hr(e,t){let r=t.plugins?.reduce((c,a)=>({...c,...a.endpoints}),{}),o=t.plugins?.map(c=>c.middlewares?.map(a=>{let d=async l=>a.middleware({...l,context:{...e,...l.context}});return d.path=a.path,d.options=a.middleware.options,d.headers=a.middleware.headers,{path:a.path,middleware:d}})).filter(c=>c!==void 0).flat()||[],i={...{signInSocial:Fe,callbackOAuth:Me,getSession:ae(),signOut:Ge,signUpEmail:it(),signInEmail:He,forgetPassword:Ze,resetPassword:We,verifyEmail:Ne,sendVerificationEmail:qe,changeEmail:tt,changePassword:Ye,setPassword:Xe,updateUser:Ke(),deleteUser:et,forgetPasswordCallback:Je,listSessions:Be(),revokeSession:Ve,revokeSessions:ze,revokeOtherSessions:$e,linkSocialAccount:at,listUserAccounts:st},...r,ok:ot,error:rt},s={};for(let[c,a]of Object.entries(i))s[c]=async(d={})=>{a.headers=new Headers;let l={setHeader(g,f){a.headers.set(g,f)},setCookie(g,f,y){fr(a.headers,g,f,y)},getCookie(g,f){let k=d.headers?.get("cookie");return ur(k||"",g,f)},getSignedCookie(g,f,y){let k=d.headers;return k?mr(k,f,g,y):null},async setSignedCookie(g,f,y,k){await gr(a.headers,g,f,y,k)},redirect(g){return a.headers.set("Location",g),new N("FOUND")},responseHeader:a.headers},m=await e,p={...l,...d,path:a.path,context:{...m,...d.context,endpoint:a}};m.session=null;let w=t.plugins||[];for(let g of w){let f=g.hooks?.before??[];for(let y of f){if(!y.matcher(p))continue;let k=await y.handler(p);if(k&&"context"in k){p={...p,...k.context};continue}if(k)return k}}let L;try{L=await a(p)}catch(g){if(g instanceof N){let f=t.plugins?.map(y=>{if(y.hooks?.after)return y.hooks.after}).filter(y=>y!==void 0).flat();if(!f?.length)throw g.headers=a.headers,g;p.context.returned=g,p.context.returned.headers=a.headers;for(let y of f||[])if(y.matcher(p))try{let O=await y.handler(p);O&&"response"in O&&(p.context.returned=O.response)}catch(O){if(O instanceof N){p.context.returned=O;continue}throw O}if(p.context.returned instanceof N)throw p.context.returned.headers=a.headers,p.context.returned;return p.context.returned}throw g}p.context.returned=L,p.responseHeader=a.headers;for(let g of t.plugins||[])if(g.hooks?.after){for(let f of g.hooks.after)if(f.matcher(p))try{let k=await f.handler(p);k&&(p.context.returned=k)}catch(k){if(k instanceof N){p.context.returned=k;continue}throw k}}let _=p.context.returned;return _ instanceof Response&&a.headers.forEach((g,f)=>{f==="set-cookie"?_.headers.append(f,g):_.headers.set(f,g)}),_},s[c].path=a.path,s[c].method=a.method,s[c].options=a.options,s[c].headers=a.headers;return{api:s,middlewares:o}}var Ws=(e,t)=>{let{api:r,middlewares:o}=hr(e,t),n=new URL(e.baseURL).pathname;return lr(r,{extraContext:e,basePath:n,routerMiddleware:[{path:"/**",middleware:le},...o],async onRequest(i){for(let s of e.options.plugins||[])if(s.onRequest){let c=await s.onRequest(i,e);if(c&&"response"in c)return c.response}return pt(i,e)},async onResponse(i){for(let s of e.options.plugins||[])if(s.onResponse){let c=await s.onResponse(i,e);if(c)return c.response}return i},onError(i){if(i instanceof N&&i.status==="FOUND")return;if(t.onAPIError?.throw)throw i;if(t.onAPIError?.onError){t.onAPIError.onError(i,e);return}let s=t.logger?.level,c=s==="error"||s==="warn"||s==="debug"?T:void 0;if(t.logger?.disabled!==!0){if(i&&typeof i=="object"&&"message"in i&&typeof i.message=="string"&&(i.message.includes("no column")||i.message.includes("column")||i.message.includes("relation")||i.message.includes("table")||i.message.includes("does not exist"))){e.logger?.error(i.message),e.logger?.error("If you are seeing this error, it is likely that you need to run the migrations for the database or you need to update your database schema. If you recently updated the package, make sure to run the migrations.");return}i instanceof N?(i.status==="INTERNAL_SERVER_ERROR"&&e.logger.error(i.status,i),c?.error(i.message)):e.logger?.error(i&&typeof i=="object"&&"name"in i?i.name:"",i)}}})};export{ra as APIError,Me as callbackOAuth,tt as changeEmail,Ye as changePassword,h as createAuthEndpoint,M as createAuthMiddleware,D as createEmailVerificationToken,et as deleteUser,rt as error,Ze as forgetPassword,Je as forgetPasswordCallback,De as freshSessionMiddleware,hr as getEndpoints,ae as getSession,q as getSessionFromCtx,at as linkSocialAccount,Be as listSessions,st as listUserAccounts,ot as ok,pe as optionsMiddleware,le as originCheckMiddleware,We as resetPassword,$e as revokeOtherSessions,Ve as revokeSession,ze as revokeSessions,Ws as router,qe as sendVerificationEmail,Yt as sendVerificationEmailFn,S as sessionMiddleware,Xe as setPassword,He as signInEmail,Fe as signInSocial,Ge as signOut,it as signUpEmail,Ke as updateUser,Ne as verifyEmail};
83
+ </html>`,rt=h("/error",{method:"GET",metadata:{...F,openapi:{description:"Displays an error page",responses:{200:{description:"Success",content:{"text/html":{schema:{type:"string"}}}}}}}},async e=>{let t=new URL(e.request?.url||"").searchParams.get("error")||"Unknown";return new Response(ir(t),{headers:{"Content-Type":"text/html"}})});var ot=h("/ok",{method:"GET",metadata:{...F,openapi:{description:"Check if the API is working",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{ok:{type:"boolean"}}}}}}}}}},async e=>e.json({ok:!0}));import{z as H}from"zod";import{APIError as B}from"better-call";var it=()=>h("/sign-up/email",{method:"POST",query:H.object({currentURL:H.string().optional()}).optional(),body:H.record(H.string(),H.any()),metadata:{openapi:{description:"Sign up a user using email and password",requestBody:{content:{"application/json":{schema:{type:"object",properties:{name:{type:"string",description:"The name of the user"},email:{type:"string",description:"The email of the user"},password:{type:"string",description:"The password of the user"},callbackURL:{type:"string",description:"The URL to use for email verification callback"}},required:["name","email","password"]}}}},responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{user:{type:"object"},session:{type:"object"}}}}}}}}}},async e=>{if(!e.context.options.emailAndPassword?.enabled)throw new B("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,...c}=t;if(!H.string().email().safeParse(o).success)throw new B("BAD_REQUEST",{message:"Invalid email"});let d=e.context.password.config.minPasswordLength;if(n.length<d)throw e.context.logger.error("Password is too short"),new B("BAD_REQUEST",{message:"Password is too short"});let l=e.context.password.config.maxPasswordLength;if(n.length>l)throw e.context.logger.error("Password is too long"),new B("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 B("UNPROCESSABLE_ENTITY",{message:"User with this email already exists"});let p=oe(e.context.options,c),w;try{if(w=await e.context.internalAdapter.createUser({email:o.toLowerCase(),name:r,image:i,...p,emailVerified:!1}),!w)throw new B("BAD_REQUEST",{message:"Failed to create user"})}catch(g){throw e.context.logger.error("Failed to create user",g),new B("UNPROCESSABLE_ENTITY",{message:"Failed to create user",details:g})}if(!w)throw new B("UNPROCESSABLE_ENTITY",{message:"Failed to create user"});let L=await e.context.password.hash(n);if(await e.context.internalAdapter.linkAccount({userId:w.id,providerId:"credential",accountId:w.id,password:L}),e.context.options.emailVerification?.sendOnSignUp){let g=await D(e.context.secret,w.email),f=`${e.context.baseURL}/verify-email?token=${g}&callbackURL=${t.callbackURL||e.query?.currentURL||"/"}`;await e.context.options.emailVerification?.sendVerificationEmail?.({user:w,url:f,token:g},e.request)}if(!e.context.options.emailAndPassword.autoSignIn||e.context.options.emailAndPassword.requireEmailVerification)return e.json({user:w,session:null});let _=await e.context.internalAdapter.createSession(w.id,e.request);if(!_)throw new B("BAD_REQUEST",{message:"Failed to create session"});return await E(e,{session:_,user:w}),e.json({user:w,session:_})});import{z as W}from"zod";import{APIError as nt}from"better-call";var st=h("/list-accounts",{method:"GET",use:[S],metadata:{openapi:{description:"List all accounts linked to the user",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"array",items:{type:"object",properties:{id:{type:"string"},provider:{type:"string"}}}}}}}}}}},async e=>{let t=e.context.session,r=await e.context.internalAdapter.findAccounts(t.user.id);return e.json(r.map(o=>({id:o.id,provider:o.providerId})))}),at=h("/link-social",{method:"POST",requireHeaders:!0,query:W.object({currentURL:W.string().optional()}).optional(),body:W.object({callbackURL:W.string({description:"The URL to redirect to after the user has signed in"}).optional(),provider:W.enum(ee,{description:"The OAuth2 provider to use"})}),use:[S],metadata:{openapi:{description:"Link a social account to the user",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{url:{type:"string"},redirect:{type:"boolean"}},required:["url","redirect"]}}}}}}}},async e=>{let t=e.context.session;if((await e.context.internalAdapter.findAccounts(t.user.id)).find(c=>c.providerId===e.body.provider))throw new nt("BAD_REQUEST",{message:"Social Account is already linked."});let n=e.context.socialProviders.find(c=>c.id===e.body.provider);if(!n)throw e.context.logger.error("Provider not found. Make sure to add the provider in your auth config",{provider:e.body.provider}),new nt("NOT_FOUND",{message:"Provider not found"});let i=await X(e,{userId:t.user.id,email:t.user.email}),s=await n.createAuthorizationURL({state:i.state,codeVerifier:i.codeVerifier,redirectURI:`${e.context.baseURL}/callback/${n.id}`});return e.json({url:s.toString(),redirect:!0})});function ct(e,t){if(t.advanced?.ipAddress?.disableIpTracking)return null;let r="127.0.0.1";if(ge)return r;let n=t.advanced?.ipAddress?.ipAddressHeaders||["x-client-ip","x-forwarded-for","cf-connecting-ip","fastly-client-ip","x-real-ip","x-cluster-client-ip","x-forwarded","forwarded-for","forwarded"],i=e instanceof Request?e.headers:e;for(let s of n){let c=i.get(s);if(typeof c=="string"){let a=c.split(",")[0].trim();if(a)return a}}return null}function nr(e,t,r){let o=Date.now(),n=t*1e3;return o-r.lastRequest<n&&r.count>=e}function sr(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 ar(e,t){let r=Date.now(),o=t*1e3;return Math.ceil((e+o-r)/1e3)}function cr(e,t){let r="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(c){e.logger.error("Error setting rate limit",c)}}}}var dt=new Map;function dr(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 dt.get(r)},async set(r,o,n){dt.set(r,o)}}:cr(e,e.rateLimit.modelName)}async function pt(e,t){if(!t.rateLimit.enabled)return;let r=t.baseURL,o=e.url.replace(r,"").split("?")[0],n=t.rateLimit.window,i=t.rateLimit.max,s=ct(e,t.options)+o,a=pr().find(p=>p.pathMatcher(o));a&&(n=a.window,i=a.max);for(let p of t.options.plugins||[])if(p.rateLimit){let w=p.rateLimit.find(L=>L.pathMatcher(o));if(w){n=w.window,i=w.max;break}}if(t.rateLimit.customRules){let p=t.rateLimit.customRules[o];p&&(n=p.window,i=p.max)}let d=dr(t),l=await d.get(s),m=Date.now();if(!l)await d.set(s,{key:s,count:1,lastRequest:m});else{let p=m-l.lastRequest;if(nr(i,n,l)){let w=ar(l.lastRequest,n);return sr(w)}else p>n*1e3?await d.set(s,{...l,count:1,lastRequest:m}):await d.set(s,{...l,count:l.count+1,lastRequest:m})}}function pr(){return[{pathMatcher(t){return t.startsWith("/sign-in")||t.startsWith("/sign-up")||t.startsWith("/change-password")||t.startsWith("/change-email")},window:10,max:3}]}import{APIError as ra}from"better-call";function hr(e,t){let r=t.plugins?.reduce((c,a)=>({...c,...a.endpoints}),{}),o=t.plugins?.map(c=>c.middlewares?.map(a=>{let d=async l=>a.middleware({...l,context:{...e,...l.context}});return d.path=a.path,d.options=a.middleware.options,d.headers=a.middleware.headers,{path:a.path,middleware:d}})).filter(c=>c!==void 0).flat()||[],i={...{signInSocial:Fe,callbackOAuth:Me,getSession:ae(),signOut:Ge,signUpEmail:it(),signInEmail:He,forgetPassword:Ze,resetPassword:We,verifyEmail:Ne,sendVerificationEmail:qe,changeEmail:tt,changePassword:Ye,setPassword:Xe,updateUser:Ke(),deleteUser:et,forgetPasswordCallback:Je,listSessions:Be(),revokeSession:Ve,revokeSessions:ze,revokeOtherSessions:$e,linkSocialAccount:at,listUserAccounts:st},...r,ok:ot,error:rt},s={};for(let[c,a]of Object.entries(i))s[c]=async(d={})=>{a.headers=new Headers;let l={setHeader(g,f){a.headers.set(g,f)},setCookie(g,f,y){fr(a.headers,g,f,y)},getCookie(g,f){let k=d.headers?.get("cookie");return ur(k||"",g,f)},getSignedCookie(g,f,y){let k=d.headers;return k?mr(k,f,g,y):null},async setSignedCookie(g,f,y,k){await gr(a.headers,g,f,y,k)},redirect(g){return a.headers.set("Location",g),new N("FOUND")},responseHeader:a.headers},m=await e,p={...l,...d,path:a.path,context:{...m,...d.context,endpoint:a}};m.session=null;let w=t.plugins||[];for(let g of w){let f=g.hooks?.before??[];for(let y of f){if(!y.matcher(p))continue;let k=await y.handler(p);if(k&&"context"in k){p={...p,...k.context};continue}if(k)return k}}let L;try{L=await a(p)}catch(g){if(g instanceof N){let f=t.plugins?.map(y=>{if(y.hooks?.after)return y.hooks.after}).filter(y=>y!==void 0).flat();if(!f?.length)throw g.headers=a.headers,g;p.context.returned=g,p.context.returned.headers=a.headers;for(let y of f||[])if(y.matcher(p))try{let O=await y.handler(p);O&&"response"in O&&(p.context.returned=O.response)}catch(O){if(O instanceof N){p.context.returned=O;continue}throw O}if(p.context.returned instanceof N)throw p.context.returned.headers=a.headers,p.context.returned;return p.context.returned}throw g}p.context.returned=L,p.responseHeader=a.headers;for(let g of t.plugins||[])if(g.hooks?.after){for(let f of g.hooks.after)if(f.matcher(p))try{let k=await f.handler(p);k&&(p.context.returned=k)}catch(k){if(k instanceof N){p.context.returned=k;continue}throw k}}let _=p.context.returned;return _ instanceof Response&&a.headers.forEach((g,f)=>{f==="set-cookie"?_.headers.append(f,g):_.headers.set(f,g)}),_},s[c].path=a.path,s[c].method=a.method,s[c].options=a.options,s[c].headers=a.headers;return{api:s,middlewares:o}}var Ws=(e,t)=>{let{api:r,middlewares:o}=hr(e,t),n=new URL(e.baseURL).pathname;return lr(r,{extraContext:e,basePath:n,routerMiddleware:[{path:"/**",middleware:le},...o],async onRequest(i){for(let s of e.options.plugins||[])if(s.onRequest){let c=await s.onRequest(i,e);if(c&&"response"in c)return c.response}return pt(i,e)},async onResponse(i){for(let s of e.options.plugins||[])if(s.onResponse){let c=await s.onResponse(i,e);if(c)return c.response}return i},onError(i){if(i instanceof N&&i.status==="FOUND")return;if(t.onAPIError?.throw)throw i;if(t.onAPIError?.onError){t.onAPIError.onError(i,e);return}let s=t.logger?.level,c=s==="error"||s==="warn"||s==="debug"?T:void 0;if(t.logger?.disabled!==!0){if(i&&typeof i=="object"&&"message"in i&&typeof i.message=="string"&&(i.message.includes("no column")||i.message.includes("column")||i.message.includes("relation")||i.message.includes("table")||i.message.includes("does not exist"))){e.logger?.error(i.message),e.logger?.error("If you are seeing this error, it is likely that you need to run the migrations for the database or you need to update your database schema. If you recently updated the package, make sure to run the migrations.");return}i instanceof N?(i.status==="INTERNAL_SERVER_ERROR"&&e.logger.error(i.status,i),c?.error(i.message)):e.logger?.error(i&&typeof i=="object"&&"name"in i?i.name:"",i)}}})};export{ra as APIError,Me as callbackOAuth,tt as changeEmail,Ye as changePassword,h as createAuthEndpoint,M as createAuthMiddleware,D as createEmailVerificationToken,et as deleteUser,rt as error,Ze as forgetPassword,Je as forgetPasswordCallback,De as freshSessionMiddleware,hr as getEndpoints,ae as getSession,q as getSessionFromCtx,at as linkSocialAccount,Be as listSessions,st as listUserAccounts,ot as ok,pe as optionsMiddleware,le as originCheckMiddleware,We as resetPassword,$e as revokeOtherSessions,Ve as revokeSession,ze as revokeSessions,Ws as router,qe as sendVerificationEmail,Yt as sendVerificationEmailFn,S as sessionMiddleware,Xe as setPassword,He as signInEmail,Fe as signInSocial,Ge as signOut,it as signUpEmail,Ke as updateUser,Ne as verifyEmail};
package/dist/index.cjs CHANGED
@@ -80,4 +80,4 @@ Error: `,u),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>`,ir=k("/error",{method:"GET",metadata:{...W,openapi:{description:"Displays an error page",responses:{200:{description:"Success",content:{"text/html":{schema:{type:"string"}}}}}}}},async e=>{let t=new URL(e.request?.url||"").searchParams.get("error")||"Unknown";return new Response(Gr(t),{headers:{"Content-Type":"text/html"}})});var sr=k("/ok",{method:"GET",metadata:{...W,openapi:{description:"Check if the API is working",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{ok:{type:"boolean"}}}}}}}}}},async e=>e.json({ok:!0}));var Q=require("zod");var V=require("better-call");var ar=()=>k("/sign-up/email",{method:"POST",query:Q.z.object({currentURL:Q.z.string().optional()}).optional(),body:Q.z.record(Q.z.string(),Q.z.any()),metadata:{openapi:{description:"Sign up a user using email and password",requestBody:{content:{"application/json":{schema:{type:"object",properties:{name:{type:"string",description:"The name of the user"},email:{type:"string",description:"The email of the user"},password:{type:"string",description:"The password of the user"},callbackURL:{type:"string",description:"The URL to use for email verification callback"}},required:["name","email","password"]}}}},responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{user:{type:"object"},session:{type:"object"}}}}}}}}}},async e=>{if(!e.context.options.emailAndPassword?.enabled)throw new V.APIError("BAD_REQUEST",{message:"Email and password sign up is not enabled"});let t=e.body,{name:r,email:n,password:i,image:o,callbackURL:a,...u}=t;if(!Q.z.string().email().safeParse(n).success)throw new V.APIError("BAD_REQUEST",{message:"Invalid email"});let d=e.context.password.config.minPasswordLength;if(i.length<d)throw e.context.logger.error("Password is too short"),new V.APIError("BAD_REQUEST",{message:"Password is too short"});let c=e.context.password.config.maxPasswordLength;if(i.length>c)throw e.context.logger.error("Password is too long"),new V.APIError("BAD_REQUEST",{message:"Password is too long"});if((await e.context.internalAdapter.findUserByEmail(n))?.user)throw e.context.logger.info(`Sign-up attempt for existing email: ${n}`),new V.APIError("UNPROCESSABLE_ENTITY",{message:"User with this email already exists"});let p=Re(e.context.options,u),m;try{if(m=await e.context.internalAdapter.createUser({email:n.toLowerCase(),name:r,image:o,...p,emailVerified:!1}),!m)throw new V.APIError("BAD_REQUEST",{message:"Failed to create user"})}catch(y){throw e.context.logger.error("Failed to create user",y),new V.APIError("UNPROCESSABLE_ENTITY",{message:"Failed to create user",details:y})}if(!m)throw new V.APIError("UNPROCESSABLE_ENTITY",{message:"Failed to create user"});let f=await e.context.password.hash(i);if(await e.context.internalAdapter.linkAccount({userId:m.id,providerId:"credential",accountId:m.id,password:f}),e.context.options.emailVerification?.sendOnSignUp){let y=await z(e.context.secret,m.email),h=`${e.context.baseURL}/verify-email?token=${y}&callbackURL=${t.callbackURL||e.query?.currentURL||"/"}`;await e.context.options.emailVerification?.sendVerificationEmail?.({user:m,url:h,token:y},e.request)}if(!e.context.options.emailAndPassword.autoSignIn||e.context.options.emailAndPassword.requireEmailVerification)return e.json({user:m,session:null});let g=await e.context.internalAdapter.createSession(m.id,e.request);if(!g)throw new V.APIError("BAD_REQUEST",{message:"Failed to create session"});return await P(e,{session:g,user:m}),e.json({user:m,session:g})});var te=require("zod");var Fe=require("better-call");var dr=k("/list-accounts",{method:"GET",use:[D],metadata:{openapi:{description:"List all accounts linked to the user",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"array",items:{type:"object",properties:{id:{type:"string"},provider:{type:"string"}}}}}}}}}}},async e=>{let t=e.context.session,r=await e.context.internalAdapter.findAccounts(t.user.id);return e.json(r.map(n=>({id:n.id,provider:n.providerId})))}),cr=k("/link-social",{method:"POST",requireHeaders:!0,query:te.z.object({currentURL:te.z.string().optional()}).optional(),body:te.z.object({callbackURL:te.z.string({description:"The URL to redirect to after the user has signed in"}).optional(),provider:te.z.enum(we,{description:"The OAuth2 provider to use"})}),use:[D],metadata:{openapi:{description:"Link a social account to the user",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{url:{type:"string"},redirect:{type:"boolean"}},required:["url","redirect"]}}}}}}}},async e=>{let t=e.context.session;if((await e.context.internalAdapter.findAccounts(t.user.id)).find(u=>u.providerId===e.body.provider))throw new Fe.APIError("BAD_REQUEST",{message:"Social Account is already linked."});let i=e.context.socialProviders.find(u=>u.id===e.body.provider);if(!i)throw e.context.logger.error("Provider not found. Make sure to add the provider in your auth config",{provider:e.body.provider}),new Fe.APIError("NOT_FOUND",{message:"Provider not found"});let o=await ae(e,{userId:t.user.id,email:t.user.email}),a=await i.createAuthorizationURL({state:o.state,codeVerifier:o.codeVerifier,redirectURI:`${e.context.baseURL}/callback/${i.id}`});return e.json({url:a.toString(),redirect:!0})});function Ue(e,t){if(t.advanced?.ipAddress?.disableIpTracking)return null;let r="127.0.0.1";if(Ze)return r;let i=t.advanced?.ipAddress?.ipAddressHeaders||["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 a of i){let u=o.get(a);if(typeof u=="string"){let s=u.split(",")[0].trim();if(s)return s}}return null}function Kr(e,t,r){let n=Date.now(),i=t*1e3;return n-r.lastRequest<i&&r.count>=e}function Wr(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 Qr(e,t){let r=Date.now(),n=t*1e3;return Math.ceil((e+n-r)/1e3)}function Zr(e,t){let r="rateLimit",n=e.adapter;return{get:async i=>await n.findOne({model:r,where:[{field:"key",value:i}]}),set:async(i,o,a)=>{try{a?await n.update({model:t??"rateLimit",where:[{field:"key",value:i}],update:{count:o.count,lastRequest:o.lastRequest}}):await n.create({model:t??"rateLimit",data:{key:i,count:o.count,lastRequest:o.lastRequest}})}catch(u){e.logger.error("Error setting rate limit",u)}}}}var ur=new Map;function Jr(e){return e.rateLimit.storage==="secondary-storage"?{get:async r=>{let n=await e.options.secondaryStorage?.get(r);return n?JSON.parse(n):void 0},set:async(r,n)=>{await e.options.secondaryStorage?.set?.(r,JSON.stringify(n))}}:e.rateLimit.storage==="memory"?{async get(r){return ur.get(r)},async set(r,n,i){ur.set(r,n)}}:Zr(e,e.rateLimit.modelName)}async function lr(e,t){if(!t.rateLimit.enabled)return;let r=t.baseURL,n=e.url.replace(r,""),i=t.rateLimit.window,o=t.rateLimit.max,a=Ue(e,t.options)+n,s=Yr().find(p=>p.pathMatcher(n));s&&(i=s.window,o=s.max);for(let p of t.options.plugins||[])if(p.rateLimit){let m=p.rateLimit.find(f=>f.pathMatcher(n));if(m){i=m.window,o=m.max;break}}if(t.rateLimit.customRules){let p=t.rateLimit.customRules[n];p&&(i=p.window,o=p.max)}let d=Jr(t),c=await d.get(a),l=Date.now();if(!c)await d.set(a,{key:a,count:1,lastRequest:l});else{let p=l-c.lastRequest;if(Kr(o,i,c)){let m=Qr(c.lastRequest,i);return Wr(m)}else p>i*1e3?await d.set(a,{...c,count:1,lastRequest:l}):await d.set(a,{...c,count:c.count+1,lastRequest:l})}}function Yr(){return[{pathMatcher(t){return t.startsWith("/sign-in")||t.startsWith("/sign-up")||t.startsWith("/change-password")||t.startsWith("/change-email")},window:10,max:3}]}var Xr=require("better-call");function Ve(e,t){let r=t.plugins?.reduce((u,s)=>({...u,...s.endpoints}),{}),n=t.plugins?.map(u=>u.middlewares?.map(s=>{let d=async c=>s.middleware({...c,context:{...e,...c.context}});return d.path=s.path,d.options=s.middleware.options,d.headers=s.middleware.headers,{path:s.path,middleware:d}})).filter(u=>u!==void 0).flat()||[],o={...{signInSocial:zt,callbackOAuth:Ht,getSession:qe(),signOut:Kt,signUpEmail:ar(),signInEmail:Mt,forgetPassword:Qt,resetPassword:Jt,verifyEmail:$t,sendVerificationEmail:Vt,changeEmail:or,changePassword:tr,setPassword:rr,updateUser:er(),deleteUser:nr,forgetPasswordCallback:Zt,listSessions:Bt(),revokeSession:qt,revokeSessions:Nt,revokeOtherSessions:jt,linkSocialAccount:cr,listUserAccounts:dr},...r,ok:sr,error:ir},a={};for(let[u,s]of Object.entries(o))a[u]=async(d={})=>{s.headers=new Headers;let c={setHeader(y,h){s.headers.set(y,h)},setCookie(y,h,w){(0,U.setCookie)(s.headers,y,h,w)},getCookie(y,h){let b=d.headers?.get("cookie");return(0,U.getCookie)(b||"",y,h)},getSignedCookie(y,h,w){let b=d.headers;return b?(0,U.getSignedCookie)(b,h,y,w):null},async setSignedCookie(y,h,w,b){await(0,U.setSignedCookie)(s.headers,y,h,w,b)},redirect(y){return s.headers.set("Location",y),new U.APIError("FOUND")},responseHeader:s.headers},l=await e,p={...c,...d,path:s.path,context:{...l,...d.context,endpoint:s}};l.session=null;let m=t.plugins||[];for(let y of m){let h=y.hooks?.before??[];for(let w of h){if(!w.matcher(p))continue;let b=await w.handler(p);if(b&&"context"in b){p={...p,...b.context};continue}if(b)return b}}let f;try{f=await s(p)}catch(y){if(y instanceof U.APIError){let h=t.plugins?.map(w=>{if(w.hooks?.after)return w.hooks.after}).filter(w=>w!==void 0).flat();if(!h?.length)throw y.headers=s.headers,y;p.context.returned=y,p.context.returned.headers=s.headers;for(let w of h||[])if(w.matcher(p))try{let E=await w.handler(p);E&&"response"in E&&(p.context.returned=E.response)}catch(E){if(E instanceof U.APIError){p.context.returned=E;continue}throw E}if(p.context.returned instanceof U.APIError)throw p.context.returned.headers=s.headers,p.context.returned;return p.context.returned}throw y}p.context.returned=f,p.responseHeader=s.headers;for(let y of t.plugins||[])if(y.hooks?.after){for(let h of y.hooks.after)if(h.matcher(p))try{let b=await h.handler(p);b&&(p.context.returned=b)}catch(b){if(b instanceof U.APIError){p.context.returned=b;continue}throw b}}let g=p.context.returned;return g instanceof Response&&s.headers.forEach((y,h)=>{h==="set-cookie"?g.headers.append(h,y):g.headers.set(h,y)}),g},a[u].path=s.path,a[u].method=s.method,a[u].options=s.options,a[u].headers=s.headers;return{api:a,middlewares:n}}var pr=(e,t)=>{let{api:r,middlewares:n}=Ve(e,t),i=new URL(e.baseURL).pathname;return(0,U.createRouter)(r,{extraContext:e,basePath:i,routerMiddleware:[{path:"/**",middleware:We},...n],async onRequest(o){for(let a of e.options.plugins||[])if(a.onRequest){let u=await a.onRequest(o,e);if(u&&"response"in u)return u.response}return lr(o,e)},async onResponse(o){for(let a of e.options.plugins||[])if(a.onResponse){let u=await a.onResponse(o,e);if(u)return u.response}return o},onError(o){if(o instanceof U.APIError&&o.status==="FOUND")return;if(t.onAPIError?.throw)throw o;if(t.onAPIError?.onError){t.onAPIError.onError(o,e);return}let a=t.logger?.level,u=a==="error"||a==="warn"||a==="debug"?I:void 0;if(t.logger?.disabled!==!0){if(o&&typeof o=="object"&&"message"in o&&typeof o.message=="string"&&(o.message.includes("no column")||o.message.includes("column")||o.message.includes("relation")||o.message.includes("table")||o.message.includes("does not exist"))){e.logger?.error(o.message),e.logger?.error("If you are seeing this error, it is likely that you need to run the migrations for the database or you need to update your database schema. If you recently updated the package, make sure to run the migrations.");return}o instanceof U.APIError?(o.status==="INTERNAL_SERVER_ERROR"&&e.logger.error(o.status,o),u?.error(o.message)):e.logger?.error(o&&typeof o=="object"&&"name"in o?o.name:"",o)}}})};var Rr=require("defu");var ce=require("oslo/encoding");var fr=require("@noble/hashes/scrypt"),mr=require("uncrypto"),re={N:16384,r:16,p:1,dkLen:64};async function gr(e,t){return await(0,fr.scryptAsync)(e.normalize("NFKC"),t,{N:re.N,p:re.p,r:re.r,dkLen:re.dkLen,maxmem:128*re.N*re.r*2})}var hr=async e=>{let t=(0,ce.encodeHex)((0,mr.getRandomValues)(new Uint8Array(16))),r=await gr(e,t);return`${t}:${(0,ce.encodeHex)(r)}`},yr=async(e,t)=>{let[r,n]=e.split(":"),i=await gr(t,r);return Ie(i,(0,ce.decodeHex)(n))};function wr(e,t){let r=t.hooks;async function n(a,u,s){let d=a;for(let p of r||[]){let m=p[u]?.create?.before;if(m){let f=await m(a);if(f===!1)return null;typeof f=="object"&&"data"in f&&(d=f.data)}}let c=s?await s.fn(d):null,l=!s||s.executeMainFn?await e.create({model:u,data:d}):c;for(let p of r||[]){let m=p[u]?.create?.after;m&&await m(l)}return l}async function i(a,u,s,d){let c=a;for(let m of r||[]){let f=m[s]?.update?.before;if(f){let g=await f(a);if(g===!1)return null;c=typeof g=="object"?g.data:g}}let l=d?await d.fn(c):null,p=!d||d.executeMainFn?await e.update({model:s,update:c,where:u}):l;for(let m of r||[]){let f=m[s]?.update?.after;f&&await f(p)}return p}async function o(a,u,s,d){let c=a;for(let m of r||[]){let f=m[s]?.update?.before;if(f){let g=await f(a);if(g===!1)return null;c=typeof g=="object"?g.data:g}}let l=d?await d.fn(c):null,p=!d||d.executeMainFn?await e.updateMany({model:s,update:c,where:u}):l;for(let m of r||[]){let f=m[s]?.update?.after;f&&await f(p)}return p}return{createWithHooks:n,updateWithHooks:i,updateManyWithHooks:o}}var $e=(e,t)=>{let r=t.options,n=r.secondaryStorage,i=r.session?.expiresIn||60*60*24*7,{createWithHooks:o,updateWithHooks:a,updateManyWithHooks:u}=wr(e,t);return{createOAuthUser:async(s,d)=>{try{let c=await o({createdAt:new Date,updatedAt:new Date,...s},"user"),l=await o({...d,userId:c.id||s.id,createdAt:new Date,updatedAt:new Date},"account");return{user:c,account:l}}catch(c){return console.log(c),null}},createUser:async s=>await o({createdAt:new Date,updatedAt:new Date,emailVerified:!1,...s},"user"),createAccount:async s=>await o({createdAt:new Date,updatedAt:new Date,...s},"account"),listSessions:async s=>{if(n){let c=await n.get(`active-sessions-${s}`);if(!c)return[];let l=J(c)||[],p=Date.now(),m=l.filter(g=>g.expiresAt>p),f=[];for(let g of m){let y=await n.get(g.token);if(y){let h=JSON.parse(y),w=ve(t.options,{...h.session,expiresAt:new Date(h.session.expiresAt)});f.push(w)}}return f}return await e.findMany({model:"session",where:[{field:"userId",value:s}]})},listUsers:async(s,d,c,l)=>await e.findMany({model:"user",limit:s,offset:d,sortBy:c,where:l}),deleteUser:async s=>{await e.deleteMany({model:"session",where:[{field:"userId",value:s}]}),await e.deleteMany({model:"account",where:[{field:"userId",value:s}]}),await e.delete({model:"user",where:[{field:"id",value:s}]})},createSession:async(s,d,c,l)=>{let p=d instanceof Request?d.headers:d,{id:m,...f}=l||{},g={ipAddress:d&&Ue(d,t.options)||"",userAgent:p?.get("user-agent")||"",...f,expiresAt:c?q(60*60*24,"sec"):q(i,"sec"),userId:s,token:N(32),createdAt:new Date,updatedAt:new Date};return await o(g,"session",n?{fn:async()=>{let h=await e.findOne({model:"user",where:[{field:"id",value:s}]});n.set(g.token,JSON.stringify({session:g,user:h}),i);let w=await n.get(`active-sessions-${s}`),b=[],E=Date.now();return w&&(b=J(w)||[],b=b.filter(Tr=>Tr.expiresAt>E)),b.push({token:g.token,expiresAt:E+i*1e3}),await n.set(`active-sessions-${s}`,JSON.stringify(b),i),g},executeMainFn:r.session?.storeSessionInDatabase}:void 0)},findSession:async s=>{if(n){let p=await n.get(s);if(p){let m=JSON.parse(p),f=ve(t.options,{...m.session,expiresAt:new Date(m.session.expiresAt),createdAt:new Date(m.session.createdAt),updatedAt:new Date(m.session.updatedAt)}),g=je(t.options,{...m.user,createdAt:new Date(m.user.createdAt),updatedAt:new Date(m.user.updatedAt)});return{session:f,user:g}}}let d=await e.findOne({model:"session",where:[{value:s,field:"token"}]});if(!d)return null;let c=await e.findOne({model:"user",where:[{value:d.userId,field:"id"}]});if(!c)return null;let l=je(t.options,c);return{session:ve(t.options,d),user:l}},findSessions:async s=>{if(n){let p=[];for(let m of s){let f=await n.get(m);if(f){let g=JSON.parse(f),y={session:{...g.session,expiresAt:new Date(g.session.expiresAt)},user:{...g.user,createdAt:new Date(g.user.createdAt),updatedAt:new Date(g.user.updatedAt)}};p.push(y)}}return p}let d=await e.findMany({model:"session",where:[{field:"token",value:s,operator:"in"}]}),c=d.map(p=>p.userId);if(!c.length)return[];let l=await e.findMany({model:"user",where:[{field:"id",value:c,operator:"in"}]});return d.map(p=>{let m=l.find(f=>f.id===p.userId);return m?{session:p,user:m}:null})},updateSession:async(s,d)=>await a(d,[{field:"token",value:s}],"session",n?{async fn(l){let p=await n.get(s),m=null;if(p){let f=JSON.parse(p);return m={...f.session,...l},await n.set(s,JSON.stringify({session:m,user:f.user}),f.session.expiresAt?Math.floor((f.session.expiresAt.getTime()-Date.now())/1e3):i),m}else return null},executeMainFn:r.session?.storeSessionInDatabase}:void 0),deleteSession:async s=>{if(n){await n.delete(s),r.session?.storeSessionInDatabase&&await e.delete({model:"session",where:[{field:"token",value:s}]});return}await e.delete({model:"session",where:[{field:"token",value:s}]})},deleteSessions:async s=>{if(n){if(typeof s=="string"){let d=await n.get(`active-sessions-${s}`),c=d?J(d):[];if(!c)return;for(let l of c)await n.delete(l.token)}else for(let d of s)await n.get(d)&&await n.delete(d);r.session?.storeSessionInDatabase&&await e.deleteMany({model:"session",where:[{field:Array.isArray(s)?"token":"userId",value:s,operator:Array.isArray(s)?"in":void 0}]});return}await e.deleteMany({model:"session",where:[{field:Array.isArray(s)?"token":"userId",value:s,operator:Array.isArray(s)?"in":void 0}]})},findUserByEmail:async(s,d)=>{let c=await e.findOne({model:"user",where:[{value:s.toLowerCase(),field:"email"}]});if(!c)return null;if(d?.includeAccounts){let l=await e.findMany({model:"account",where:[{value:c.id,field:"userId"}]});return{user:c,accounts:l}}return{user:c,accounts:[]}},findUserById:async s=>await e.findOne({model:"user",where:[{field:"id",value:s}]}),linkAccount:async s=>await o({...s,createdAt:new Date,updatedAt:new Date},"account"),updateUser:async(s,d)=>await a(d,[{field:"id",value:s}],"user"),updateUserByEmail:async(s,d)=>await a(d,[{field:"email",value:s}],"user"),updatePassword:async(s,d)=>{await u({password:d},[{field:"userId",value:s},{field:"providerId",value:"credential"}],"account")},findAccounts:async s=>await e.findMany({model:"account",where:[{field:"userId",value:s}]}),findAccount:async s=>await e.findOne({model:"account",where:[{field:"accountId",value:s}]}),findAccountByUserId:async s=>await e.findMany({model:"account",where:[{field:"userId",value:s}]}),updateAccount:async(s,d)=>await a(d,[{field:"id",value:s}],"account"),createVerificationValue:async s=>await o({createdAt:new Date,updatedAt:new Date,...s},"verification"),findVerificationValue:async s=>(await e.findMany({model:"verification",where:[{field:"identifier",value:s}],sortBy:{field:"createdAt",direction:"desc"},limit:10}))[0],deleteVerificationValue:async s=>{await e.delete({model:"verification",where:[{field:"id",value:s}]})},deleteVerificationByIdentifier:async s=>{await e.delete({model:"verification",where:[{field:"identifier",value:s}]})},updateVerificationValue:async(s,d)=>await a(d,[{field:"id",value:s}],"verification")}};var M=e=>{let t=e.plugins?.reduce((s,d)=>{let c=d.schema;if(!c)return s;for(let[l,p]of Object.entries(c))s[l]={fields:{...s[l]?.fields,...p.fields},modelName:p.modelName||l};return s},{}),r=e.rateLimit?.storage==="database",n={rateLimit:{modelName:e.rateLimit?.modelName||"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:i,session:o,account:a,...u}=t||{};return{user:{modelName: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"},...i?.fields,...e.user?.additionalFields},order:1},session:{modelName:e.session?.modelName||"session",fields:{expiresAt:{type:"date",required:!0,fieldName:e.session?.fields?.expiresAt||"expiresAt"},token:{type:"string",required:!0,fieldName:e.session?.fields?.token||"token",unique:!0},createdAt:{type:"date",required:!0,fieldName:e.session?.fields?.createdAt||"createdAt"},updatedAt:{type:"date",required:!0,fieldName:e.session?.fields?.updatedAt||"updatedAt"},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},...o?.fields,...e.session?.additionalFields},order:2},account:{modelName: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"},accessTokenExpiresAt:{type:"date",required:!1,fieldName:e.account?.fields?.accessTokenExpiresAt||"accessTokenExpiresAt"},refreshTokenExpiresAt:{type:"date",required:!1,fieldName:e.account?.fields?.accessTokenExpiresAt||"refreshTokenExpiresAt"},scope:{type:"string",required:!1,fieldName:e.account?.fields?.scope||"scope"},password:{type:"string",required:!1,fieldName:e.account?.fields?.password||"password"},createdAt:{type:"date",required:!0,fieldName:e.account?.fields?.createdAt||"createdAt"},updatedAt:{type:"date",required:!0,fieldName:e.account?.fields?.updatedAt||"updatedAt"},...a?.fields},order:3},verification:{modelName: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"},createdAt:{type:"date",required:!1,defaultValue:()=>new Date,fieldName:e.verification?.fields?.createdAt||"createdAt"},updatedAt:{type:"date",required:!1,defaultValue:()=>new Date,fieldName:e.verification?.fields?.updatedAt||"updatedAt"}},order:4},...u,...r?n:{}}};var en=require("zod");var ue=require("kysely"),H=require("kysely");function br(e){if(!e)return null;if("dialect"in e)return br(e.dialect);if("createDriver"in e){if(e instanceof H.SqliteDialect)return"sqlite";if(e instanceof H.MysqlDialect)return"mysql";if(e instanceof H.PostgresDialect)return"postgres";if(e instanceof ue.MssqlDialect)return"mssql"}return"aggregate"in e?"sqlite":"getConnection"in e?"mysql":"connect"in e?"postgres":null}var ze=async e=>{let t=e.database;if(!t)return{kysely:null,databaseType:null};if("db"in t)return{kysely:t.db,databaseType:t.type};if("dialect"in t)return{kysely:new ue.Kysely({dialect:t.dialect}),databaseType:t.type};let r,n=br(t);return"createDriver"in t&&(r=t),"aggregate"in t&&(r=new H.SqliteDialect({database:t})),"getConnection"in t&&(r=new H.MysqlDialect(t)),"connect"in t&&(r=new H.PostgresDialect({pool:t})),{kysely:r?new ue.Kysely({dialect:r}):null,databaseType:n}};function Te(e,t,r){return r==="update"?e:e==null&&t.defaultValue?typeof t.defaultValue=="function"?t.defaultValue():t.defaultValue:e}var tn=(e,t,r)=>{let n=M(t);function i(d,c){if(c==="id")return c;let l=n[d].fields[c];return l||console.log("Field not found",d,c),l.fieldName||c}function o(d,c,l){let{type:p="sqlite"}=r||{},m=n[c].fields[l];return m.type==="boolean"&&p==="sqlite"&&d!==null&&d!==void 0?d?1:0:m.type==="date"&&d&&d instanceof Date&&p==="sqlite"?d.toISOString():d}function a(d,c,l){let{type:p="sqlite"}=r||{},m=n[c].fields[l];return m.type==="boolean"&&p==="sqlite"&&d!==null?d===1:m.type==="date"&&d?new Date(d):d}function u(d){return n[d].modelName}let s=t?.advanced?.generateId===!1;return{transformInput(d,c,l){let p=s||l==="update"?{}:{id:t.advanced?.generateId?t.advanced.generateId({model:c}):d.id||N()},m=n[c].fields;for(let f in m){let g=d[f];p[m[f].fieldName||f]=Te(o(g,c,f),m[f],l)}return p},transformOutput(d,c,l=[]){if(!d)return null;let p=d.id?l.length===0||l.includes("id")?{id:d.id}:{}:{},m=n[c].fields;for(let f in m){if(l.length&&!l.includes(f))continue;let g=m[f];g&&(p[f]=a(d[g.fieldName||f],c,f))}return p},convertWhereClause(d,c){if(!c)return{and:null,or:null};let l={and:[],or:[]};return c.forEach(p=>{let{field:m,value:f,operator:g="=",connector:y="AND"}=p,h=i(d,m),w=b=>g.toLowerCase()==="in"?b(h,"in",Array.isArray(f)?f:[f]):g==="contains"?b(h,"like",`%${f}%`):g==="starts_with"?b(h,"like",`${f}%`):g==="ends_with"?b(h,"like",`%${f}`):g==="eq"?b(h,"=",f):g==="ne"?b(h,"<>",f):g==="gt"?b(h,">",f):g==="gte"?b(h,">=",f):g==="lt"?b(h,"<",f):g==="lte"?b(h,"<=",f):b(h,g,f);y==="OR"?l.or.push(w):l.and.push(w)}),{and:l.and.length?l.and:null,or:l.or.length?l.or:null}},async withReturning(d,c,l,p){let m;if(r?.type!=="mysql")m=await c.returningAll().executeTakeFirst();else{await c.execute();let f=d.id?"id":p[0].field?p[0].field:"id",g=d[f]||p[0].value;m=await e.selectFrom(u(l)).selectAll().where(i(l,f),"=",g).executeTakeFirst()}return m},getModelName:u,getField:i}},Ar=(e,t)=>r=>{let{transformInput:n,withReturning:i,transformOutput:o,convertWhereClause:a,getModelName:u,getField:s}=tn(e,r,t);return{id:"kysely",async create(d){let{model:c,data:l,select:p}=d,m=n(l,c,"create"),f=e.insertInto(u(c)).values(m);return o(await i(m,f,c,[]),c,p)},async findOne(d){let{model:c,where:l,select:p}=d,{and:m,or:f}=a(c,l),g=e.selectFrom(u(c)).selectAll();m&&(g=g.where(h=>h.and(m.map(w=>w(h))))),f&&(g=g.where(h=>h.or(f.map(w=>w(h)))));let y=await g.executeTakeFirst();return y?o(y,c,p):null},async findMany(d){let{model:c,where:l,limit:p,offset:m,sortBy:f}=d,{and:g,or:y}=a(c,l),h=e.selectFrom(u(c));g&&(h=h.where(b=>b.and(g.map(E=>E(b))))),y&&(h=h.where(b=>b.or(y.map(E=>E(b))))),h=h.limit(p||100),m&&(h=h.offset(m)),f&&(h=h.orderBy(s(c,f.field),f.direction));let w=await h.selectAll().execute();return w?w.map(b=>o(b,c)):[]},async update(d){let{model:c,where:l,update:p}=d,{and:m,or:f}=a(c,l),g=n(p,c,"update"),y=e.updateTable(u(c)).set(g);return m&&(y=y.where(w=>w.and(m.map(b=>b(w))))),f&&(y=y.where(w=>w.or(f.map(b=>b(w))))),await o(await i(g,y,c,l),c)},async updateMany(d){let{model:c,where:l,update:p}=d,{and:m,or:f}=a(c,l),g=n(p,c,"update"),y=e.updateTable(u(c)).set(g);return m&&(y=y.where(w=>w.and(m.map(b=>b(w))))),f&&(y=y.where(w=>w.or(f.map(b=>b(w))))),(await y.execute()).length},async delete(d){let{model:c,where:l}=d,{and:p,or:m}=a(c,l),f=e.deleteFrom(u(c));p&&(f=f.where(g=>g.and(p.map(y=>y(g))))),m&&(f=f.where(g=>g.or(m.map(y=>y(g))))),await f.execute()},async deleteMany(d){let{model:c,where:l}=d,{and:p,or:m}=a(c,l),f=e.deleteFrom(u(c));return p&&(f=f.where(g=>g.and(p.map(y=>y(g))))),m&&(f=f.where(g=>g.or(m.map(y=>y(g))))),(await f.execute()).length},options:t}};var rn=e=>{let t=M(e);function r(n,i){return i==="id"?i:t[n].fields[i].fieldName||i}return{transformInput(n,i,o){let a=o==="update"?{}:{id:e.advanced?.generateId?e.advanced.generateId({model:i}):n.id||N()},u=t[i].fields;for(let s in u){let d=n[s];d===void 0&&!u[s].defaultValue||(a[u[s].fieldName||s]=Te(d,u[s],o))}return a},transformOutput(n,i,o=[]){if(!n)return null;let a=n.id||n._id?o.length===0||o.includes("id")?{id:n.id}:{}:{},u=t[i].fields;for(let s in u){if(o.length&&!o.includes(s))continue;let d=u[s];d&&(a[s]=n[d.fieldName||s])}return a},convertWhereClause(n,i,o){return i.filter(a=>n.every(u=>{let{field:s,value:d,operator:c}=u,l=r(o,s);if(c==="in"){if(!Array.isArray(d))throw new Error("Value must be an array");return d.includes(a[l])}else return c==="contains"?a[l].includes(d):c==="starts_with"?a[l].startsWith(d):c==="ends_with"?a[l].endsWith(d):a[l]===d}))},getField:r}},kr=e=>t=>{let{transformInput:r,transformOutput:n,convertWhereClause:i,getField:o}=rn(t);return{id:"memory",create:async({model:a,data:u})=>{let s=r(u,a,"create");return e[a].push(s),n(s,a)},findOne:async({model:a,where:u,select:s})=>{let d=e[a],l=i(u,d,a)[0]||null;return n(l,a,s)},findMany:async({model:a,where:u,sortBy:s,limit:d,offset:c})=>{let l=e[a];return u&&(l=i(u,l,a)),s&&(l=l.sort((p,m)=>{let f=o(a,s.field);return s.direction==="asc"?p[f]>m[f]?1:-1:p[f]<m[f]?1:-1})),c!==void 0&&(l=l.slice(c)),d!==void 0&&(l=l.slice(0,d)),l.map(p=>n(p,a))},update:async({model:a,where:u,update:s})=>{let d=e[a],c=i(u,d,a);return c.forEach(l=>{Object.assign(l,r(s,a,"update"))}),n(c[0],a)},delete:async({model:a,where:u})=>{let s=e[a],d=i(u,s,a);e[a]=s.filter(c=>!d.includes(c))},deleteMany:async({model:a,where:u})=>{let s=e[a],d=i(u,s,a),c=0;return e[a]=s.filter(l=>d.includes(l)?(c++,!1):!d.includes(l)),c},updateMany(a){let{model:u,where:s,update:d}=a,c=e[u],l=i(s,c,u);return l.forEach(p=>{Object.assign(p,d)}),l[0]||null}}};async function xr(e){if(!e.database){let n=M(e),i=Object.keys(n).reduce((o,a)=>(o[a]=[],o),{});return I.warn("No database configuration provided. Using memory adapter in development"),kr(i)(e)}if(typeof e.database=="function")return e.database(e);let{kysely:t,databaseType:r}=await ze(e);if(!t)throw new L("Failed to initialize database adapter");return Ar(t,{type:r||"sqlite"})(e)}var Me="better-auth-secret-123456789";var He=require("better-call");async function vr(e,t){let n=(await t.context.internalAdapter.findAccounts(e))?.find(a=>a.providerId==="credential"),i=n?.password;if(!n||!i)throw new He.APIError("BAD_REQUEST",{message:"No password credential found"});if(!await t.context.password.verify(i,t.body.password))throw new He.APIError("BAD_REQUEST",{message:"Invalid password"});return!0}var Ur=async e=>{let t=await xr(e),r=e.plugins||[],n=on(e),i=de(e.logger),o=se(e.baseURL,e.basePath),a=e.secret||_.BETTER_AUTH_SECRET||_.AUTH_SECRET||Me;a===Me&&ie&&i.error("You are using the default secret. Please set `BETTER_AUTH_SECRET` in your environment variables or pass `secret` in your auth config."),e={...e,secret:a,baseURL:o?new URL(o).origin:"",basePath:e.basePath||"/api/auth",plugins:r.concat(n),emailAndPassword:{...e.emailAndPassword,enabled:e.emailAndPassword?.enabled??!1,autoSignIn:e.emailAndPassword?.autoSignIn??!0}};let u=Pe(e),s=M(e),d=Object.keys(e.socialProviders||{}).map(m=>{let f=e.socialProviders?.[m];return f.enabled===!1?null:((!f.clientId||!f.clientSecret)&&i.warn(`Social provider ${m} is missing clientId or clientSecret`),Be[m](f))}).filter(m=>m!==null),c=({model:m,size:f})=>typeof e?.advanced?.generateId=="function"?e.advanced.generateId({model:m,size:f}):N(f),l={appName:e.appName||"Better Auth",socialProviders:d,options:e,tables:s,trustedOrigins:sn(e),baseURL:o||"",sessionConfig:{updateAge:e.session?.updateAge!==void 0?e.session.updateAge:24*60*60,expiresIn:e.session?.expiresIn||60*60*24*7,freshAge:e.session?.freshAge||60*5},secret:a,rateLimit:{...e.rateLimit,enabled:e.rateLimit?.enabled??ie,window:e.rateLimit?.window||10,max:e.rateLimit?.max||100,storage:e.rateLimit?.storage||e.secondaryStorage?"secondary-storage":"memory"},authCookies:u,logger:i,generateId:c,session:null,secondaryStorage:e.secondaryStorage,password:{hash:e.emailAndPassword?.password?.hash||hr,verify:e.emailAndPassword?.password?.verify||yr,config:{minPasswordLength:e.emailAndPassword?.minPasswordLength||8,maxPasswordLength:e.emailAndPassword?.maxPasswordLength||128},checkPassword:vr},adapter:t,internalAdapter:$e(t,{options:e,hooks:e.databaseHooks?[e.databaseHooks]:[],generateId:c}),createAuthCookie:ge(e)},{context:p}=nn(l);return p};function nn(e){let t=e.options,r=t.plugins||[],n=e,i=[];for(let o of r)if(o.init){let a=o.init(e);typeof a=="object"&&(a.options&&(a.options.databaseHooks&&i.push(a.options.databaseHooks),t=(0,Rr.defu)(t,a.options)),a.context&&(n={...n,...a.context}))}return i.push(t.databaseHooks),n.internalAdapter=$e(e.adapter,{options:t,hooks:i.filter(o=>o!==void 0),generateId:e.generateId}),n.options=t,{context:n}}function on(e){let t=[];return e.advanced?.crossSubDomainCookies?.enabled,t}function sn(e){let t=se(e.baseURL,e.basePath);if(!t)return[];let r=[new URL(t).origin];e.trustedOrigins&&r.push(...e.trustedOrigins);let n=_.BETTER_AUTH_TRUSTED_ORIGINS;return n&&r.push(...n.split(",")),r}var an=e=>{let t=Ur(e),{api:r}=Ve(t,e);return{handler:async n=>{let i=await t,o=i.options.basePath||"/api/auth",a=new URL(n.url);if(!i.options.baseURL){let s=se(void 0,o)||`${a.origin}${o}`;i.options.baseURL=s,i.baseURL=s}i.trustedOrigins=[...e.trustedOrigins||[],i.baseURL,a.origin];let{handler:u}=pr(i,e);return u(n)},api:r,options:e,$context:t,$Infer:{}}};0&&(module.exports={BetterAuthError,HIDE_METADATA,MissingDependencyError,betterAuth,capitalizeFirstLetter,createCookieGetter,createLogger,deleteSessionCookie,generateId,generateState,getCookies,levels,logger,parseCookies,parseSetCookieHeader,parseState,setSessionCookie,shouldPublishLog});
83
+ </html>`,ir=k("/error",{method:"GET",metadata:{...W,openapi:{description:"Displays an error page",responses:{200:{description:"Success",content:{"text/html":{schema:{type:"string"}}}}}}}},async e=>{let t=new URL(e.request?.url||"").searchParams.get("error")||"Unknown";return new Response(Gr(t),{headers:{"Content-Type":"text/html"}})});var sr=k("/ok",{method:"GET",metadata:{...W,openapi:{description:"Check if the API is working",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{ok:{type:"boolean"}}}}}}}}}},async e=>e.json({ok:!0}));var Q=require("zod");var V=require("better-call");var ar=()=>k("/sign-up/email",{method:"POST",query:Q.z.object({currentURL:Q.z.string().optional()}).optional(),body:Q.z.record(Q.z.string(),Q.z.any()),metadata:{openapi:{description:"Sign up a user using email and password",requestBody:{content:{"application/json":{schema:{type:"object",properties:{name:{type:"string",description:"The name of the user"},email:{type:"string",description:"The email of the user"},password:{type:"string",description:"The password of the user"},callbackURL:{type:"string",description:"The URL to use for email verification callback"}},required:["name","email","password"]}}}},responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{user:{type:"object"},session:{type:"object"}}}}}}}}}},async e=>{if(!e.context.options.emailAndPassword?.enabled)throw new V.APIError("BAD_REQUEST",{message:"Email and password sign up is not enabled"});let t=e.body,{name:r,email:n,password:i,image:o,callbackURL:a,...u}=t;if(!Q.z.string().email().safeParse(n).success)throw new V.APIError("BAD_REQUEST",{message:"Invalid email"});let d=e.context.password.config.minPasswordLength;if(i.length<d)throw e.context.logger.error("Password is too short"),new V.APIError("BAD_REQUEST",{message:"Password is too short"});let c=e.context.password.config.maxPasswordLength;if(i.length>c)throw e.context.logger.error("Password is too long"),new V.APIError("BAD_REQUEST",{message:"Password is too long"});if((await e.context.internalAdapter.findUserByEmail(n))?.user)throw e.context.logger.info(`Sign-up attempt for existing email: ${n}`),new V.APIError("UNPROCESSABLE_ENTITY",{message:"User with this email already exists"});let p=Re(e.context.options,u),m;try{if(m=await e.context.internalAdapter.createUser({email:n.toLowerCase(),name:r,image:o,...p,emailVerified:!1}),!m)throw new V.APIError("BAD_REQUEST",{message:"Failed to create user"})}catch(y){throw e.context.logger.error("Failed to create user",y),new V.APIError("UNPROCESSABLE_ENTITY",{message:"Failed to create user",details:y})}if(!m)throw new V.APIError("UNPROCESSABLE_ENTITY",{message:"Failed to create user"});let f=await e.context.password.hash(i);if(await e.context.internalAdapter.linkAccount({userId:m.id,providerId:"credential",accountId:m.id,password:f}),e.context.options.emailVerification?.sendOnSignUp){let y=await z(e.context.secret,m.email),h=`${e.context.baseURL}/verify-email?token=${y}&callbackURL=${t.callbackURL||e.query?.currentURL||"/"}`;await e.context.options.emailVerification?.sendVerificationEmail?.({user:m,url:h,token:y},e.request)}if(!e.context.options.emailAndPassword.autoSignIn||e.context.options.emailAndPassword.requireEmailVerification)return e.json({user:m,session:null});let g=await e.context.internalAdapter.createSession(m.id,e.request);if(!g)throw new V.APIError("BAD_REQUEST",{message:"Failed to create session"});return await P(e,{session:g,user:m}),e.json({user:m,session:g})});var te=require("zod");var Fe=require("better-call");var dr=k("/list-accounts",{method:"GET",use:[D],metadata:{openapi:{description:"List all accounts linked to the user",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"array",items:{type:"object",properties:{id:{type:"string"},provider:{type:"string"}}}}}}}}}}},async e=>{let t=e.context.session,r=await e.context.internalAdapter.findAccounts(t.user.id);return e.json(r.map(n=>({id:n.id,provider:n.providerId})))}),cr=k("/link-social",{method:"POST",requireHeaders:!0,query:te.z.object({currentURL:te.z.string().optional()}).optional(),body:te.z.object({callbackURL:te.z.string({description:"The URL to redirect to after the user has signed in"}).optional(),provider:te.z.enum(we,{description:"The OAuth2 provider to use"})}),use:[D],metadata:{openapi:{description:"Link a social account to the user",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{url:{type:"string"},redirect:{type:"boolean"}},required:["url","redirect"]}}}}}}}},async e=>{let t=e.context.session;if((await e.context.internalAdapter.findAccounts(t.user.id)).find(u=>u.providerId===e.body.provider))throw new Fe.APIError("BAD_REQUEST",{message:"Social Account is already linked."});let i=e.context.socialProviders.find(u=>u.id===e.body.provider);if(!i)throw e.context.logger.error("Provider not found. Make sure to add the provider in your auth config",{provider:e.body.provider}),new Fe.APIError("NOT_FOUND",{message:"Provider not found"});let o=await ae(e,{userId:t.user.id,email:t.user.email}),a=await i.createAuthorizationURL({state:o.state,codeVerifier:o.codeVerifier,redirectURI:`${e.context.baseURL}/callback/${i.id}`});return e.json({url:a.toString(),redirect:!0})});function Ue(e,t){if(t.advanced?.ipAddress?.disableIpTracking)return null;let r="127.0.0.1";if(Ze)return r;let i=t.advanced?.ipAddress?.ipAddressHeaders||["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 a of i){let u=o.get(a);if(typeof u=="string"){let s=u.split(",")[0].trim();if(s)return s}}return null}function Kr(e,t,r){let n=Date.now(),i=t*1e3;return n-r.lastRequest<i&&r.count>=e}function Wr(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 Qr(e,t){let r=Date.now(),n=t*1e3;return Math.ceil((e+n-r)/1e3)}function Zr(e,t){let r="rateLimit",n=e.adapter;return{get:async i=>await n.findOne({model:r,where:[{field:"key",value:i}]}),set:async(i,o,a)=>{try{a?await n.update({model:t??"rateLimit",where:[{field:"key",value:i}],update:{count:o.count,lastRequest:o.lastRequest}}):await n.create({model:t??"rateLimit",data:{key:i,count:o.count,lastRequest:o.lastRequest}})}catch(u){e.logger.error("Error setting rate limit",u)}}}}var ur=new Map;function Jr(e){return e.rateLimit.storage==="secondary-storage"?{get:async r=>{let n=await e.options.secondaryStorage?.get(r);return n?JSON.parse(n):void 0},set:async(r,n)=>{await e.options.secondaryStorage?.set?.(r,JSON.stringify(n))}}:e.rateLimit.storage==="memory"?{async get(r){return ur.get(r)},async set(r,n,i){ur.set(r,n)}}:Zr(e,e.rateLimit.modelName)}async function lr(e,t){if(!t.rateLimit.enabled)return;let r=t.baseURL,n=e.url.replace(r,"").split("?")[0],i=t.rateLimit.window,o=t.rateLimit.max,a=Ue(e,t.options)+n,s=Yr().find(p=>p.pathMatcher(n));s&&(i=s.window,o=s.max);for(let p of t.options.plugins||[])if(p.rateLimit){let m=p.rateLimit.find(f=>f.pathMatcher(n));if(m){i=m.window,o=m.max;break}}if(t.rateLimit.customRules){let p=t.rateLimit.customRules[n];p&&(i=p.window,o=p.max)}let d=Jr(t),c=await d.get(a),l=Date.now();if(!c)await d.set(a,{key:a,count:1,lastRequest:l});else{let p=l-c.lastRequest;if(Kr(o,i,c)){let m=Qr(c.lastRequest,i);return Wr(m)}else p>i*1e3?await d.set(a,{...c,count:1,lastRequest:l}):await d.set(a,{...c,count:c.count+1,lastRequest:l})}}function Yr(){return[{pathMatcher(t){return t.startsWith("/sign-in")||t.startsWith("/sign-up")||t.startsWith("/change-password")||t.startsWith("/change-email")},window:10,max:3}]}var Xr=require("better-call");function Ve(e,t){let r=t.plugins?.reduce((u,s)=>({...u,...s.endpoints}),{}),n=t.plugins?.map(u=>u.middlewares?.map(s=>{let d=async c=>s.middleware({...c,context:{...e,...c.context}});return d.path=s.path,d.options=s.middleware.options,d.headers=s.middleware.headers,{path:s.path,middleware:d}})).filter(u=>u!==void 0).flat()||[],o={...{signInSocial:zt,callbackOAuth:Ht,getSession:qe(),signOut:Kt,signUpEmail:ar(),signInEmail:Mt,forgetPassword:Qt,resetPassword:Jt,verifyEmail:$t,sendVerificationEmail:Vt,changeEmail:or,changePassword:tr,setPassword:rr,updateUser:er(),deleteUser:nr,forgetPasswordCallback:Zt,listSessions:Bt(),revokeSession:qt,revokeSessions:Nt,revokeOtherSessions:jt,linkSocialAccount:cr,listUserAccounts:dr},...r,ok:sr,error:ir},a={};for(let[u,s]of Object.entries(o))a[u]=async(d={})=>{s.headers=new Headers;let c={setHeader(y,h){s.headers.set(y,h)},setCookie(y,h,w){(0,U.setCookie)(s.headers,y,h,w)},getCookie(y,h){let b=d.headers?.get("cookie");return(0,U.getCookie)(b||"",y,h)},getSignedCookie(y,h,w){let b=d.headers;return b?(0,U.getSignedCookie)(b,h,y,w):null},async setSignedCookie(y,h,w,b){await(0,U.setSignedCookie)(s.headers,y,h,w,b)},redirect(y){return s.headers.set("Location",y),new U.APIError("FOUND")},responseHeader:s.headers},l=await e,p={...c,...d,path:s.path,context:{...l,...d.context,endpoint:s}};l.session=null;let m=t.plugins||[];for(let y of m){let h=y.hooks?.before??[];for(let w of h){if(!w.matcher(p))continue;let b=await w.handler(p);if(b&&"context"in b){p={...p,...b.context};continue}if(b)return b}}let f;try{f=await s(p)}catch(y){if(y instanceof U.APIError){let h=t.plugins?.map(w=>{if(w.hooks?.after)return w.hooks.after}).filter(w=>w!==void 0).flat();if(!h?.length)throw y.headers=s.headers,y;p.context.returned=y,p.context.returned.headers=s.headers;for(let w of h||[])if(w.matcher(p))try{let E=await w.handler(p);E&&"response"in E&&(p.context.returned=E.response)}catch(E){if(E instanceof U.APIError){p.context.returned=E;continue}throw E}if(p.context.returned instanceof U.APIError)throw p.context.returned.headers=s.headers,p.context.returned;return p.context.returned}throw y}p.context.returned=f,p.responseHeader=s.headers;for(let y of t.plugins||[])if(y.hooks?.after){for(let h of y.hooks.after)if(h.matcher(p))try{let b=await h.handler(p);b&&(p.context.returned=b)}catch(b){if(b instanceof U.APIError){p.context.returned=b;continue}throw b}}let g=p.context.returned;return g instanceof Response&&s.headers.forEach((y,h)=>{h==="set-cookie"?g.headers.append(h,y):g.headers.set(h,y)}),g},a[u].path=s.path,a[u].method=s.method,a[u].options=s.options,a[u].headers=s.headers;return{api:a,middlewares:n}}var pr=(e,t)=>{let{api:r,middlewares:n}=Ve(e,t),i=new URL(e.baseURL).pathname;return(0,U.createRouter)(r,{extraContext:e,basePath:i,routerMiddleware:[{path:"/**",middleware:We},...n],async onRequest(o){for(let a of e.options.plugins||[])if(a.onRequest){let u=await a.onRequest(o,e);if(u&&"response"in u)return u.response}return lr(o,e)},async onResponse(o){for(let a of e.options.plugins||[])if(a.onResponse){let u=await a.onResponse(o,e);if(u)return u.response}return o},onError(o){if(o instanceof U.APIError&&o.status==="FOUND")return;if(t.onAPIError?.throw)throw o;if(t.onAPIError?.onError){t.onAPIError.onError(o,e);return}let a=t.logger?.level,u=a==="error"||a==="warn"||a==="debug"?I:void 0;if(t.logger?.disabled!==!0){if(o&&typeof o=="object"&&"message"in o&&typeof o.message=="string"&&(o.message.includes("no column")||o.message.includes("column")||o.message.includes("relation")||o.message.includes("table")||o.message.includes("does not exist"))){e.logger?.error(o.message),e.logger?.error("If you are seeing this error, it is likely that you need to run the migrations for the database or you need to update your database schema. If you recently updated the package, make sure to run the migrations.");return}o instanceof U.APIError?(o.status==="INTERNAL_SERVER_ERROR"&&e.logger.error(o.status,o),u?.error(o.message)):e.logger?.error(o&&typeof o=="object"&&"name"in o?o.name:"",o)}}})};var Rr=require("defu");var ce=require("oslo/encoding");var fr=require("@noble/hashes/scrypt"),mr=require("uncrypto"),re={N:16384,r:16,p:1,dkLen:64};async function gr(e,t){return await(0,fr.scryptAsync)(e.normalize("NFKC"),t,{N:re.N,p:re.p,r:re.r,dkLen:re.dkLen,maxmem:128*re.N*re.r*2})}var hr=async e=>{let t=(0,ce.encodeHex)((0,mr.getRandomValues)(new Uint8Array(16))),r=await gr(e,t);return`${t}:${(0,ce.encodeHex)(r)}`},yr=async(e,t)=>{let[r,n]=e.split(":"),i=await gr(t,r);return Ie(i,(0,ce.decodeHex)(n))};function wr(e,t){let r=t.hooks;async function n(a,u,s){let d=a;for(let p of r||[]){let m=p[u]?.create?.before;if(m){let f=await m(a);if(f===!1)return null;typeof f=="object"&&"data"in f&&(d=f.data)}}let c=s?await s.fn(d):null,l=!s||s.executeMainFn?await e.create({model:u,data:d}):c;for(let p of r||[]){let m=p[u]?.create?.after;m&&await m(l)}return l}async function i(a,u,s,d){let c=a;for(let m of r||[]){let f=m[s]?.update?.before;if(f){let g=await f(a);if(g===!1)return null;c=typeof g=="object"?g.data:g}}let l=d?await d.fn(c):null,p=!d||d.executeMainFn?await e.update({model:s,update:c,where:u}):l;for(let m of r||[]){let f=m[s]?.update?.after;f&&await f(p)}return p}async function o(a,u,s,d){let c=a;for(let m of r||[]){let f=m[s]?.update?.before;if(f){let g=await f(a);if(g===!1)return null;c=typeof g=="object"?g.data:g}}let l=d?await d.fn(c):null,p=!d||d.executeMainFn?await e.updateMany({model:s,update:c,where:u}):l;for(let m of r||[]){let f=m[s]?.update?.after;f&&await f(p)}return p}return{createWithHooks:n,updateWithHooks:i,updateManyWithHooks:o}}var $e=(e,t)=>{let r=t.options,n=r.secondaryStorage,i=r.session?.expiresIn||60*60*24*7,{createWithHooks:o,updateWithHooks:a,updateManyWithHooks:u}=wr(e,t);return{createOAuthUser:async(s,d)=>{try{let c=await o({createdAt:new Date,updatedAt:new Date,...s},"user"),l=await o({...d,userId:c.id||s.id,createdAt:new Date,updatedAt:new Date},"account");return{user:c,account:l}}catch(c){return console.log(c),null}},createUser:async s=>await o({createdAt:new Date,updatedAt:new Date,emailVerified:!1,...s},"user"),createAccount:async s=>await o({createdAt:new Date,updatedAt:new Date,...s},"account"),listSessions:async s=>{if(n){let c=await n.get(`active-sessions-${s}`);if(!c)return[];let l=J(c)||[],p=Date.now(),m=l.filter(g=>g.expiresAt>p),f=[];for(let g of m){let y=await n.get(g.token);if(y){let h=JSON.parse(y),w=ve(t.options,{...h.session,expiresAt:new Date(h.session.expiresAt)});f.push(w)}}return f}return await e.findMany({model:"session",where:[{field:"userId",value:s}]})},listUsers:async(s,d,c,l)=>await e.findMany({model:"user",limit:s,offset:d,sortBy:c,where:l}),deleteUser:async s=>{await e.deleteMany({model:"session",where:[{field:"userId",value:s}]}),await e.deleteMany({model:"account",where:[{field:"userId",value:s}]}),await e.delete({model:"user",where:[{field:"id",value:s}]})},createSession:async(s,d,c,l)=>{let p=d instanceof Request?d.headers:d,{id:m,...f}=l||{},g={ipAddress:d&&Ue(d,t.options)||"",userAgent:p?.get("user-agent")||"",...f,expiresAt:c?q(60*60*24,"sec"):q(i,"sec"),userId:s,token:N(32),createdAt:new Date,updatedAt:new Date};return await o(g,"session",n?{fn:async()=>{let h=await e.findOne({model:"user",where:[{field:"id",value:s}]});n.set(g.token,JSON.stringify({session:g,user:h}),i);let w=await n.get(`active-sessions-${s}`),b=[],E=Date.now();return w&&(b=J(w)||[],b=b.filter(Tr=>Tr.expiresAt>E)),b.push({token:g.token,expiresAt:E+i*1e3}),await n.set(`active-sessions-${s}`,JSON.stringify(b),i),g},executeMainFn:r.session?.storeSessionInDatabase}:void 0)},findSession:async s=>{if(n){let p=await n.get(s);if(p){let m=JSON.parse(p),f=ve(t.options,{...m.session,expiresAt:new Date(m.session.expiresAt),createdAt:new Date(m.session.createdAt),updatedAt:new Date(m.session.updatedAt)}),g=je(t.options,{...m.user,createdAt:new Date(m.user.createdAt),updatedAt:new Date(m.user.updatedAt)});return{session:f,user:g}}}let d=await e.findOne({model:"session",where:[{value:s,field:"token"}]});if(!d)return null;let c=await e.findOne({model:"user",where:[{value:d.userId,field:"id"}]});if(!c)return null;let l=je(t.options,c);return{session:ve(t.options,d),user:l}},findSessions:async s=>{if(n){let p=[];for(let m of s){let f=await n.get(m);if(f){let g=JSON.parse(f),y={session:{...g.session,expiresAt:new Date(g.session.expiresAt)},user:{...g.user,createdAt:new Date(g.user.createdAt),updatedAt:new Date(g.user.updatedAt)}};p.push(y)}}return p}let d=await e.findMany({model:"session",where:[{field:"token",value:s,operator:"in"}]}),c=d.map(p=>p.userId);if(!c.length)return[];let l=await e.findMany({model:"user",where:[{field:"id",value:c,operator:"in"}]});return d.map(p=>{let m=l.find(f=>f.id===p.userId);return m?{session:p,user:m}:null})},updateSession:async(s,d)=>await a(d,[{field:"token",value:s}],"session",n?{async fn(l){let p=await n.get(s),m=null;if(p){let f=JSON.parse(p);return m={...f.session,...l},await n.set(s,JSON.stringify({session:m,user:f.user}),f.session.expiresAt?Math.floor((f.session.expiresAt.getTime()-Date.now())/1e3):i),m}else return null},executeMainFn:r.session?.storeSessionInDatabase}:void 0),deleteSession:async s=>{if(n){await n.delete(s),r.session?.storeSessionInDatabase&&await e.delete({model:"session",where:[{field:"token",value:s}]});return}await e.delete({model:"session",where:[{field:"token",value:s}]})},deleteSessions:async s=>{if(n){if(typeof s=="string"){let d=await n.get(`active-sessions-${s}`),c=d?J(d):[];if(!c)return;for(let l of c)await n.delete(l.token)}else for(let d of s)await n.get(d)&&await n.delete(d);r.session?.storeSessionInDatabase&&await e.deleteMany({model:"session",where:[{field:Array.isArray(s)?"token":"userId",value:s,operator:Array.isArray(s)?"in":void 0}]});return}await e.deleteMany({model:"session",where:[{field:Array.isArray(s)?"token":"userId",value:s,operator:Array.isArray(s)?"in":void 0}]})},findUserByEmail:async(s,d)=>{let c=await e.findOne({model:"user",where:[{value:s.toLowerCase(),field:"email"}]});if(!c)return null;if(d?.includeAccounts){let l=await e.findMany({model:"account",where:[{value:c.id,field:"userId"}]});return{user:c,accounts:l}}return{user:c,accounts:[]}},findUserById:async s=>await e.findOne({model:"user",where:[{field:"id",value:s}]}),linkAccount:async s=>await o({...s,createdAt:new Date,updatedAt:new Date},"account"),updateUser:async(s,d)=>await a(d,[{field:"id",value:s}],"user"),updateUserByEmail:async(s,d)=>await a(d,[{field:"email",value:s}],"user"),updatePassword:async(s,d)=>{await u({password:d},[{field:"userId",value:s},{field:"providerId",value:"credential"}],"account")},findAccounts:async s=>await e.findMany({model:"account",where:[{field:"userId",value:s}]}),findAccount:async s=>await e.findOne({model:"account",where:[{field:"accountId",value:s}]}),findAccountByUserId:async s=>await e.findMany({model:"account",where:[{field:"userId",value:s}]}),updateAccount:async(s,d)=>await a(d,[{field:"id",value:s}],"account"),createVerificationValue:async s=>await o({createdAt:new Date,updatedAt:new Date,...s},"verification"),findVerificationValue:async s=>(await e.findMany({model:"verification",where:[{field:"identifier",value:s}],sortBy:{field:"createdAt",direction:"desc"},limit:10}))[0],deleteVerificationValue:async s=>{await e.delete({model:"verification",where:[{field:"id",value:s}]})},deleteVerificationByIdentifier:async s=>{await e.delete({model:"verification",where:[{field:"identifier",value:s}]})},updateVerificationValue:async(s,d)=>await a(d,[{field:"id",value:s}],"verification")}};var M=e=>{let t=e.plugins?.reduce((s,d)=>{let c=d.schema;if(!c)return s;for(let[l,p]of Object.entries(c))s[l]={fields:{...s[l]?.fields,...p.fields},modelName:p.modelName||l};return s},{}),r=e.rateLimit?.storage==="database",n={rateLimit:{modelName:e.rateLimit?.modelName||"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:i,session:o,account:a,...u}=t||{};return{user:{modelName: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"},...i?.fields,...e.user?.additionalFields},order:1},session:{modelName:e.session?.modelName||"session",fields:{expiresAt:{type:"date",required:!0,fieldName:e.session?.fields?.expiresAt||"expiresAt"},token:{type:"string",required:!0,fieldName:e.session?.fields?.token||"token",unique:!0},createdAt:{type:"date",required:!0,fieldName:e.session?.fields?.createdAt||"createdAt"},updatedAt:{type:"date",required:!0,fieldName:e.session?.fields?.updatedAt||"updatedAt"},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},...o?.fields,...e.session?.additionalFields},order:2},account:{modelName: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"},accessTokenExpiresAt:{type:"date",required:!1,fieldName:e.account?.fields?.accessTokenExpiresAt||"accessTokenExpiresAt"},refreshTokenExpiresAt:{type:"date",required:!1,fieldName:e.account?.fields?.accessTokenExpiresAt||"refreshTokenExpiresAt"},scope:{type:"string",required:!1,fieldName:e.account?.fields?.scope||"scope"},password:{type:"string",required:!1,fieldName:e.account?.fields?.password||"password"},createdAt:{type:"date",required:!0,fieldName:e.account?.fields?.createdAt||"createdAt"},updatedAt:{type:"date",required:!0,fieldName:e.account?.fields?.updatedAt||"updatedAt"},...a?.fields},order:3},verification:{modelName: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"},createdAt:{type:"date",required:!1,defaultValue:()=>new Date,fieldName:e.verification?.fields?.createdAt||"createdAt"},updatedAt:{type:"date",required:!1,defaultValue:()=>new Date,fieldName:e.verification?.fields?.updatedAt||"updatedAt"}},order:4},...u,...r?n:{}}};var en=require("zod");var ue=require("kysely"),H=require("kysely");function br(e){if(!e)return null;if("dialect"in e)return br(e.dialect);if("createDriver"in e){if(e instanceof H.SqliteDialect)return"sqlite";if(e instanceof H.MysqlDialect)return"mysql";if(e instanceof H.PostgresDialect)return"postgres";if(e instanceof ue.MssqlDialect)return"mssql"}return"aggregate"in e?"sqlite":"getConnection"in e?"mysql":"connect"in e?"postgres":null}var ze=async e=>{let t=e.database;if(!t)return{kysely:null,databaseType:null};if("db"in t)return{kysely:t.db,databaseType:t.type};if("dialect"in t)return{kysely:new ue.Kysely({dialect:t.dialect}),databaseType:t.type};let r,n=br(t);return"createDriver"in t&&(r=t),"aggregate"in t&&(r=new H.SqliteDialect({database:t})),"getConnection"in t&&(r=new H.MysqlDialect(t)),"connect"in t&&(r=new H.PostgresDialect({pool:t})),{kysely:r?new ue.Kysely({dialect:r}):null,databaseType:n}};function Te(e,t,r){return r==="update"?e:e==null&&t.defaultValue?typeof t.defaultValue=="function"?t.defaultValue():t.defaultValue:e}var tn=(e,t,r)=>{let n=M(t);function i(d,c){if(c==="id")return c;let l=n[d].fields[c];return l||console.log("Field not found",d,c),l.fieldName||c}function o(d,c,l){let{type:p="sqlite"}=r||{},m=n[c].fields[l];return m.type==="boolean"&&p==="sqlite"&&d!==null&&d!==void 0?d?1:0:m.type==="date"&&d&&d instanceof Date&&p==="sqlite"?d.toISOString():d}function a(d,c,l){let{type:p="sqlite"}=r||{},m=n[c].fields[l];return m.type==="boolean"&&p==="sqlite"&&d!==null?d===1:m.type==="date"&&d?new Date(d):d}function u(d){return n[d].modelName}let s=t?.advanced?.generateId===!1;return{transformInput(d,c,l){let p=s||l==="update"?{}:{id:t.advanced?.generateId?t.advanced.generateId({model:c}):d.id||N()},m=n[c].fields;for(let f in m){let g=d[f];p[m[f].fieldName||f]=Te(o(g,c,f),m[f],l)}return p},transformOutput(d,c,l=[]){if(!d)return null;let p=d.id?l.length===0||l.includes("id")?{id:d.id}:{}:{},m=n[c].fields;for(let f in m){if(l.length&&!l.includes(f))continue;let g=m[f];g&&(p[f]=a(d[g.fieldName||f],c,f))}return p},convertWhereClause(d,c){if(!c)return{and:null,or:null};let l={and:[],or:[]};return c.forEach(p=>{let{field:m,value:f,operator:g="=",connector:y="AND"}=p,h=i(d,m),w=b=>g.toLowerCase()==="in"?b(h,"in",Array.isArray(f)?f:[f]):g==="contains"?b(h,"like",`%${f}%`):g==="starts_with"?b(h,"like",`${f}%`):g==="ends_with"?b(h,"like",`%${f}`):g==="eq"?b(h,"=",f):g==="ne"?b(h,"<>",f):g==="gt"?b(h,">",f):g==="gte"?b(h,">=",f):g==="lt"?b(h,"<",f):g==="lte"?b(h,"<=",f):b(h,g,f);y==="OR"?l.or.push(w):l.and.push(w)}),{and:l.and.length?l.and:null,or:l.or.length?l.or:null}},async withReturning(d,c,l,p){let m;if(r?.type!=="mysql")m=await c.returningAll().executeTakeFirst();else{await c.execute();let f=d.id?"id":p[0].field?p[0].field:"id",g=d[f]||p[0].value;m=await e.selectFrom(u(l)).selectAll().where(i(l,f),"=",g).executeTakeFirst()}return m},getModelName:u,getField:i}},Ar=(e,t)=>r=>{let{transformInput:n,withReturning:i,transformOutput:o,convertWhereClause:a,getModelName:u,getField:s}=tn(e,r,t);return{id:"kysely",async create(d){let{model:c,data:l,select:p}=d,m=n(l,c,"create"),f=e.insertInto(u(c)).values(m);return o(await i(m,f,c,[]),c,p)},async findOne(d){let{model:c,where:l,select:p}=d,{and:m,or:f}=a(c,l),g=e.selectFrom(u(c)).selectAll();m&&(g=g.where(h=>h.and(m.map(w=>w(h))))),f&&(g=g.where(h=>h.or(f.map(w=>w(h)))));let y=await g.executeTakeFirst();return y?o(y,c,p):null},async findMany(d){let{model:c,where:l,limit:p,offset:m,sortBy:f}=d,{and:g,or:y}=a(c,l),h=e.selectFrom(u(c));g&&(h=h.where(b=>b.and(g.map(E=>E(b))))),y&&(h=h.where(b=>b.or(y.map(E=>E(b))))),h=h.limit(p||100),m&&(h=h.offset(m)),f&&(h=h.orderBy(s(c,f.field),f.direction));let w=await h.selectAll().execute();return w?w.map(b=>o(b,c)):[]},async update(d){let{model:c,where:l,update:p}=d,{and:m,or:f}=a(c,l),g=n(p,c,"update"),y=e.updateTable(u(c)).set(g);return m&&(y=y.where(w=>w.and(m.map(b=>b(w))))),f&&(y=y.where(w=>w.or(f.map(b=>b(w))))),await o(await i(g,y,c,l),c)},async updateMany(d){let{model:c,where:l,update:p}=d,{and:m,or:f}=a(c,l),g=n(p,c,"update"),y=e.updateTable(u(c)).set(g);return m&&(y=y.where(w=>w.and(m.map(b=>b(w))))),f&&(y=y.where(w=>w.or(f.map(b=>b(w))))),(await y.execute()).length},async delete(d){let{model:c,where:l}=d,{and:p,or:m}=a(c,l),f=e.deleteFrom(u(c));p&&(f=f.where(g=>g.and(p.map(y=>y(g))))),m&&(f=f.where(g=>g.or(m.map(y=>y(g))))),await f.execute()},async deleteMany(d){let{model:c,where:l}=d,{and:p,or:m}=a(c,l),f=e.deleteFrom(u(c));return p&&(f=f.where(g=>g.and(p.map(y=>y(g))))),m&&(f=f.where(g=>g.or(m.map(y=>y(g))))),(await f.execute()).length},options:t}};var rn=e=>{let t=M(e);function r(n,i){return i==="id"?i:t[n].fields[i].fieldName||i}return{transformInput(n,i,o){let a=o==="update"?{}:{id:e.advanced?.generateId?e.advanced.generateId({model:i}):n.id||N()},u=t[i].fields;for(let s in u){let d=n[s];d===void 0&&!u[s].defaultValue||(a[u[s].fieldName||s]=Te(d,u[s],o))}return a},transformOutput(n,i,o=[]){if(!n)return null;let a=n.id||n._id?o.length===0||o.includes("id")?{id:n.id}:{}:{},u=t[i].fields;for(let s in u){if(o.length&&!o.includes(s))continue;let d=u[s];d&&(a[s]=n[d.fieldName||s])}return a},convertWhereClause(n,i,o){return i.filter(a=>n.every(u=>{let{field:s,value:d,operator:c}=u,l=r(o,s);if(c==="in"){if(!Array.isArray(d))throw new Error("Value must be an array");return d.includes(a[l])}else return c==="contains"?a[l].includes(d):c==="starts_with"?a[l].startsWith(d):c==="ends_with"?a[l].endsWith(d):a[l]===d}))},getField:r}},kr=e=>t=>{let{transformInput:r,transformOutput:n,convertWhereClause:i,getField:o}=rn(t);return{id:"memory",create:async({model:a,data:u})=>{let s=r(u,a,"create");return e[a].push(s),n(s,a)},findOne:async({model:a,where:u,select:s})=>{let d=e[a],l=i(u,d,a)[0]||null;return n(l,a,s)},findMany:async({model:a,where:u,sortBy:s,limit:d,offset:c})=>{let l=e[a];return u&&(l=i(u,l,a)),s&&(l=l.sort((p,m)=>{let f=o(a,s.field);return s.direction==="asc"?p[f]>m[f]?1:-1:p[f]<m[f]?1:-1})),c!==void 0&&(l=l.slice(c)),d!==void 0&&(l=l.slice(0,d)),l.map(p=>n(p,a))},update:async({model:a,where:u,update:s})=>{let d=e[a],c=i(u,d,a);return c.forEach(l=>{Object.assign(l,r(s,a,"update"))}),n(c[0],a)},delete:async({model:a,where:u})=>{let s=e[a],d=i(u,s,a);e[a]=s.filter(c=>!d.includes(c))},deleteMany:async({model:a,where:u})=>{let s=e[a],d=i(u,s,a),c=0;return e[a]=s.filter(l=>d.includes(l)?(c++,!1):!d.includes(l)),c},updateMany(a){let{model:u,where:s,update:d}=a,c=e[u],l=i(s,c,u);return l.forEach(p=>{Object.assign(p,d)}),l[0]||null}}};async function xr(e){if(!e.database){let n=M(e),i=Object.keys(n).reduce((o,a)=>(o[a]=[],o),{});return I.warn("No database configuration provided. Using memory adapter in development"),kr(i)(e)}if(typeof e.database=="function")return e.database(e);let{kysely:t,databaseType:r}=await ze(e);if(!t)throw new L("Failed to initialize database adapter");return Ar(t,{type:r||"sqlite"})(e)}var Me="better-auth-secret-123456789";var He=require("better-call");async function vr(e,t){let n=(await t.context.internalAdapter.findAccounts(e))?.find(a=>a.providerId==="credential"),i=n?.password;if(!n||!i)throw new He.APIError("BAD_REQUEST",{message:"No password credential found"});if(!await t.context.password.verify(i,t.body.password))throw new He.APIError("BAD_REQUEST",{message:"Invalid password"});return!0}var Ur=async e=>{let t=await xr(e),r=e.plugins||[],n=on(e),i=de(e.logger),o=se(e.baseURL,e.basePath),a=e.secret||_.BETTER_AUTH_SECRET||_.AUTH_SECRET||Me;a===Me&&ie&&i.error("You are using the default secret. Please set `BETTER_AUTH_SECRET` in your environment variables or pass `secret` in your auth config."),e={...e,secret:a,baseURL:o?new URL(o).origin:"",basePath:e.basePath||"/api/auth",plugins:r.concat(n),emailAndPassword:{...e.emailAndPassword,enabled:e.emailAndPassword?.enabled??!1,autoSignIn:e.emailAndPassword?.autoSignIn??!0}};let u=Pe(e),s=M(e),d=Object.keys(e.socialProviders||{}).map(m=>{let f=e.socialProviders?.[m];return f.enabled===!1?null:((!f.clientId||!f.clientSecret)&&i.warn(`Social provider ${m} is missing clientId or clientSecret`),Be[m](f))}).filter(m=>m!==null),c=({model:m,size:f})=>typeof e?.advanced?.generateId=="function"?e.advanced.generateId({model:m,size:f}):N(f),l={appName:e.appName||"Better Auth",socialProviders:d,options:e,tables:s,trustedOrigins:sn(e),baseURL:o||"",sessionConfig:{updateAge:e.session?.updateAge!==void 0?e.session.updateAge:24*60*60,expiresIn:e.session?.expiresIn||60*60*24*7,freshAge:e.session?.freshAge||60*5},secret:a,rateLimit:{...e.rateLimit,enabled:e.rateLimit?.enabled??ie,window:e.rateLimit?.window||10,max:e.rateLimit?.max||100,storage:e.rateLimit?.storage||e.secondaryStorage?"secondary-storage":"memory"},authCookies:u,logger:i,generateId:c,session:null,secondaryStorage:e.secondaryStorage,password:{hash:e.emailAndPassword?.password?.hash||hr,verify:e.emailAndPassword?.password?.verify||yr,config:{minPasswordLength:e.emailAndPassword?.minPasswordLength||8,maxPasswordLength:e.emailAndPassword?.maxPasswordLength||128},checkPassword:vr},adapter:t,internalAdapter:$e(t,{options:e,hooks:e.databaseHooks?[e.databaseHooks]:[],generateId:c}),createAuthCookie:ge(e)},{context:p}=nn(l);return p};function nn(e){let t=e.options,r=t.plugins||[],n=e,i=[];for(let o of r)if(o.init){let a=o.init(e);typeof a=="object"&&(a.options&&(a.options.databaseHooks&&i.push(a.options.databaseHooks),t=(0,Rr.defu)(t,a.options)),a.context&&(n={...n,...a.context}))}return i.push(t.databaseHooks),n.internalAdapter=$e(e.adapter,{options:t,hooks:i.filter(o=>o!==void 0),generateId:e.generateId}),n.options=t,{context:n}}function on(e){let t=[];return e.advanced?.crossSubDomainCookies?.enabled,t}function sn(e){let t=se(e.baseURL,e.basePath);if(!t)return[];let r=[new URL(t).origin];e.trustedOrigins&&r.push(...e.trustedOrigins);let n=_.BETTER_AUTH_TRUSTED_ORIGINS;return n&&r.push(...n.split(",")),r}var an=e=>{let t=Ur(e),{api:r}=Ve(t,e);return{handler:async n=>{let i=await t,o=i.options.basePath||"/api/auth",a=new URL(n.url);if(!i.options.baseURL){let s=se(void 0,o)||`${a.origin}${o}`;i.options.baseURL=s,i.baseURL=s}i.trustedOrigins=[...e.trustedOrigins||[],i.baseURL,a.origin];let{handler:u}=pr(i,e);return u(n)},api:r,options:e,$context:t,$Infer:{}}};0&&(module.exports={BetterAuthError,HIDE_METADATA,MissingDependencyError,betterAuth,capitalizeFirstLetter,createCookieGetter,createLogger,deleteSessionCookie,generateId,generateState,getCookies,levels,logger,parseCookies,parseSetCookieHeader,parseState,setSessionCookie,shouldPublishLog});
package/dist/index.js CHANGED
@@ -80,4 +80,4 @@ Error: `,u),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>`,vt=k("/error",{method:"GET",metadata:{...G,openapi:{description:"Displays an error page",responses:{200:{description:"Success",content:{"text/html":{schema:{type:"string"}}}}}}}},async e=>{let t=new URL(e.request?.url||"").searchParams.get("error")||"Unknown";return new Response(Vr(t),{headers:{"Content-Type":"text/html"}})});var Rt=k("/ok",{method:"GET",metadata:{...G,openapi:{description:"Check if the API is working",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{ok:{type:"boolean"}}}}}}}}}},async e=>e.json({ok:!0}));import{z as W}from"zod";import{APIError as V}from"better-call";var Ut=()=>k("/sign-up/email",{method:"POST",query:W.object({currentURL:W.string().optional()}).optional(),body:W.record(W.string(),W.any()),metadata:{openapi:{description:"Sign up a user using email and password",requestBody:{content:{"application/json":{schema:{type:"object",properties:{name:{type:"string",description:"The name of the user"},email:{type:"string",description:"The email of the user"},password:{type:"string",description:"The password of the user"},callbackURL:{type:"string",description:"The URL to use for email verification callback"}},required:["name","email","password"]}}}},responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{user:{type:"object"},session:{type:"object"}}}}}}}}}},async e=>{if(!e.context.options.emailAndPassword?.enabled)throw new V("BAD_REQUEST",{message:"Email and password sign up is not enabled"});let t=e.body,{name:r,email:n,password:s,image:o,callbackURL:a,...u}=t;if(!W.string().email().safeParse(n).success)throw new V("BAD_REQUEST",{message:"Invalid email"});let d=e.context.password.config.minPasswordLength;if(s.length<d)throw e.context.logger.error("Password is too short"),new V("BAD_REQUEST",{message:"Password is too short"});let c=e.context.password.config.maxPasswordLength;if(s.length>c)throw e.context.logger.error("Password is too long"),new V("BAD_REQUEST",{message:"Password is too long"});if((await e.context.internalAdapter.findUserByEmail(n))?.user)throw e.context.logger.info(`Sign-up attempt for existing email: ${n}`),new V("UNPROCESSABLE_ENTITY",{message:"User with this email already exists"});let p=fe(e.context.options,u),m;try{if(m=await e.context.internalAdapter.createUser({email:n.toLowerCase(),name:r,image:o,...p,emailVerified:!1}),!m)throw new V("BAD_REQUEST",{message:"Failed to create user"})}catch(y){throw e.context.logger.error("Failed to create user",y),new V("UNPROCESSABLE_ENTITY",{message:"Failed to create user",details:y})}if(!m)throw new V("UNPROCESSABLE_ENTITY",{message:"Failed to create user"});let f=await e.context.password.hash(s);if(await e.context.internalAdapter.linkAccount({userId:m.id,providerId:"credential",accountId:m.id,password:f}),e.context.options.emailVerification?.sendOnSignUp){let y=await F(e.context.secret,m.email),h=`${e.context.baseURL}/verify-email?token=${y}&callbackURL=${t.callbackURL||e.query?.currentURL||"/"}`;await e.context.options.emailVerification?.sendVerificationEmail?.({user:m,url:h,token:y},e.request)}if(!e.context.options.emailAndPassword.autoSignIn||e.context.options.emailAndPassword.requireEmailVerification)return e.json({user:m,session:null});let g=await e.context.internalAdapter.createSession(m.id,e.request);if(!g)throw new V("BAD_REQUEST",{message:"Failed to create session"});return await S(e,{session:g,user:m}),e.json({user:m,session:g})});import{z as ne}from"zod";import{APIError as Tt}from"better-call";var Et=k("/list-accounts",{method:"GET",use:[_],metadata:{openapi:{description:"List all accounts linked to the user",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"array",items:{type:"object",properties:{id:{type:"string"},provider:{type:"string"}}}}}}}}}}},async e=>{let t=e.context.session,r=await e.context.internalAdapter.findAccounts(t.user.id);return e.json(r.map(n=>({id:n.id,provider:n.providerId})))}),It=k("/link-social",{method:"POST",requireHeaders:!0,query:ne.object({currentURL:ne.string().optional()}).optional(),body:ne.object({callbackURL:ne.string({description:"The URL to redirect to after the user has signed in"}).optional(),provider:ne.enum(ce,{description:"The OAuth2 provider to use"})}),use:[_],metadata:{openapi:{description:"Link a social account to the user",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{url:{type:"string"},redirect:{type:"boolean"}},required:["url","redirect"]}}}}}}}},async e=>{let t=e.context.session;if((await e.context.internalAdapter.findAccounts(t.user.id)).find(u=>u.providerId===e.body.provider))throw new Tt("BAD_REQUEST",{message:"Social Account is already linked."});let s=e.context.socialProviders.find(u=>u.id===e.body.provider);if(!s)throw e.context.logger.error("Provider not found. Make sure to add the provider in your auth config",{provider:e.body.provider}),new Tt("NOT_FOUND",{message:"Provider not found"});let o=await ae(e,{userId:t.user.id,email:t.user.email}),a=await s.createAuthorizationURL({state:o.state,codeVerifier:o.codeVerifier,redirectURI:`${e.context.baseURL}/callback/${s.id}`});return e.json({url:a.toString(),redirect:!0})});function me(e,t){if(t.advanced?.ipAddress?.disableIpTracking)return null;let r="127.0.0.1";if(Be)return r;let s=t.advanced?.ipAddress?.ipAddressHeaders||["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 a of s){let u=o.get(a);if(typeof u=="string"){let i=u.split(",")[0].trim();if(i)return i}}return null}function $r(e,t,r){let n=Date.now(),s=t*1e3;return n-r.lastRequest<s&&r.count>=e}function zr(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 Mr(e,t){let r=Date.now(),n=t*1e3;return Math.ceil((e+n-r)/1e3)}function Hr(e,t){let r="rateLimit",n=e.adapter;return{get:async s=>await n.findOne({model:r,where:[{field:"key",value:s}]}),set:async(s,o,a)=>{try{a?await n.update({model:t??"rateLimit",where:[{field:"key",value:s}],update:{count:o.count,lastRequest:o.lastRequest}}):await n.create({model:t??"rateLimit",data:{key:s,count:o.count,lastRequest:o.lastRequest}})}catch(u){e.logger.error("Error setting rate limit",u)}}}}var St=new Map;function Gr(e){return e.rateLimit.storage==="secondary-storage"?{get:async r=>{let n=await e.options.secondaryStorage?.get(r);return n?JSON.parse(n):void 0},set:async(r,n)=>{await e.options.secondaryStorage?.set?.(r,JSON.stringify(n))}}:e.rateLimit.storage==="memory"?{async get(r){return St.get(r)},async set(r,n,s){St.set(r,n)}}:Hr(e,e.rateLimit.modelName)}async function Pt(e,t){if(!t.rateLimit.enabled)return;let r=t.baseURL,n=e.url.replace(r,""),s=t.rateLimit.window,o=t.rateLimit.max,a=me(e,t.options)+n,i=Kr().find(p=>p.pathMatcher(n));i&&(s=i.window,o=i.max);for(let p of t.options.plugins||[])if(p.rateLimit){let m=p.rateLimit.find(f=>f.pathMatcher(n));if(m){s=m.window,o=m.max;break}}if(t.rateLimit.customRules){let p=t.rateLimit.customRules[n];p&&(s=p.window,o=p.max)}let d=Gr(t),c=await d.get(a),l=Date.now();if(!c)await d.set(a,{key:a,count:1,lastRequest:l});else{let p=l-c.lastRequest;if($r(o,s,c)){let m=Mr(c.lastRequest,s);return zr(m)}else p>s*1e3?await d.set(a,{...c,count:1,lastRequest:l}):await d.set(a,{...c,count:c.count+1,lastRequest:l})}}function Kr(){return[{pathMatcher(t){return t.startsWith("/sign-in")||t.startsWith("/sign-up")||t.startsWith("/change-password")||t.startsWith("/change-email")},window:10,max:3}]}import{APIError as Ka}from"better-call";function Te(e,t){let r=t.plugins?.reduce((u,i)=>({...u,...i.endpoints}),{}),n=t.plugins?.map(u=>u.middlewares?.map(i=>{let d=async c=>i.middleware({...c,context:{...e,...c.context}});return d.path=i.path,d.options=i.middleware.options,d.headers=i.middleware.headers,{path:i.path,middleware:d}})).filter(u=>u!==void 0).flat()||[],o={...{signInSocial:ct,callbackOAuth:lt,getSession:xe(),signOut:pt,signUpEmail:Ut(),signInEmail:ut,forgetPassword:mt,resetPassword:ht,verifyEmail:dt,sendVerificationEmail:at,changeEmail:xt,changePassword:bt,setPassword:At,updateUser:wt(),deleteUser:kt,forgetPasswordCallback:gt,listSessions:nt(),revokeSession:ot,revokeSessions:it,revokeOtherSessions:st,linkSocialAccount:It,listUserAccounts:Et},...r,ok:Rt,error:vt},a={};for(let[u,i]of Object.entries(o))a[u]=async(d={})=>{i.headers=new Headers;let c={setHeader(y,h){i.headers.set(y,h)},setCookie(y,h,w){Jr(i.headers,y,h,w)},getCookie(y,h){let b=d.headers?.get("cookie");return Qr(b||"",y,h)},getSignedCookie(y,h,w){let b=d.headers;return b?Zr(b,h,y,w):null},async setSignedCookie(y,h,w,b){await Yr(i.headers,y,h,w,b)},redirect(y){return i.headers.set("Location",y),new H("FOUND")},responseHeader:i.headers},l=await e,p={...c,...d,path:i.path,context:{...l,...d.context,endpoint:i}};l.session=null;let m=t.plugins||[];for(let y of m){let h=y.hooks?.before??[];for(let w of h){if(!w.matcher(p))continue;let b=await w.handler(p);if(b&&"context"in b){p={...p,...b.context};continue}if(b)return b}}let f;try{f=await i(p)}catch(y){if(y instanceof H){let h=t.plugins?.map(w=>{if(w.hooks?.after)return w.hooks.after}).filter(w=>w!==void 0).flat();if(!h?.length)throw y.headers=i.headers,y;p.context.returned=y,p.context.returned.headers=i.headers;for(let w of h||[])if(w.matcher(p))try{let U=await w.handler(p);U&&"response"in U&&(p.context.returned=U.response)}catch(U){if(U instanceof H){p.context.returned=U;continue}throw U}if(p.context.returned instanceof H)throw p.context.returned.headers=i.headers,p.context.returned;return p.context.returned}throw y}p.context.returned=f,p.responseHeader=i.headers;for(let y of t.plugins||[])if(y.hooks?.after){for(let h of y.hooks.after)if(h.matcher(p))try{let b=await h.handler(p);b&&(p.context.returned=b)}catch(b){if(b instanceof H){p.context.returned=b;continue}throw b}}let g=p.context.returned;return g instanceof Response&&i.headers.forEach((y,h)=>{h==="set-cookie"?g.headers.append(h,y):g.headers.set(h,y)}),g},a[u].path=i.path,a[u].method=i.method,a[u].options=i.options,a[u].headers=i.headers;return{api:a,middlewares:n}}var Ot=(e,t)=>{let{api:r,middlewares:n}=Te(e,t),s=new URL(e.baseURL).pathname;return Wr(r,{extraContext:e,basePath:s,routerMiddleware:[{path:"/**",middleware:Le},...n],async onRequest(o){for(let a of e.options.plugins||[])if(a.onRequest){let u=await a.onRequest(o,e);if(u&&"response"in u)return u.response}return Pt(o,e)},async onResponse(o){for(let a of e.options.plugins||[])if(a.onResponse){let u=await a.onResponse(o,e);if(u)return u.response}return o},onError(o){if(o instanceof H&&o.status==="FOUND")return;if(t.onAPIError?.throw)throw o;if(t.onAPIError?.onError){t.onAPIError.onError(o,e);return}let a=t.logger?.level,u=a==="error"||a==="warn"||a==="debug"?E:void 0;if(t.logger?.disabled!==!0){if(o&&typeof o=="object"&&"message"in o&&typeof o.message=="string"&&(o.message.includes("no column")||o.message.includes("column")||o.message.includes("relation")||o.message.includes("table")||o.message.includes("does not exist"))){e.logger?.error(o.message),e.logger?.error("If you are seeing this error, it is likely that you need to run the migrations for the database or you need to update your database schema. If you recently updated the package, make sure to run the migrations.");return}o instanceof H?(o.status==="INTERNAL_SERVER_ERROR"&&e.logger.error(o.status,o),u?.error(o.message)):e.logger?.error(o&&typeof o=="object"&&"name"in o?o.name:"",o)}}})};import{defu as sn}from"defu";import{decodeHex as Xr,encodeHex as Lt}from"oslo/encoding";import{scryptAsync as en}from"@noble/hashes/scrypt";import{getRandomValues as tn}from"uncrypto";var Q={N:16384,r:16,p:1,dkLen:64};async function _t(e,t){return await en(e.normalize("NFKC"),t,{N:Q.N,p:Q.p,r:Q.r,dkLen:Q.dkLen,maxmem:128*Q.N*Q.r*2})}var Ct=async e=>{let t=Lt(tn(new Uint8Array(16))),r=await _t(e,t);return`${t}:${Lt(r)}`},Dt=async(e,t)=>{let[r,n]=e.split(":"),s=await _t(t,r);return he(s,Xr(n))};function Bt(e,t){let r=t.hooks;async function n(a,u,i){let d=a;for(let p of r||[]){let m=p[u]?.create?.before;if(m){let f=await m(a);if(f===!1)return null;typeof f=="object"&&"data"in f&&(d=f.data)}}let c=i?await i.fn(d):null,l=!i||i.executeMainFn?await e.create({model:u,data:d}):c;for(let p of r||[]){let m=p[u]?.create?.after;m&&await m(l)}return l}async function s(a,u,i,d){let c=a;for(let m of r||[]){let f=m[i]?.update?.before;if(f){let g=await f(a);if(g===!1)return null;c=typeof g=="object"?g.data:g}}let l=d?await d.fn(c):null,p=!d||d.executeMainFn?await e.update({model:i,update:c,where:u}):l;for(let m of r||[]){let f=m[i]?.update?.after;f&&await f(p)}return p}async function o(a,u,i,d){let c=a;for(let m of r||[]){let f=m[i]?.update?.before;if(f){let g=await f(a);if(g===!1)return null;c=typeof g=="object"?g.data:g}}let l=d?await d.fn(c):null,p=!d||d.executeMainFn?await e.updateMany({model:i,update:c,where:u}):l;for(let m of r||[]){let f=m[i]?.update?.after;f&&await f(p)}return p}return{createWithHooks:n,updateWithHooks:s,updateManyWithHooks:o}}var Ee=(e,t)=>{let r=t.options,n=r.secondaryStorage,s=r.session?.expiresIn||60*60*24*7,{createWithHooks:o,updateWithHooks:a,updateManyWithHooks:u}=Bt(e,t);return{createOAuthUser:async(i,d)=>{try{let c=await o({createdAt:new Date,updatedAt:new Date,...i},"user"),l=await o({...d,userId:c.id||i.id,createdAt:new Date,updatedAt:new Date},"account");return{user:c,account:l}}catch(c){return console.log(c),null}},createUser:async i=>await o({createdAt:new Date,updatedAt:new Date,emailVerified:!1,...i},"user"),createAccount:async i=>await o({createdAt:new Date,updatedAt:new Date,...i},"account"),listSessions:async i=>{if(n){let c=await n.get(`active-sessions-${i}`);if(!c)return[];let l=K(c)||[],p=Date.now(),m=l.filter(g=>g.expiresAt>p),f=[];for(let g of m){let y=await n.get(g.token);if(y){let h=JSON.parse(y),w=pe(t.options,{...h.session,expiresAt:new Date(h.session.expiresAt)});f.push(w)}}return f}return await e.findMany({model:"session",where:[{field:"userId",value:i}]})},listUsers:async(i,d,c,l)=>await e.findMany({model:"user",limit:i,offset:d,sortBy:c,where:l}),deleteUser:async i=>{await e.deleteMany({model:"session",where:[{field:"userId",value:i}]}),await e.deleteMany({model:"account",where:[{field:"userId",value:i}]}),await e.delete({model:"user",where:[{field:"id",value:i}]})},createSession:async(i,d,c,l)=>{let p=d instanceof Request?d.headers:d,{id:m,...f}=l||{},g={ipAddress:d&&me(d,t.options)||"",userAgent:p?.get("user-agent")||"",...f,expiresAt:c?D(60*60*24,"sec"):D(s,"sec"),userId:i,token:q(32),createdAt:new Date,updatedAt:new Date};return await o(g,"session",n?{fn:async()=>{let h=await e.findOne({model:"user",where:[{field:"id",value:i}]});n.set(g.token,JSON.stringify({session:g,user:h}),s);let w=await n.get(`active-sessions-${i}`),b=[],U=Date.now();return w&&(b=K(w)||[],b=b.filter(Wt=>Wt.expiresAt>U)),b.push({token:g.token,expiresAt:U+s*1e3}),await n.set(`active-sessions-${i}`,JSON.stringify(b),s),g},executeMainFn:r.session?.storeSessionInDatabase}:void 0)},findSession:async i=>{if(n){let p=await n.get(i);if(p){let m=JSON.parse(p),f=pe(t.options,{...m.session,expiresAt:new Date(m.session.expiresAt),createdAt:new Date(m.session.createdAt),updatedAt:new Date(m.session.updatedAt)}),g=Ue(t.options,{...m.user,createdAt:new Date(m.user.createdAt),updatedAt:new Date(m.user.updatedAt)});return{session:f,user:g}}}let d=await e.findOne({model:"session",where:[{value:i,field:"token"}]});if(!d)return null;let c=await e.findOne({model:"user",where:[{value:d.userId,field:"id"}]});if(!c)return null;let l=Ue(t.options,c);return{session:pe(t.options,d),user:l}},findSessions:async i=>{if(n){let p=[];for(let m of i){let f=await n.get(m);if(f){let g=JSON.parse(f),y={session:{...g.session,expiresAt:new Date(g.session.expiresAt)},user:{...g.user,createdAt:new Date(g.user.createdAt),updatedAt:new Date(g.user.updatedAt)}};p.push(y)}}return p}let d=await e.findMany({model:"session",where:[{field:"token",value:i,operator:"in"}]}),c=d.map(p=>p.userId);if(!c.length)return[];let l=await e.findMany({model:"user",where:[{field:"id",value:c,operator:"in"}]});return d.map(p=>{let m=l.find(f=>f.id===p.userId);return m?{session:p,user:m}:null})},updateSession:async(i,d)=>await a(d,[{field:"token",value:i}],"session",n?{async fn(l){let p=await n.get(i),m=null;if(p){let f=JSON.parse(p);return m={...f.session,...l},await n.set(i,JSON.stringify({session:m,user:f.user}),f.session.expiresAt?Math.floor((f.session.expiresAt.getTime()-Date.now())/1e3):s),m}else return null},executeMainFn:r.session?.storeSessionInDatabase}:void 0),deleteSession:async i=>{if(n){await n.delete(i),r.session?.storeSessionInDatabase&&await e.delete({model:"session",where:[{field:"token",value:i}]});return}await e.delete({model:"session",where:[{field:"token",value:i}]})},deleteSessions:async i=>{if(n){if(typeof i=="string"){let d=await n.get(`active-sessions-${i}`),c=d?K(d):[];if(!c)return;for(let l of c)await n.delete(l.token)}else for(let d of i)await n.get(d)&&await n.delete(d);r.session?.storeSessionInDatabase&&await e.deleteMany({model:"session",where:[{field:Array.isArray(i)?"token":"userId",value:i,operator:Array.isArray(i)?"in":void 0}]});return}await e.deleteMany({model:"session",where:[{field:Array.isArray(i)?"token":"userId",value:i,operator:Array.isArray(i)?"in":void 0}]})},findUserByEmail:async(i,d)=>{let c=await e.findOne({model:"user",where:[{value:i.toLowerCase(),field:"email"}]});if(!c)return null;if(d?.includeAccounts){let l=await e.findMany({model:"account",where:[{value:c.id,field:"userId"}]});return{user:c,accounts:l}}return{user:c,accounts:[]}},findUserById:async i=>await e.findOne({model:"user",where:[{field:"id",value:i}]}),linkAccount:async i=>await o({...i,createdAt:new Date,updatedAt:new Date},"account"),updateUser:async(i,d)=>await a(d,[{field:"id",value:i}],"user"),updateUserByEmail:async(i,d)=>await a(d,[{field:"email",value:i}],"user"),updatePassword:async(i,d)=>{await u({password:d},[{field:"userId",value:i},{field:"providerId",value:"credential"}],"account")},findAccounts:async i=>await e.findMany({model:"account",where:[{field:"userId",value:i}]}),findAccount:async i=>await e.findOne({model:"account",where:[{field:"accountId",value:i}]}),findAccountByUserId:async i=>await e.findMany({model:"account",where:[{field:"userId",value:i}]}),updateAccount:async(i,d)=>await a(d,[{field:"id",value:i}],"account"),createVerificationValue:async i=>await o({createdAt:new Date,updatedAt:new Date,...i},"verification"),findVerificationValue:async i=>(await e.findMany({model:"verification",where:[{field:"identifier",value:i}],sortBy:{field:"createdAt",direction:"desc"},limit:10}))[0],deleteVerificationValue:async i=>{await e.delete({model:"verification",where:[{field:"id",value:i}]})},deleteVerificationByIdentifier:async i=>{await e.delete({model:"verification",where:[{field:"identifier",value:i}]})},updateVerificationValue:async(i,d)=>await a(d,[{field:"id",value:i}],"verification")}};var $=e=>{let t=e.plugins?.reduce((i,d)=>{let c=d.schema;if(!c)return i;for(let[l,p]of Object.entries(c))i[l]={fields:{...i[l]?.fields,...p.fields},modelName:p.modelName||l};return i},{}),r=e.rateLimit?.storage==="database",n={rateLimit:{modelName:e.rateLimit?.modelName||"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:s,session:o,account:a,...u}=t||{};return{user:{modelName: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"},...s?.fields,...e.user?.additionalFields},order:1},session:{modelName:e.session?.modelName||"session",fields:{expiresAt:{type:"date",required:!0,fieldName:e.session?.fields?.expiresAt||"expiresAt"},token:{type:"string",required:!0,fieldName:e.session?.fields?.token||"token",unique:!0},createdAt:{type:"date",required:!0,fieldName:e.session?.fields?.createdAt||"createdAt"},updatedAt:{type:"date",required:!0,fieldName:e.session?.fields?.updatedAt||"updatedAt"},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},...o?.fields,...e.session?.additionalFields},order:2},account:{modelName: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"},accessTokenExpiresAt:{type:"date",required:!1,fieldName:e.account?.fields?.accessTokenExpiresAt||"accessTokenExpiresAt"},refreshTokenExpiresAt:{type:"date",required:!1,fieldName:e.account?.fields?.accessTokenExpiresAt||"refreshTokenExpiresAt"},scope:{type:"string",required:!1,fieldName:e.account?.fields?.scope||"scope"},password:{type:"string",required:!1,fieldName:e.account?.fields?.password||"password"},createdAt:{type:"date",required:!0,fieldName:e.account?.fields?.createdAt||"createdAt"},updatedAt:{type:"date",required:!0,fieldName:e.account?.fields?.updatedAt||"updatedAt"},...a?.fields},order:3},verification:{modelName: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"},createdAt:{type:"date",required:!1,defaultValue:()=>new Date,fieldName:e.verification?.fields?.createdAt||"createdAt"},updatedAt:{type:"date",required:!1,defaultValue:()=>new Date,fieldName:e.verification?.fields?.updatedAt||"updatedAt"}},order:4},...u,...r?n:{}}};import{z as ud}from"zod";import{Kysely as qt,MssqlDialect as rn}from"kysely";import{MysqlDialect as Nt,PostgresDialect as jt,SqliteDialect as Ft}from"kysely";function Vt(e){if(!e)return null;if("dialect"in e)return Vt(e.dialect);if("createDriver"in e){if(e instanceof Ft)return"sqlite";if(e instanceof Nt)return"mysql";if(e instanceof jt)return"postgres";if(e instanceof rn)return"mssql"}return"aggregate"in e?"sqlite":"getConnection"in e?"mysql":"connect"in e?"postgres":null}var Ie=async e=>{let t=e.database;if(!t)return{kysely:null,databaseType:null};if("db"in t)return{kysely:t.db,databaseType:t.type};if("dialect"in t)return{kysely:new qt({dialect:t.dialect}),databaseType:t.type};let r,n=Vt(t);return"createDriver"in t&&(r=t),"aggregate"in t&&(r=new Ft({database:t})),"getConnection"in t&&(r=new Nt(t)),"connect"in t&&(r=new jt({pool:t})),{kysely:r?new qt({dialect:r}):null,databaseType:n}};function ge(e,t,r){return r==="update"?e:e==null&&t.defaultValue?typeof t.defaultValue=="function"?t.defaultValue():t.defaultValue:e}var nn=(e,t,r)=>{let n=$(t);function s(d,c){if(c==="id")return c;let l=n[d].fields[c];return l||console.log("Field not found",d,c),l.fieldName||c}function o(d,c,l){let{type:p="sqlite"}=r||{},m=n[c].fields[l];return m.type==="boolean"&&p==="sqlite"&&d!==null&&d!==void 0?d?1:0:m.type==="date"&&d&&d instanceof Date&&p==="sqlite"?d.toISOString():d}function a(d,c,l){let{type:p="sqlite"}=r||{},m=n[c].fields[l];return m.type==="boolean"&&p==="sqlite"&&d!==null?d===1:m.type==="date"&&d?new Date(d):d}function u(d){return n[d].modelName}let i=t?.advanced?.generateId===!1;return{transformInput(d,c,l){let p=i||l==="update"?{}:{id:t.advanced?.generateId?t.advanced.generateId({model:c}):d.id||q()},m=n[c].fields;for(let f in m){let g=d[f];p[m[f].fieldName||f]=ge(o(g,c,f),m[f],l)}return p},transformOutput(d,c,l=[]){if(!d)return null;let p=d.id?l.length===0||l.includes("id")?{id:d.id}:{}:{},m=n[c].fields;for(let f in m){if(l.length&&!l.includes(f))continue;let g=m[f];g&&(p[f]=a(d[g.fieldName||f],c,f))}return p},convertWhereClause(d,c){if(!c)return{and:null,or:null};let l={and:[],or:[]};return c.forEach(p=>{let{field:m,value:f,operator:g="=",connector:y="AND"}=p,h=s(d,m),w=b=>g.toLowerCase()==="in"?b(h,"in",Array.isArray(f)?f:[f]):g==="contains"?b(h,"like",`%${f}%`):g==="starts_with"?b(h,"like",`${f}%`):g==="ends_with"?b(h,"like",`%${f}`):g==="eq"?b(h,"=",f):g==="ne"?b(h,"<>",f):g==="gt"?b(h,">",f):g==="gte"?b(h,">=",f):g==="lt"?b(h,"<",f):g==="lte"?b(h,"<=",f):b(h,g,f);y==="OR"?l.or.push(w):l.and.push(w)}),{and:l.and.length?l.and:null,or:l.or.length?l.or:null}},async withReturning(d,c,l,p){let m;if(r?.type!=="mysql")m=await c.returningAll().executeTakeFirst();else{await c.execute();let f=d.id?"id":p[0].field?p[0].field:"id",g=d[f]||p[0].value;m=await e.selectFrom(u(l)).selectAll().where(s(l,f),"=",g).executeTakeFirst()}return m},getModelName:u,getField:s}},$t=(e,t)=>r=>{let{transformInput:n,withReturning:s,transformOutput:o,convertWhereClause:a,getModelName:u,getField:i}=nn(e,r,t);return{id:"kysely",async create(d){let{model:c,data:l,select:p}=d,m=n(l,c,"create"),f=e.insertInto(u(c)).values(m);return o(await s(m,f,c,[]),c,p)},async findOne(d){let{model:c,where:l,select:p}=d,{and:m,or:f}=a(c,l),g=e.selectFrom(u(c)).selectAll();m&&(g=g.where(h=>h.and(m.map(w=>w(h))))),f&&(g=g.where(h=>h.or(f.map(w=>w(h)))));let y=await g.executeTakeFirst();return y?o(y,c,p):null},async findMany(d){let{model:c,where:l,limit:p,offset:m,sortBy:f}=d,{and:g,or:y}=a(c,l),h=e.selectFrom(u(c));g&&(h=h.where(b=>b.and(g.map(U=>U(b))))),y&&(h=h.where(b=>b.or(y.map(U=>U(b))))),h=h.limit(p||100),m&&(h=h.offset(m)),f&&(h=h.orderBy(i(c,f.field),f.direction));let w=await h.selectAll().execute();return w?w.map(b=>o(b,c)):[]},async update(d){let{model:c,where:l,update:p}=d,{and:m,or:f}=a(c,l),g=n(p,c,"update"),y=e.updateTable(u(c)).set(g);return m&&(y=y.where(w=>w.and(m.map(b=>b(w))))),f&&(y=y.where(w=>w.or(f.map(b=>b(w))))),await o(await s(g,y,c,l),c)},async updateMany(d){let{model:c,where:l,update:p}=d,{and:m,or:f}=a(c,l),g=n(p,c,"update"),y=e.updateTable(u(c)).set(g);return m&&(y=y.where(w=>w.and(m.map(b=>b(w))))),f&&(y=y.where(w=>w.or(f.map(b=>b(w))))),(await y.execute()).length},async delete(d){let{model:c,where:l}=d,{and:p,or:m}=a(c,l),f=e.deleteFrom(u(c));p&&(f=f.where(g=>g.and(p.map(y=>y(g))))),m&&(f=f.where(g=>g.or(m.map(y=>y(g))))),await f.execute()},async deleteMany(d){let{model:c,where:l}=d,{and:p,or:m}=a(c,l),f=e.deleteFrom(u(c));return p&&(f=f.where(g=>g.and(p.map(y=>y(g))))),m&&(f=f.where(g=>g.or(m.map(y=>y(g))))),(await f.execute()).length},options:t}};var on=e=>{let t=$(e);function r(n,s){return s==="id"?s:t[n].fields[s].fieldName||s}return{transformInput(n,s,o){let a=o==="update"?{}:{id:e.advanced?.generateId?e.advanced.generateId({model:s}):n.id||q()},u=t[s].fields;for(let i in u){let d=n[i];d===void 0&&!u[i].defaultValue||(a[u[i].fieldName||i]=ge(d,u[i],o))}return a},transformOutput(n,s,o=[]){if(!n)return null;let a=n.id||n._id?o.length===0||o.includes("id")?{id:n.id}:{}:{},u=t[s].fields;for(let i in u){if(o.length&&!o.includes(i))continue;let d=u[i];d&&(a[i]=n[d.fieldName||i])}return a},convertWhereClause(n,s,o){return s.filter(a=>n.every(u=>{let{field:i,value:d,operator:c}=u,l=r(o,i);if(c==="in"){if(!Array.isArray(d))throw new Error("Value must be an array");return d.includes(a[l])}else return c==="contains"?a[l].includes(d):c==="starts_with"?a[l].startsWith(d):c==="ends_with"?a[l].endsWith(d):a[l]===d}))},getField:r}},zt=e=>t=>{let{transformInput:r,transformOutput:n,convertWhereClause:s,getField:o}=on(t);return{id:"memory",create:async({model:a,data:u})=>{let i=r(u,a,"create");return e[a].push(i),n(i,a)},findOne:async({model:a,where:u,select:i})=>{let d=e[a],l=s(u,d,a)[0]||null;return n(l,a,i)},findMany:async({model:a,where:u,sortBy:i,limit:d,offset:c})=>{let l=e[a];return u&&(l=s(u,l,a)),i&&(l=l.sort((p,m)=>{let f=o(a,i.field);return i.direction==="asc"?p[f]>m[f]?1:-1:p[f]<m[f]?1:-1})),c!==void 0&&(l=l.slice(c)),d!==void 0&&(l=l.slice(0,d)),l.map(p=>n(p,a))},update:async({model:a,where:u,update:i})=>{let d=e[a],c=s(u,d,a);return c.forEach(l=>{Object.assign(l,r(i,a,"update"))}),n(c[0],a)},delete:async({model:a,where:u})=>{let i=e[a],d=s(u,i,a);e[a]=i.filter(c=>!d.includes(c))},deleteMany:async({model:a,where:u})=>{let i=e[a],d=s(u,i,a),c=0;return e[a]=i.filter(l=>d.includes(l)?(c++,!1):!d.includes(l)),c},updateMany(a){let{model:u,where:i,update:d}=a,c=e[u],l=s(i,c,u);return l.forEach(p=>{Object.assign(p,d)}),l[0]||null}}};async function Mt(e){if(!e.database){let n=$(e),s=Object.keys(n).reduce((o,a)=>(o[a]=[],o),{});return E.warn("No database configuration provided. Using memory adapter in development"),zt(s)(e)}if(typeof e.database=="function")return e.database(e);let{kysely:t,databaseType:r}=await Ie(e);if(!t)throw new L("Failed to initialize database adapter");return $t(t,{type:r||"sqlite"})(e)}var Se="better-auth-secret-123456789";import{APIError as Ht}from"better-call";async function Gt(e,t){let n=(await t.context.internalAdapter.findAccounts(e))?.find(a=>a.providerId==="credential"),s=n?.password;if(!n||!s)throw new Ht("BAD_REQUEST",{message:"No password credential found"});if(!await t.context.password.verify(s,t.body.password))throw new Ht("BAD_REQUEST",{message:"Invalid password"});return!0}var Kt=async e=>{let t=await Mt(e),r=e.plugins||[],n=dn(e),s=de(e.logger),o=X(e.baseURL,e.basePath),a=e.secret||P.BETTER_AUTH_SECRET||P.AUTH_SECRET||Se;a===Se&&Y&&s.error("You are using the default secret. Please set `BETTER_AUTH_SECRET` in your environment variables or pass `secret` in your auth config."),e={...e,secret:a,baseURL:o?new URL(o).origin:"",basePath:e.basePath||"/api/auth",plugins:r.concat(n),emailAndPassword:{...e.emailAndPassword,enabled:e.emailAndPassword?.enabled??!1,autoSignIn:e.emailAndPassword?.autoSignIn??!0}};let u=qe(e),i=$(e),d=Object.keys(e.socialProviders||{}).map(m=>{let f=e.socialProviders?.[m];return f.enabled===!1?null:((!f.clientId||!f.clientSecret)&&s.warn(`Social provider ${m} is missing clientId or clientSecret`),ke[m](f))}).filter(m=>m!==null),c=({model:m,size:f})=>typeof e?.advanced?.generateId=="function"?e.advanced.generateId({model:m,size:f}):q(f),l={appName:e.appName||"Better Auth",socialProviders:d,options:e,tables:i,trustedOrigins:cn(e),baseURL:o||"",sessionConfig:{updateAge:e.session?.updateAge!==void 0?e.session.updateAge:24*60*60,expiresIn:e.session?.expiresIn||60*60*24*7,freshAge:e.session?.freshAge||60*5},secret:a,rateLimit:{...e.rateLimit,enabled:e.rateLimit?.enabled??Y,window:e.rateLimit?.window||10,max:e.rateLimit?.max||100,storage:e.rateLimit?.storage||e.secondaryStorage?"secondary-storage":"memory"},authCookies:u,logger:s,generateId:c,session:null,secondaryStorage:e.secondaryStorage,password:{hash:e.emailAndPassword?.password?.hash||Ct,verify:e.emailAndPassword?.password?.verify||Dt,config:{minPasswordLength:e.emailAndPassword?.minPasswordLength||8,maxPasswordLength:e.emailAndPassword?.maxPasswordLength||128},checkPassword:Gt},adapter:t,internalAdapter:Ee(t,{options:e,hooks:e.databaseHooks?[e.databaseHooks]:[],generateId:c}),createAuthCookie:ye(e)},{context:p}=an(l);return p};function an(e){let t=e.options,r=t.plugins||[],n=e,s=[];for(let o of r)if(o.init){let a=o.init(e);typeof a=="object"&&(a.options&&(a.options.databaseHooks&&s.push(a.options.databaseHooks),t=sn(t,a.options)),a.context&&(n={...n,...a.context}))}return s.push(t.databaseHooks),n.internalAdapter=Ee(e.adapter,{options:t,hooks:s.filter(o=>o!==void 0),generateId:e.generateId}),n.options=t,{context:n}}function dn(e){let t=[];return e.advanced?.crossSubDomainCookies?.enabled,t}function cn(e){let t=X(e.baseURL,e.basePath);if(!t)return[];let r=[new URL(t).origin];e.trustedOrigins&&r.push(...e.trustedOrigins);let n=P.BETTER_AUTH_TRUSTED_ORIGINS;return n&&r.push(...n.split(",")),r}var Ac=e=>{let t=Kt(e),{api:r}=Te(t,e);return{handler:async n=>{let s=await t,o=s.options.basePath||"/api/auth",a=new URL(n.url);if(!s.options.baseURL){let i=X(void 0,o)||`${a.origin}${o}`;s.options.baseURL=i,s.baseURL=i}s.trustedOrigins=[...e.trustedOrigins||[],s.baseURL,a.origin];let{handler:u}=Ot(s,e);return u(n)},api:r,options:e,$context:t,$Infer:{}}};export{L as BetterAuthError,G as HIDE_METADATA,Ce as MissingDependencyError,Ac as betterAuth,Bo as capitalizeFirstLetter,ye as createCookieGetter,de as createLogger,N as deleteSessionCookie,q as generateId,ae as generateState,qe as getCookies,be as levels,E as logger,Ln as parseCookies,vn as parseSetCookieHeader,$e as parseState,S as setSessionCookie,br as shouldPublishLog};
83
+ </html>`,vt=k("/error",{method:"GET",metadata:{...G,openapi:{description:"Displays an error page",responses:{200:{description:"Success",content:{"text/html":{schema:{type:"string"}}}}}}}},async e=>{let t=new URL(e.request?.url||"").searchParams.get("error")||"Unknown";return new Response(Vr(t),{headers:{"Content-Type":"text/html"}})});var Rt=k("/ok",{method:"GET",metadata:{...G,openapi:{description:"Check if the API is working",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{ok:{type:"boolean"}}}}}}}}}},async e=>e.json({ok:!0}));import{z as W}from"zod";import{APIError as V}from"better-call";var Ut=()=>k("/sign-up/email",{method:"POST",query:W.object({currentURL:W.string().optional()}).optional(),body:W.record(W.string(),W.any()),metadata:{openapi:{description:"Sign up a user using email and password",requestBody:{content:{"application/json":{schema:{type:"object",properties:{name:{type:"string",description:"The name of the user"},email:{type:"string",description:"The email of the user"},password:{type:"string",description:"The password of the user"},callbackURL:{type:"string",description:"The URL to use for email verification callback"}},required:["name","email","password"]}}}},responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{user:{type:"object"},session:{type:"object"}}}}}}}}}},async e=>{if(!e.context.options.emailAndPassword?.enabled)throw new V("BAD_REQUEST",{message:"Email and password sign up is not enabled"});let t=e.body,{name:r,email:n,password:s,image:o,callbackURL:a,...u}=t;if(!W.string().email().safeParse(n).success)throw new V("BAD_REQUEST",{message:"Invalid email"});let d=e.context.password.config.minPasswordLength;if(s.length<d)throw e.context.logger.error("Password is too short"),new V("BAD_REQUEST",{message:"Password is too short"});let c=e.context.password.config.maxPasswordLength;if(s.length>c)throw e.context.logger.error("Password is too long"),new V("BAD_REQUEST",{message:"Password is too long"});if((await e.context.internalAdapter.findUserByEmail(n))?.user)throw e.context.logger.info(`Sign-up attempt for existing email: ${n}`),new V("UNPROCESSABLE_ENTITY",{message:"User with this email already exists"});let p=fe(e.context.options,u),m;try{if(m=await e.context.internalAdapter.createUser({email:n.toLowerCase(),name:r,image:o,...p,emailVerified:!1}),!m)throw new V("BAD_REQUEST",{message:"Failed to create user"})}catch(y){throw e.context.logger.error("Failed to create user",y),new V("UNPROCESSABLE_ENTITY",{message:"Failed to create user",details:y})}if(!m)throw new V("UNPROCESSABLE_ENTITY",{message:"Failed to create user"});let f=await e.context.password.hash(s);if(await e.context.internalAdapter.linkAccount({userId:m.id,providerId:"credential",accountId:m.id,password:f}),e.context.options.emailVerification?.sendOnSignUp){let y=await F(e.context.secret,m.email),h=`${e.context.baseURL}/verify-email?token=${y}&callbackURL=${t.callbackURL||e.query?.currentURL||"/"}`;await e.context.options.emailVerification?.sendVerificationEmail?.({user:m,url:h,token:y},e.request)}if(!e.context.options.emailAndPassword.autoSignIn||e.context.options.emailAndPassword.requireEmailVerification)return e.json({user:m,session:null});let g=await e.context.internalAdapter.createSession(m.id,e.request);if(!g)throw new V("BAD_REQUEST",{message:"Failed to create session"});return await S(e,{session:g,user:m}),e.json({user:m,session:g})});import{z as ne}from"zod";import{APIError as Tt}from"better-call";var Et=k("/list-accounts",{method:"GET",use:[_],metadata:{openapi:{description:"List all accounts linked to the user",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"array",items:{type:"object",properties:{id:{type:"string"},provider:{type:"string"}}}}}}}}}}},async e=>{let t=e.context.session,r=await e.context.internalAdapter.findAccounts(t.user.id);return e.json(r.map(n=>({id:n.id,provider:n.providerId})))}),It=k("/link-social",{method:"POST",requireHeaders:!0,query:ne.object({currentURL:ne.string().optional()}).optional(),body:ne.object({callbackURL:ne.string({description:"The URL to redirect to after the user has signed in"}).optional(),provider:ne.enum(ce,{description:"The OAuth2 provider to use"})}),use:[_],metadata:{openapi:{description:"Link a social account to the user",responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{url:{type:"string"},redirect:{type:"boolean"}},required:["url","redirect"]}}}}}}}},async e=>{let t=e.context.session;if((await e.context.internalAdapter.findAccounts(t.user.id)).find(u=>u.providerId===e.body.provider))throw new Tt("BAD_REQUEST",{message:"Social Account is already linked."});let s=e.context.socialProviders.find(u=>u.id===e.body.provider);if(!s)throw e.context.logger.error("Provider not found. Make sure to add the provider in your auth config",{provider:e.body.provider}),new Tt("NOT_FOUND",{message:"Provider not found"});let o=await ae(e,{userId:t.user.id,email:t.user.email}),a=await s.createAuthorizationURL({state:o.state,codeVerifier:o.codeVerifier,redirectURI:`${e.context.baseURL}/callback/${s.id}`});return e.json({url:a.toString(),redirect:!0})});function me(e,t){if(t.advanced?.ipAddress?.disableIpTracking)return null;let r="127.0.0.1";if(Be)return r;let s=t.advanced?.ipAddress?.ipAddressHeaders||["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 a of s){let u=o.get(a);if(typeof u=="string"){let i=u.split(",")[0].trim();if(i)return i}}return null}function $r(e,t,r){let n=Date.now(),s=t*1e3;return n-r.lastRequest<s&&r.count>=e}function zr(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 Mr(e,t){let r=Date.now(),n=t*1e3;return Math.ceil((e+n-r)/1e3)}function Hr(e,t){let r="rateLimit",n=e.adapter;return{get:async s=>await n.findOne({model:r,where:[{field:"key",value:s}]}),set:async(s,o,a)=>{try{a?await n.update({model:t??"rateLimit",where:[{field:"key",value:s}],update:{count:o.count,lastRequest:o.lastRequest}}):await n.create({model:t??"rateLimit",data:{key:s,count:o.count,lastRequest:o.lastRequest}})}catch(u){e.logger.error("Error setting rate limit",u)}}}}var St=new Map;function Gr(e){return e.rateLimit.storage==="secondary-storage"?{get:async r=>{let n=await e.options.secondaryStorage?.get(r);return n?JSON.parse(n):void 0},set:async(r,n)=>{await e.options.secondaryStorage?.set?.(r,JSON.stringify(n))}}:e.rateLimit.storage==="memory"?{async get(r){return St.get(r)},async set(r,n,s){St.set(r,n)}}:Hr(e,e.rateLimit.modelName)}async function Pt(e,t){if(!t.rateLimit.enabled)return;let r=t.baseURL,n=e.url.replace(r,"").split("?")[0],s=t.rateLimit.window,o=t.rateLimit.max,a=me(e,t.options)+n,i=Kr().find(p=>p.pathMatcher(n));i&&(s=i.window,o=i.max);for(let p of t.options.plugins||[])if(p.rateLimit){let m=p.rateLimit.find(f=>f.pathMatcher(n));if(m){s=m.window,o=m.max;break}}if(t.rateLimit.customRules){let p=t.rateLimit.customRules[n];p&&(s=p.window,o=p.max)}let d=Gr(t),c=await d.get(a),l=Date.now();if(!c)await d.set(a,{key:a,count:1,lastRequest:l});else{let p=l-c.lastRequest;if($r(o,s,c)){let m=Mr(c.lastRequest,s);return zr(m)}else p>s*1e3?await d.set(a,{...c,count:1,lastRequest:l}):await d.set(a,{...c,count:c.count+1,lastRequest:l})}}function Kr(){return[{pathMatcher(t){return t.startsWith("/sign-in")||t.startsWith("/sign-up")||t.startsWith("/change-password")||t.startsWith("/change-email")},window:10,max:3}]}import{APIError as Ka}from"better-call";function Te(e,t){let r=t.plugins?.reduce((u,i)=>({...u,...i.endpoints}),{}),n=t.plugins?.map(u=>u.middlewares?.map(i=>{let d=async c=>i.middleware({...c,context:{...e,...c.context}});return d.path=i.path,d.options=i.middleware.options,d.headers=i.middleware.headers,{path:i.path,middleware:d}})).filter(u=>u!==void 0).flat()||[],o={...{signInSocial:ct,callbackOAuth:lt,getSession:xe(),signOut:pt,signUpEmail:Ut(),signInEmail:ut,forgetPassword:mt,resetPassword:ht,verifyEmail:dt,sendVerificationEmail:at,changeEmail:xt,changePassword:bt,setPassword:At,updateUser:wt(),deleteUser:kt,forgetPasswordCallback:gt,listSessions:nt(),revokeSession:ot,revokeSessions:it,revokeOtherSessions:st,linkSocialAccount:It,listUserAccounts:Et},...r,ok:Rt,error:vt},a={};for(let[u,i]of Object.entries(o))a[u]=async(d={})=>{i.headers=new Headers;let c={setHeader(y,h){i.headers.set(y,h)},setCookie(y,h,w){Jr(i.headers,y,h,w)},getCookie(y,h){let b=d.headers?.get("cookie");return Qr(b||"",y,h)},getSignedCookie(y,h,w){let b=d.headers;return b?Zr(b,h,y,w):null},async setSignedCookie(y,h,w,b){await Yr(i.headers,y,h,w,b)},redirect(y){return i.headers.set("Location",y),new H("FOUND")},responseHeader:i.headers},l=await e,p={...c,...d,path:i.path,context:{...l,...d.context,endpoint:i}};l.session=null;let m=t.plugins||[];for(let y of m){let h=y.hooks?.before??[];for(let w of h){if(!w.matcher(p))continue;let b=await w.handler(p);if(b&&"context"in b){p={...p,...b.context};continue}if(b)return b}}let f;try{f=await i(p)}catch(y){if(y instanceof H){let h=t.plugins?.map(w=>{if(w.hooks?.after)return w.hooks.after}).filter(w=>w!==void 0).flat();if(!h?.length)throw y.headers=i.headers,y;p.context.returned=y,p.context.returned.headers=i.headers;for(let w of h||[])if(w.matcher(p))try{let U=await w.handler(p);U&&"response"in U&&(p.context.returned=U.response)}catch(U){if(U instanceof H){p.context.returned=U;continue}throw U}if(p.context.returned instanceof H)throw p.context.returned.headers=i.headers,p.context.returned;return p.context.returned}throw y}p.context.returned=f,p.responseHeader=i.headers;for(let y of t.plugins||[])if(y.hooks?.after){for(let h of y.hooks.after)if(h.matcher(p))try{let b=await h.handler(p);b&&(p.context.returned=b)}catch(b){if(b instanceof H){p.context.returned=b;continue}throw b}}let g=p.context.returned;return g instanceof Response&&i.headers.forEach((y,h)=>{h==="set-cookie"?g.headers.append(h,y):g.headers.set(h,y)}),g},a[u].path=i.path,a[u].method=i.method,a[u].options=i.options,a[u].headers=i.headers;return{api:a,middlewares:n}}var Ot=(e,t)=>{let{api:r,middlewares:n}=Te(e,t),s=new URL(e.baseURL).pathname;return Wr(r,{extraContext:e,basePath:s,routerMiddleware:[{path:"/**",middleware:Le},...n],async onRequest(o){for(let a of e.options.plugins||[])if(a.onRequest){let u=await a.onRequest(o,e);if(u&&"response"in u)return u.response}return Pt(o,e)},async onResponse(o){for(let a of e.options.plugins||[])if(a.onResponse){let u=await a.onResponse(o,e);if(u)return u.response}return o},onError(o){if(o instanceof H&&o.status==="FOUND")return;if(t.onAPIError?.throw)throw o;if(t.onAPIError?.onError){t.onAPIError.onError(o,e);return}let a=t.logger?.level,u=a==="error"||a==="warn"||a==="debug"?E:void 0;if(t.logger?.disabled!==!0){if(o&&typeof o=="object"&&"message"in o&&typeof o.message=="string"&&(o.message.includes("no column")||o.message.includes("column")||o.message.includes("relation")||o.message.includes("table")||o.message.includes("does not exist"))){e.logger?.error(o.message),e.logger?.error("If you are seeing this error, it is likely that you need to run the migrations for the database or you need to update your database schema. If you recently updated the package, make sure to run the migrations.");return}o instanceof H?(o.status==="INTERNAL_SERVER_ERROR"&&e.logger.error(o.status,o),u?.error(o.message)):e.logger?.error(o&&typeof o=="object"&&"name"in o?o.name:"",o)}}})};import{defu as sn}from"defu";import{decodeHex as Xr,encodeHex as Lt}from"oslo/encoding";import{scryptAsync as en}from"@noble/hashes/scrypt";import{getRandomValues as tn}from"uncrypto";var Q={N:16384,r:16,p:1,dkLen:64};async function _t(e,t){return await en(e.normalize("NFKC"),t,{N:Q.N,p:Q.p,r:Q.r,dkLen:Q.dkLen,maxmem:128*Q.N*Q.r*2})}var Ct=async e=>{let t=Lt(tn(new Uint8Array(16))),r=await _t(e,t);return`${t}:${Lt(r)}`},Dt=async(e,t)=>{let[r,n]=e.split(":"),s=await _t(t,r);return he(s,Xr(n))};function Bt(e,t){let r=t.hooks;async function n(a,u,i){let d=a;for(let p of r||[]){let m=p[u]?.create?.before;if(m){let f=await m(a);if(f===!1)return null;typeof f=="object"&&"data"in f&&(d=f.data)}}let c=i?await i.fn(d):null,l=!i||i.executeMainFn?await e.create({model:u,data:d}):c;for(let p of r||[]){let m=p[u]?.create?.after;m&&await m(l)}return l}async function s(a,u,i,d){let c=a;for(let m of r||[]){let f=m[i]?.update?.before;if(f){let g=await f(a);if(g===!1)return null;c=typeof g=="object"?g.data:g}}let l=d?await d.fn(c):null,p=!d||d.executeMainFn?await e.update({model:i,update:c,where:u}):l;for(let m of r||[]){let f=m[i]?.update?.after;f&&await f(p)}return p}async function o(a,u,i,d){let c=a;for(let m of r||[]){let f=m[i]?.update?.before;if(f){let g=await f(a);if(g===!1)return null;c=typeof g=="object"?g.data:g}}let l=d?await d.fn(c):null,p=!d||d.executeMainFn?await e.updateMany({model:i,update:c,where:u}):l;for(let m of r||[]){let f=m[i]?.update?.after;f&&await f(p)}return p}return{createWithHooks:n,updateWithHooks:s,updateManyWithHooks:o}}var Ee=(e,t)=>{let r=t.options,n=r.secondaryStorage,s=r.session?.expiresIn||60*60*24*7,{createWithHooks:o,updateWithHooks:a,updateManyWithHooks:u}=Bt(e,t);return{createOAuthUser:async(i,d)=>{try{let c=await o({createdAt:new Date,updatedAt:new Date,...i},"user"),l=await o({...d,userId:c.id||i.id,createdAt:new Date,updatedAt:new Date},"account");return{user:c,account:l}}catch(c){return console.log(c),null}},createUser:async i=>await o({createdAt:new Date,updatedAt:new Date,emailVerified:!1,...i},"user"),createAccount:async i=>await o({createdAt:new Date,updatedAt:new Date,...i},"account"),listSessions:async i=>{if(n){let c=await n.get(`active-sessions-${i}`);if(!c)return[];let l=K(c)||[],p=Date.now(),m=l.filter(g=>g.expiresAt>p),f=[];for(let g of m){let y=await n.get(g.token);if(y){let h=JSON.parse(y),w=pe(t.options,{...h.session,expiresAt:new Date(h.session.expiresAt)});f.push(w)}}return f}return await e.findMany({model:"session",where:[{field:"userId",value:i}]})},listUsers:async(i,d,c,l)=>await e.findMany({model:"user",limit:i,offset:d,sortBy:c,where:l}),deleteUser:async i=>{await e.deleteMany({model:"session",where:[{field:"userId",value:i}]}),await e.deleteMany({model:"account",where:[{field:"userId",value:i}]}),await e.delete({model:"user",where:[{field:"id",value:i}]})},createSession:async(i,d,c,l)=>{let p=d instanceof Request?d.headers:d,{id:m,...f}=l||{},g={ipAddress:d&&me(d,t.options)||"",userAgent:p?.get("user-agent")||"",...f,expiresAt:c?D(60*60*24,"sec"):D(s,"sec"),userId:i,token:q(32),createdAt:new Date,updatedAt:new Date};return await o(g,"session",n?{fn:async()=>{let h=await e.findOne({model:"user",where:[{field:"id",value:i}]});n.set(g.token,JSON.stringify({session:g,user:h}),s);let w=await n.get(`active-sessions-${i}`),b=[],U=Date.now();return w&&(b=K(w)||[],b=b.filter(Wt=>Wt.expiresAt>U)),b.push({token:g.token,expiresAt:U+s*1e3}),await n.set(`active-sessions-${i}`,JSON.stringify(b),s),g},executeMainFn:r.session?.storeSessionInDatabase}:void 0)},findSession:async i=>{if(n){let p=await n.get(i);if(p){let m=JSON.parse(p),f=pe(t.options,{...m.session,expiresAt:new Date(m.session.expiresAt),createdAt:new Date(m.session.createdAt),updatedAt:new Date(m.session.updatedAt)}),g=Ue(t.options,{...m.user,createdAt:new Date(m.user.createdAt),updatedAt:new Date(m.user.updatedAt)});return{session:f,user:g}}}let d=await e.findOne({model:"session",where:[{value:i,field:"token"}]});if(!d)return null;let c=await e.findOne({model:"user",where:[{value:d.userId,field:"id"}]});if(!c)return null;let l=Ue(t.options,c);return{session:pe(t.options,d),user:l}},findSessions:async i=>{if(n){let p=[];for(let m of i){let f=await n.get(m);if(f){let g=JSON.parse(f),y={session:{...g.session,expiresAt:new Date(g.session.expiresAt)},user:{...g.user,createdAt:new Date(g.user.createdAt),updatedAt:new Date(g.user.updatedAt)}};p.push(y)}}return p}let d=await e.findMany({model:"session",where:[{field:"token",value:i,operator:"in"}]}),c=d.map(p=>p.userId);if(!c.length)return[];let l=await e.findMany({model:"user",where:[{field:"id",value:c,operator:"in"}]});return d.map(p=>{let m=l.find(f=>f.id===p.userId);return m?{session:p,user:m}:null})},updateSession:async(i,d)=>await a(d,[{field:"token",value:i}],"session",n?{async fn(l){let p=await n.get(i),m=null;if(p){let f=JSON.parse(p);return m={...f.session,...l},await n.set(i,JSON.stringify({session:m,user:f.user}),f.session.expiresAt?Math.floor((f.session.expiresAt.getTime()-Date.now())/1e3):s),m}else return null},executeMainFn:r.session?.storeSessionInDatabase}:void 0),deleteSession:async i=>{if(n){await n.delete(i),r.session?.storeSessionInDatabase&&await e.delete({model:"session",where:[{field:"token",value:i}]});return}await e.delete({model:"session",where:[{field:"token",value:i}]})},deleteSessions:async i=>{if(n){if(typeof i=="string"){let d=await n.get(`active-sessions-${i}`),c=d?K(d):[];if(!c)return;for(let l of c)await n.delete(l.token)}else for(let d of i)await n.get(d)&&await n.delete(d);r.session?.storeSessionInDatabase&&await e.deleteMany({model:"session",where:[{field:Array.isArray(i)?"token":"userId",value:i,operator:Array.isArray(i)?"in":void 0}]});return}await e.deleteMany({model:"session",where:[{field:Array.isArray(i)?"token":"userId",value:i,operator:Array.isArray(i)?"in":void 0}]})},findUserByEmail:async(i,d)=>{let c=await e.findOne({model:"user",where:[{value:i.toLowerCase(),field:"email"}]});if(!c)return null;if(d?.includeAccounts){let l=await e.findMany({model:"account",where:[{value:c.id,field:"userId"}]});return{user:c,accounts:l}}return{user:c,accounts:[]}},findUserById:async i=>await e.findOne({model:"user",where:[{field:"id",value:i}]}),linkAccount:async i=>await o({...i,createdAt:new Date,updatedAt:new Date},"account"),updateUser:async(i,d)=>await a(d,[{field:"id",value:i}],"user"),updateUserByEmail:async(i,d)=>await a(d,[{field:"email",value:i}],"user"),updatePassword:async(i,d)=>{await u({password:d},[{field:"userId",value:i},{field:"providerId",value:"credential"}],"account")},findAccounts:async i=>await e.findMany({model:"account",where:[{field:"userId",value:i}]}),findAccount:async i=>await e.findOne({model:"account",where:[{field:"accountId",value:i}]}),findAccountByUserId:async i=>await e.findMany({model:"account",where:[{field:"userId",value:i}]}),updateAccount:async(i,d)=>await a(d,[{field:"id",value:i}],"account"),createVerificationValue:async i=>await o({createdAt:new Date,updatedAt:new Date,...i},"verification"),findVerificationValue:async i=>(await e.findMany({model:"verification",where:[{field:"identifier",value:i}],sortBy:{field:"createdAt",direction:"desc"},limit:10}))[0],deleteVerificationValue:async i=>{await e.delete({model:"verification",where:[{field:"id",value:i}]})},deleteVerificationByIdentifier:async i=>{await e.delete({model:"verification",where:[{field:"identifier",value:i}]})},updateVerificationValue:async(i,d)=>await a(d,[{field:"id",value:i}],"verification")}};var $=e=>{let t=e.plugins?.reduce((i,d)=>{let c=d.schema;if(!c)return i;for(let[l,p]of Object.entries(c))i[l]={fields:{...i[l]?.fields,...p.fields},modelName:p.modelName||l};return i},{}),r=e.rateLimit?.storage==="database",n={rateLimit:{modelName:e.rateLimit?.modelName||"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:s,session:o,account:a,...u}=t||{};return{user:{modelName: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"},...s?.fields,...e.user?.additionalFields},order:1},session:{modelName:e.session?.modelName||"session",fields:{expiresAt:{type:"date",required:!0,fieldName:e.session?.fields?.expiresAt||"expiresAt"},token:{type:"string",required:!0,fieldName:e.session?.fields?.token||"token",unique:!0},createdAt:{type:"date",required:!0,fieldName:e.session?.fields?.createdAt||"createdAt"},updatedAt:{type:"date",required:!0,fieldName:e.session?.fields?.updatedAt||"updatedAt"},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},...o?.fields,...e.session?.additionalFields},order:2},account:{modelName: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"},accessTokenExpiresAt:{type:"date",required:!1,fieldName:e.account?.fields?.accessTokenExpiresAt||"accessTokenExpiresAt"},refreshTokenExpiresAt:{type:"date",required:!1,fieldName:e.account?.fields?.accessTokenExpiresAt||"refreshTokenExpiresAt"},scope:{type:"string",required:!1,fieldName:e.account?.fields?.scope||"scope"},password:{type:"string",required:!1,fieldName:e.account?.fields?.password||"password"},createdAt:{type:"date",required:!0,fieldName:e.account?.fields?.createdAt||"createdAt"},updatedAt:{type:"date",required:!0,fieldName:e.account?.fields?.updatedAt||"updatedAt"},...a?.fields},order:3},verification:{modelName: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"},createdAt:{type:"date",required:!1,defaultValue:()=>new Date,fieldName:e.verification?.fields?.createdAt||"createdAt"},updatedAt:{type:"date",required:!1,defaultValue:()=>new Date,fieldName:e.verification?.fields?.updatedAt||"updatedAt"}},order:4},...u,...r?n:{}}};import{z as ud}from"zod";import{Kysely as qt,MssqlDialect as rn}from"kysely";import{MysqlDialect as Nt,PostgresDialect as jt,SqliteDialect as Ft}from"kysely";function Vt(e){if(!e)return null;if("dialect"in e)return Vt(e.dialect);if("createDriver"in e){if(e instanceof Ft)return"sqlite";if(e instanceof Nt)return"mysql";if(e instanceof jt)return"postgres";if(e instanceof rn)return"mssql"}return"aggregate"in e?"sqlite":"getConnection"in e?"mysql":"connect"in e?"postgres":null}var Ie=async e=>{let t=e.database;if(!t)return{kysely:null,databaseType:null};if("db"in t)return{kysely:t.db,databaseType:t.type};if("dialect"in t)return{kysely:new qt({dialect:t.dialect}),databaseType:t.type};let r,n=Vt(t);return"createDriver"in t&&(r=t),"aggregate"in t&&(r=new Ft({database:t})),"getConnection"in t&&(r=new Nt(t)),"connect"in t&&(r=new jt({pool:t})),{kysely:r?new qt({dialect:r}):null,databaseType:n}};function ge(e,t,r){return r==="update"?e:e==null&&t.defaultValue?typeof t.defaultValue=="function"?t.defaultValue():t.defaultValue:e}var nn=(e,t,r)=>{let n=$(t);function s(d,c){if(c==="id")return c;let l=n[d].fields[c];return l||console.log("Field not found",d,c),l.fieldName||c}function o(d,c,l){let{type:p="sqlite"}=r||{},m=n[c].fields[l];return m.type==="boolean"&&p==="sqlite"&&d!==null&&d!==void 0?d?1:0:m.type==="date"&&d&&d instanceof Date&&p==="sqlite"?d.toISOString():d}function a(d,c,l){let{type:p="sqlite"}=r||{},m=n[c].fields[l];return m.type==="boolean"&&p==="sqlite"&&d!==null?d===1:m.type==="date"&&d?new Date(d):d}function u(d){return n[d].modelName}let i=t?.advanced?.generateId===!1;return{transformInput(d,c,l){let p=i||l==="update"?{}:{id:t.advanced?.generateId?t.advanced.generateId({model:c}):d.id||q()},m=n[c].fields;for(let f in m){let g=d[f];p[m[f].fieldName||f]=ge(o(g,c,f),m[f],l)}return p},transformOutput(d,c,l=[]){if(!d)return null;let p=d.id?l.length===0||l.includes("id")?{id:d.id}:{}:{},m=n[c].fields;for(let f in m){if(l.length&&!l.includes(f))continue;let g=m[f];g&&(p[f]=a(d[g.fieldName||f],c,f))}return p},convertWhereClause(d,c){if(!c)return{and:null,or:null};let l={and:[],or:[]};return c.forEach(p=>{let{field:m,value:f,operator:g="=",connector:y="AND"}=p,h=s(d,m),w=b=>g.toLowerCase()==="in"?b(h,"in",Array.isArray(f)?f:[f]):g==="contains"?b(h,"like",`%${f}%`):g==="starts_with"?b(h,"like",`${f}%`):g==="ends_with"?b(h,"like",`%${f}`):g==="eq"?b(h,"=",f):g==="ne"?b(h,"<>",f):g==="gt"?b(h,">",f):g==="gte"?b(h,">=",f):g==="lt"?b(h,"<",f):g==="lte"?b(h,"<=",f):b(h,g,f);y==="OR"?l.or.push(w):l.and.push(w)}),{and:l.and.length?l.and:null,or:l.or.length?l.or:null}},async withReturning(d,c,l,p){let m;if(r?.type!=="mysql")m=await c.returningAll().executeTakeFirst();else{await c.execute();let f=d.id?"id":p[0].field?p[0].field:"id",g=d[f]||p[0].value;m=await e.selectFrom(u(l)).selectAll().where(s(l,f),"=",g).executeTakeFirst()}return m},getModelName:u,getField:s}},$t=(e,t)=>r=>{let{transformInput:n,withReturning:s,transformOutput:o,convertWhereClause:a,getModelName:u,getField:i}=nn(e,r,t);return{id:"kysely",async create(d){let{model:c,data:l,select:p}=d,m=n(l,c,"create"),f=e.insertInto(u(c)).values(m);return o(await s(m,f,c,[]),c,p)},async findOne(d){let{model:c,where:l,select:p}=d,{and:m,or:f}=a(c,l),g=e.selectFrom(u(c)).selectAll();m&&(g=g.where(h=>h.and(m.map(w=>w(h))))),f&&(g=g.where(h=>h.or(f.map(w=>w(h)))));let y=await g.executeTakeFirst();return y?o(y,c,p):null},async findMany(d){let{model:c,where:l,limit:p,offset:m,sortBy:f}=d,{and:g,or:y}=a(c,l),h=e.selectFrom(u(c));g&&(h=h.where(b=>b.and(g.map(U=>U(b))))),y&&(h=h.where(b=>b.or(y.map(U=>U(b))))),h=h.limit(p||100),m&&(h=h.offset(m)),f&&(h=h.orderBy(i(c,f.field),f.direction));let w=await h.selectAll().execute();return w?w.map(b=>o(b,c)):[]},async update(d){let{model:c,where:l,update:p}=d,{and:m,or:f}=a(c,l),g=n(p,c,"update"),y=e.updateTable(u(c)).set(g);return m&&(y=y.where(w=>w.and(m.map(b=>b(w))))),f&&(y=y.where(w=>w.or(f.map(b=>b(w))))),await o(await s(g,y,c,l),c)},async updateMany(d){let{model:c,where:l,update:p}=d,{and:m,or:f}=a(c,l),g=n(p,c,"update"),y=e.updateTable(u(c)).set(g);return m&&(y=y.where(w=>w.and(m.map(b=>b(w))))),f&&(y=y.where(w=>w.or(f.map(b=>b(w))))),(await y.execute()).length},async delete(d){let{model:c,where:l}=d,{and:p,or:m}=a(c,l),f=e.deleteFrom(u(c));p&&(f=f.where(g=>g.and(p.map(y=>y(g))))),m&&(f=f.where(g=>g.or(m.map(y=>y(g))))),await f.execute()},async deleteMany(d){let{model:c,where:l}=d,{and:p,or:m}=a(c,l),f=e.deleteFrom(u(c));return p&&(f=f.where(g=>g.and(p.map(y=>y(g))))),m&&(f=f.where(g=>g.or(m.map(y=>y(g))))),(await f.execute()).length},options:t}};var on=e=>{let t=$(e);function r(n,s){return s==="id"?s:t[n].fields[s].fieldName||s}return{transformInput(n,s,o){let a=o==="update"?{}:{id:e.advanced?.generateId?e.advanced.generateId({model:s}):n.id||q()},u=t[s].fields;for(let i in u){let d=n[i];d===void 0&&!u[i].defaultValue||(a[u[i].fieldName||i]=ge(d,u[i],o))}return a},transformOutput(n,s,o=[]){if(!n)return null;let a=n.id||n._id?o.length===0||o.includes("id")?{id:n.id}:{}:{},u=t[s].fields;for(let i in u){if(o.length&&!o.includes(i))continue;let d=u[i];d&&(a[i]=n[d.fieldName||i])}return a},convertWhereClause(n,s,o){return s.filter(a=>n.every(u=>{let{field:i,value:d,operator:c}=u,l=r(o,i);if(c==="in"){if(!Array.isArray(d))throw new Error("Value must be an array");return d.includes(a[l])}else return c==="contains"?a[l].includes(d):c==="starts_with"?a[l].startsWith(d):c==="ends_with"?a[l].endsWith(d):a[l]===d}))},getField:r}},zt=e=>t=>{let{transformInput:r,transformOutput:n,convertWhereClause:s,getField:o}=on(t);return{id:"memory",create:async({model:a,data:u})=>{let i=r(u,a,"create");return e[a].push(i),n(i,a)},findOne:async({model:a,where:u,select:i})=>{let d=e[a],l=s(u,d,a)[0]||null;return n(l,a,i)},findMany:async({model:a,where:u,sortBy:i,limit:d,offset:c})=>{let l=e[a];return u&&(l=s(u,l,a)),i&&(l=l.sort((p,m)=>{let f=o(a,i.field);return i.direction==="asc"?p[f]>m[f]?1:-1:p[f]<m[f]?1:-1})),c!==void 0&&(l=l.slice(c)),d!==void 0&&(l=l.slice(0,d)),l.map(p=>n(p,a))},update:async({model:a,where:u,update:i})=>{let d=e[a],c=s(u,d,a);return c.forEach(l=>{Object.assign(l,r(i,a,"update"))}),n(c[0],a)},delete:async({model:a,where:u})=>{let i=e[a],d=s(u,i,a);e[a]=i.filter(c=>!d.includes(c))},deleteMany:async({model:a,where:u})=>{let i=e[a],d=s(u,i,a),c=0;return e[a]=i.filter(l=>d.includes(l)?(c++,!1):!d.includes(l)),c},updateMany(a){let{model:u,where:i,update:d}=a,c=e[u],l=s(i,c,u);return l.forEach(p=>{Object.assign(p,d)}),l[0]||null}}};async function Mt(e){if(!e.database){let n=$(e),s=Object.keys(n).reduce((o,a)=>(o[a]=[],o),{});return E.warn("No database configuration provided. Using memory adapter in development"),zt(s)(e)}if(typeof e.database=="function")return e.database(e);let{kysely:t,databaseType:r}=await Ie(e);if(!t)throw new L("Failed to initialize database adapter");return $t(t,{type:r||"sqlite"})(e)}var Se="better-auth-secret-123456789";import{APIError as Ht}from"better-call";async function Gt(e,t){let n=(await t.context.internalAdapter.findAccounts(e))?.find(a=>a.providerId==="credential"),s=n?.password;if(!n||!s)throw new Ht("BAD_REQUEST",{message:"No password credential found"});if(!await t.context.password.verify(s,t.body.password))throw new Ht("BAD_REQUEST",{message:"Invalid password"});return!0}var Kt=async e=>{let t=await Mt(e),r=e.plugins||[],n=dn(e),s=de(e.logger),o=X(e.baseURL,e.basePath),a=e.secret||P.BETTER_AUTH_SECRET||P.AUTH_SECRET||Se;a===Se&&Y&&s.error("You are using the default secret. Please set `BETTER_AUTH_SECRET` in your environment variables or pass `secret` in your auth config."),e={...e,secret:a,baseURL:o?new URL(o).origin:"",basePath:e.basePath||"/api/auth",plugins:r.concat(n),emailAndPassword:{...e.emailAndPassword,enabled:e.emailAndPassword?.enabled??!1,autoSignIn:e.emailAndPassword?.autoSignIn??!0}};let u=qe(e),i=$(e),d=Object.keys(e.socialProviders||{}).map(m=>{let f=e.socialProviders?.[m];return f.enabled===!1?null:((!f.clientId||!f.clientSecret)&&s.warn(`Social provider ${m} is missing clientId or clientSecret`),ke[m](f))}).filter(m=>m!==null),c=({model:m,size:f})=>typeof e?.advanced?.generateId=="function"?e.advanced.generateId({model:m,size:f}):q(f),l={appName:e.appName||"Better Auth",socialProviders:d,options:e,tables:i,trustedOrigins:cn(e),baseURL:o||"",sessionConfig:{updateAge:e.session?.updateAge!==void 0?e.session.updateAge:24*60*60,expiresIn:e.session?.expiresIn||60*60*24*7,freshAge:e.session?.freshAge||60*5},secret:a,rateLimit:{...e.rateLimit,enabled:e.rateLimit?.enabled??Y,window:e.rateLimit?.window||10,max:e.rateLimit?.max||100,storage:e.rateLimit?.storage||e.secondaryStorage?"secondary-storage":"memory"},authCookies:u,logger:s,generateId:c,session:null,secondaryStorage:e.secondaryStorage,password:{hash:e.emailAndPassword?.password?.hash||Ct,verify:e.emailAndPassword?.password?.verify||Dt,config:{minPasswordLength:e.emailAndPassword?.minPasswordLength||8,maxPasswordLength:e.emailAndPassword?.maxPasswordLength||128},checkPassword:Gt},adapter:t,internalAdapter:Ee(t,{options:e,hooks:e.databaseHooks?[e.databaseHooks]:[],generateId:c}),createAuthCookie:ye(e)},{context:p}=an(l);return p};function an(e){let t=e.options,r=t.plugins||[],n=e,s=[];for(let o of r)if(o.init){let a=o.init(e);typeof a=="object"&&(a.options&&(a.options.databaseHooks&&s.push(a.options.databaseHooks),t=sn(t,a.options)),a.context&&(n={...n,...a.context}))}return s.push(t.databaseHooks),n.internalAdapter=Ee(e.adapter,{options:t,hooks:s.filter(o=>o!==void 0),generateId:e.generateId}),n.options=t,{context:n}}function dn(e){let t=[];return e.advanced?.crossSubDomainCookies?.enabled,t}function cn(e){let t=X(e.baseURL,e.basePath);if(!t)return[];let r=[new URL(t).origin];e.trustedOrigins&&r.push(...e.trustedOrigins);let n=P.BETTER_AUTH_TRUSTED_ORIGINS;return n&&r.push(...n.split(",")),r}var Ac=e=>{let t=Kt(e),{api:r}=Te(t,e);return{handler:async n=>{let s=await t,o=s.options.basePath||"/api/auth",a=new URL(n.url);if(!s.options.baseURL){let i=X(void 0,o)||`${a.origin}${o}`;s.options.baseURL=i,s.baseURL=i}s.trustedOrigins=[...e.trustedOrigins||[],s.baseURL,a.origin];let{handler:u}=Ot(s,e);return u(n)},api:r,options:e,$context:t,$Infer:{}}};export{L as BetterAuthError,G as HIDE_METADATA,Ce as MissingDependencyError,Ac as betterAuth,Bo as capitalizeFirstLetter,ye as createCookieGetter,de as createLogger,N as deleteSessionCookie,q as generateId,ae as generateState,qe as getCookies,be as levels,E as logger,Ln as parseCookies,vn as parseSetCookieHeader,$e as parseState,S as setSessionCookie,br as shouldPublishLog};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "better-auth",
3
- "version": "1.0.6",
3
+ "version": "1.0.7",
4
4
  "description": "The most comprehensive authentication library for TypeScript.",
5
5
  "type": "module",
6
6
  "repository": {