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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- "use strict";var O=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var B=(t,e)=>{for(var r in e)O(t,r,{get:e[r],enumerable:!0})},k=(t,e,r,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of C(e))!v.call(t,n)&&n!==r&&O(t,n,{get:()=>e[n],enumerable:!(i=R(e,n))||i.enumerable});return t};var F=t=>k(O({},"__esModule",{value:!0}),t);var Z={};B(Z,{adminClient:()=>H,anonymousClient:()=>W,emailOTPClient:()=>J,genericOAuthClient:()=>K,getPasskeyActions:()=>x,inferAdditionalFields:()=>D,jwtClient:()=>Q,magicLinkClient:()=>M,multiSessionClient:()=>V,oneTapClient:()=>X,organizationClient:()=>z,passkeyClient:()=>N,phoneNumberClient:()=>q,twoFactorClient:()=>G,usernameClient:()=>j});module.exports=F(Z);var P=require("nanostores");var c=class extends Error{path;constructor(e,r){super(e),this.path=r}},d=class{constructor(e){this.s=e;this.statements=e}statements;newRole(e){return new g(e)}},g=class t{statements;constructor(e){this.statements=e}authorize(e,r){for(let[i,n]of Object.entries(e)){let s=this.statements[i];if(!s)return{success:!1,error:`You are not allowed to access resource: ${i}`};let a=r==="OR"?n.some(o=>s.includes(o)):n.every(o=>s.includes(o));return a?{success:a}:{success:!1,error:`unauthorized to access resource "${i}"`}}return{success:!1,error:"Not authorized"}}static fromString(e){let r=JSON.parse(e);if(typeof r!="object")throw new c("statements is not an object",".");for(let[i,n]of Object.entries(r)){if(typeof i!="string")throw new c("invalid resource identifier",i);if(!Array.isArray(n))throw new c("actions is not an array",i);for(let s=0;s<n.length;s++)if(typeof n[s]!="string")throw new c("action is not a string",`${i}[${s}]`)}return new t(r)}toString(){return JSON.stringify(this.statements)}};var E=t=>new d(t),I={organization:["update","delete"],member:["create","update","delete"],invitation:["create","cancel"]},S=E(I),re=S.newRole({organization:["update"],invitation:["create","cancel"],member:["create","update","delete"]}),ie=S.newRole({organization:["update","delete"],member:["create","update","delete"],invitation:["create","cancel"]}),se=S.newRole({organization:[],member:[],invitation:[]});var $=require("@better-fetch/fetch");var y=Object.create(null),m=t=>globalThis.process?.env||globalThis.Deno?.env.toObject()||globalThis.__env__||(t?y:globalThis),b=new Proxy(y,{get(t,e){return m()[e]??y[e]},has(t,e){let r=m();return e in r||e in y},set(t,e,r){let i=m(!0);return i[e]=r,!0},deleteProperty(t,e){if(!e)return!1;let r=m(!0);return delete r[e],!0},ownKeys(){let t=m(!0);return Object.keys(t)}});function U(t){return t?t!=="false":!1}var _=typeof process<"u"&&process.env&&process.env.NODE_ENV||"";var de=_==="test"||U(b.TEST);var Ie=require("nanostores");var Ae=require("@better-fetch/fetch");var L=require("nanostores");var Te=require("@better-fetch/fetch"),h=require("nanostores"),u=(t,e,r,i)=>{let n=(0,h.atom)({data:null,error:null,isPending:!0,isRefetching:!1}),s=()=>{let o=typeof i=="function"?i({data:n.get().data,error:n.get().error,isPending:n.get().isPending}):i;return r(e,{...o,onSuccess:async l=>{n.set({data:l.data,error:null,isPending:!1,isRefetching:!1}),await o?.onSuccess?.(l)},async onError(l){n.set({error:l.error,data:null,isPending:!1,isRefetching:!1}),await o?.onError?.(l)},async onRequest(l){let f=n.get();n.set({isPending:f.data===null,data:f.data,error:null,isRefetching:!0}),await o?.onRequest?.(l)}})};t=Array.isArray(t)?t:[t];let a=!1;for(let o of t)o.subscribe(()=>{a?s():(0,h.onMount)(n,()=>(s(),a=!0,()=>{n.off(),o.off()}))});return n};var z=t=>{let e=(0,P.atom)(void 0),r=(0,P.atom)(!1),i=(0,P.atom)(!1);return{id:"organization",$InferServerPlugin:{},getActions:n=>({$Infer:{ActiveOrganization:{},Organization:{},Invitation:{},Member:{}},organization:{setActive(s){e.set(s)},hasPermission:async s=>await n("/organization/has-permission",{method:"POST",body:{permission:s.permission},...s.fetchOptions})}}),getAtoms:n=>{let s=u(r,"/organization/list",n,{method:"GET"}),a=u([e,i],"/organization/activate",n,()=>({method:"POST",body:{orgId:e.get()}}));return{$listOrg:r,$activeOrgSignal:i,activeOrganization:a,listOrganizations:s}},atomListeners:[{matcher(n){return n==="/organization/create"||n==="/organization/delete"},signal:"$listOrg"},{matcher(n){return n.startsWith("/organization")},signal:"$activeOrgSignal"}]}};var j=()=>({id:"username",$InferServerPlugin:{}});var p=require("@simplewebauthn/browser");var T=require("nanostores"),x=(t,{_listPasskeys:e})=>({signIn:{passkey:async(n,s)=>{let a=await t("/passkey/generate-authenticate-options",{method:"POST",body:{email:n?.email}});if(!a.data)return a;try{let o=await(0,p.startAuthentication)(a.data,n?.autoFill||!1),l=await t("/passkey/verify-authentication",{body:{response:o},...n?.fetchOptions,...s,method:"POST"});if(!l.data)return l}catch{return{data:null,error:{message:"auth cancelled",status:400,statusText:"BAD_REQUEST"}}}}},passkey:{addPasskey:async(n,s)=>{let a=await t("/passkey/generate-register-options",{method:"GET"});if(!a.data)return a;try{let o=await(0,p.startRegistration)(a.data),l=await t("/passkey/verify-registration",{...n?.fetchOptions,...s,body:{response:o,name:n?.name},method:"POST"});if(!l.data)return l;e.set(Math.random())}catch(o){return o instanceof p.WebAuthnError?o.code==="ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED"?{data:null,error:{message:"previously registered",status:400,statusText:"BAD_REQUEST"}}:o.code==="ERROR_CEREMONY_ABORTED"?{data:null,error:{message:"registration cancelled",status:400,statusText:"BAD_REQUEST"}}:{data:null,error:{message:o.message,status:400,statusText:"BAD_REQUEST"}}:{data:null,error:{message:o instanceof Error?o.message:"unknown error",status:500,statusText:"INTERNAL_SERVER_ERROR"}}}}},$Infer:{}}),N=()=>{let t=(0,T.atom)();return{id:"passkey",$InferServerPlugin:{},getActions:e=>x(e,{_listPasskeys:t}),getAtoms(e){return{listPasskeys:u(t,"/passkey/list-user-passkeys",e,{method:"GET"}),_listPasskeys:t}},pathMethods:{"/passkey/register":"POST","/passkey/authenticate":"POST"},atomListeners:[{matcher(e){return e==="/passkey/verify-registration"||e==="/passkey/delete-passkey"},signal:"_listPasskeys"}]}};var G=(t={redirect:!0,twoFactorPage:"/"})=>({id:"two-factor",$InferServerPlugin:{},atomListeners:[{matcher:e=>e.startsWith("/two-factor/"),signal:"$sessionSignal"}],pathMethods:{"/two-factor/disable":"POST","/two-factor/enable":"POST","/two-factor/send-otp":"POST","/two-factor/generate-backup-codes":"POST"},fetchPlugins:[{id:"two-factor",name:"two-factor",hooks:{async onSuccess(e){e.data?.twoFactorRedirect&&(t.redirect||t.twoFactorPage)&&typeof window<"u"&&(window.location.href=t.twoFactorPage)}}}]});var M=()=>({id:"magic-link",$InferServerPlugin:{}});var q=()=>({id:"phoneNumber",$InferServerPlugin:{},atomListeners:[{matcher(t){return t==="/phone-number/update"||t==="/phone-number/verify"},signal:"$sessionSignal"}]});var W=()=>({id:"anonymous",$InferServerPlugin:{},pathMethods:{"/sign-in/anonymous":"POST"}});var D=t=>({id:"additional-fields-client",$InferServerPlugin:{}});var H=()=>({id:"better-auth-client",$InferServerPlugin:{},pathMethods:{"/admin/list-users":"GET"}});var K=()=>({id:"generic-oauth-client",$InferServerPlugin:{}});var Q=()=>({id:"better-auth-client",$InferServerPlugin:{}});var V=()=>({id:"multi-session",$InferServerPlugin:{},pathMethods:{"/multi-session/sign-out-device-sessions":"POST"},atomListeners:[{matcher(t){return t==="/multi-session/set-active"},signal:"$sessionSignal"}]});var J=()=>({id:"email-otp",$InferServerPlugin:{}});var A=!1,X=t=>({id:"one-tap",getActions:(e,r)=>({oneTap:async(i,n)=>{if(A){console.warn("A Google One Tap request is already in progress. Please wait.");return}A=!0;try{if(typeof window>"u"||!window.document){console.warn("Google One Tap is only available in browser environments");return}let{autoSelect:s,cancelOnTapOutside:a,context:o}=i??{},l=o??t.context??"signin";await Y(),await new Promise(f=>{window.google?.accounts.id.initialize({client_id:t.clientId,callback:async w=>{await e("/one-tap/callback",{method:"POST",body:{idToken:w.credential},...i?.fetchOptions,...n}),(!i?.fetchOptions&&!n||i?.callbackURL)&&(window.location.href=i?.callbackURL??"/"),f()},auto_select:s,cancel_on_tap_outside:a,context:l}),window.google?.accounts.id.prompt()})}catch(s){throw console.error("Error during Google One Tap flow:",s),s}finally{A=!1}}}),getAtoms(e){return{}}}),Y=()=>new Promise(t=>{if(window.googleScriptInitialized){t();return}let e=document.createElement("script");e.src="https://accounts.google.com/gsi/client",e.async=!0,e.defer=!0,e.onload=()=>{window.googleScriptInitialized=!0,t()},document.head.appendChild(e)});0&&(module.exports={adminClient,anonymousClient,emailOTPClient,genericOAuthClient,getPasskeyActions,inferAdditionalFields,jwtClient,magicLinkClient,multiSessionClient,oneTapClient,organizationClient,passkeyClient,phoneNumberClient,twoFactorClient,usernameClient});
1
+ "use strict";var O=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var B=(t,e)=>{for(var r in e)O(t,r,{get:e[r],enumerable:!0})},k=(t,e,r,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of C(e))!v.call(t,n)&&n!==r&&O(t,n,{get:()=>e[n],enumerable:!(i=R(e,n))||i.enumerable});return t};var F=t=>k(O({},"__esModule",{value:!0}),t);var Z={};B(Z,{adminClient:()=>H,anonymousClient:()=>W,emailOTPClient:()=>J,genericOAuthClient:()=>K,getPasskeyActions:()=>x,inferAdditionalFields:()=>D,jwtClient:()=>Q,magicLinkClient:()=>N,multiSessionClient:()=>V,oneTapClient:()=>X,organizationClient:()=>z,passkeyClient:()=>G,phoneNumberClient:()=>q,twoFactorClient:()=>j,usernameClient:()=>M});module.exports=F(Z);var P=require("nanostores");var u=class extends Error{path;constructor(e,r){super(e),this.path=r}},d=class{constructor(e){this.s=e;this.statements=e}statements;newRole(e){return new g(e)}},g=class t{statements;constructor(e){this.statements=e}authorize(e,r){for(let[i,n]of Object.entries(e)){let o=this.statements[i];if(!o)return{success:!1,error:`You are not allowed to access resource: ${i}`};let a=r==="OR"?n.some(s=>o.includes(s)):n.every(s=>o.includes(s));return a?{success:a}:{success:!1,error:`unauthorized to access resource "${i}"`}}return{success:!1,error:"Not authorized"}}static fromString(e){let r=JSON.parse(e);if(typeof r!="object")throw new u("statements is not an object",".");for(let[i,n]of Object.entries(r)){if(typeof i!="string")throw new u("invalid resource identifier",i);if(!Array.isArray(n))throw new u("actions is not an array",i);for(let o=0;o<n.length;o++)if(typeof n[o]!="string")throw new u("action is not a string",`${i}[${o}]`)}return new t(r)}toString(){return JSON.stringify(this.statements)}};var E=t=>new d(t),I={organization:["update","delete"],member:["create","update","delete"],invitation:["create","cancel"]},S=E(I),re=S.newRole({organization:["update"],invitation:["create","cancel"],member:["create","update","delete"]}),ie=S.newRole({organization:["update","delete"],member:["create","update","delete"],invitation:["create","cancel"]}),se=S.newRole({organization:[],member:[],invitation:[]});var L=require("@better-fetch/fetch");var y=Object.create(null),m=t=>globalThis.process?.env||globalThis.Deno?.env.toObject()||globalThis.__env__||(t?y:globalThis),b=new Proxy(y,{get(t,e){return m()[e]??y[e]},has(t,e){let r=m();return e in r||e in y},set(t,e,r){let i=m(!0);return i[e]=r,!0},deleteProperty(t,e){if(!e)return!1;let r=m(!0);return delete r[e],!0},ownKeys(){let t=m(!0);return Object.keys(t)}});function U(t){return t?t!=="false":!1}var $=typeof process<"u"&&process.env&&process.env.NODE_ENV||"";var de=$==="test"||U(b.TEST);var Ie=require("nanostores");var Ae=require("@better-fetch/fetch");var _=require("nanostores");var Te=require("@better-fetch/fetch"),h=require("nanostores"),c=(t,e,r,i)=>{let n=(0,h.atom)({data:null,error:null,isPending:!0,isRefetching:!1}),o=()=>{let s=typeof i=="function"?i({data:n.get().data,error:n.get().error,isPending:n.get().isPending}):i;return r(e,{...s,onSuccess:async l=>{n.set({data:l.data,error:null,isPending:!1,isRefetching:!1}),await s?.onSuccess?.(l)},async onError(l){n.set({error:l.error,data:null,isPending:!1,isRefetching:!1}),await s?.onError?.(l)},async onRequest(l){let f=n.get();n.set({isPending:f.data===null,data:f.data,error:null,isRefetching:!0}),await s?.onRequest?.(l)}})};t=Array.isArray(t)?t:[t];let a=!1;for(let s of t)s.subscribe(()=>{a?o():(0,h.onMount)(n,()=>(o(),a=!0,()=>{n.off(),s.off()}))});return n};var z=t=>{let e=(0,P.atom)(!1),r=(0,P.atom)(!1),i=(0,P.atom)(!1);return{id:"organization",$InferServerPlugin:{},getActions:n=>({$Infer:{ActiveOrganization:{},Organization:{},Invitation:{},Member:{}},organization:{hasPermission:async o=>await n("/organization/has-permission",{method:"POST",body:{permission:o.permission},...o.fetchOptions})}}),getAtoms:n=>{let o=c(e,"/organization/list",n,{method:"GET"}),a=c([r],"/organization/get-full-organization",n,()=>({method:"GET"})),s=c([i],"/organization/get-active-member",n,{method:"GET"});return{$listOrg:e,$activeOrgSignal:r,$activeMemberSignal:i,activeOrganization:a,listOrganizations:o,activeMember:s}},atomListeners:[{matcher(n){return n==="/organization/create"||n==="/organization/delete"},signal:"$listOrg"},{matcher(n){return n.startsWith("/organization")},signal:"$activeOrgSignal"},{matcher(n){return n.includes("/organization/update-member-role")},signal:"$activeMemberSignal"}]}};var M=()=>({id:"username",$InferServerPlugin:{}});var p=require("@simplewebauthn/browser");var T=require("nanostores"),x=(t,{$listPasskeys:e})=>({signIn:{passkey:async(n,o)=>{let a=await t("/passkey/generate-authenticate-options",{method:"POST",body:{email:n?.email}});if(!a.data)return a;try{let s=await(0,p.startAuthentication)(a.data,n?.autoFill||!1),l=await t("/passkey/verify-authentication",{body:{response:s},...n?.fetchOptions,...o,method:"POST"});if(!l.data)return l}catch{return{data:null,error:{message:"auth cancelled",status:400,statusText:"BAD_REQUEST"}}}}},passkey:{addPasskey:async(n,o)=>{let a=await t("/passkey/generate-register-options",{method:"GET"});if(!a.data)return a;try{let s=await(0,p.startRegistration)(a.data),l=await t("/passkey/verify-registration",{...n?.fetchOptions,...o,body:{response:s,name:n?.name},method:"POST"});if(!l.data)return l;e.set(Math.random())}catch(s){return s instanceof p.WebAuthnError?s.code==="ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED"?{data:null,error:{message:"previously registered",status:400,statusText:"BAD_REQUEST"}}:s.code==="ERROR_CEREMONY_ABORTED"?{data:null,error:{message:"registration cancelled",status:400,statusText:"BAD_REQUEST"}}:{data:null,error:{message:s.message,status:400,statusText:"BAD_REQUEST"}}:{data:null,error:{message:s instanceof Error?s.message:"unknown error",status:500,statusText:"INTERNAL_SERVER_ERROR"}}}}},$Infer:{}}),G=()=>{let t=(0,T.atom)();return{id:"passkey",$InferServerPlugin:{},getActions:e=>x(e,{$listPasskeys:t}),getAtoms(e){return{listPasskeys:c(t,"/passkey/list-user-passkeys",e,{method:"GET"}),$listPasskeys:t}},pathMethods:{"/passkey/register":"POST","/passkey/authenticate":"POST"},atomListeners:[{matcher(e){return e==="/passkey/verify-registration"||e==="/passkey/delete-passkey"},signal:"_listPasskeys"}]}};var j=(t={redirect:!0,twoFactorPage:"/"})=>({id:"two-factor",$InferServerPlugin:{},atomListeners:[{matcher:e=>e.startsWith("/two-factor/"),signal:"$sessionSignal"}],pathMethods:{"/two-factor/disable":"POST","/two-factor/enable":"POST","/two-factor/send-otp":"POST","/two-factor/generate-backup-codes":"POST"},fetchPlugins:[{id:"two-factor",name:"two-factor",hooks:{async onSuccess(e){e.data?.twoFactorRedirect&&(t.redirect||t.twoFactorPage)&&typeof window<"u"&&(window.location.href=t.twoFactorPage)}}}]});var N=()=>({id:"magic-link",$InferServerPlugin:{}});var q=()=>({id:"phoneNumber",$InferServerPlugin:{},atomListeners:[{matcher(t){return t==="/phone-number/update"||t==="/phone-number/verify"},signal:"$sessionSignal"}]});var W=()=>({id:"anonymous",$InferServerPlugin:{},pathMethods:{"/sign-in/anonymous":"POST"}});var D=t=>({id:"additional-fields-client",$InferServerPlugin:{}});var H=()=>({id:"better-auth-client",$InferServerPlugin:{},pathMethods:{"/admin/list-users":"GET"}});var K=()=>({id:"generic-oauth-client",$InferServerPlugin:{}});var Q=()=>({id:"better-auth-client",$InferServerPlugin:{}});var V=()=>({id:"multi-session",$InferServerPlugin:{},pathMethods:{"/multi-session/sign-out-device-sessions":"POST"},atomListeners:[{matcher(t){return t==="/multi-session/set-active"},signal:"$sessionSignal"}]});var J=()=>({id:"email-otp",$InferServerPlugin:{}});var A=!1,X=t=>({id:"one-tap",getActions:(e,r)=>({oneTap:async(i,n)=>{if(A){console.warn("A Google One Tap request is already in progress. Please wait.");return}A=!0;try{if(typeof window>"u"||!window.document){console.warn("Google One Tap is only available in browser environments");return}let{autoSelect:o,cancelOnTapOutside:a,context:s}=i??{},l=s??t.context??"signin";await Y(),await new Promise(f=>{window.google?.accounts.id.initialize({client_id:t.clientId,callback:async w=>{await e("/one-tap/callback",{method:"POST",body:{idToken:w.credential},...i?.fetchOptions,...n}),(!i?.fetchOptions&&!n||i?.callbackURL)&&(window.location.href=i?.callbackURL??"/"),f()},auto_select:o,cancel_on_tap_outside:a,context:l}),window.google?.accounts.id.prompt()})}catch(o){throw console.error("Error during Google One Tap flow:",o),o}finally{A=!1}}}),getAtoms(e){return{}}}),Y=()=>new Promise(t=>{if(window.googleScriptInitialized){t();return}let e=document.createElement("script");e.src="https://accounts.google.com/gsi/client",e.async=!0,e.defer=!0,e.onload=()=>{window.googleScriptInitialized=!0,t()},document.head.appendChild(e)});0&&(module.exports={adminClient,anonymousClient,emailOTPClient,genericOAuthClient,getPasskeyActions,inferAdditionalFields,jwtClient,magicLinkClient,multiSessionClient,oneTapClient,organizationClient,passkeyClient,phoneNumberClient,twoFactorClient,usernameClient});
@@ -1,6 +1,6 @@
1
1
  import * as nanostores from 'nanostores';
2
- import { o as organization, q as Organization, M as Member, I as Invitation, r as AccessControl, S as StatementsPrimitive, R as Role, u as username, m as magicLink, d as phoneNumber, e as anonymous, i as admin, j as genericOAuth, k as jwt, l as multiSession, n as emailOTP } from '../index-x8I2g2EY.cjs';
3
- export { g as getPasskeyActions, c as passkeyClient, a as twoFactorClient } from '../index-x8I2g2EY.cjs';
2
+ import { o as organization, q as Organization, M as Member, I as Invitation, r as AccessControl, S as StatementsPrimitive, R as Role, u as username, m as magicLink, d as phoneNumber, e as anonymous, i as admin, j as genericOAuth, k as jwt, l as multiSession, n as emailOTP } from '../index-BCww38p0.cjs';
3
+ export { g as getPasskeyActions, c as passkeyClient, a as twoFactorClient } from '../index-BCww38p0.cjs';
4
4
  import * as _better_fetch_fetch from '@better-fetch/fetch';
5
5
  import { BetterFetchOption } from '@better-fetch/fetch';
6
6
  import { P as Prettify } from '../index-DUqGSAH3.cjs';
@@ -30,7 +30,7 @@ declare const organizationClient: <O extends OrganizationClientOptions>(options?
30
30
  id: string;
31
31
  name: string;
32
32
  email: string;
33
- image: string;
33
+ image?: string;
34
34
  };
35
35
  }>[];
36
36
  invitations: Invitation[];
@@ -40,7 +40,6 @@ declare const organizationClient: <O extends OrganizationClientOptions>(options?
40
40
  Member: Member;
41
41
  };
42
42
  organization: {
43
- setActive(orgId: string | null): void;
44
43
  hasPermission: (data: {
45
44
  permission: Partial<{ [key in keyof (O["ac"] extends AccessControl<infer S extends StatementsPrimitive> ? S extends Record<string, any[]> ? S & {
46
45
  readonly organization: readonly ["update", "delete"];
@@ -86,6 +85,7 @@ declare const organizationClient: <O extends OrganizationClientOptions>(options?
86
85
  getAtoms: ($fetch: _better_fetch_fetch.BetterFetch) => {
87
86
  $listOrg: nanostores.PreinitializedWritableAtom<boolean>;
88
87
  $activeOrgSignal: nanostores.PreinitializedWritableAtom<boolean>;
88
+ $activeMemberSignal: nanostores.PreinitializedWritableAtom<boolean>;
89
89
  activeOrganization: nanostores.PreinitializedWritableAtom<{
90
90
  data: Prettify<{
91
91
  id: string;
@@ -122,6 +122,19 @@ declare const organizationClient: <O extends OrganizationClientOptions>(options?
122
122
  isPending: boolean;
123
123
  isRefetching: boolean;
124
124
  }>;
125
+ activeMember: nanostores.PreinitializedWritableAtom<{
126
+ data: {
127
+ id: string;
128
+ createdAt: Date;
129
+ email: string;
130
+ organizationId: string;
131
+ userId: string;
132
+ role: "admin" | "member" | "owner";
133
+ } | null;
134
+ error: null | _better_fetch_fetch.BetterFetchError;
135
+ isPending: boolean;
136
+ isRefetching: boolean;
137
+ }>;
125
138
  };
126
139
  atomListeners: ({
127
140
  matcher(path: string): path is "/organization/create" | "/organization/delete";
@@ -129,6 +142,9 @@ declare const organizationClient: <O extends OrganizationClientOptions>(options?
129
142
  } | {
130
143
  matcher(path: string): boolean;
131
144
  signal: "$activeOrgSignal";
145
+ } | {
146
+ matcher(path: string): boolean;
147
+ signal: "$activeMemberSignal";
132
148
  })[];
133
149
  };
134
150
 
@@ -1,6 +1,6 @@
1
1
  import * as nanostores from 'nanostores';
2
- import { o as organization, q as Organization, M as Member, I as Invitation, r as AccessControl, S as StatementsPrimitive, R as Role, u as username, m as magicLink, d as phoneNumber, e as anonymous, i as admin, j as genericOAuth, k as jwt, l as multiSession, n as emailOTP } from '../index-CUC7PVVh.js';
3
- export { g as getPasskeyActions, c as passkeyClient, a as twoFactorClient } from '../index-CUC7PVVh.js';
2
+ import { o as organization, q as Organization, M as Member, I as Invitation, r as AccessControl, S as StatementsPrimitive, R as Role, u as username, m as magicLink, d as phoneNumber, e as anonymous, i as admin, j as genericOAuth, k as jwt, l as multiSession, n as emailOTP } from '../index-6Fy0Ylm9.js';
3
+ export { g as getPasskeyActions, c as passkeyClient, a as twoFactorClient } from '../index-6Fy0Ylm9.js';
4
4
  import * as _better_fetch_fetch from '@better-fetch/fetch';
5
5
  import { BetterFetchOption } from '@better-fetch/fetch';
6
6
  import { P as Prettify } from '../index-DUqGSAH3.js';
@@ -30,7 +30,7 @@ declare const organizationClient: <O extends OrganizationClientOptions>(options?
30
30
  id: string;
31
31
  name: string;
32
32
  email: string;
33
- image: string;
33
+ image?: string;
34
34
  };
35
35
  }>[];
36
36
  invitations: Invitation[];
@@ -40,7 +40,6 @@ declare const organizationClient: <O extends OrganizationClientOptions>(options?
40
40
  Member: Member;
41
41
  };
42
42
  organization: {
43
- setActive(orgId: string | null): void;
44
43
  hasPermission: (data: {
45
44
  permission: Partial<{ [key in keyof (O["ac"] extends AccessControl<infer S extends StatementsPrimitive> ? S extends Record<string, any[]> ? S & {
46
45
  readonly organization: readonly ["update", "delete"];
@@ -86,6 +85,7 @@ declare const organizationClient: <O extends OrganizationClientOptions>(options?
86
85
  getAtoms: ($fetch: _better_fetch_fetch.BetterFetch) => {
87
86
  $listOrg: nanostores.PreinitializedWritableAtom<boolean>;
88
87
  $activeOrgSignal: nanostores.PreinitializedWritableAtom<boolean>;
88
+ $activeMemberSignal: nanostores.PreinitializedWritableAtom<boolean>;
89
89
  activeOrganization: nanostores.PreinitializedWritableAtom<{
90
90
  data: Prettify<{
91
91
  id: string;
@@ -122,6 +122,19 @@ declare const organizationClient: <O extends OrganizationClientOptions>(options?
122
122
  isPending: boolean;
123
123
  isRefetching: boolean;
124
124
  }>;
125
+ activeMember: nanostores.PreinitializedWritableAtom<{
126
+ data: {
127
+ id: string;
128
+ createdAt: Date;
129
+ email: string;
130
+ organizationId: string;
131
+ userId: string;
132
+ role: "admin" | "member" | "owner";
133
+ } | null;
134
+ error: null | _better_fetch_fetch.BetterFetchError;
135
+ isPending: boolean;
136
+ isRefetching: boolean;
137
+ }>;
125
138
  };
126
139
  atomListeners: ({
127
140
  matcher(path: string): path is "/organization/create" | "/organization/delete";
@@ -129,6 +142,9 @@ declare const organizationClient: <O extends OrganizationClientOptions>(options?
129
142
  } | {
130
143
  matcher(path: string): boolean;
131
144
  signal: "$activeOrgSignal";
145
+ } | {
146
+ matcher(path: string): boolean;
147
+ signal: "$activeMemberSignal";
132
148
  })[];
133
149
  };
134
150
 
@@ -1 +1 @@
1
- import{atom as h}from"nanostores";var c=class extends Error{path;constructor(e,o){super(e),this.path=o}},f=class{constructor(e){this.s=e;this.statements=e}statements;newRole(e){return new d(e)}},d=class t{statements;constructor(e){this.statements=e}authorize(e,o){for(let[s,n]of Object.entries(e)){let r=this.statements[s];if(!r)return{success:!1,error:`You are not allowed to access resource: ${s}`};let a=o==="OR"?n.some(i=>r.includes(i)):n.every(i=>r.includes(i));return a?{success:a}:{success:!1,error:`unauthorized to access resource "${s}"`}}return{success:!1,error:"Not authorized"}}static fromString(e){let o=JSON.parse(e);if(typeof o!="object")throw new c("statements is not an object",".");for(let[s,n]of Object.entries(o)){if(typeof s!="string")throw new c("invalid resource identifier",s);if(!Array.isArray(n))throw new c("actions is not an array",s);for(let r=0;r<n.length;r++)if(typeof n[r]!="string")throw new c("action is not a string",`${s}[${r}]`)}return new t(o)}toString(){return JSON.stringify(this.statements)}};var A=t=>new f(t),b={organization:["update","delete"],member:["create","update","delete"],invitation:["create","cancel"]},y=A(b),_=y.newRole({organization:["update"],invitation:["create","cancel"],member:["create","update","delete"]}),L=y.newRole({organization:["update","delete"],member:["create","update","delete"],invitation:["create","cancel"]}),$=y.newRole({organization:[],member:[],invitation:[]});import{createFetch as de}from"@better-fetch/fetch";var g=Object.create(null),p=t=>globalThis.process?.env||globalThis.Deno?.env.toObject()||globalThis.__env__||(t?g:globalThis),O=new Proxy(g,{get(t,e){return p()[e]??g[e]},has(t,e){let o=p();return e in o||e in g},set(t,e,o){let s=p(!0);return s[e]=o,!0},deleteProperty(t,e){if(!e)return!1;let o=p(!0);return delete o[e],!0},ownKeys(){let t=p(!0);return Object.keys(t)}});function T(t){return t?t!=="false":!1}var x=typeof process<"u"&&process.env&&process.env.NODE_ENV||"";var H=x==="test"||T(O.TEST);import"nanostores";import"@better-fetch/fetch";import{atom as oe}from"nanostores";import"@better-fetch/fetch";import{atom as w,onMount as R}from"nanostores";var u=(t,e,o,s)=>{let n=w({data:null,error:null,isPending:!0,isRefetching:!1}),r=()=>{let i=typeof s=="function"?s({data:n.get().data,error:n.get().error,isPending:n.get().isPending}):s;return o(e,{...i,onSuccess:async l=>{n.set({data:l.data,error:null,isPending:!1,isRefetching:!1}),await i?.onSuccess?.(l)},async onError(l){n.set({error:l.error,data:null,isPending:!1,isRefetching:!1}),await i?.onError?.(l)},async onRequest(l){let m=n.get();n.set({isPending:m.data===null,data:m.data,error:null,isRefetching:!0}),await i?.onRequest?.(l)}})};t=Array.isArray(t)?t:[t];let a=!1;for(let i of t)i.subscribe(()=>{a?r():R(n,()=>(r(),a=!0,()=>{n.off(),i.off()}))});return n};var $e=t=>{let e=h(void 0),o=h(!1),s=h(!1);return{id:"organization",$InferServerPlugin:{},getActions:n=>({$Infer:{ActiveOrganization:{},Organization:{},Invitation:{},Member:{}},organization:{setActive(r){e.set(r)},hasPermission:async r=>await n("/organization/has-permission",{method:"POST",body:{permission:r.permission},...r.fetchOptions})}}),getAtoms:n=>{let r=u(o,"/organization/list",n,{method:"GET"}),a=u([e,s],"/organization/activate",n,()=>({method:"POST",body:{orgId:e.get()}}));return{$listOrg:o,$activeOrgSignal:s,activeOrganization:a,listOrganizations:r}},atomListeners:[{matcher(n){return n==="/organization/create"||n==="/organization/delete"},signal:"$listOrg"},{matcher(n){return n.startsWith("/organization")},signal:"$activeOrgSignal"}]}};var je=()=>({id:"username",$InferServerPlugin:{}});import{WebAuthnError as C,startAuthentication as v,startRegistration as B}from"@simplewebauthn/browser";import{atom as k}from"nanostores";var F=(t,{_listPasskeys:e})=>({signIn:{passkey:async(n,r)=>{let a=await t("/passkey/generate-authenticate-options",{method:"POST",body:{email:n?.email}});if(!a.data)return a;try{let i=await v(a.data,n?.autoFill||!1),l=await t("/passkey/verify-authentication",{body:{response:i},...n?.fetchOptions,...r,method:"POST"});if(!l.data)return l}catch{return{data:null,error:{message:"auth cancelled",status:400,statusText:"BAD_REQUEST"}}}}},passkey:{addPasskey:async(n,r)=>{let a=await t("/passkey/generate-register-options",{method:"GET"});if(!a.data)return a;try{let i=await B(a.data),l=await t("/passkey/verify-registration",{...n?.fetchOptions,...r,body:{response:i,name:n?.name},method:"POST"});if(!l.data)return l;e.set(Math.random())}catch(i){return i instanceof C?i.code==="ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED"?{data:null,error:{message:"previously registered",status:400,statusText:"BAD_REQUEST"}}:i.code==="ERROR_CEREMONY_ABORTED"?{data:null,error:{message:"registration cancelled",status:400,statusText:"BAD_REQUEST"}}:{data:null,error:{message:i.message,status:400,statusText:"BAD_REQUEST"}}:{data:null,error:{message:i instanceof Error?i.message:"unknown error",status:500,statusText:"INTERNAL_SERVER_ERROR"}}}}},$Infer:{}}),We=()=>{let t=k();return{id:"passkey",$InferServerPlugin:{},getActions:e=>F(e,{_listPasskeys:t}),getAtoms(e){return{listPasskeys:u(t,"/passkey/list-user-passkeys",e,{method:"GET"}),_listPasskeys:t}},pathMethods:{"/passkey/register":"POST","/passkey/authenticate":"POST"},atomListeners:[{matcher(e){return e==="/passkey/verify-registration"||e==="/passkey/delete-passkey"},signal:"_listPasskeys"}]}};var He=(t={redirect:!0,twoFactorPage:"/"})=>({id:"two-factor",$InferServerPlugin:{},atomListeners:[{matcher:e=>e.startsWith("/two-factor/"),signal:"$sessionSignal"}],pathMethods:{"/two-factor/disable":"POST","/two-factor/enable":"POST","/two-factor/send-otp":"POST","/two-factor/generate-backup-codes":"POST"},fetchPlugins:[{id:"two-factor",name:"two-factor",hooks:{async onSuccess(e){e.data?.twoFactorRedirect&&(t.redirect||t.twoFactorPage)&&typeof window<"u"&&(window.location.href=t.twoFactorPage)}}}]});var Qe=()=>({id:"magic-link",$InferServerPlugin:{}});var Je=()=>({id:"phoneNumber",$InferServerPlugin:{},atomListeners:[{matcher(t){return t==="/phone-number/update"||t==="/phone-number/verify"},signal:"$sessionSignal"}]});var Ye=()=>({id:"anonymous",$InferServerPlugin:{},pathMethods:{"/sign-in/anonymous":"POST"}});var et=t=>({id:"additional-fields-client",$InferServerPlugin:{}});var nt=()=>({id:"better-auth-client",$InferServerPlugin:{},pathMethods:{"/admin/list-users":"GET"}});var it=()=>({id:"generic-oauth-client",$InferServerPlugin:{}});var ot=()=>({id:"better-auth-client",$InferServerPlugin:{}});var lt=()=>({id:"multi-session",$InferServerPlugin:{},pathMethods:{"/multi-session/sign-out-device-sessions":"POST"},atomListeners:[{matcher(t){return t==="/multi-session/set-active"},signal:"$sessionSignal"}]});var ut=()=>({id:"email-otp",$InferServerPlugin:{}});var P=!1,mt=t=>({id:"one-tap",getActions:(e,o)=>({oneTap:async(s,n)=>{if(P){console.warn("A Google One Tap request is already in progress. Please wait.");return}P=!0;try{if(typeof window>"u"||!window.document){console.warn("Google One Tap is only available in browser environments");return}let{autoSelect:r,cancelOnTapOutside:a,context:i}=s??{},l=i??t.context??"signin";await E(),await new Promise(m=>{window.google?.accounts.id.initialize({client_id:t.clientId,callback:async S=>{await e("/one-tap/callback",{method:"POST",body:{idToken:S.credential},...s?.fetchOptions,...n}),(!s?.fetchOptions&&!n||s?.callbackURL)&&(window.location.href=s?.callbackURL??"/"),m()},auto_select:r,cancel_on_tap_outside:a,context:l}),window.google?.accounts.id.prompt()})}catch(r){throw console.error("Error during Google One Tap flow:",r),r}finally{P=!1}}}),getAtoms(e){return{}}}),E=()=>new Promise(t=>{if(window.googleScriptInitialized){t();return}let e=document.createElement("script");e.src="https://accounts.google.com/gsi/client",e.async=!0,e.defer=!0,e.onload=()=>{window.googleScriptInitialized=!0,t()},document.head.appendChild(e)});export{nt as adminClient,Ye as anonymousClient,ut as emailOTPClient,it as genericOAuthClient,F as getPasskeyActions,et as inferAdditionalFields,ot as jwtClient,Qe as magicLinkClient,lt as multiSessionClient,mt as oneTapClient,$e as organizationClient,We as passkeyClient,Je as phoneNumberClient,He as twoFactorClient,je as usernameClient};
1
+ import{atom as h}from"nanostores";var u=class extends Error{path;constructor(e,o){super(e),this.path=o}},f=class{constructor(e){this.s=e;this.statements=e}statements;newRole(e){return new d(e)}},d=class t{statements;constructor(e){this.statements=e}authorize(e,o){for(let[s,n]of Object.entries(e)){let i=this.statements[s];if(!i)return{success:!1,error:`You are not allowed to access resource: ${s}`};let a=o==="OR"?n.some(r=>i.includes(r)):n.every(r=>i.includes(r));return a?{success:a}:{success:!1,error:`unauthorized to access resource "${s}"`}}return{success:!1,error:"Not authorized"}}static fromString(e){let o=JSON.parse(e);if(typeof o!="object")throw new u("statements is not an object",".");for(let[s,n]of Object.entries(o)){if(typeof s!="string")throw new u("invalid resource identifier",s);if(!Array.isArray(n))throw new u("actions is not an array",s);for(let i=0;i<n.length;i++)if(typeof n[i]!="string")throw new u("action is not a string",`${s}[${i}]`)}return new t(o)}toString(){return JSON.stringify(this.statements)}};var A=t=>new f(t),b={organization:["update","delete"],member:["create","update","delete"],invitation:["create","cancel"]},y=A(b),$=y.newRole({organization:["update"],invitation:["create","cancel"],member:["create","update","delete"]}),_=y.newRole({organization:["update","delete"],member:["create","update","delete"],invitation:["create","cancel"]}),L=y.newRole({organization:[],member:[],invitation:[]});import{createFetch as de}from"@better-fetch/fetch";var g=Object.create(null),p=t=>globalThis.process?.env||globalThis.Deno?.env.toObject()||globalThis.__env__||(t?g:globalThis),O=new Proxy(g,{get(t,e){return p()[e]??g[e]},has(t,e){let o=p();return e in o||e in g},set(t,e,o){let s=p(!0);return s[e]=o,!0},deleteProperty(t,e){if(!e)return!1;let o=p(!0);return delete o[e],!0},ownKeys(){let t=p(!0);return Object.keys(t)}});function T(t){return t?t!=="false":!1}var x=typeof process<"u"&&process.env&&process.env.NODE_ENV||"";var H=x==="test"||T(O.TEST);import"nanostores";import"@better-fetch/fetch";import{atom as oe}from"nanostores";import"@better-fetch/fetch";import{atom as w,onMount as R}from"nanostores";var c=(t,e,o,s)=>{let n=w({data:null,error:null,isPending:!0,isRefetching:!1}),i=()=>{let r=typeof s=="function"?s({data:n.get().data,error:n.get().error,isPending:n.get().isPending}):s;return o(e,{...r,onSuccess:async l=>{n.set({data:l.data,error:null,isPending:!1,isRefetching:!1}),await r?.onSuccess?.(l)},async onError(l){n.set({error:l.error,data:null,isPending:!1,isRefetching:!1}),await r?.onError?.(l)},async onRequest(l){let m=n.get();n.set({isPending:m.data===null,data:m.data,error:null,isRefetching:!0}),await r?.onRequest?.(l)}})};t=Array.isArray(t)?t:[t];let a=!1;for(let r of t)r.subscribe(()=>{a?i():R(n,()=>(i(),a=!0,()=>{n.off(),r.off()}))});return n};var Le=t=>{let e=h(!1),o=h(!1),s=h(!1);return{id:"organization",$InferServerPlugin:{},getActions:n=>({$Infer:{ActiveOrganization:{},Organization:{},Invitation:{},Member:{}},organization:{hasPermission:async i=>await n("/organization/has-permission",{method:"POST",body:{permission:i.permission},...i.fetchOptions})}}),getAtoms:n=>{let i=c(e,"/organization/list",n,{method:"GET"}),a=c([o],"/organization/get-full-organization",n,()=>({method:"GET"})),r=c([s],"/organization/get-active-member",n,{method:"GET"});return{$listOrg:e,$activeOrgSignal:o,$activeMemberSignal:s,activeOrganization:a,listOrganizations:i,activeMember:r}},atomListeners:[{matcher(n){return n==="/organization/create"||n==="/organization/delete"},signal:"$listOrg"},{matcher(n){return n.startsWith("/organization")},signal:"$activeOrgSignal"},{matcher(n){return n.includes("/organization/update-member-role")},signal:"$activeMemberSignal"}]}};var Me=()=>({id:"username",$InferServerPlugin:{}});import{WebAuthnError as C,startAuthentication as v,startRegistration as B}from"@simplewebauthn/browser";import{atom as k}from"nanostores";var F=(t,{$listPasskeys:e})=>({signIn:{passkey:async(n,i)=>{let a=await t("/passkey/generate-authenticate-options",{method:"POST",body:{email:n?.email}});if(!a.data)return a;try{let r=await v(a.data,n?.autoFill||!1),l=await t("/passkey/verify-authentication",{body:{response:r},...n?.fetchOptions,...i,method:"POST"});if(!l.data)return l}catch{return{data:null,error:{message:"auth cancelled",status:400,statusText:"BAD_REQUEST"}}}}},passkey:{addPasskey:async(n,i)=>{let a=await t("/passkey/generate-register-options",{method:"GET"});if(!a.data)return a;try{let r=await B(a.data),l=await t("/passkey/verify-registration",{...n?.fetchOptions,...i,body:{response:r,name:n?.name},method:"POST"});if(!l.data)return l;e.set(Math.random())}catch(r){return r instanceof C?r.code==="ERROR_AUTHENTICATOR_PREVIOUSLY_REGISTERED"?{data:null,error:{message:"previously registered",status:400,statusText:"BAD_REQUEST"}}:r.code==="ERROR_CEREMONY_ABORTED"?{data:null,error:{message:"registration cancelled",status:400,statusText:"BAD_REQUEST"}}:{data:null,error:{message:r.message,status:400,statusText:"BAD_REQUEST"}}:{data:null,error:{message:r instanceof Error?r.message:"unknown error",status:500,statusText:"INTERNAL_SERVER_ERROR"}}}}},$Infer:{}}),We=()=>{let t=k();return{id:"passkey",$InferServerPlugin:{},getActions:e=>F(e,{$listPasskeys:t}),getAtoms(e){return{listPasskeys:c(t,"/passkey/list-user-passkeys",e,{method:"GET"}),$listPasskeys:t}},pathMethods:{"/passkey/register":"POST","/passkey/authenticate":"POST"},atomListeners:[{matcher(e){return e==="/passkey/verify-registration"||e==="/passkey/delete-passkey"},signal:"_listPasskeys"}]}};var He=(t={redirect:!0,twoFactorPage:"/"})=>({id:"two-factor",$InferServerPlugin:{},atomListeners:[{matcher:e=>e.startsWith("/two-factor/"),signal:"$sessionSignal"}],pathMethods:{"/two-factor/disable":"POST","/two-factor/enable":"POST","/two-factor/send-otp":"POST","/two-factor/generate-backup-codes":"POST"},fetchPlugins:[{id:"two-factor",name:"two-factor",hooks:{async onSuccess(e){e.data?.twoFactorRedirect&&(t.redirect||t.twoFactorPage)&&typeof window<"u"&&(window.location.href=t.twoFactorPage)}}}]});var Qe=()=>({id:"magic-link",$InferServerPlugin:{}});var Je=()=>({id:"phoneNumber",$InferServerPlugin:{},atomListeners:[{matcher(t){return t==="/phone-number/update"||t==="/phone-number/verify"},signal:"$sessionSignal"}]});var Ye=()=>({id:"anonymous",$InferServerPlugin:{},pathMethods:{"/sign-in/anonymous":"POST"}});var et=t=>({id:"additional-fields-client",$InferServerPlugin:{}});var nt=()=>({id:"better-auth-client",$InferServerPlugin:{},pathMethods:{"/admin/list-users":"GET"}});var it=()=>({id:"generic-oauth-client",$InferServerPlugin:{}});var ot=()=>({id:"better-auth-client",$InferServerPlugin:{}});var lt=()=>({id:"multi-session",$InferServerPlugin:{},pathMethods:{"/multi-session/sign-out-device-sessions":"POST"},atomListeners:[{matcher(t){return t==="/multi-session/set-active"},signal:"$sessionSignal"}]});var ut=()=>({id:"email-otp",$InferServerPlugin:{}});var P=!1,mt=t=>({id:"one-tap",getActions:(e,o)=>({oneTap:async(s,n)=>{if(P){console.warn("A Google One Tap request is already in progress. Please wait.");return}P=!0;try{if(typeof window>"u"||!window.document){console.warn("Google One Tap is only available in browser environments");return}let{autoSelect:i,cancelOnTapOutside:a,context:r}=s??{},l=r??t.context??"signin";await E(),await new Promise(m=>{window.google?.accounts.id.initialize({client_id:t.clientId,callback:async S=>{await e("/one-tap/callback",{method:"POST",body:{idToken:S.credential},...s?.fetchOptions,...n}),(!s?.fetchOptions&&!n||s?.callbackURL)&&(window.location.href=s?.callbackURL??"/"),m()},auto_select:i,cancel_on_tap_outside:a,context:l}),window.google?.accounts.id.prompt()})}catch(i){throw console.error("Error during Google One Tap flow:",i),i}finally{P=!1}}}),getAtoms(e){return{}}}),E=()=>new Promise(t=>{if(window.googleScriptInitialized){t();return}let e=document.createElement("script");e.src="https://accounts.google.com/gsi/client",e.async=!0,e.defer=!0,e.onload=()=>{window.googleScriptInitialized=!0,t()},document.head.appendChild(e)});export{nt as adminClient,Ye as anonymousClient,ut as emailOTPClient,it as genericOAuthClient,F as getPasskeyActions,et as inferAdditionalFields,ot as jwtClient,Qe as magicLinkClient,lt as multiSessionClient,mt as oneTapClient,Le as organizationClient,We as passkeyClient,Je as phoneNumberClient,He as twoFactorClient,Me as usernameClient};
package/dist/db.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var V=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var J=Object.getOwnPropertyNames;var Z=Object.prototype.hasOwnProperty;var z=(e,r)=>{for(var s in r)V(e,s,{get:r[s],enumerable:!0})},G=(e,r,s,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of J(r))!Z.call(e,o)&&o!==s&&V(e,o,{get:()=>r[o],enumerable:!(a=H(r,o))||a.enumerable});return e};var X=e=>G(V({},"__esModule",{value:!0}),e);var fe={};z(fe,{convertFromDB:()=>g,convertToDB:()=>S,createFieldAttribute:()=>ne,createInternalAdapter:()=>re,getAdapter:()=>Y,getAuthTables:()=>A,getMigrations:()=>ce,getSchema:()=>K,getWithHooks:()=>U,matchType:()=>W,toZodSchema:()=>se});module.exports=X(fe);var M=(e,r="ms")=>new Date(Date.now()+(r==="sec"?e*1e3:e));var A=e=>{let r=e.plugins?.reduce((t,i)=>{let d=i.schema;if(!d)return t;for(let[l,u]of Object.entries(d))t[l]={fields:{...t[l]?.fields,...u.fields},tableName:u.tableName||l};return t},{}),s=e.rateLimit?.storage==="database",a={rateLimit:{tableName:e.rateLimit?.tableName||"rateLimit",fields:{key:{type:"string",fieldName:e.rateLimit?.fields?.key||"key"},count:{type:"number",fieldName:e.rateLimit?.fields?.count||"count"},lastRequest:{type:"number",fieldName:e.rateLimit?.fields?.lastRequest||"lastRequest"}}}},{user:o,session:n,account:c,...f}=r||{};return{user:{tableName:e.user?.modelName||"user",fields:{name:{type:"string",required:!0,fieldName:e.user?.fields?.name||"name"},email:{type:"string",unique:!0,required:!0,fieldName:e.user?.fields?.email||"email"},emailVerified:{type:"boolean",defaultValue:()=>!1,required:!0,fieldName:e.user?.fields?.emailVerified||"emailVerified"},image:{type:"string",required:!1,fieldName:e.user?.fields?.image||"image"},createdAt:{type:"date",defaultValue:()=>new Date,required:!0,fieldName:e.user?.fields?.createdAt||"createdAt"},updatedAt:{type:"date",defaultValue:()=>new Date,required:!0,fieldName:e.user?.fields?.updatedAt||"updatedAt"},...o?.fields,...e.user?.additionalFields},order:1},session:{tableName:e.session?.modelName||"session",fields:{expiresAt:{type:"date",required:!0,fieldName:e.session?.fields?.expiresAt||"expiresAt"},ipAddress:{type:"string",required:!1,fieldName:e.session?.fields?.ipAddress||"ipAddress"},userAgent:{type:"string",required:!1,fieldName:e.session?.fields?.userAgent||"userAgent"},userId:{type:"string",fieldName:e.session?.fields?.userId||"userId",references:{model:e.user?.modelName||"user",field:"id",onDelete:"cascade"},required:!0},...n?.fields,...e.session?.additionalFields},order:2},account:{tableName:e.account?.modelName||"account",fields:{accountId:{type:"string",required:!0,fieldName:e.account?.fields?.accountId||"accountId"},providerId:{type:"string",required:!0,fieldName:e.account?.fields?.providerId||"providerId"},userId:{type:"string",references:{model:e.user?.modelName||"user",field:"id",onDelete:"cascade"},required:!0,fieldName:e.account?.fields?.userId||"userId"},accessToken:{type:"string",required:!1,fieldName:e.account?.fields?.accessToken||"accessToken"},refreshToken:{type:"string",required:!1,fieldName:e.account?.fields?.refreshToken||"refreshToken"},idToken:{type:"string",required:!1,fieldName:e.account?.fields?.idToken||"idToken"},expiresAt:{type:"date",required:!1,fieldName:e.account?.fields?.expiresAt||"expiresAt"},password:{type:"string",required:!1,fieldName:e.account?.fields?.password||"password"},...c?.fields},order:3},verification:{tableName:e.verification?.modelName||"verification",fields:{identifier:{type:"string",required:!0,fieldName:e.verification?.fields?.identifier||"identifier"},value:{type:"string",required:!0,fieldName:e.verification?.fields?.value||"value"},expiresAt:{type:"date",required:!0,fieldName:e.verification?.fields?.expiresAt||"expiresAt"}},order:4},...f,...s?a:{}}};var j=require("nanoid"),h=e=>(0,j.nanoid)(e);var I=class extends Error{constructor(r,s){super(r),this.name="BetterAuthError",this.message=r,this.cause=s}};var v=require("kysely"),x=require("kysely");function E(e){if("dialect"in e)return E(e.dialect);if("createDriver"in e){if(e instanceof x.SqliteDialect)return"sqlite";if(e instanceof x.MysqlDialect)return"mysql";if(e instanceof x.PostgresDialect)return"postgres";if(e instanceof v.MssqlDialect)return"mssql"}return"aggregate"in e?"sqlite":"getConnection"in e?"mysql":"connect"in e?"postgres":null}var D=async e=>{let r=e.database;if("db"in r)return{kysely:r.db,databaseType:r.type};if("dialect"in r)return{kysely:new v.Kysely({dialect:r.dialect}),databaseType:r.type};let s,a=E(r);return"createDriver"in r&&(s=r),"aggregate"in r&&(s=new x.SqliteDialect({database:r})),"getConnection"in r&&(s=new x.MysqlDialect(r)),"connect"in r&&(s=new x.PostgresDialect({pool:r})),{kysely:s?new v.Kysely({dialect:s}):null,databaseType:a}};function k(e){if(!e)return{and:null,or:null};let r={and:[],or:[]};return e.forEach(s=>{let{field:a,value:o,operator:n="=",connector:c="AND"}=s,f=t=>n.toLowerCase()==="in"?t(a,"in",Array.isArray(o)?o:[o]):n==="contains"?t(a,"like",`%${o}%`):n==="starts_with"?t(a,"like",`${o}%`):n==="ends_with"?t(a,"like",`%${o}`):t(a,n,o);c==="OR"?r.or.push(f):r.and.push(f)}),{and:r.and.length?r.and:null,or:r.or.length?r.or:null}}function q(e,r,s){for(let a in e){let o=r[a]||Object.values(r).find(n=>n.fieldName===a);e[a]===0&&o.type==="boolean"&&s?.boolean&&(e[a]=!1),e[a]===1&&o?.type==="boolean"&&s?.boolean&&(e[a]=!0),o?.type==="date"&&(e[a]instanceof Date||(e[a]=new Date(e[a])))}return e}function C(e,r){for(let s in e)typeof e[s]=="boolean"&&r?.boolean&&(e[s]=e[s]?1:0),e[s]instanceof Date&&(e[s]=e[s].toISOString());return e}var P=(e,r)=>({id:"kysely",async create(s){let{model:a,data:o,select:n}=s;r?.transform&&(o=C(o,r.transform)),r?.generateId!==void 0&&(o.id=r.generateId?r.generateId():void 0);let c=await e.insertInto(a).values(o).returningAll().executeTakeFirst();if(r?.transform){let f=r.transform.schema[a];c=f?q(o,f,r.transform):c}return n?.length&&(c=c?n.reduce((t,i)=>c?.[i]?{...t,[i]:c[i]}:t,{}):null),c},async findOne(s){let{model:a,where:o,select:n}=s,{and:c,or:f}=k(o),t=e.selectFrom(a).selectAll();c&&(t=t.where(d=>d.and(c.map(l=>l(d))))),f&&(t=t.where(d=>d.or(f.map(l=>l(d)))));let i=await t.executeTakeFirst();if(n?.length&&(i=i?n.reduce((l,u)=>i?.[u]?{...l,[u]:i[u]}:l,{}):null),r?.transform){let d=r.transform.schema[a];return i=i&&d?q(i,d,r.transform):i,i||null}return i||null},async findMany(s){let{model:a,where:o,limit:n,offset:c,sortBy:f}=s,t=e.selectFrom(a),{and:i,or:d}=k(o);i&&(t=t.where(u=>u.and(i.map(m=>m(u))))),d&&(t=t.where(u=>u.or(d.map(m=>m(u))))),t=t.limit(n||100),c&&(t=t.offset(c)),f&&(t=t.orderBy(f.field,f.direction));let l=await t.selectAll().execute();if(r?.transform){let u=r.transform.schema[a];return u?l.map(m=>q(m,u,r.transform)):l}return l},async update(s){let{model:a,where:o,update:n}=s,{and:c,or:f}=k(o);r?.transform&&(n=C(n,r.transform)),n.id&&(n.id=void 0);let t=e.updateTable(a).set(n);c&&(t=t.where(d=>d.and(c.map(l=>l(d))))),f&&(t=t.where(d=>d.or(f.map(l=>l(d)))));let i=await t.returningAll().executeTakeFirst()||null;if(r?.transform){let d=r.transform.schema[a];return d?q(i,d,r.transform):i}return i},async delete(s){let{model:a,where:o}=s,{and:n,or:c}=k(o),f=e.deleteFrom(a);n&&(f=f.where(t=>t.and(n.map(i=>i(t))))),c&&(f=f.where(t=>t.or(c.map(i=>i(t))))),await f.execute()},async deleteMany(s){let{model:a,where:o}=s,{and:n,or:c}=k(o),f=e.deleteFrom(a);n&&(f=f.where(t=>t.and(n.map(i=>i(t))))),c&&(f=f.where(t=>t.or(c.map(i=>i(t))))),await f.execute()}});async function Y(e){if(!e.database)throw new I("Database configuration is required");if("create"in e.database)return e.database;let{kysely:r,databaseType:s}=await D(e);if(!r)throw new I("Failed to initialize database adapter");let a=A(e),o={};for(let n of Object.values(a))o[n.tableName]=n.fields;return P(r,{transform:{schema:o,date:!0,boolean:s==="sqlite"},generateId:"generateId"in e.database?e.database.generateId:void 0})}function S(e,r){let s=r.id?{id:r.id}:{};for(let a in e){let o=e[a],n=r[a];n!==void 0&&(s[o.fieldName||a]=n)}return s}function g(e,r){if(!r)return null;let s={id:r.id};for(let[a,o]of Object.entries(e))s[a]=r[o.fieldName||a];return s}function U(e,r){let s=r.hooks,a=A(r.options);async function o(c,f,t){let i=c,d=a[f];for(let m of s||[]){let p=m[f]?.create?.before;if(p){let y=await p(c);if(y===!1)return null;typeof y=="object"&&"data"in y&&(i=y.data)}}let l=t?await t.fn(i):null,u=!t||t.executeMainFn?await e.create({model:d.tableName,data:{...S(d.fields,i),id:i.id||h()}}):l;for(let m of s||[]){let p=m[f]?.create?.after;p&&await p(u)}return g(d.fields,u)}async function n(c,f,t,i){let d=c;for(let m of s||[]){let p=m[t]?.update?.before;if(p){let y=await p(c);if(y===!1)return null;d=typeof y=="object"?y.data:y}}let l=i?await i.fn(d):null,u=!i||i.executeMainFn?await e.update({model:a[t].tableName,update:S(a[t].fields,d),where:f}):l;for(let m of s||[]){let p=m[t]?.update?.after;p&&await p(u)}return g(a[t].fields,u)}return{createWithHooks:o,updateWithHooks:n}}var R=Object.create(null),O=e=>globalThis.process?.env||globalThis.Deno?.env.toObject()||globalThis.__env__||(e?R:globalThis),Q=new Proxy(R,{get(e,r){return O()[r]??R[r]},has(e,r){let s=O();return r in s||r in R},set(e,r,s){let a=O(!0);return a[r]=s,!0},deleteProperty(e,r){if(!r)return!1;let s=O(!0);return delete s[r],!0},ownKeys(){let e=O(!0);return Object.keys(e)}});function ee(e){return e?e!=="false":!1}var te=typeof process<"u"&&process.env&&process.env.NODE_ENV||"";var L=te==="test"||ee(Q.TEST);function _(e){let r="127.0.0.1";if(L)return r;let s=["x-client-ip","x-forwarded-for","cf-connecting-ip","fastly-client-ip","x-real-ip","x-cluster-client-ip","x-forwarded","forwarded-for","forwarded"],a=e instanceof Request?e.headers:e;for(let o of s){let n=a.get(o);if(typeof n=="string"){let c=n.split(",")[0].trim();if(c)return c}}return null}var re=(e,r)=>{let s=r.options,a=s.secondaryStorage,o=s.session?.expiresIn||60*60*24*7,n=A(s),{createWithHooks:c,updateWithHooks:f}=U(e,r);return{createOAuthUser:async(t,i)=>{try{let d=await c({id:h(),createdAt:new Date,updatedAt:new Date,...t},"user"),l=await c({id:h(),...i,userId:d.id||t.id},"account");return{user:d,account:l}}catch(d){return console.log(d),null}},createUser:async t=>await c({id:h(),createdAt:new Date,updatedAt:new Date,emailVerified:!1,...t},"user"),createAccount:async t=>await c({id:h(),createdAt:new Date,updatedAt:new Date,...t},"account"),listSessions:async t=>await e.findMany({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]}),listUsers:async(t,i,d,l)=>(await e.findMany({model:n.user.tableName,limit:t,offset:i,sortBy:d,where:l})).map(m=>g(n.user.fields,m)),deleteUser:async t=>{await e.delete({model:n.account.tableName,where:[{field:n.account.fields.userId.fieldName||"userId",value:t}]}),await e.deleteMany({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]}),await e.deleteMany({model:n.user.tableName,where:[{field:"id",value:t}]})},createSession:async(t,i,d,l)=>{let u=i instanceof Request?i.headers:i,m={id:h(32),userId:t,expiresAt:d?M(60*60*24,"sec"):M(o,"sec"),ipAddress:i&&_(i)||"",userAgent:u?.get("user-agent")||"",...l};return await c(m,"session",a?{fn:async y=>{let b=await e.findOne({model:n.user.tableName,where:[{field:"id",value:t}]});return a.set(y.id,JSON.stringify({session:y,user:b}),o),y},executeMainFn:s.session?.storeSessionInDatabase}:void 0)},findSession:async t=>{if(a){let u=await a.get(t);if(u){let m=JSON.parse(u);return{session:{...m.session,expiresAt:new Date(m.session.expiresAt)},user:{...m.user,createdAt:new Date(m.user.createdAt),updatedAt:new Date(m.user.updatedAt)}}}}let i=await e.findOne({model:n.session.tableName,where:[{value:t,field:"id"}]});if(!i)return null;let d=g(n.session.fields,i),l=await e.findOne({model:n.user.tableName,where:[{value:d.userId,field:"id"}]});return l?{session:d,user:g(n.user.fields,l)}:null},findSessions:async t=>{if(a){let u=[];for(let m of t){let p=await a.get(m);if(p){let y=JSON.parse(p),b={session:{...y.session,expiresAt:new Date(y.session.expiresAt)},user:{...y.user,createdAt:new Date(y.user.createdAt),updatedAt:new Date(y.user.updatedAt)}};u.push(b)}}return u}let i=await e.findMany({model:n.session.tableName,where:[{field:"id",value:t,operator:"in"}]}),d=i.map(u=>g(n.session.fields,u).userId);if(!d.length)return[];let l=await e.findMany({model:n.user.tableName,where:[{field:"id",value:d,operator:"in"}]});return i.map(u=>{let m=l.find(p=>p.id===u.userId);return m?{session:g(n.session.fields,u),user:g(n.user.fields,m)}:null})},updateSession:async(t,i)=>await f(i,[{field:"id",value:t}],"session",a?{async fn(l){let u=await a.get(t),m=null;if(u){let p=JSON.parse(u);m={...p.session,...l},await a.set(t,JSON.stringify({session:m,user:p.user}),p.session.expiresAt?Math.floor((p.session.expiresAt.getTime()-Date.now())/1e3):o)}else return null},executeMainFn:s.session?.storeSessionInDatabase}:void 0),deleteSession:async t=>{if(a){await a.delete(t),s.session?.storeSessionInDatabase&&await e.delete({model:n.session.tableName,where:[{field:"id",value:t}]});return}await e.delete({model:n.session.tableName,where:[{field:"id",value:t}]})},deleteSessions:async t=>{if(a){let i=await e.findMany({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]});for(let d of i)await a.delete(d.id);s.session?.storeSessionInDatabase&&await e.delete({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]});return}await e.deleteMany({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]})},findUserByEmail:async(t,i)=>{let d=await e.findOne({model:n.user.tableName,where:[{value:t.toLowerCase(),field:n.user.fields.email.fieldName||"email"}]});if(!d)return null;if(i?.includeAccounts){let l=await e.findMany({model:n.account.tableName,where:[{value:d.id,field:n.account.fields.userId.fieldName||"userId"}]});return{user:g(n.user.fields,d),accounts:l.map(u=>g(n.account.fields,u))}}return{user:g(n.user.fields,d),accounts:[]}},findUserById:async t=>await e.findOne({model:n.user.tableName,where:[{field:"id",value:t}]}),linkAccount:async t=>await c({id:h(),...t},"account"),updateUser:async(t,i)=>await f(i,[{field:"id",value:t}],"user"),updateUserByEmail:async(t,i)=>await f(i,[{field:n.user.fields.email.fieldName||"email",value:t}],"user"),updatePassword:async(t,i)=>await f({password:i},[{field:n.account.fields.userId.fieldName||"userId",value:t},{field:n.account.fields.providerId.fieldName||"providerId",value:"credential"}],"account"),findAccounts:async t=>(await e.findMany({model:n.account.tableName,where:[{field:n.account.fields.userId.fieldName||"userId",value:t}]})).map(d=>g(n.account.fields,d)),updateAccount:async(t,i)=>await f(i,[{field:"id",value:t}],"account"),createVerificationValue:async t=>await c({id:h(),...t},"verification"),findVerificationValue:async t=>{let i=await e.findMany({model:n.verification.tableName,where:[{field:n.verification.fields.identifier.fieldName||"identifier",value:t}],limit:100}),d=i.pop();return i.length>0&&await e.deleteMany({model:n.verification.tableName,where:[{operator:"in",field:"id",value:i.map(l=>l.id)}]}),d?g(n.verification.fields,d):null},deleteVerificationValue:async t=>{await e.delete({model:n.verification.tableName,where:[{field:"id",value:t}]})},updateVerificationValue:async(t,i)=>await f(i,[{field:"id",value:t}],"verification")}};var ne=(e,r)=>({type:e,...r});var F=require("zod");function se(e){return F.z.object({...Object.keys(e).reduce((s,a)=>{let o=e[a];if(!o)return s;if(o.type==="string[]"||o.type==="number[]")return{...s,[a]:F.z.array(o.type==="string[]"?F.z.string():F.z.number())};let n=F.z[o.type]();return o?.required===!1&&(n=n.optional()),o?.returned===!1?s:{...s,[a]:n}},{})})}var $=require("consola"),w=(0,$.createConsola)({formatOptions:{date:!1,colors:!0,compact:!0},defaults:{tag:"Better Auth"}}),ie=e=>({log:(...r)=>{!e?.disabled&&w.log("",...r)},error:(...r)=>{!e?.disabled&&w.error("",...r)},warn:(...r)=>{!e?.disabled&&w.warn("",...r)},info:(...r)=>{!e?.disabled&&w.info("",...r)},debug:(...r)=>{!e?.disabled&&w.debug("",...r)},box:(...r)=>{!e?.disabled&&w.box("",...r)},success:(...r)=>{!e?.disabled&&w.success("",...r)},break:(...r)=>{!e?.disabled&&console.log(`
2
- `)}}),B=ie();function K(e){let r=A(e),s={};for(let a in r){let o=r[a],n=o.fields,c={};if(Object.entries(n).forEach(([f,t])=>{c[t.fieldName||f]=t}),s[o.tableName]){s[o.tableName].fields={...s[o.tableName].fields,...c};continue}s[o.tableName]={fields:c,order:o.order||1/0}}return s}var ae={string:["character varying","text"],number:["int4","integer","bigint","smallint","numeric","real","double precision"],boolean:["bool","boolean"],date:["timestamp","date"]},oe={string:["varchar","text"],number:["integer","int","bigint","smallint","decimal","float","double"],boolean:["boolean"],date:["datetime","date"]},de={string:["TEXT"],number:["INTEGER","REAL"],boolean:["INTEGER","BOOLEAN"],date:["DATE","INTEGER"]},le={string:["nvarchar","varchar"],number:["int","bigint","smallint","decimal","float","double"],boolean:["bit","boolean"],date:["datetime","date"]},ue={postgres:ae,mysql:oe,sqlite:de,mssql:le};function W(e,r,s){return r==="string[]"||r==="number[]"?e.toLowerCase().includes("json"):ue[s][r].map(c=>c.toLowerCase()).includes(e.toLowerCase())}async function ce(e){let r=K(e),{kysely:s,databaseType:a}=await D(e);a||(B.warn("Could not determine database type, defaulting to sqlite. Please provide a type in the database options to avoid this."),a="sqlite"),s||(B.error("Only kysely adapter is supported for migrations. You can use `generate` command to generate the schema, if you're using a different adapter."),process.exit(1));let o=await s.introspection.getTables(),n=[],c=[];for(let[l,u]of Object.entries(r)){let m=o.find(y=>y.name===l);if(!m){let y=n.findIndex(N=>N.table===l),b={table:l,fields:u.fields,order:u.order||1/0},T=n.findIndex(N=>(N.order||1/0)>b.order);T===-1?y===-1?n.push(b):n[y].fields={...n[y].fields,...u.fields}:n.splice(T,0,b);continue}let p={};for(let[y,b]of Object.entries(u.fields)){let T=m.columns.find(N=>N.name===y);if(!T){p[y]=b;continue}W(T.dataType,b.type,a)||B.warn(`Field ${y} in table ${l} has a different type in the database. Expected ${b.type} but got ${T.dataType}.`)}Object.keys(p).length>0&&c.push({table:l,fields:p,order:u.order||1/0})}let f=[];function t(l){let u={string:"text",boolean:"boolean",number:"integer",date:"date"};return a==="mysql"&&l==="string"?"varchar(255)":a==="sqlite"&&(l==="string[]"||l==="number[]")?"text":l==="string[]"||l==="number[]"?"jsonb":u[l]}if(c.length)for(let l of c)for(let[u,m]of Object.entries(l.fields)){let p=t(m.type),y=s.schema.alterTable(l.table).addColumn(u,p,b=>(b=m.required!==!1?b.notNull():b,m.references&&(b=b.references(`${m.references.model}.${m.references.field}`)),b));f.push(y)}if(n.length)for(let l of n){let u=s.schema.createTable(l.table).addColumn("id",t("string"),m=>m.primaryKey().notNull());for(let[m,p]of Object.entries(l.fields)){let y=t(p.type);u=u.addColumn(m,y,b=>(b=p.required!==!1?b.notNull():b,p.references&&(b=b.references(`${p.references.model}.${p.references.field}`)),p.unique&&(b=b.unique()),b))}f.push(u)}async function i(){for(let l of f)await l.execute()}async function d(){return f.map(u=>u.compile().sql).join(`;
1
+ "use strict";var U=Object.defineProperty;var X=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var Q=Object.prototype.hasOwnProperty;var ee=(e,t)=>{for(var s in t)U(e,s,{get:t[s],enumerable:!0})},te=(e,t,s,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Y(t))!Q.call(e,o)&&o!==s&&U(e,o,{get:()=>t[o],enumerable:!(i=X(t,o))||i.enumerable});return e};var re=e=>te(U({},"__esModule",{value:!0}),e);var ge={};ee(ge,{convertFromDB:()=>h,convertToDB:()=>R,createFieldAttribute:()=>de,createInternalAdapter:()=>oe,getAdapter:()=>ne,getAuthTables:()=>x,getMigrations:()=>be,getSchema:()=>E,getWithHooks:()=>C,matchType:()=>G,toZodSchema:()=>le});module.exports=re(ge);var M=(e,t="ms")=>new Date(Date.now()+(t==="sec"?e*1e3:e));var x=e=>{let t=e.plugins?.reduce((r,a)=>{let d=a.schema;if(!d)return r;for(let[l,u]of Object.entries(d))r[l]={fields:{...r[l]?.fields,...u.fields},tableName:u.tableName||l};return r},{}),s=e.rateLimit?.storage==="database",i={rateLimit:{tableName:e.rateLimit?.tableName||"rateLimit",fields:{key:{type:"string",fieldName:e.rateLimit?.fields?.key||"key"},count:{type:"number",fieldName:e.rateLimit?.fields?.count||"count"},lastRequest:{type:"number",fieldName:e.rateLimit?.fields?.lastRequest||"lastRequest"}}}},{user:o,session:n,account:c,...f}=t||{};return{user:{tableName:e.user?.modelName||"user",fields:{name:{type:"string",required:!0,fieldName:e.user?.fields?.name||"name"},email:{type:"string",unique:!0,required:!0,fieldName:e.user?.fields?.email||"email"},emailVerified:{type:"boolean",defaultValue:()=>!1,required:!0,fieldName:e.user?.fields?.emailVerified||"emailVerified"},image:{type:"string",required:!1,fieldName:e.user?.fields?.image||"image"},createdAt:{type:"date",defaultValue:()=>new Date,required:!0,fieldName:e.user?.fields?.createdAt||"createdAt"},updatedAt:{type:"date",defaultValue:()=>new Date,required:!0,fieldName:e.user?.fields?.updatedAt||"updatedAt"},...o?.fields,...e.user?.additionalFields},order:1},session:{tableName:e.session?.modelName||"session",fields:{expiresAt:{type:"date",required:!0,fieldName:e.session?.fields?.expiresAt||"expiresAt"},ipAddress:{type:"string",required:!1,fieldName:e.session?.fields?.ipAddress||"ipAddress"},userAgent:{type:"string",required:!1,fieldName:e.session?.fields?.userAgent||"userAgent"},userId:{type:"string",fieldName:e.session?.fields?.userId||"userId",references:{model:e.user?.modelName||"user",field:"id",onDelete:"cascade"},required:!0},...n?.fields,...e.session?.additionalFields},order:2},account:{tableName:e.account?.modelName||"account",fields:{accountId:{type:"string",required:!0,fieldName:e.account?.fields?.accountId||"accountId"},providerId:{type:"string",required:!0,fieldName:e.account?.fields?.providerId||"providerId"},userId:{type:"string",references:{model:e.user?.modelName||"user",field:"id",onDelete:"cascade"},required:!0,fieldName:e.account?.fields?.userId||"userId"},accessToken:{type:"string",required:!1,fieldName:e.account?.fields?.accessToken||"accessToken"},refreshToken:{type:"string",required:!1,fieldName:e.account?.fields?.refreshToken||"refreshToken"},idToken:{type:"string",required:!1,fieldName:e.account?.fields?.idToken||"idToken"},expiresAt:{type:"date",required:!1,fieldName:e.account?.fields?.expiresAt||"expiresAt"},password:{type:"string",required:!1,fieldName:e.account?.fields?.password||"password"},...c?.fields},order:3},verification:{tableName:e.verification?.modelName||"verification",fields:{identifier:{type:"string",required:!0,fieldName:e.verification?.fields?.identifier||"identifier"},value:{type:"string",required:!0,fieldName:e.verification?.fields?.value||"value"},expiresAt:{type:"date",required:!0,fieldName:e.verification?.fields?.expiresAt||"expiresAt"}},order:4},...f,...s?i:{}}};var g=require("zod"),we=g.z.object({id:g.z.string(),providerId:g.z.string(),accountId:g.z.string(),userId:g.z.string(),accessToken:g.z.string().nullable().optional(),refreshToken:g.z.string().nullable().optional(),idToken:g.z.string().nullable().optional(),expiresAt:g.z.date().nullable().optional(),password:g.z.string().optional().nullable()}),Te=g.z.object({id:g.z.string(),email:g.z.string().transform(e=>e.toLowerCase()),emailVerified:g.z.boolean().default(!1),name:g.z.string(),image:g.z.string().optional(),createdAt:g.z.date().default(new Date),updatedAt:g.z.date().default(new Date)}),Fe=g.z.object({id:g.z.string(),userId:g.z.string(),expiresAt:g.z.date(),ipAddress:g.z.string().optional(),userAgent:g.z.string().optional()}),Ie=g.z.object({id:g.z.string(),value:g.z.string(),expiresAt:g.z.date(),identifier:g.z.string()});function P(e,t){let s=t.fields,i={};for(let o in e){let n=s[o];if(!n){i[o]=e[o];continue}n.returned!==!1&&(i[o]=e[o])}return i}function L(e,t){let s={...t==="user"?e.user?.additionalFields:{},...t==="session"?e.session?.additionalFields:{}};for(let i of e.plugins||[])i.schema&&i.schema[t]&&(s={...s,...i.schema[t].fields});return s}function j(e,t){let s=L(e,"user");return P(t,{fields:s})}function K(e,t){let s=L(e,"session");return P(t,{fields:s})}var _=require("nanoid"),A=e=>(0,_.nanoid)(e);var v=class extends Error{constructor(t,s){super(t),this.name="BetterAuthError",this.message=t,this.cause=s}};var O=require("kysely"),w=require("kysely");function $(e){if("dialect"in e)return $(e.dialect);if("createDriver"in e){if(e instanceof w.SqliteDialect)return"sqlite";if(e instanceof w.MysqlDialect)return"mysql";if(e instanceof w.PostgresDialect)return"postgres";if(e instanceof O.MssqlDialect)return"mssql"}return"aggregate"in e?"sqlite":"getConnection"in e?"mysql":"connect"in e?"postgres":null}var D=async e=>{let t=e.database;if("db"in t)return{kysely:t.db,databaseType:t.type};if("dialect"in t)return{kysely:new O.Kysely({dialect:t.dialect}),databaseType:t.type};let s,i=$(t);return"createDriver"in t&&(s=t),"aggregate"in t&&(s=new w.SqliteDialect({database:t})),"getConnection"in t&&(s=new w.MysqlDialect(t)),"connect"in t&&(s=new w.PostgresDialect({pool:t})),{kysely:s?new O.Kysely({dialect:s}):null,databaseType:i}};function k(e){if(!e)return{and:null,or:null};let t={and:[],or:[]};return e.forEach(s=>{let{field:i,value:o,operator:n="=",connector:c="AND"}=s,f=r=>n.toLowerCase()==="in"?r(i,"in",Array.isArray(o)?o:[o]):n==="contains"?r(i,"like",`%${o}%`):n==="starts_with"?r(i,"like",`${o}%`):n==="ends_with"?r(i,"like",`%${o}`):r(i,n,o);c==="OR"?t.or.push(f):t.and.push(f)}),{and:t.and.length?t.and:null,or:t.or.length?t.or:null}}function q(e,t,s){for(let i in e){let o=t[i]||Object.values(t).find(n=>n.fieldName===i);e[i]===0&&o.type==="boolean"&&s?.boolean&&(e[i]=!1),e[i]===1&&o?.type==="boolean"&&s?.boolean&&(e[i]=!0),o?.type==="date"&&(e[i]instanceof Date||(e[i]=new Date(e[i])))}return e}function W(e,t){for(let s in e)typeof e[s]=="boolean"&&t?.boolean&&(e[s]=e[s]?1:0),e[s]instanceof Date&&(e[s]=e[s].toISOString());return e}var H=(e,t)=>({id:"kysely",async create(s){let{model:i,data:o,select:n}=s;t?.transform&&(o=W(o,t.transform)),t?.generateId!==void 0&&(o.id=t.generateId?t.generateId():void 0);let c=await e.insertInto(i).values(o).returningAll().executeTakeFirst();if(t?.transform){let f=t.transform.schema[i];c=f?q(o,f,t.transform):c}return n?.length&&(c=c?n.reduce((r,a)=>c?.[a]?{...r,[a]:c[a]}:r,{}):null),c},async findOne(s){let{model:i,where:o,select:n}=s,{and:c,or:f}=k(o),r=e.selectFrom(i).selectAll();c&&(r=r.where(d=>d.and(c.map(l=>l(d))))),f&&(r=r.where(d=>d.or(f.map(l=>l(d)))));let a=await r.executeTakeFirst();if(n?.length&&(a=a?n.reduce((l,u)=>a?.[u]?{...l,[u]:a[u]}:l,{}):null),t?.transform){let d=t.transform.schema[i];return a=a&&d?q(a,d,t.transform):a,a||null}return a||null},async findMany(s){let{model:i,where:o,limit:n,offset:c,sortBy:f}=s,r=e.selectFrom(i),{and:a,or:d}=k(o);a&&(r=r.where(u=>u.and(a.map(p=>p(u))))),d&&(r=r.where(u=>u.or(d.map(p=>p(u))))),r=r.limit(n||100),c&&(r=r.offset(c)),f&&(r=r.orderBy(f.field,f.direction));let l=await r.selectAll().execute();if(t?.transform){let u=t.transform.schema[i];return u?l.map(p=>q(p,u,t.transform)):l}return l},async update(s){let{model:i,where:o,update:n}=s,{and:c,or:f}=k(o);t?.transform&&(n=W(n,t.transform)),n.id&&(n.id=void 0);let r=e.updateTable(i).set(n);c&&(r=r.where(d=>d.and(c.map(l=>l(d))))),f&&(r=r.where(d=>d.or(f.map(l=>l(d)))));let a=await r.returningAll().executeTakeFirst()||null;if(t?.transform){let d=t.transform.schema[i];return d?q(a,d,t.transform):a}return a},async delete(s){let{model:i,where:o}=s,{and:n,or:c}=k(o),f=e.deleteFrom(i);n&&(f=f.where(r=>r.and(n.map(a=>a(r))))),c&&(f=f.where(r=>r.or(c.map(a=>a(r))))),await f.execute()},async deleteMany(s){let{model:i,where:o}=s,{and:n,or:c}=k(o),f=e.deleteFrom(i);n&&(f=f.where(r=>r.and(n.map(a=>a(r))))),c&&(f=f.where(r=>r.or(c.map(a=>a(r))))),await f.execute()}});async function ne(e){if(!e.database)throw new v("Database configuration is required");if("create"in e.database)return e.database;let{kysely:t,databaseType:s}=await D(e);if(!t)throw new v("Failed to initialize database adapter");let i=x(e),o={};for(let n of Object.values(i))o[n.tableName]=n.fields;return H(t,{transform:{schema:o,date:!0,boolean:s==="sqlite"},generateId:"generateId"in e.database?e.database.generateId:void 0})}function R(e,t){let s=t.id?{id:t.id}:{};for(let i in e){let o=e[i],n=t[i];n!==void 0&&(s[o.fieldName||i]=n)}return s}function h(e,t){if(!t)return null;let s={id:t.id};for(let[i,o]of Object.entries(e))s[i]=t[o.fieldName||i];return s}function C(e,t){let s=t.hooks,i=x(t.options);async function o(c,f,r){let a=c,d=i[f];for(let p of s||[]){let m=p[f]?.create?.before;if(m){let y=await m(c);if(y===!1)return null;typeof y=="object"&&"data"in y&&(a=y.data)}}let l=r?await r.fn(a):null,u=!r||r.executeMainFn?await e.create({model:d.tableName,data:{...R(d.fields,a),id:a.id||A()}}):l;for(let p of s||[]){let m=p[f]?.create?.after;m&&await m(u)}return h(d.fields,u)}async function n(c,f,r,a){let d=c;for(let p of s||[]){let m=p[r]?.update?.before;if(m){let y=await m(c);if(y===!1)return null;d=typeof y=="object"?y.data:y}}let l=a?await a.fn(d):null,u=!a||a.executeMainFn?await e.update({model:i[r].tableName,update:R(i[r].fields,d),where:f}):l;for(let p of s||[]){let m=p[r]?.update?.after;m&&await m(u)}return h(i[r].fields,u)}return{createWithHooks:o,updateWithHooks:n}}var B=Object.create(null),S=e=>globalThis.process?.env||globalThis.Deno?.env.toObject()||globalThis.__env__||(e?B:globalThis),se=new Proxy(B,{get(e,t){return S()[t]??B[t]},has(e,t){let s=S();return t in s||t in B},set(e,t,s){let i=S(!0);return i[t]=s,!0},deleteProperty(e,t){if(!t)return!1;let s=S(!0);return delete s[t],!0},ownKeys(){let e=S(!0);return Object.keys(e)}});function ie(e){return e?e!=="false":!1}var ae=typeof process<"u"&&process.env&&process.env.NODE_ENV||"";var z=ae==="test"||ie(se.TEST);function J(e){let t="127.0.0.1";if(z)return t;let s=["x-client-ip","x-forwarded-for","cf-connecting-ip","fastly-client-ip","x-real-ip","x-cluster-client-ip","x-forwarded","forwarded-for","forwarded"],i=e instanceof Request?e.headers:e;for(let o of s){let n=i.get(o);if(typeof n=="string"){let c=n.split(",")[0].trim();if(c)return c}}return null}var oe=(e,t)=>{let s=t.options,i=s.secondaryStorage,o=s.session?.expiresIn||60*60*24*7,n=x(s),{createWithHooks:c,updateWithHooks:f}=C(e,t);return{createOAuthUser:async(r,a)=>{try{let d=await c({id:A(),createdAt:new Date,updatedAt:new Date,...r},"user"),l=await c({id:A(),...a,userId:d.id||r.id},"account");return{user:d,account:l}}catch(d){return console.log(d),null}},createUser:async r=>await c({id:A(),createdAt:new Date,updatedAt:new Date,emailVerified:!1,...r},"user"),createAccount:async r=>await c({id:A(),createdAt:new Date,updatedAt:new Date,...r},"account"),listSessions:async r=>await e.findMany({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:r}]}),listUsers:async(r,a,d,l)=>(await e.findMany({model:n.user.tableName,limit:r,offset:a,sortBy:d,where:l})).map(p=>h(n.user.fields,p)),deleteUser:async r=>{await e.delete({model:n.account.tableName,where:[{field:n.account.fields.userId.fieldName||"userId",value:r}]}),await e.deleteMany({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:r}]}),await e.deleteMany({model:n.user.tableName,where:[{field:"id",value:r}]})},createSession:async(r,a,d,l)=>{let u=a instanceof Request?a.headers:a,p={id:A(32),userId:r,expiresAt:d?M(60*60*24,"sec"):M(o,"sec"),ipAddress:a&&J(a)||"",userAgent:u?.get("user-agent")||"",...l};return await c(p,"session",i?{fn:async y=>{let b=await e.findOne({model:n.user.tableName,where:[{field:"id",value:r}]});return i.set(y.id,JSON.stringify({session:y,user:b}),o),y},executeMainFn:s.session?.storeSessionInDatabase}:void 0)},findSession:async r=>{if(i){let p=await i.get(r);if(p){let m=JSON.parse(p),y=K(t.options,{...m.session,expiresAt:new Date(m.session.expiresAt)}),b=j(t.options,{...m.user,createdAt:new Date(m.user.createdAt),updatedAt:new Date(m.user.updatedAt)});return{session:y,user:b}}}let a=await e.findOne({model:n.session.tableName,where:[{value:r,field:"id"}]});if(!a)return null;let d=h(n.session.fields,a),l=await e.findOne({model:n.user.tableName,where:[{value:d.userId,field:"id"}]});if(!l)return null;let u=j(t.options,h(n.user.fields,l));return{session:K(t.options,d),user:u}},findSessions:async r=>{if(i){let u=[];for(let p of r){let m=await i.get(p);if(m){let y=JSON.parse(m),b={session:{...y.session,expiresAt:new Date(y.session.expiresAt)},user:{...y.user,createdAt:new Date(y.user.createdAt),updatedAt:new Date(y.user.updatedAt)}};u.push(b)}}return u}let a=await e.findMany({model:n.session.tableName,where:[{field:"id",value:r,operator:"in"}]}),d=a.map(u=>h(n.session.fields,u).userId);if(!d.length)return[];let l=await e.findMany({model:n.user.tableName,where:[{field:"id",value:d,operator:"in"}]});return a.map(u=>{let p=l.find(m=>m.id===u.userId);return p?{session:h(n.session.fields,u),user:h(n.user.fields,p)}:null})},updateSession:async(r,a)=>await f(a,[{field:"id",value:r}],"session",i?{async fn(l){let u=await i.get(r),p=null;if(u){let m=JSON.parse(u);p={...m.session,...l},await i.set(r,JSON.stringify({session:p,user:m.user}),m.session.expiresAt?Math.floor((m.session.expiresAt.getTime()-Date.now())/1e3):o)}else return null},executeMainFn:s.session?.storeSessionInDatabase}:void 0),deleteSession:async r=>{if(i){await i.delete(r),s.session?.storeSessionInDatabase&&await e.delete({model:n.session.tableName,where:[{field:"id",value:r}]});return}await e.delete({model:n.session.tableName,where:[{field:"id",value:r}]})},deleteSessions:async r=>{if(i){let a=await e.findMany({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:r}]});for(let d of a)await i.delete(d.id);s.session?.storeSessionInDatabase&&await e.delete({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:r}]});return}await e.deleteMany({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:r}]})},findUserByEmail:async(r,a)=>{let d=await e.findOne({model:n.user.tableName,where:[{value:r.toLowerCase(),field:n.user.fields.email.fieldName||"email"}]});if(!d)return null;if(a?.includeAccounts){let l=await e.findMany({model:n.account.tableName,where:[{value:d.id,field:n.account.fields.userId.fieldName||"userId"}]});return{user:h(n.user.fields,d),accounts:l.map(u=>h(n.account.fields,u))}}return{user:h(n.user.fields,d),accounts:[]}},findUserById:async r=>await e.findOne({model:n.user.tableName,where:[{field:"id",value:r}]}),linkAccount:async r=>await c({id:A(),...r},"account"),updateUser:async(r,a)=>await f(a,[{field:"id",value:r}],"user"),updateUserByEmail:async(r,a)=>await f(a,[{field:n.user.fields.email.fieldName||"email",value:r}],"user"),updatePassword:async(r,a)=>await f({password:a},[{field:n.account.fields.userId.fieldName||"userId",value:r},{field:n.account.fields.providerId.fieldName||"providerId",value:"credential"}],"account"),findAccounts:async r=>(await e.findMany({model:n.account.tableName,where:[{field:n.account.fields.userId.fieldName||"userId",value:r}]})).map(d=>h(n.account.fields,d)),updateAccount:async(r,a)=>await f(a,[{field:"id",value:r}],"account"),createVerificationValue:async r=>await c({id:A(),...r},"verification"),findVerificationValue:async r=>{let a=await e.findMany({model:n.verification.tableName,where:[{field:n.verification.fields.identifier.fieldName||"identifier",value:r}],limit:100}),d=a.pop();return a.length>0&&await e.deleteMany({model:n.verification.tableName,where:[{operator:"in",field:"id",value:a.map(l=>l.id)}]}),d?h(n.verification.fields,d):null},deleteVerificationValue:async r=>{await e.delete({model:n.verification.tableName,where:[{field:"id",value:r}]})},updateVerificationValue:async(r,a)=>await f(a,[{field:"id",value:r}],"verification")}};var de=(e,t)=>({type:e,...t});var I=require("zod");function le(e){return I.z.object({...Object.keys(e).reduce((s,i)=>{let o=e[i];if(!o)return s;if(o.type==="string[]"||o.type==="number[]")return{...s,[i]:I.z.array(o.type==="string[]"?I.z.string():I.z.number())};let n=I.z[o.type]();return o?.required===!1&&(n=n.optional()),o?.returned===!1?s:{...s,[i]:n}},{})})}var Z=require("consola"),T=(0,Z.createConsola)({formatOptions:{date:!1,colors:!0,compact:!0},defaults:{tag:"Better Auth"}}),ue=e=>({log:(...t)=>{!e?.disabled&&T.log("",...t)},error:(...t)=>{!e?.disabled&&T.error("",...t)},warn:(...t)=>{!e?.disabled&&T.warn("",...t)},info:(...t)=>{!e?.disabled&&T.info("",...t)},debug:(...t)=>{!e?.disabled&&T.debug("",...t)},box:(...t)=>{!e?.disabled&&T.box("",...t)},success:(...t)=>{!e?.disabled&&T.success("",...t)},break:(...t)=>{!e?.disabled&&console.log(`
2
+ `)}}),V=ue();function E(e){let t=x(e),s={};for(let i in t){let o=t[i],n=o.fields,c={};if(Object.entries(n).forEach(([f,r])=>{c[r.fieldName||f]=r}),s[o.tableName]){s[o.tableName].fields={...s[o.tableName].fields,...c};continue}s[o.tableName]={fields:c,order:o.order||1/0}}return s}var ce={string:["character varying","text"],number:["int4","integer","bigint","smallint","numeric","real","double precision"],boolean:["bool","boolean"],date:["timestamp","date"]},fe={string:["varchar","text"],number:["integer","int","bigint","smallint","decimal","float","double"],boolean:["boolean"],date:["datetime","date"]},pe={string:["TEXT"],number:["INTEGER","REAL"],boolean:["INTEGER","BOOLEAN"],date:["DATE","INTEGER"]},me={string:["nvarchar","varchar"],number:["int","bigint","smallint","decimal","float","double"],boolean:["bit","boolean"],date:["datetime","date"]},ye={postgres:ce,mysql:fe,sqlite:pe,mssql:me};function G(e,t,s){return t==="string[]"||t==="number[]"?e.toLowerCase().includes("json"):ye[s][t].map(c=>c.toLowerCase()).includes(e.toLowerCase())}async function be(e){let t=E(e),{kysely:s,databaseType:i}=await D(e);i||(V.warn("Could not determine database type, defaulting to sqlite. Please provide a type in the database options to avoid this."),i="sqlite"),s||(V.error("Only kysely adapter is supported for migrations. You can use `generate` command to generate the schema, if you're using a different adapter."),process.exit(1));let o=await s.introspection.getTables(),n=[],c=[];for(let[l,u]of Object.entries(t)){let p=o.find(y=>y.name===l);if(!p){let y=n.findIndex(N=>N.table===l),b={table:l,fields:u.fields,order:u.order||1/0},F=n.findIndex(N=>(N.order||1/0)>b.order);F===-1?y===-1?n.push(b):n[y].fields={...n[y].fields,...u.fields}:n.splice(F,0,b);continue}let m={};for(let[y,b]of Object.entries(u.fields)){let F=p.columns.find(N=>N.name===y);if(!F){m[y]=b;continue}G(F.dataType,b.type,i)||V.warn(`Field ${y} in table ${l} has a different type in the database. Expected ${b.type} but got ${F.dataType}.`)}Object.keys(m).length>0&&c.push({table:l,fields:m,order:u.order||1/0})}let f=[];function r(l){let u={string:"text",boolean:"boolean",number:"integer",date:"date"};return i==="mysql"&&l==="string"?"varchar(255)":i==="sqlite"&&(l==="string[]"||l==="number[]")?"text":l==="string[]"||l==="number[]"?"jsonb":u[l]}if(c.length)for(let l of c)for(let[u,p]of Object.entries(l.fields)){let m=r(p.type),y=s.schema.alterTable(l.table).addColumn(u,m,b=>(b=p.required!==!1?b.notNull():b,p.references&&(b=b.references(`${p.references.model}.${p.references.field}`)),b));f.push(y)}if(n.length)for(let l of n){let u=s.schema.createTable(l.table).addColumn("id",r("string"),p=>p.primaryKey().notNull());for(let[p,m]of Object.entries(l.fields)){let y=r(m.type);u=u.addColumn(p,y,b=>(b=m.required!==!1?b.notNull():b,m.references&&(b=b.references(`${m.references.model}.${m.references.field}`)),m.unique&&(b=b.unique()),b))}f.push(u)}async function a(){for(let l of f)await l.execute()}async function d(){return f.map(u=>u.compile().sql).join(`;
3
3
 
4
- `)}return{toBeCreated:n,toBeAdded:c,runMigrations:i,compileMigrations:d}}0&&(module.exports={convertFromDB,convertToDB,createFieldAttribute,createInternalAdapter,getAdapter,getAuthTables,getMigrations,getSchema,getWithHooks,matchType,toZodSchema});
4
+ `)}return{toBeCreated:n,toBeAdded:c,runMigrations:a,compileMigrations:d}}0&&(module.exports={convertFromDB,convertToDB,createFieldAttribute,createInternalAdapter,getAdapter,getAuthTables,getMigrations,getSchema,getWithHooks,matchType,toZodSchema});
package/dist/db.js CHANGED
@@ -1,4 +1,4 @@
1
- var S=(e,r="ms")=>new Date(Date.now()+(r==="sec"?e*1e3:e));var A=e=>{let r=e.plugins?.reduce((t,s)=>{let o=s.schema;if(!o)return t;for(let[l,u]of Object.entries(o))t[l]={fields:{...t[l]?.fields,...u.fields},tableName:u.tableName||l};return t},{}),i=e.rateLimit?.storage==="database",a={rateLimit:{tableName:e.rateLimit?.tableName||"rateLimit",fields:{key:{type:"string",fieldName:e.rateLimit?.fields?.key||"key"},count:{type:"number",fieldName:e.rateLimit?.fields?.count||"count"},lastRequest:{type:"number",fieldName:e.rateLimit?.fields?.lastRequest||"lastRequest"}}}},{user:d,session:n,account:c,...f}=r||{};return{user:{tableName:e.user?.modelName||"user",fields:{name:{type:"string",required:!0,fieldName:e.user?.fields?.name||"name"},email:{type:"string",unique:!0,required:!0,fieldName:e.user?.fields?.email||"email"},emailVerified:{type:"boolean",defaultValue:()=>!1,required:!0,fieldName:e.user?.fields?.emailVerified||"emailVerified"},image:{type:"string",required:!1,fieldName:e.user?.fields?.image||"image"},createdAt:{type:"date",defaultValue:()=>new Date,required:!0,fieldName:e.user?.fields?.createdAt||"createdAt"},updatedAt:{type:"date",defaultValue:()=>new Date,required:!0,fieldName:e.user?.fields?.updatedAt||"updatedAt"},...d?.fields,...e.user?.additionalFields},order:1},session:{tableName:e.session?.modelName||"session",fields:{expiresAt:{type:"date",required:!0,fieldName:e.session?.fields?.expiresAt||"expiresAt"},ipAddress:{type:"string",required:!1,fieldName:e.session?.fields?.ipAddress||"ipAddress"},userAgent:{type:"string",required:!1,fieldName:e.session?.fields?.userAgent||"userAgent"},userId:{type:"string",fieldName:e.session?.fields?.userId||"userId",references:{model:e.user?.modelName||"user",field:"id",onDelete:"cascade"},required:!0},...n?.fields,...e.session?.additionalFields},order:2},account:{tableName:e.account?.modelName||"account",fields:{accountId:{type:"string",required:!0,fieldName:e.account?.fields?.accountId||"accountId"},providerId:{type:"string",required:!0,fieldName:e.account?.fields?.providerId||"providerId"},userId:{type:"string",references:{model:e.user?.modelName||"user",field:"id",onDelete:"cascade"},required:!0,fieldName:e.account?.fields?.userId||"userId"},accessToken:{type:"string",required:!1,fieldName:e.account?.fields?.accessToken||"accessToken"},refreshToken:{type:"string",required:!1,fieldName:e.account?.fields?.refreshToken||"refreshToken"},idToken:{type:"string",required:!1,fieldName:e.account?.fields?.idToken||"idToken"},expiresAt:{type:"date",required:!1,fieldName:e.account?.fields?.expiresAt||"expiresAt"},password:{type:"string",required:!1,fieldName:e.account?.fields?.password||"password"},...c?.fields},order:3},verification:{tableName:e.verification?.modelName||"verification",fields:{identifier:{type:"string",required:!0,fieldName:e.verification?.fields?.identifier||"identifier"},value:{type:"string",required:!0,fieldName:e.verification?.fields?.value||"value"},expiresAt:{type:"date",required:!0,fieldName:e.verification?.fields?.expiresAt||"expiresAt"}},order:4},...f,...i?a:{}}};import{nanoid as $}from"nanoid";var h=e=>$(e);var F=class extends Error{constructor(r,i){super(r),this.name="BetterAuthError",this.message=r,this.cause=i}};import{Kysely as B,MssqlDialect as W}from"kysely";import{MysqlDialect as V,PostgresDialect as M,SqliteDialect as U}from"kysely";function K(e){if("dialect"in e)return K(e.dialect);if("createDriver"in e){if(e instanceof U)return"sqlite";if(e instanceof V)return"mysql";if(e instanceof M)return"postgres";if(e instanceof W)return"mssql"}return"aggregate"in e?"sqlite":"getConnection"in e?"mysql":"connect"in e?"postgres":null}var k=async e=>{let r=e.database;if("db"in r)return{kysely:r.db,databaseType:r.type};if("dialect"in r)return{kysely:new B({dialect:r.dialect}),databaseType:r.type};let i,a=K(r);return"createDriver"in r&&(i=r),"aggregate"in r&&(i=new U({database:r})),"getConnection"in r&&(i=new V(r)),"connect"in r&&(i=new M({pool:r})),{kysely:i?new B({dialect:i}):null,databaseType:a}};function N(e){if(!e)return{and:null,or:null};let r={and:[],or:[]};return e.forEach(i=>{let{field:a,value:d,operator:n="=",connector:c="AND"}=i,f=t=>n.toLowerCase()==="in"?t(a,"in",Array.isArray(d)?d:[d]):n==="contains"?t(a,"like",`%${d}%`):n==="starts_with"?t(a,"like",`${d}%`):n==="ends_with"?t(a,"like",`%${d}`):t(a,n,d);c==="OR"?r.or.push(f):r.and.push(f)}),{and:r.and.length?r.and:null,or:r.or.length?r.or:null}}function O(e,r,i){for(let a in e){let d=r[a]||Object.values(r).find(n=>n.fieldName===a);e[a]===0&&d.type==="boolean"&&i?.boolean&&(e[a]=!1),e[a]===1&&d?.type==="boolean"&&i?.boolean&&(e[a]=!0),d?.type==="date"&&(e[a]instanceof Date||(e[a]=new Date(e[a])))}return e}function j(e,r){for(let i in e)typeof e[i]=="boolean"&&r?.boolean&&(e[i]=e[i]?1:0),e[i]instanceof Date&&(e[i]=e[i].toISOString());return e}var E=(e,r)=>({id:"kysely",async create(i){let{model:a,data:d,select:n}=i;r?.transform&&(d=j(d,r.transform)),r?.generateId!==void 0&&(d.id=r.generateId?r.generateId():void 0);let c=await e.insertInto(a).values(d).returningAll().executeTakeFirst();if(r?.transform){let f=r.transform.schema[a];c=f?O(d,f,r.transform):c}return n?.length&&(c=c?n.reduce((t,s)=>c?.[s]?{...t,[s]:c[s]}:t,{}):null),c},async findOne(i){let{model:a,where:d,select:n}=i,{and:c,or:f}=N(d),t=e.selectFrom(a).selectAll();c&&(t=t.where(o=>o.and(c.map(l=>l(o))))),f&&(t=t.where(o=>o.or(f.map(l=>l(o)))));let s=await t.executeTakeFirst();if(n?.length&&(s=s?n.reduce((l,u)=>s?.[u]?{...l,[u]:s[u]}:l,{}):null),r?.transform){let o=r.transform.schema[a];return s=s&&o?O(s,o,r.transform):s,s||null}return s||null},async findMany(i){let{model:a,where:d,limit:n,offset:c,sortBy:f}=i,t=e.selectFrom(a),{and:s,or:o}=N(d);s&&(t=t.where(u=>u.and(s.map(m=>m(u))))),o&&(t=t.where(u=>u.or(o.map(m=>m(u))))),t=t.limit(n||100),c&&(t=t.offset(c)),f&&(t=t.orderBy(f.field,f.direction));let l=await t.selectAll().execute();if(r?.transform){let u=r.transform.schema[a];return u?l.map(m=>O(m,u,r.transform)):l}return l},async update(i){let{model:a,where:d,update:n}=i,{and:c,or:f}=N(d);r?.transform&&(n=j(n,r.transform)),n.id&&(n.id=void 0);let t=e.updateTable(a).set(n);c&&(t=t.where(o=>o.and(c.map(l=>l(o))))),f&&(t=t.where(o=>o.or(f.map(l=>l(o)))));let s=await t.returningAll().executeTakeFirst()||null;if(r?.transform){let o=r.transform.schema[a];return o?O(s,o,r.transform):s}return s},async delete(i){let{model:a,where:d}=i,{and:n,or:c}=N(d),f=e.deleteFrom(a);n&&(f=f.where(t=>t.and(n.map(s=>s(t))))),c&&(f=f.where(t=>t.or(c.map(s=>s(t))))),await f.execute()},async deleteMany(i){let{model:a,where:d}=i,{and:n,or:c}=N(d),f=e.deleteFrom(a);n&&(f=f.where(t=>t.and(n.map(s=>s(t))))),c&&(f=f.where(t=>t.or(c.map(s=>s(t))))),await f.execute()}});async function he(e){if(!e.database)throw new F("Database configuration is required");if("create"in e.database)return e.database;let{kysely:r,databaseType:i}=await k(e);if(!r)throw new F("Failed to initialize database adapter");let a=A(e),d={};for(let n of Object.values(a))d[n.tableName]=n.fields;return E(r,{transform:{schema:d,date:!0,boolean:i==="sqlite"},generateId:"generateId"in e.database?e.database.generateId:void 0})}function R(e,r){let i=r.id?{id:r.id}:{};for(let a in e){let d=e[a],n=r[a];n!==void 0&&(i[d.fieldName||a]=n)}return i}function g(e,r){if(!r)return null;let i={id:r.id};for(let[a,d]of Object.entries(e))i[a]=r[d.fieldName||a];return i}function C(e,r){let i=r.hooks,a=A(r.options);async function d(c,f,t){let s=c,o=a[f];for(let m of i||[]){let p=m[f]?.create?.before;if(p){let y=await p(c);if(y===!1)return null;typeof y=="object"&&"data"in y&&(s=y.data)}}let l=t?await t.fn(s):null,u=!t||t.executeMainFn?await e.create({model:o.tableName,data:{...R(o.fields,s),id:s.id||h()}}):l;for(let m of i||[]){let p=m[f]?.create?.after;p&&await p(u)}return g(o.fields,u)}async function n(c,f,t,s){let o=c;for(let m of i||[]){let p=m[t]?.update?.before;if(p){let y=await p(c);if(y===!1)return null;o=typeof y=="object"?y.data:y}}let l=s?await s.fn(o):null,u=!s||s.executeMainFn?await e.update({model:a[t].tableName,update:R(a[t].fields,o),where:f}):l;for(let m of i||[]){let p=m[t]?.update?.after;p&&await p(u)}return g(a[t].fields,u)}return{createWithHooks:d,updateWithHooks:n}}var D=Object.create(null),I=e=>globalThis.process?.env||globalThis.Deno?.env.toObject()||globalThis.__env__||(e?D:globalThis),H=new Proxy(D,{get(e,r){return I()[r]??D[r]},has(e,r){let i=I();return r in i||r in D},set(e,r,i){let a=I(!0);return a[r]=i,!0},deleteProperty(e,r){if(!r)return!1;let i=I(!0);return delete i[r],!0},ownKeys(){let e=I(!0);return Object.keys(e)}});function J(e){return e?e!=="false":!1}var Z=typeof process<"u"&&process.env&&process.env.NODE_ENV||"";var P=Z==="test"||J(H.TEST);function L(e){let r="127.0.0.1";if(P)return r;let i=["x-client-ip","x-forwarded-for","cf-connecting-ip","fastly-client-ip","x-real-ip","x-cluster-client-ip","x-forwarded","forwarded-for","forwarded"],a=e instanceof Request?e.headers:e;for(let d of i){let n=a.get(d);if(typeof n=="string"){let c=n.split(",")[0].trim();if(c)return c}}return null}var Be=(e,r)=>{let i=r.options,a=i.secondaryStorage,d=i.session?.expiresIn||60*60*24*7,n=A(i),{createWithHooks:c,updateWithHooks:f}=C(e,r);return{createOAuthUser:async(t,s)=>{try{let o=await c({id:h(),createdAt:new Date,updatedAt:new Date,...t},"user"),l=await c({id:h(),...s,userId:o.id||t.id},"account");return{user:o,account:l}}catch(o){return console.log(o),null}},createUser:async t=>await c({id:h(),createdAt:new Date,updatedAt:new Date,emailVerified:!1,...t},"user"),createAccount:async t=>await c({id:h(),createdAt:new Date,updatedAt:new Date,...t},"account"),listSessions:async t=>await e.findMany({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]}),listUsers:async(t,s,o,l)=>(await e.findMany({model:n.user.tableName,limit:t,offset:s,sortBy:o,where:l})).map(m=>g(n.user.fields,m)),deleteUser:async t=>{await e.delete({model:n.account.tableName,where:[{field:n.account.fields.userId.fieldName||"userId",value:t}]}),await e.deleteMany({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]}),await e.deleteMany({model:n.user.tableName,where:[{field:"id",value:t}]})},createSession:async(t,s,o,l)=>{let u=s instanceof Request?s.headers:s,m={id:h(32),userId:t,expiresAt:o?S(60*60*24,"sec"):S(d,"sec"),ipAddress:s&&L(s)||"",userAgent:u?.get("user-agent")||"",...l};return await c(m,"session",a?{fn:async y=>{let b=await e.findOne({model:n.user.tableName,where:[{field:"id",value:t}]});return a.set(y.id,JSON.stringify({session:y,user:b}),d),y},executeMainFn:i.session?.storeSessionInDatabase}:void 0)},findSession:async t=>{if(a){let u=await a.get(t);if(u){let m=JSON.parse(u);return{session:{...m.session,expiresAt:new Date(m.session.expiresAt)},user:{...m.user,createdAt:new Date(m.user.createdAt),updatedAt:new Date(m.user.updatedAt)}}}}let s=await e.findOne({model:n.session.tableName,where:[{value:t,field:"id"}]});if(!s)return null;let o=g(n.session.fields,s),l=await e.findOne({model:n.user.tableName,where:[{value:o.userId,field:"id"}]});return l?{session:o,user:g(n.user.fields,l)}:null},findSessions:async t=>{if(a){let u=[];for(let m of t){let p=await a.get(m);if(p){let y=JSON.parse(p),b={session:{...y.session,expiresAt:new Date(y.session.expiresAt)},user:{...y.user,createdAt:new Date(y.user.createdAt),updatedAt:new Date(y.user.updatedAt)}};u.push(b)}}return u}let s=await e.findMany({model:n.session.tableName,where:[{field:"id",value:t,operator:"in"}]}),o=s.map(u=>g(n.session.fields,u).userId);if(!o.length)return[];let l=await e.findMany({model:n.user.tableName,where:[{field:"id",value:o,operator:"in"}]});return s.map(u=>{let m=l.find(p=>p.id===u.userId);return m?{session:g(n.session.fields,u),user:g(n.user.fields,m)}:null})},updateSession:async(t,s)=>await f(s,[{field:"id",value:t}],"session",a?{async fn(l){let u=await a.get(t),m=null;if(u){let p=JSON.parse(u);m={...p.session,...l},await a.set(t,JSON.stringify({session:m,user:p.user}),p.session.expiresAt?Math.floor((p.session.expiresAt.getTime()-Date.now())/1e3):d)}else return null},executeMainFn:i.session?.storeSessionInDatabase}:void 0),deleteSession:async t=>{if(a){await a.delete(t),i.session?.storeSessionInDatabase&&await e.delete({model:n.session.tableName,where:[{field:"id",value:t}]});return}await e.delete({model:n.session.tableName,where:[{field:"id",value:t}]})},deleteSessions:async t=>{if(a){let s=await e.findMany({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]});for(let o of s)await a.delete(o.id);i.session?.storeSessionInDatabase&&await e.delete({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]});return}await e.deleteMany({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]})},findUserByEmail:async(t,s)=>{let o=await e.findOne({model:n.user.tableName,where:[{value:t.toLowerCase(),field:n.user.fields.email.fieldName||"email"}]});if(!o)return null;if(s?.includeAccounts){let l=await e.findMany({model:n.account.tableName,where:[{value:o.id,field:n.account.fields.userId.fieldName||"userId"}]});return{user:g(n.user.fields,o),accounts:l.map(u=>g(n.account.fields,u))}}return{user:g(n.user.fields,o),accounts:[]}},findUserById:async t=>await e.findOne({model:n.user.tableName,where:[{field:"id",value:t}]}),linkAccount:async t=>await c({id:h(),...t},"account"),updateUser:async(t,s)=>await f(s,[{field:"id",value:t}],"user"),updateUserByEmail:async(t,s)=>await f(s,[{field:n.user.fields.email.fieldName||"email",value:t}],"user"),updatePassword:async(t,s)=>await f({password:s},[{field:n.account.fields.userId.fieldName||"userId",value:t},{field:n.account.fields.providerId.fieldName||"providerId",value:"credential"}],"account"),findAccounts:async t=>(await e.findMany({model:n.account.tableName,where:[{field:n.account.fields.userId.fieldName||"userId",value:t}]})).map(o=>g(n.account.fields,o)),updateAccount:async(t,s)=>await f(s,[{field:"id",value:t}],"account"),createVerificationValue:async t=>await c({id:h(),...t},"verification"),findVerificationValue:async t=>{let s=await e.findMany({model:n.verification.tableName,where:[{field:n.verification.fields.identifier.fieldName||"identifier",value:t}],limit:100}),o=s.pop();return s.length>0&&await e.deleteMany({model:n.verification.tableName,where:[{operator:"in",field:"id",value:s.map(l=>l.id)}]}),o?g(n.verification.fields,o):null},deleteVerificationValue:async t=>{await e.delete({model:n.verification.tableName,where:[{field:"id",value:t}]})},updateVerificationValue:async(t,s)=>await f(s,[{field:"id",value:t}],"verification")}};var Me=(e,r)=>({type:e,...r});import{z as v}from"zod";function je(e){return v.object({...Object.keys(e).reduce((i,a)=>{let d=e[a];if(!d)return i;if(d.type==="string[]"||d.type==="number[]")return{...i,[a]:v.array(d.type==="string[]"?v.string():v.number())};let n=v[d.type]();return d?.required===!1&&(n=n.optional()),d?.returned===!1?i:{...i,[a]:n}},{})})}import{createConsola as z}from"consola";var x=z({formatOptions:{date:!1,colors:!0,compact:!0},defaults:{tag:"Better Auth"}}),G=e=>({log:(...r)=>{!e?.disabled&&x.log("",...r)},error:(...r)=>{!e?.disabled&&x.error("",...r)},warn:(...r)=>{!e?.disabled&&x.warn("",...r)},info:(...r)=>{!e?.disabled&&x.info("",...r)},debug:(...r)=>{!e?.disabled&&x.debug("",...r)},box:(...r)=>{!e?.disabled&&x.box("",...r)},success:(...r)=>{!e?.disabled&&x.success("",...r)},break:(...r)=>{!e?.disabled&&console.log(`
2
- `)}}),q=G();function _(e){let r=A(e),i={};for(let a in r){let d=r[a],n=d.fields,c={};if(Object.entries(n).forEach(([f,t])=>{c[t.fieldName||f]=t}),i[d.tableName]){i[d.tableName].fields={...i[d.tableName].fields,...c};continue}i[d.tableName]={fields:c,order:d.order||1/0}}return i}var X={string:["character varying","text"],number:["int4","integer","bigint","smallint","numeric","real","double precision"],boolean:["bool","boolean"],date:["timestamp","date"]},Y={string:["varchar","text"],number:["integer","int","bigint","smallint","decimal","float","double"],boolean:["boolean"],date:["datetime","date"]},Q={string:["TEXT"],number:["INTEGER","REAL"],boolean:["INTEGER","BOOLEAN"],date:["DATE","INTEGER"]},ee={string:["nvarchar","varchar"],number:["int","bigint","smallint","decimal","float","double"],boolean:["bit","boolean"],date:["datetime","date"]},te={postgres:X,mysql:Y,sqlite:Q,mssql:ee};function re(e,r,i){return r==="string[]"||r==="number[]"?e.toLowerCase().includes("json"):te[i][r].map(c=>c.toLowerCase()).includes(e.toLowerCase())}async function Je(e){let r=_(e),{kysely:i,databaseType:a}=await k(e);a||(q.warn("Could not determine database type, defaulting to sqlite. Please provide a type in the database options to avoid this."),a="sqlite"),i||(q.error("Only kysely adapter is supported for migrations. You can use `generate` command to generate the schema, if you're using a different adapter."),process.exit(1));let d=await i.introspection.getTables(),n=[],c=[];for(let[l,u]of Object.entries(r)){let m=d.find(y=>y.name===l);if(!m){let y=n.findIndex(T=>T.table===l),b={table:l,fields:u.fields,order:u.order||1/0},w=n.findIndex(T=>(T.order||1/0)>b.order);w===-1?y===-1?n.push(b):n[y].fields={...n[y].fields,...u.fields}:n.splice(w,0,b);continue}let p={};for(let[y,b]of Object.entries(u.fields)){let w=m.columns.find(T=>T.name===y);if(!w){p[y]=b;continue}re(w.dataType,b.type,a)||q.warn(`Field ${y} in table ${l} has a different type in the database. Expected ${b.type} but got ${w.dataType}.`)}Object.keys(p).length>0&&c.push({table:l,fields:p,order:u.order||1/0})}let f=[];function t(l){let u={string:"text",boolean:"boolean",number:"integer",date:"date"};return a==="mysql"&&l==="string"?"varchar(255)":a==="sqlite"&&(l==="string[]"||l==="number[]")?"text":l==="string[]"||l==="number[]"?"jsonb":u[l]}if(c.length)for(let l of c)for(let[u,m]of Object.entries(l.fields)){let p=t(m.type),y=i.schema.alterTable(l.table).addColumn(u,p,b=>(b=m.required!==!1?b.notNull():b,m.references&&(b=b.references(`${m.references.model}.${m.references.field}`)),b));f.push(y)}if(n.length)for(let l of n){let u=i.schema.createTable(l.table).addColumn("id",t("string"),m=>m.primaryKey().notNull());for(let[m,p]of Object.entries(l.fields)){let y=t(p.type);u=u.addColumn(m,y,b=>(b=p.required!==!1?b.notNull():b,p.references&&(b=b.references(`${p.references.model}.${p.references.field}`)),p.unique&&(b=b.unique()),b))}f.push(u)}async function s(){for(let l of f)await l.execute()}async function o(){return f.map(u=>u.compile().sql).join(`;
1
+ var R=(e,r="ms")=>new Date(Date.now()+(r==="sec"?e*1e3:e));var x=e=>{let r=e.plugins?.reduce((t,a)=>{let d=a.schema;if(!d)return t;for(let[l,u]of Object.entries(d))t[l]={fields:{...t[l]?.fields,...u.fields},tableName:u.tableName||l};return t},{}),s=e.rateLimit?.storage==="database",i={rateLimit:{tableName:e.rateLimit?.tableName||"rateLimit",fields:{key:{type:"string",fieldName:e.rateLimit?.fields?.key||"key"},count:{type:"number",fieldName:e.rateLimit?.fields?.count||"count"},lastRequest:{type:"number",fieldName:e.rateLimit?.fields?.lastRequest||"lastRequest"}}}},{user:o,session:n,account:c,...f}=r||{};return{user:{tableName:e.user?.modelName||"user",fields:{name:{type:"string",required:!0,fieldName:e.user?.fields?.name||"name"},email:{type:"string",unique:!0,required:!0,fieldName:e.user?.fields?.email||"email"},emailVerified:{type:"boolean",defaultValue:()=>!1,required:!0,fieldName:e.user?.fields?.emailVerified||"emailVerified"},image:{type:"string",required:!1,fieldName:e.user?.fields?.image||"image"},createdAt:{type:"date",defaultValue:()=>new Date,required:!0,fieldName:e.user?.fields?.createdAt||"createdAt"},updatedAt:{type:"date",defaultValue:()=>new Date,required:!0,fieldName:e.user?.fields?.updatedAt||"updatedAt"},...o?.fields,...e.user?.additionalFields},order:1},session:{tableName:e.session?.modelName||"session",fields:{expiresAt:{type:"date",required:!0,fieldName:e.session?.fields?.expiresAt||"expiresAt"},ipAddress:{type:"string",required:!1,fieldName:e.session?.fields?.ipAddress||"ipAddress"},userAgent:{type:"string",required:!1,fieldName:e.session?.fields?.userAgent||"userAgent"},userId:{type:"string",fieldName:e.session?.fields?.userId||"userId",references:{model:e.user?.modelName||"user",field:"id",onDelete:"cascade"},required:!0},...n?.fields,...e.session?.additionalFields},order:2},account:{tableName:e.account?.modelName||"account",fields:{accountId:{type:"string",required:!0,fieldName:e.account?.fields?.accountId||"accountId"},providerId:{type:"string",required:!0,fieldName:e.account?.fields?.providerId||"providerId"},userId:{type:"string",references:{model:e.user?.modelName||"user",field:"id",onDelete:"cascade"},required:!0,fieldName:e.account?.fields?.userId||"userId"},accessToken:{type:"string",required:!1,fieldName:e.account?.fields?.accessToken||"accessToken"},refreshToken:{type:"string",required:!1,fieldName:e.account?.fields?.refreshToken||"refreshToken"},idToken:{type:"string",required:!1,fieldName:e.account?.fields?.idToken||"idToken"},expiresAt:{type:"date",required:!1,fieldName:e.account?.fields?.expiresAt||"expiresAt"},password:{type:"string",required:!1,fieldName:e.account?.fields?.password||"password"},...c?.fields},order:3},verification:{tableName:e.verification?.modelName||"verification",fields:{identifier:{type:"string",required:!0,fieldName:e.verification?.fields?.identifier||"identifier"},value:{type:"string",required:!0,fieldName:e.verification?.fields?.value||"value"},expiresAt:{type:"date",required:!0,fieldName:e.verification?.fields?.expiresAt||"expiresAt"}},order:4},...f,...s?i:{}}};import{z as g}from"zod";var ce=g.object({id:g.string(),providerId:g.string(),accountId:g.string(),userId:g.string(),accessToken:g.string().nullable().optional(),refreshToken:g.string().nullable().optional(),idToken:g.string().nullable().optional(),expiresAt:g.date().nullable().optional(),password:g.string().optional().nullable()}),fe=g.object({id:g.string(),email:g.string().transform(e=>e.toLowerCase()),emailVerified:g.boolean().default(!1),name:g.string(),image:g.string().optional(),createdAt:g.date().default(new Date),updatedAt:g.date().default(new Date)}),pe=g.object({id:g.string(),userId:g.string(),expiresAt:g.date(),ipAddress:g.string().optional(),userAgent:g.string().optional()}),me=g.object({id:g.string(),value:g.string(),expiresAt:g.date(),identifier:g.string()});function M(e,r){let s=r.fields,i={};for(let o in e){let n=s[o];if(!n){i[o]=e[o];continue}n.returned!==!1&&(i[o]=e[o])}return i}function j(e,r){let s={...r==="user"?e.user?.additionalFields:{},...r==="session"?e.session?.additionalFields:{}};for(let i of e.plugins||[])i.schema&&i.schema[r]&&(s={...s,...i.schema[r].fields});return s}function B(e,r){let s=j(e,"user");return M(r,{fields:s})}function V(e,r){let s=j(e,"session");return M(r,{fields:s})}import{nanoid as Z}from"nanoid";var A=e=>Z(e);var I=class extends Error{constructor(r,s){super(r),this.name="BetterAuthError",this.message=r,this.cause=s}};import{Kysely as K,MssqlDialect as G}from"kysely";import{MysqlDialect as C,PostgresDialect as E,SqliteDialect as P}from"kysely";function L(e){if("dialect"in e)return L(e.dialect);if("createDriver"in e){if(e instanceof P)return"sqlite";if(e instanceof C)return"mysql";if(e instanceof E)return"postgres";if(e instanceof G)return"mssql"}return"aggregate"in e?"sqlite":"getConnection"in e?"mysql":"connect"in e?"postgres":null}var k=async e=>{let r=e.database;if("db"in r)return{kysely:r.db,databaseType:r.type};if("dialect"in r)return{kysely:new K({dialect:r.dialect}),databaseType:r.type};let s,i=L(r);return"createDriver"in r&&(s=r),"aggregate"in r&&(s=new P({database:r})),"getConnection"in r&&(s=new C(r)),"connect"in r&&(s=new E({pool:r})),{kysely:s?new K({dialect:s}):null,databaseType:i}};function N(e){if(!e)return{and:null,or:null};let r={and:[],or:[]};return e.forEach(s=>{let{field:i,value:o,operator:n="=",connector:c="AND"}=s,f=t=>n.toLowerCase()==="in"?t(i,"in",Array.isArray(o)?o:[o]):n==="contains"?t(i,"like",`%${o}%`):n==="starts_with"?t(i,"like",`${o}%`):n==="ends_with"?t(i,"like",`%${o}`):t(i,n,o);c==="OR"?r.or.push(f):r.and.push(f)}),{and:r.and.length?r.and:null,or:r.or.length?r.or:null}}function S(e,r,s){for(let i in e){let o=r[i]||Object.values(r).find(n=>n.fieldName===i);e[i]===0&&o.type==="boolean"&&s?.boolean&&(e[i]=!1),e[i]===1&&o?.type==="boolean"&&s?.boolean&&(e[i]=!0),o?.type==="date"&&(e[i]instanceof Date||(e[i]=new Date(e[i])))}return e}function _(e,r){for(let s in e)typeof e[s]=="boolean"&&r?.boolean&&(e[s]=e[s]?1:0),e[s]instanceof Date&&(e[s]=e[s].toISOString());return e}var $=(e,r)=>({id:"kysely",async create(s){let{model:i,data:o,select:n}=s;r?.transform&&(o=_(o,r.transform)),r?.generateId!==void 0&&(o.id=r.generateId?r.generateId():void 0);let c=await e.insertInto(i).values(o).returningAll().executeTakeFirst();if(r?.transform){let f=r.transform.schema[i];c=f?S(o,f,r.transform):c}return n?.length&&(c=c?n.reduce((t,a)=>c?.[a]?{...t,[a]:c[a]}:t,{}):null),c},async findOne(s){let{model:i,where:o,select:n}=s,{and:c,or:f}=N(o),t=e.selectFrom(i).selectAll();c&&(t=t.where(d=>d.and(c.map(l=>l(d))))),f&&(t=t.where(d=>d.or(f.map(l=>l(d)))));let a=await t.executeTakeFirst();if(n?.length&&(a=a?n.reduce((l,u)=>a?.[u]?{...l,[u]:a[u]}:l,{}):null),r?.transform){let d=r.transform.schema[i];return a=a&&d?S(a,d,r.transform):a,a||null}return a||null},async findMany(s){let{model:i,where:o,limit:n,offset:c,sortBy:f}=s,t=e.selectFrom(i),{and:a,or:d}=N(o);a&&(t=t.where(u=>u.and(a.map(p=>p(u))))),d&&(t=t.where(u=>u.or(d.map(p=>p(u))))),t=t.limit(n||100),c&&(t=t.offset(c)),f&&(t=t.orderBy(f.field,f.direction));let l=await t.selectAll().execute();if(r?.transform){let u=r.transform.schema[i];return u?l.map(p=>S(p,u,r.transform)):l}return l},async update(s){let{model:i,where:o,update:n}=s,{and:c,or:f}=N(o);r?.transform&&(n=_(n,r.transform)),n.id&&(n.id=void 0);let t=e.updateTable(i).set(n);c&&(t=t.where(d=>d.and(c.map(l=>l(d))))),f&&(t=t.where(d=>d.or(f.map(l=>l(d)))));let a=await t.returningAll().executeTakeFirst()||null;if(r?.transform){let d=r.transform.schema[i];return d?S(a,d,r.transform):a}return a},async delete(s){let{model:i,where:o}=s,{and:n,or:c}=N(o),f=e.deleteFrom(i);n&&(f=f.where(t=>t.and(n.map(a=>a(t))))),c&&(f=f.where(t=>t.or(c.map(a=>a(t))))),await f.execute()},async deleteMany(s){let{model:i,where:o}=s,{and:n,or:c}=N(o),f=e.deleteFrom(i);n&&(f=f.where(t=>t.and(n.map(a=>a(t))))),c&&(f=f.where(t=>t.or(c.map(a=>a(t))))),await f.execute()}});async function Se(e){if(!e.database)throw new I("Database configuration is required");if("create"in e.database)return e.database;let{kysely:r,databaseType:s}=await k(e);if(!r)throw new I("Failed to initialize database adapter");let i=x(e),o={};for(let n of Object.values(i))o[n.tableName]=n.fields;return $(r,{transform:{schema:o,date:!0,boolean:s==="sqlite"},generateId:"generateId"in e.database?e.database.generateId:void 0})}function U(e,r){let s=r.id?{id:r.id}:{};for(let i in e){let o=e[i],n=r[i];n!==void 0&&(s[o.fieldName||i]=n)}return s}function h(e,r){if(!r)return null;let s={id:r.id};for(let[i,o]of Object.entries(e))s[i]=r[o.fieldName||i];return s}function W(e,r){let s=r.hooks,i=x(r.options);async function o(c,f,t){let a=c,d=i[f];for(let p of s||[]){let m=p[f]?.create?.before;if(m){let y=await m(c);if(y===!1)return null;typeof y=="object"&&"data"in y&&(a=y.data)}}let l=t?await t.fn(a):null,u=!t||t.executeMainFn?await e.create({model:d.tableName,data:{...U(d.fields,a),id:a.id||A()}}):l;for(let p of s||[]){let m=p[f]?.create?.after;m&&await m(u)}return h(d.fields,u)}async function n(c,f,t,a){let d=c;for(let p of s||[]){let m=p[t]?.update?.before;if(m){let y=await m(c);if(y===!1)return null;d=typeof y=="object"?y.data:y}}let l=a?await a.fn(d):null,u=!a||a.executeMainFn?await e.update({model:i[t].tableName,update:U(i[t].fields,d),where:f}):l;for(let p of s||[]){let m=p[t]?.update?.after;m&&await m(u)}return h(i[t].fields,u)}return{createWithHooks:o,updateWithHooks:n}}var D=Object.create(null),v=e=>globalThis.process?.env||globalThis.Deno?.env.toObject()||globalThis.__env__||(e?D:globalThis),X=new Proxy(D,{get(e,r){return v()[r]??D[r]},has(e,r){let s=v();return r in s||r in D},set(e,r,s){let i=v(!0);return i[r]=s,!0},deleteProperty(e,r){if(!r)return!1;let s=v(!0);return delete s[r],!0},ownKeys(){let e=v(!0);return Object.keys(e)}});function Y(e){return e?e!=="false":!1}var Q=typeof process<"u"&&process.env&&process.env.NODE_ENV||"";var H=Q==="test"||Y(X.TEST);function z(e){let r="127.0.0.1";if(H)return r;let s=["x-client-ip","x-forwarded-for","cf-connecting-ip","fastly-client-ip","x-real-ip","x-cluster-client-ip","x-forwarded","forwarded-for","forwarded"],i=e instanceof Request?e.headers:e;for(let o of s){let n=i.get(o);if(typeof n=="string"){let c=n.split(",")[0].trim();if(c)return c}}return null}var We=(e,r)=>{let s=r.options,i=s.secondaryStorage,o=s.session?.expiresIn||60*60*24*7,n=x(s),{createWithHooks:c,updateWithHooks:f}=W(e,r);return{createOAuthUser:async(t,a)=>{try{let d=await c({id:A(),createdAt:new Date,updatedAt:new Date,...t},"user"),l=await c({id:A(),...a,userId:d.id||t.id},"account");return{user:d,account:l}}catch(d){return console.log(d),null}},createUser:async t=>await c({id:A(),createdAt:new Date,updatedAt:new Date,emailVerified:!1,...t},"user"),createAccount:async t=>await c({id:A(),createdAt:new Date,updatedAt:new Date,...t},"account"),listSessions:async t=>await e.findMany({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]}),listUsers:async(t,a,d,l)=>(await e.findMany({model:n.user.tableName,limit:t,offset:a,sortBy:d,where:l})).map(p=>h(n.user.fields,p)),deleteUser:async t=>{await e.delete({model:n.account.tableName,where:[{field:n.account.fields.userId.fieldName||"userId",value:t}]}),await e.deleteMany({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]}),await e.deleteMany({model:n.user.tableName,where:[{field:"id",value:t}]})},createSession:async(t,a,d,l)=>{let u=a instanceof Request?a.headers:a,p={id:A(32),userId:t,expiresAt:d?R(60*60*24,"sec"):R(o,"sec"),ipAddress:a&&z(a)||"",userAgent:u?.get("user-agent")||"",...l};return await c(p,"session",i?{fn:async y=>{let b=await e.findOne({model:n.user.tableName,where:[{field:"id",value:t}]});return i.set(y.id,JSON.stringify({session:y,user:b}),o),y},executeMainFn:s.session?.storeSessionInDatabase}:void 0)},findSession:async t=>{if(i){let p=await i.get(t);if(p){let m=JSON.parse(p),y=V(r.options,{...m.session,expiresAt:new Date(m.session.expiresAt)}),b=B(r.options,{...m.user,createdAt:new Date(m.user.createdAt),updatedAt:new Date(m.user.updatedAt)});return{session:y,user:b}}}let a=await e.findOne({model:n.session.tableName,where:[{value:t,field:"id"}]});if(!a)return null;let d=h(n.session.fields,a),l=await e.findOne({model:n.user.tableName,where:[{value:d.userId,field:"id"}]});if(!l)return null;let u=B(r.options,h(n.user.fields,l));return{session:V(r.options,d),user:u}},findSessions:async t=>{if(i){let u=[];for(let p of t){let m=await i.get(p);if(m){let y=JSON.parse(m),b={session:{...y.session,expiresAt:new Date(y.session.expiresAt)},user:{...y.user,createdAt:new Date(y.user.createdAt),updatedAt:new Date(y.user.updatedAt)}};u.push(b)}}return u}let a=await e.findMany({model:n.session.tableName,where:[{field:"id",value:t,operator:"in"}]}),d=a.map(u=>h(n.session.fields,u).userId);if(!d.length)return[];let l=await e.findMany({model:n.user.tableName,where:[{field:"id",value:d,operator:"in"}]});return a.map(u=>{let p=l.find(m=>m.id===u.userId);return p?{session:h(n.session.fields,u),user:h(n.user.fields,p)}:null})},updateSession:async(t,a)=>await f(a,[{field:"id",value:t}],"session",i?{async fn(l){let u=await i.get(t),p=null;if(u){let m=JSON.parse(u);p={...m.session,...l},await i.set(t,JSON.stringify({session:p,user:m.user}),m.session.expiresAt?Math.floor((m.session.expiresAt.getTime()-Date.now())/1e3):o)}else return null},executeMainFn:s.session?.storeSessionInDatabase}:void 0),deleteSession:async t=>{if(i){await i.delete(t),s.session?.storeSessionInDatabase&&await e.delete({model:n.session.tableName,where:[{field:"id",value:t}]});return}await e.delete({model:n.session.tableName,where:[{field:"id",value:t}]})},deleteSessions:async t=>{if(i){let a=await e.findMany({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]});for(let d of a)await i.delete(d.id);s.session?.storeSessionInDatabase&&await e.delete({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]});return}await e.deleteMany({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]})},findUserByEmail:async(t,a)=>{let d=await e.findOne({model:n.user.tableName,where:[{value:t.toLowerCase(),field:n.user.fields.email.fieldName||"email"}]});if(!d)return null;if(a?.includeAccounts){let l=await e.findMany({model:n.account.tableName,where:[{value:d.id,field:n.account.fields.userId.fieldName||"userId"}]});return{user:h(n.user.fields,d),accounts:l.map(u=>h(n.account.fields,u))}}return{user:h(n.user.fields,d),accounts:[]}},findUserById:async t=>await e.findOne({model:n.user.tableName,where:[{field:"id",value:t}]}),linkAccount:async t=>await c({id:A(),...t},"account"),updateUser:async(t,a)=>await f(a,[{field:"id",value:t}],"user"),updateUserByEmail:async(t,a)=>await f(a,[{field:n.user.fields.email.fieldName||"email",value:t}],"user"),updatePassword:async(t,a)=>await f({password:a},[{field:n.account.fields.userId.fieldName||"userId",value:t},{field:n.account.fields.providerId.fieldName||"providerId",value:"credential"}],"account"),findAccounts:async t=>(await e.findMany({model:n.account.tableName,where:[{field:n.account.fields.userId.fieldName||"userId",value:t}]})).map(d=>h(n.account.fields,d)),updateAccount:async(t,a)=>await f(a,[{field:"id",value:t}],"account"),createVerificationValue:async t=>await c({id:A(),...t},"verification"),findVerificationValue:async t=>{let a=await e.findMany({model:n.verification.tableName,where:[{field:n.verification.fields.identifier.fieldName||"identifier",value:t}],limit:100}),d=a.pop();return a.length>0&&await e.deleteMany({model:n.verification.tableName,where:[{operator:"in",field:"id",value:a.map(l=>l.id)}]}),d?h(n.verification.fields,d):null},deleteVerificationValue:async t=>{await e.delete({model:n.verification.tableName,where:[{field:"id",value:t}]})},updateVerificationValue:async(t,a)=>await f(a,[{field:"id",value:t}],"verification")}};var ze=(e,r)=>({type:e,...r});import{z as O}from"zod";function Ge(e){return O.object({...Object.keys(e).reduce((s,i)=>{let o=e[i];if(!o)return s;if(o.type==="string[]"||o.type==="number[]")return{...s,[i]:O.array(o.type==="string[]"?O.string():O.number())};let n=O[o.type]();return o?.required===!1&&(n=n.optional()),o?.returned===!1?s:{...s,[i]:n}},{})})}import{createConsola as ee}from"consola";var w=ee({formatOptions:{date:!1,colors:!0,compact:!0},defaults:{tag:"Better Auth"}}),te=e=>({log:(...r)=>{!e?.disabled&&w.log("",...r)},error:(...r)=>{!e?.disabled&&w.error("",...r)},warn:(...r)=>{!e?.disabled&&w.warn("",...r)},info:(...r)=>{!e?.disabled&&w.info("",...r)},debug:(...r)=>{!e?.disabled&&w.debug("",...r)},box:(...r)=>{!e?.disabled&&w.box("",...r)},success:(...r)=>{!e?.disabled&&w.success("",...r)},break:(...r)=>{!e?.disabled&&console.log(`
2
+ `)}}),q=te();function J(e){let r=x(e),s={};for(let i in r){let o=r[i],n=o.fields,c={};if(Object.entries(n).forEach(([f,t])=>{c[t.fieldName||f]=t}),s[o.tableName]){s[o.tableName].fields={...s[o.tableName].fields,...c};continue}s[o.tableName]={fields:c,order:o.order||1/0}}return s}var re={string:["character varying","text"],number:["int4","integer","bigint","smallint","numeric","real","double precision"],boolean:["bool","boolean"],date:["timestamp","date"]},ne={string:["varchar","text"],number:["integer","int","bigint","smallint","decimal","float","double"],boolean:["boolean"],date:["datetime","date"]},se={string:["TEXT"],number:["INTEGER","REAL"],boolean:["INTEGER","BOOLEAN"],date:["DATE","INTEGER"]},ie={string:["nvarchar","varchar"],number:["int","bigint","smallint","decimal","float","double"],boolean:["bit","boolean"],date:["datetime","date"]},ae={postgres:re,mysql:ne,sqlite:se,mssql:ie};function oe(e,r,s){return r==="string[]"||r==="number[]"?e.toLowerCase().includes("json"):ae[s][r].map(c=>c.toLowerCase()).includes(e.toLowerCase())}async function it(e){let r=J(e),{kysely:s,databaseType:i}=await k(e);i||(q.warn("Could not determine database type, defaulting to sqlite. Please provide a type in the database options to avoid this."),i="sqlite"),s||(q.error("Only kysely adapter is supported for migrations. You can use `generate` command to generate the schema, if you're using a different adapter."),process.exit(1));let o=await s.introspection.getTables(),n=[],c=[];for(let[l,u]of Object.entries(r)){let p=o.find(y=>y.name===l);if(!p){let y=n.findIndex(F=>F.table===l),b={table:l,fields:u.fields,order:u.order||1/0},T=n.findIndex(F=>(F.order||1/0)>b.order);T===-1?y===-1?n.push(b):n[y].fields={...n[y].fields,...u.fields}:n.splice(T,0,b);continue}let m={};for(let[y,b]of Object.entries(u.fields)){let T=p.columns.find(F=>F.name===y);if(!T){m[y]=b;continue}oe(T.dataType,b.type,i)||q.warn(`Field ${y} in table ${l} has a different type in the database. Expected ${b.type} but got ${T.dataType}.`)}Object.keys(m).length>0&&c.push({table:l,fields:m,order:u.order||1/0})}let f=[];function t(l){let u={string:"text",boolean:"boolean",number:"integer",date:"date"};return i==="mysql"&&l==="string"?"varchar(255)":i==="sqlite"&&(l==="string[]"||l==="number[]")?"text":l==="string[]"||l==="number[]"?"jsonb":u[l]}if(c.length)for(let l of c)for(let[u,p]of Object.entries(l.fields)){let m=t(p.type),y=s.schema.alterTable(l.table).addColumn(u,m,b=>(b=p.required!==!1?b.notNull():b,p.references&&(b=b.references(`${p.references.model}.${p.references.field}`)),b));f.push(y)}if(n.length)for(let l of n){let u=s.schema.createTable(l.table).addColumn("id",t("string"),p=>p.primaryKey().notNull());for(let[p,m]of Object.entries(l.fields)){let y=t(m.type);u=u.addColumn(p,y,b=>(b=m.required!==!1?b.notNull():b,m.references&&(b=b.references(`${m.references.model}.${m.references.field}`)),m.unique&&(b=b.unique()),b))}f.push(u)}async function a(){for(let l of f)await l.execute()}async function d(){return f.map(u=>u.compile().sql).join(`;
3
3
 
4
- `)}return{toBeCreated:n,toBeAdded:c,runMigrations:s,compileMigrations:o}}export{g as convertFromDB,R as convertToDB,Me as createFieldAttribute,Be as createInternalAdapter,he as getAdapter,A as getAuthTables,Je as getMigrations,_ as getSchema,C as getWithHooks,re as matchType,je as toZodSchema};
4
+ `)}return{toBeCreated:n,toBeAdded:c,runMigrations:a,compileMigrations:d}}export{h as convertFromDB,U as convertToDB,ze as createFieldAttribute,We as createInternalAdapter,Se as getAdapter,x as getAuthTables,it as getMigrations,J as getSchema,W as getWithHooks,oe as matchType,Ge as toZodSchema};