better-auth 0.5.2-beta.11 → 0.5.2-beta.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var R=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var G=Object.prototype.hasOwnProperty;var H=(e,t)=>{for(var s in t)R(e,s,{get:t[s],enumerable:!0})},j=(e,t,s,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of M(t))!G.call(e,r)&&r!==s&&R(e,r,{get:()=>t[r],enumerable:!(i=q(t,r))||i.enumerable});return e};var z=e=>j(R({},"__esModule",{value:!0}),e);var Q={};H(Q,{createAuthClient:()=>D,useAuthQuery:()=>T});module.exports=z(Q);var B=require("@better-fetch/fetch");var d=class extends Error{constructor(t,s){super(t),this.name="BetterAuthError",this.message=t,this.cause=s,this.stack=""}};function N(e){try{return new URL(e).pathname!=="/"}catch{throw new d(`Invalid base URL: ${e}. Please provide a valid base URL.`)}}function A(e,t="/api/auth"){return N(e)?e:(t=t.startsWith("/")?t:`/${t}`,`${e}${t}`)}function U(e,t){if(e)return A(e,t);let s=typeof process<"u"?process.env:{},i=s.BETTER_AUTH_URL||s.NEXT_PUBLIC_BETTER_AUTH_URL||s.PUBLIC_BETTER_AUTH_URL||s.NUXT_PUBLIC_BETTER_AUTH_URL||s.NUXT_PUBLIC_AUTH_URL||(s.BASE_URL!=="/"?s.BASE_URL:void 0);if(i)return A(i,t);if(typeof window<"u")return A(window.location.origin,t)}var ne=require("nanostores");var F=require("@better-fetch/fetch");var b={id:"redirect",name:"Redirect",hooks:{onSuccess(e){e.data?.url&&e.data?.redirect&&typeof window<"u"&&(window.location.href=e.data.url)}}},C={id:"add-current-url",name:"Add current URL",hooks:{onRequest(e){if(typeof window<"u"){let t=new URL(e.url);t.searchParams.set("currentURL",window.location.href),e.url=t}return e}}},L={id:"csrf",name:"CSRF Check",async init(e,t){if(t?.method!=="GET"){t=t||{};let{data:s,error:i}=await(0,F.betterFetch)("/csrf",{body:void 0,baseURL:t.baseURL,plugins:[],method:"GET",credentials:"include",customFetchImpl:t.customFetchImpl});if(i){if(i.status===404)throw new d("CSRF route not found. Make sure the server is running and the base URL is correct and includes the path (e.g. http://localhost:3000/api/auth).");if(i.status===429)return new Response(JSON.stringify({message:"Too many requests. Please try again later."}),{status:429,statusText:"Too Many Requests"});throw new d("Failed to fetch CSRF token: "+i.message)}let r=s?.csrfToken;t.body={...t?.body,csrfToken:r}}return t.credentials="include",{url:e,options:t}}};var S=e=>{let t=(0,B.createFetch)({baseURL:U(e?.fetchOptions?.baseURL||e?.baseURL),credentials:"include",method:"GET",...e?.fetchOptions,plugins:e?.disableDefaultFetchPlugins?e.fetchOptions?.plugins:[...e?.disableCSRFTokenCheck?[]:[L],b,C,...e?.fetchOptions?.plugins?.filter(n=>n!==void 0)||[],...e?.plugins?.flatMap(n=>n.fetchPlugins).filter(n=>n!==void 0)||[]]}),s=e?.plugins||[],i={},r={},u={"/sign-out":"POST","/user/revoke-sessions":"POST"},o=[{signal:"_sessionSignal",matcher(n){return n==="/sign-out"||n==="/user/update"||n.startsWith("/sign-in")||n.startsWith("/sign-up")}}];for(let n of s)n.getActions&&Object.assign(i,n.getActions?.(t)),n.getAtoms&&Object.assign(r,n.getAtoms?.(t)),n.pathMethods&&Object.assign(u,n.pathMethods),n.atomListeners&&o.push(...n.atomListeners);return{pluginsActions:i,pluginsAtoms:r,pluginPathMethods:u,atomListeners:o,$fetch:t}};function x(e){return e.charAt(0).toUpperCase()+e.slice(1)}function X(e,t,s){let i=t[e],{fetchOptions:r,query:u,...o}=s||{};return i||(r?.method?r.method:o&&Object.keys(o).length>0?"POST":"GET")}function w(e,t,s,i,r){function u(o=[]){return new Proxy(function(){},{get(n,c){let l=[...o,c],a=e;for(let f of l)if(a&&typeof a=="object"&&f in a)a=a[f];else{a=void 0;break}return typeof a=="function"?a:u(l)},apply:async(n,c,l)=>{let a="/"+o.map(y=>y.replace(/[A-Z]/g,h=>`-${h.toLowerCase()}`)).join("/"),f=l[0]||{},m=l[1]||{},{query:k,fetchOptions:_,...$}=f,p={...m,..._},O=X(a,s,f);return await t(a,{...p,body:O==="GET"?void 0:{...$,...p?.body||{}},query:k||p?.query,method:O,async onSuccess(y){await p?.onSuccess?.(y);let h=r?.find(W=>W.matcher(a));if(!h)return;let P=i[h.signal];if(!P)return;let v=P.get();setTimeout(()=>{P.set(!v)},10)}})}})}return u()}var I=require("nanostores");var ae=require("@better-fetch/fetch"),g=require("nanostores"),T=(e,t,s,i)=>{let r=(0,g.atom)({data:null,error:null,isPending:!1,isRefetching:!1}),u=()=>{let n=typeof i=="function"?i({data:r.get().data,error:r.get().error,isPending:r.get().isPending}):i;return s(t,{...n,onSuccess:async c=>{r.set({data:c.data,error:null,isPending:!1,isRefetching:!1}),await n?.onSuccess?.(c)},async onError(c){r.set({error:c.error,data:null,isPending:!1,isRefetching:!1}),await n?.onError?.(c)},async onRequest(c){let l=r.get();r.set({isPending:l.data===null,data:l.data,error:null,isRefetching:!0}),await n?.onRequest?.(c)}})};e=Array.isArray(e)?e:[e];let o=!1;for(let n of e)n.subscribe(()=>{o?u():(0,g.onMount)(r,()=>(u(),o=!0,()=>{r.off(),n.off()}))});return r};function E(e){let t=(0,I.atom)(!1);return{$session:T(t,"/session",e,{method:"GET"}),_sessionSignal:t,$Infer:{}}}function D(e){let{pluginPathMethods:t,pluginsActions:s,pluginsAtoms:i,$fetch:r,atomListeners:u}=S(e),o={};for(let[f,m]of Object.entries(i))o[`use${x(f)}`]=m;let{$session:n,_sessionSignal:c}=E(r),l={...s,...o,$fetch:r,useSession:n};return w(l,r,t,{...i,_sessionSignal:c},u)}0&&(module.exports={createAuthClient,useAuthQuery});
1
+ "use strict";var A=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var H=Object.prototype.hasOwnProperty;var j=(e,t)=>{for(var s in t)A(e,s,{get:t[s],enumerable:!0})},z=(e,t,s,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of G(t))!H.call(e,r)&&r!==s&&A(e,r,{get:()=>t[r],enumerable:!(i=M(t,r))||i.enumerable});return e};var N=e=>z(A({},"__esModule",{value:!0}),e);var J={};j(J,{createAuthClient:()=>D,useAuthQuery:()=>O});module.exports=N(J);var S=require("@better-fetch/fetch");var f=require("std-env");var p=class extends Error{constructor(t,s){super(t),this.name="BetterAuthError",this.message=t,this.cause=s,this.stack=""}};function X(e){try{return new URL(e).pathname!=="/"}catch{throw new p(`Invalid base URL: ${e}. Please provide a valid base URL.`)}}function T(e,t="/api/auth"){return X(e)?e:(t=t.startsWith("/")?t:`/${t}`,`${e}${t}`)}function F(e,t){if(e)return T(e,t);let s=f.env.BETTER_AUTH_URL||f.env.NEXT_PUBLIC_BETTER_AUTH_URL||f.env.PUBLIC_BETTER_AUTH_URL||f.env.NUXT_PUBLIC_BETTER_AUTH_URL||f.env.NUXT_PUBLIC_AUTH_URL||(f.env.BASE_URL!=="/"?f.env.BASE_URL:void 0);if(s)return T(s,t);if(typeof window<"u")return T(window.location.origin,t)}var re=require("nanostores");var b=require("@better-fetch/fetch");var C={id:"redirect",name:"Redirect",hooks:{onSuccess(e){e.data?.url&&e.data?.redirect&&typeof window<"u"&&(window.location.href=e.data.url)}}},L={id:"add-current-url",name:"Add current URL",hooks:{onRequest(e){if(typeof window<"u"){let t=new URL(e.url);t.searchParams.set("currentURL",window.location.href),e.url=t}return e}}},B={id:"csrf",name:"CSRF Check",async init(e,t){if(t?.method!=="GET"){t=t||{};let{data:s,error:i}=await(0,b.betterFetch)("/csrf",{body:void 0,baseURL:t.baseURL,plugins:[],method:"GET",credentials:"include",customFetchImpl:t.customFetchImpl});if(i){if(i.status===404)throw new p("CSRF route not found. Make sure the server is running and the base URL is correct and includes the path (e.g. http://localhost:3000/api/auth).");if(i.status===429)return new Response(JSON.stringify({message:"Too many requests. Please try again later."}),{status:429,statusText:"Too Many Requests"});throw new p("Failed to fetch CSRF token: "+i.message)}let r=s?.csrfToken;t.body={...t?.body,csrfToken:r}}return t.credentials="include",{url:e,options:t}}};var x=e=>{let t=(0,S.createFetch)({baseURL:F(e?.fetchOptions?.baseURL||e?.baseURL),credentials:"include",method:"GET",...e?.fetchOptions,plugins:[...e?.disableCSRFTokenCheck?[]:[B],C,L,...e?.fetchOptions?.plugins?.filter(n=>n!==void 0)||[],...e?.plugins?.flatMap(n=>n.fetchPlugins).filter(n=>n!==void 0)||[]]}),s=e?.plugins||[],i={},r={},u={"/sign-out":"POST","/user/revoke-sessions":"POST"},o=[{signal:"_sessionSignal",matcher(n){return n==="/sign-out"||n==="/user/update"||n.startsWith("/sign-in")||n.startsWith("/sign-up")}}];for(let n of s)n.getActions&&Object.assign(i,n.getActions?.(t)),n.getAtoms&&Object.assign(r,n.getAtoms?.(t)),n.pathMethods&&Object.assign(u,n.pathMethods),n.atomListeners&&o.push(...n.atomListeners);return{pluginsActions:i,pluginsAtoms:r,pluginPathMethods:u,atomListeners:o,$fetch:t}};function w(e){return e.charAt(0).toUpperCase()+e.slice(1)}function Q(e,t,s){let i=t[e],{fetchOptions:r,query:u,...o}=s||{};return i||(r?.method?r.method:o&&Object.keys(o).length>0?"POST":"GET")}function I(e,t,s,i,r){function u(o=[]){return new Proxy(function(){},{get(n,c){let l=[...o,c],a=e;for(let d of l)if(a&&typeof a=="object"&&d in a)a=a[d];else{a=void 0;break}return typeof a=="function"?a:u(l)},apply:async(n,c,l)=>{let a="/"+o.map(P=>P.replace(/[A-Z]/g,g=>`-${g.toLowerCase()}`)).join("/"),d=l[0]||{},y=l[1]||{},{query:_,fetchOptions:$,...v}=d,h={...y,...$},U=Q(a,s,d);return await t(a,{...h,body:U==="GET"?void 0:{...v,...h?.body||{}},query:_||h?.query,method:U,async onSuccess(P){await h?.onSuccess?.(P);let g=r?.find(q=>q.matcher(a));if(!g)return;let R=i[g.signal];if(!R)return;let W=R.get();setTimeout(()=>{R.set(!W)},10)}})}})}return u()}var E=require("nanostores");var ce=require("@better-fetch/fetch"),m=require("nanostores"),O=(e,t,s,i)=>{let r=(0,m.atom)({data:null,error:null,isPending:!1,isRefetching:!1}),u=()=>{let n=typeof i=="function"?i({data:r.get().data,error:r.get().error,isPending:r.get().isPending}):i;return s(t,{...n,onSuccess:async c=>{r.set({data:c.data,error:null,isPending:!1,isRefetching:!1}),await n?.onSuccess?.(c)},async onError(c){r.set({error:c.error,data:null,isPending:!1,isRefetching:!1}),await n?.onError?.(c)},async onRequest(c){let l=r.get();r.set({isPending:l.data===null,data:l.data,error:null,isRefetching:!0}),await n?.onRequest?.(c)}})};e=Array.isArray(e)?e:[e];let o=!1;for(let n of e)n.subscribe(()=>{o?u():(0,m.onMount)(r,()=>(u(),o=!0,()=>{r.off(),n.off()}))});return r};function k(e){let t=(0,E.atom)(!1);return{$session:O(t,"/session",e,{method:"GET"}),_sessionSignal:t,$Infer:{}}}function D(e){let{pluginPathMethods:t,pluginsActions:s,pluginsAtoms:i,$fetch:r,atomListeners:u}=x(e),o={};for(let[d,y]of Object.entries(i))o[`use${w(d)}`]=y;let{$session:n,_sessionSignal:c}=k(r),l={...s,...o,$fetch:r,useSession:n};return I(l,r,t,{...i,_sessionSignal:c},u)}0&&(module.exports={createAuthClient,useAuthQuery});
package/dist/client.d.cts CHANGED
@@ -190,7 +190,7 @@ declare function createAuthClient<Option extends ClientOptions>(options?: Option
190
190
  disableValidation?: boolean | undefined;
191
191
  };
192
192
  }>;
193
- })[] | undefined;
193
+ })[];
194
194
  headers?: (HeadersInit & (HeadersInit | {
195
195
  accept: "application/json" | "text/plain" | "application/octet-stream";
196
196
  "content-type": "application/json" | "text/plain" | "application/x-www-form-urlencoded" | "multipart/form-data" | "application/octet-stream";
@@ -253,7 +253,7 @@ declare function createAuthClient<Option extends ClientOptions>(options?: Option
253
253
  output?: zod.ZodType | typeof Blob | typeof File;
254
254
  errorSchema?: zod.ZodType;
255
255
  disableValidation?: boolean;
256
- }, unknown, unknown, unknown>;
256
+ }, unknown, unknown, {}>;
257
257
  $Infer: {
258
258
  Session: {
259
259
  session: InferSessionFromClient<Option>;
package/dist/client.d.ts CHANGED
@@ -190,7 +190,7 @@ declare function createAuthClient<Option extends ClientOptions>(options?: Option
190
190
  disableValidation?: boolean | undefined;
191
191
  };
192
192
  }>;
193
- })[] | undefined;
193
+ })[];
194
194
  headers?: (HeadersInit & (HeadersInit | {
195
195
  accept: "application/json" | "text/plain" | "application/octet-stream";
196
196
  "content-type": "application/json" | "text/plain" | "application/x-www-form-urlencoded" | "multipart/form-data" | "application/octet-stream";
@@ -253,7 +253,7 @@ declare function createAuthClient<Option extends ClientOptions>(options?: Option
253
253
  output?: zod.ZodType | typeof Blob | typeof File;
254
254
  errorSchema?: zod.ZodType;
255
255
  disableValidation?: boolean;
256
- }, unknown, unknown, unknown>;
256
+ }, unknown, unknown, {}>;
257
257
  $Infer: {
258
258
  Session: {
259
259
  session: InferSessionFromClient<Option>;
package/dist/client.js CHANGED
@@ -1 +1 @@
1
- import{createFetch as $}from"@better-fetch/fetch";var d=class extends Error{constructor(t,s){super(t),this.name="BetterAuthError",this.message=t,this.cause=s,this.stack=""}};function k(e){try{return new URL(e).pathname!=="/"}catch{throw new d(`Invalid base URL: ${e}. Please provide a valid base URL.`)}}function P(e,t="/api/auth"){return k(e)?e:(t=t.startsWith("/")?t:`/${t}`,`${e}${t}`)}function A(e,t){if(e)return P(e,t);let s=typeof process<"u"?process.env:{},i=s.BETTER_AUTH_URL||s.NEXT_PUBLIC_BETTER_AUTH_URL||s.PUBLIC_BETTER_AUTH_URL||s.NUXT_PUBLIC_BETTER_AUTH_URL||s.NUXT_PUBLIC_AUTH_URL||(s.BASE_URL!=="/"?s.BASE_URL:void 0);if(i)return P(i,t);if(typeof window<"u")return P(window.location.origin,t)}import"nanostores";import{betterFetch as _}from"@better-fetch/fetch";var T={id:"redirect",name:"Redirect",hooks:{onSuccess(e){e.data?.url&&e.data?.redirect&&typeof window<"u"&&(window.location.href=e.data.url)}}},O={id:"add-current-url",name:"Add current URL",hooks:{onRequest(e){if(typeof window<"u"){let t=new URL(e.url);t.searchParams.set("currentURL",window.location.href),e.url=t}return e}}},U={id:"csrf",name:"CSRF Check",async init(e,t){if(t?.method!=="GET"){t=t||{};let{data:s,error:i}=await _("/csrf",{body:void 0,baseURL:t.baseURL,plugins:[],method:"GET",credentials:"include",customFetchImpl:t.customFetchImpl});if(i){if(i.status===404)throw new d("CSRF route not found. Make sure the server is running and the base URL is correct and includes the path (e.g. http://localhost:3000/api/auth).");if(i.status===429)return new Response(JSON.stringify({message:"Too many requests. Please try again later."}),{status:429,statusText:"Too Many Requests"});throw new d("Failed to fetch CSRF token: "+i.message)}let r=s?.csrfToken;t.body={...t?.body,csrfToken:r}}return t.credentials="include",{url:e,options:t}}};var F=e=>{let t=$({baseURL:A(e?.fetchOptions?.baseURL||e?.baseURL),credentials:"include",method:"GET",...e?.fetchOptions,plugins:e?.disableDefaultFetchPlugins?e.fetchOptions?.plugins:[...e?.disableCSRFTokenCheck?[]:[U],T,O,...e?.fetchOptions?.plugins?.filter(n=>n!==void 0)||[],...e?.plugins?.flatMap(n=>n.fetchPlugins).filter(n=>n!==void 0)||[]]}),s=e?.plugins||[],i={},r={},u={"/sign-out":"POST","/user/revoke-sessions":"POST"},o=[{signal:"_sessionSignal",matcher(n){return n==="/sign-out"||n==="/user/update"||n.startsWith("/sign-in")||n.startsWith("/sign-up")}}];for(let n of s)n.getActions&&Object.assign(i,n.getActions?.(t)),n.getAtoms&&Object.assign(r,n.getAtoms?.(t)),n.pathMethods&&Object.assign(u,n.pathMethods),n.atomListeners&&o.push(...n.atomListeners);return{pluginsActions:i,pluginsAtoms:r,pluginPathMethods:u,atomListeners:o,$fetch:t}};function b(e){return e.charAt(0).toUpperCase()+e.slice(1)}function v(e,t,s){let i=t[e],{fetchOptions:r,query:u,...o}=s||{};return i||(r?.method?r.method:o&&Object.keys(o).length>0?"POST":"GET")}function C(e,t,s,i,r){function u(o=[]){return new Proxy(function(){},{get(n,c){let l=[...o,c],a=e;for(let f of l)if(a&&typeof a=="object"&&f in a)a=a[f];else{a=void 0;break}return typeof a=="function"?a:u(l)},apply:async(n,c,l)=>{let a="/"+o.map(m=>m.replace(/[A-Z]/g,h=>`-${h.toLowerCase()}`)).join("/"),f=l[0]||{},g=l[1]||{},{query:S,fetchOptions:x,...w}=f,p={...g,...x},R=v(a,s,f);return await t(a,{...p,body:R==="GET"?void 0:{...w,...p?.body||{}},query:S||p?.query,method:R,async onSuccess(m){await p?.onSuccess?.(m);let h=r?.find(E=>E.matcher(a));if(!h)return;let y=i[h.signal];if(!y)return;let I=y.get();setTimeout(()=>{y.set(!I)},10)}})}})}return u()}import{atom as M}from"nanostores";import"@better-fetch/fetch";import{atom as W,onMount as q}from"nanostores";var L=(e,t,s,i)=>{let r=W({data:null,error:null,isPending:!1,isRefetching:!1}),u=()=>{let n=typeof i=="function"?i({data:r.get().data,error:r.get().error,isPending:r.get().isPending}):i;return s(t,{...n,onSuccess:async c=>{r.set({data:c.data,error:null,isPending:!1,isRefetching:!1}),await n?.onSuccess?.(c)},async onError(c){r.set({error:c.error,data:null,isPending:!1,isRefetching:!1}),await n?.onError?.(c)},async onRequest(c){let l=r.get();r.set({isPending:l.data===null,data:l.data,error:null,isRefetching:!0}),await n?.onRequest?.(c)}})};e=Array.isArray(e)?e:[e];let o=!1;for(let n of e)n.subscribe(()=>{o?u():q(r,()=>(u(),o=!0,()=>{r.off(),n.off()}))});return r};function B(e){let t=M(!1);return{$session:L(t,"/session",e,{method:"GET"}),_sessionSignal:t,$Infer:{}}}function fe(e){let{pluginPathMethods:t,pluginsActions:s,pluginsAtoms:i,$fetch:r,atomListeners:u}=F(e),o={};for(let[f,g]of Object.entries(i))o[`use${b(f)}`]=g;let{$session:n,_sessionSignal:c}=B(r),l={...s,...o,$fetch:r,useSession:n};return C(l,r,t,{...i,_sessionSignal:c},u)}export{fe as createAuthClient,L as useAuthQuery};
1
+ import{createFetch as v}from"@better-fetch/fetch";import{env as p}from"std-env";var d=class extends Error{constructor(t,i){super(t),this.name="BetterAuthError",this.message=t,this.cause=i,this.stack=""}};function _(e){try{return new URL(e).pathname!=="/"}catch{throw new d(`Invalid base URL: ${e}. Please provide a valid base URL.`)}}function R(e,t="/api/auth"){return _(e)?e:(t=t.startsWith("/")?t:`/${t}`,`${e}${t}`)}function T(e,t){if(e)return R(e,t);let i=p.BETTER_AUTH_URL||p.NEXT_PUBLIC_BETTER_AUTH_URL||p.PUBLIC_BETTER_AUTH_URL||p.NUXT_PUBLIC_BETTER_AUTH_URL||p.NUXT_PUBLIC_AUTH_URL||(p.BASE_URL!=="/"?p.BASE_URL:void 0);if(i)return R(i,t);if(typeof window<"u")return R(window.location.origin,t)}import"nanostores";import{betterFetch as $}from"@better-fetch/fetch";var O={id:"redirect",name:"Redirect",hooks:{onSuccess(e){e.data?.url&&e.data?.redirect&&typeof window<"u"&&(window.location.href=e.data.url)}}},U={id:"add-current-url",name:"Add current URL",hooks:{onRequest(e){if(typeof window<"u"){let t=new URL(e.url);t.searchParams.set("currentURL",window.location.href),e.url=t}return e}}},F={id:"csrf",name:"CSRF Check",async init(e,t){if(t?.method!=="GET"){t=t||{};let{data:i,error:s}=await $("/csrf",{body:void 0,baseURL:t.baseURL,plugins:[],method:"GET",credentials:"include",customFetchImpl:t.customFetchImpl});if(s){if(s.status===404)throw new d("CSRF route not found. Make sure the server is running and the base URL is correct and includes the path (e.g. http://localhost:3000/api/auth).");if(s.status===429)return new Response(JSON.stringify({message:"Too many requests. Please try again later."}),{status:429,statusText:"Too Many Requests"});throw new d("Failed to fetch CSRF token: "+s.message)}let r=i?.csrfToken;t.body={...t?.body,csrfToken:r}}return t.credentials="include",{url:e,options:t}}};var b=e=>{let t=v({baseURL:T(e?.fetchOptions?.baseURL||e?.baseURL),credentials:"include",method:"GET",...e?.fetchOptions,plugins:[...e?.disableCSRFTokenCheck?[]:[F],O,U,...e?.fetchOptions?.plugins?.filter(n=>n!==void 0)||[],...e?.plugins?.flatMap(n=>n.fetchPlugins).filter(n=>n!==void 0)||[]]}),i=e?.plugins||[],s={},r={},u={"/sign-out":"POST","/user/revoke-sessions":"POST"},o=[{signal:"_sessionSignal",matcher(n){return n==="/sign-out"||n==="/user/update"||n.startsWith("/sign-in")||n.startsWith("/sign-up")}}];for(let n of i)n.getActions&&Object.assign(s,n.getActions?.(t)),n.getAtoms&&Object.assign(r,n.getAtoms?.(t)),n.pathMethods&&Object.assign(u,n.pathMethods),n.atomListeners&&o.push(...n.atomListeners);return{pluginsActions:s,pluginsAtoms:r,pluginPathMethods:u,atomListeners:o,$fetch:t}};function C(e){return e.charAt(0).toUpperCase()+e.slice(1)}function W(e,t,i){let s=t[e],{fetchOptions:r,query:u,...o}=i||{};return s||(r?.method?r.method:o&&Object.keys(o).length>0?"POST":"GET")}function L(e,t,i,s,r){function u(o=[]){return new Proxy(function(){},{get(n,c){let l=[...o,c],a=e;for(let f of l)if(a&&typeof a=="object"&&f in a)a=a[f];else{a=void 0;break}return typeof a=="function"?a:u(l)},apply:async(n,c,l)=>{let a="/"+o.map(y=>y.replace(/[A-Z]/g,g=>`-${g.toLowerCase()}`)).join("/"),f=l[0]||{},m=l[1]||{},{query:x,fetchOptions:w,...I}=f,h={...m,...w},A=W(a,i,f);return await t(a,{...h,body:A==="GET"?void 0:{...I,...h?.body||{}},query:x||h?.query,method:A,async onSuccess(y){await h?.onSuccess?.(y);let g=r?.find(k=>k.matcher(a));if(!g)return;let P=s[g.signal];if(!P)return;let E=P.get();setTimeout(()=>{P.set(!E)},10)}})}})}return u()}import{atom as G}from"nanostores";import"@better-fetch/fetch";import{atom as q,onMount as M}from"nanostores";var B=(e,t,i,s)=>{let r=q({data:null,error:null,isPending:!1,isRefetching:!1}),u=()=>{let n=typeof s=="function"?s({data:r.get().data,error:r.get().error,isPending:r.get().isPending}):s;return i(t,{...n,onSuccess:async c=>{r.set({data:c.data,error:null,isPending:!1,isRefetching:!1}),await n?.onSuccess?.(c)},async onError(c){r.set({error:c.error,data:null,isPending:!1,isRefetching:!1}),await n?.onError?.(c)},async onRequest(c){let l=r.get();r.set({isPending:l.data===null,data:l.data,error:null,isRefetching:!0}),await n?.onRequest?.(c)}})};e=Array.isArray(e)?e:[e];let o=!1;for(let n of e)n.subscribe(()=>{o?u():M(r,()=>(u(),o=!0,()=>{r.off(),n.off()}))});return r};function S(e){let t=G(!1);return{$session:B(t,"/session",e,{method:"GET"}),_sessionSignal:t,$Infer:{}}}function pe(e){let{pluginPathMethods:t,pluginsActions:i,pluginsAtoms:s,$fetch:r,atomListeners:u}=b(e),o={};for(let[f,m]of Object.entries(s))o[`use${C(f)}`]=m;let{$session:n,_sessionSignal:c}=S(r),l={...i,...o,$fetch:r,useSession:n};return L(l,r,t,{...s,_sessionSignal:c},u)}export{pe as createAuthClient,B as useAuthQuery};
package/dist/cookies.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var p=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var b=(e,t)=>{for(var o in t)p(e,o,{get:t[o],enumerable:!0})},x=(e,t,o,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of f(t))!l.call(e,n)&&n!==o&&p(e,n,{get:()=>t[n],enumerable:!(s=h(t,n))||s.enumerable});return e};var g=e=>x(p({},"__esModule",{value:!0}),e);var E={};b(E,{createCookieGetter:()=>S,deleteSessionCookie:()=>y,getCookies:()=>O,parseCookies:()=>v,parseSetCookieHeader:()=>$,setSessionCookie:()=>A});module.exports=g(E);var d=require("oslo");var u=class extends Error{constructor(t,o){super(t),this.name="BetterAuthError",this.message=t,this.cause=o,this.stack=""}};function O(e){let o=(e.advanced?.useSecureCookies!==void 0?e.advanced?.useSecureCookies:e.baseURL!==void 0?!!e.baseURL.startsWith("https://"):process.env.NODE_ENV==="production")?"__Secure-":"",s="better-auth",n=e.session?.expiresIn||new d.TimeSpan(7,"d").seconds(),i=!!e.advanced?.crossSubDomainCookies?.enabled,r=i?e.advanced?.crossSubDomainCookies?.domain||(e.baseURL?new URL(e.baseURL).hostname:void 0):void 0;if(i&&!r)throw new u("baseURL is required when crossSubdomainCookies are enabled");let a=i?"none":"lax";return{sessionToken:{name:`${o}${s}.session_token`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:n,...i?{domain:r}:{}}},csrfToken:{name:`${o}${s}.csrf_token`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*60*24*7,...i?{domain:r}:{}}},state:{name:`${o}${s}.state`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*15,...i?{domain:r}:{}}},pkCodeVerifier:{name:`${o}${s}.pk_code_verifier`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*15,...i?{domain:r}:{}}},dontRememberToken:{name:`${o}${s}.dont_remember`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,...i?{domain:r}:{}}},nonce:{name:`${o}${s}.nonce`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*15,...i?{domain:r}:{}}}}}function S(e){let o=(e.advanced?.useSecureCookies!==void 0?e.advanced?.useSecureCookies:e.baseURL?.startsWith("https://")||process.env.NODE_ENV==="production")?"__Secure-":"",s="better-auth",n=e.advanced?.crossSubDomainCookies?.domain||(e.baseURL?new URL(e.baseURL).hostname:void 0);function i(r,a){let c=e.advanced?.crossSubDomainCookies?.enabled?e.advanced.crossSubDomainCookies.additionalCookies?.includes(r):void 0;return{name:process.env.NODE_ENV==="production"?`${o}${s}.${r}`:`${s}.${r}`,options:{secure:!!o,sameSite:"lax",path:"/",maxAge:60*15,...a,...c?{domain:n}:{}}}}return i}async function A(e,t,o,s){let n=e.context.authCookies.sessionToken.options;n.maxAge=o?void 0:e.context.sessionConfig.expiresIn,await e.setSignedCookie(e.context.authCookies.sessionToken.name,t,e.context.secret,{...n,...s}),o&&await e.setSignedCookie(e.context.authCookies.dontRememberToken.name,"true",e.context.secret,e.context.authCookies.dontRememberToken.options)}function y(e){e.setCookie(e.context.authCookies.sessionToken.name,"",{maxAge:0}),e.setCookie(e.context.authCookies.dontRememberToken.name,"",{maxAge:0})}function $(e){let t=new Map;return e.split(", ").forEach(s=>{let[n,...i]=s.split("; "),[r,a]=n.split("="),c={value:a};i.forEach(k=>{let[m,C]=k.split("=");c[m.toLowerCase()]=C||!0}),t.set(r,c)}),t}function v(e){let t=e.split("; "),o=new Map;return t.forEach(s=>{let[n,i]=s.split("=");o.set(n,i)}),o}0&&(module.exports={createCookieGetter,deleteSessionCookie,getCookies,parseCookies,parseSetCookieHeader,setSessionCookie});
1
+ "use strict";var k=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var b=Object.prototype.hasOwnProperty;var x=(e,t)=>{for(var o in t)k(e,o,{get:t[o],enumerable:!0})},g=(e,t,o,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of l(t))!b.call(e,n)&&n!==o&&k(e,n,{get:()=>t[n],enumerable:!(s=f(t,n))||s.enumerable});return e};var S=e=>g(k({},"__esModule",{value:!0}),e);var E={};x(E,{createCookieGetter:()=>A,deleteSessionCookie:()=>$,getCookies:()=>O,parseCookies:()=>R,parseSetCookieHeader:()=>v,setSessionCookie:()=>y});module.exports=S(E);var d=require("oslo");var p=class extends Error{constructor(t,o){super(t),this.name="BetterAuthError",this.message=t,this.cause=o,this.stack=""}};var c=require("std-env");function O(e){let o=(e.advanced?.useSecureCookies!==void 0?e.advanced?.useSecureCookies:e.baseURL!==void 0?!!e.baseURL.startsWith("https://"):c.isProduction)?"__Secure-":"",s="better-auth",n=e.session?.expiresIn||new d.TimeSpan(7,"d").seconds(),i=!!e.advanced?.crossSubDomainCookies?.enabled,r=i?e.advanced?.crossSubDomainCookies?.domain||(e.baseURL?new URL(e.baseURL).hostname:void 0):void 0;if(i&&!r)throw new p("baseURL is required when crossSubdomainCookies are enabled");let a=i?"none":"lax";return{sessionToken:{name:`${o}${s}.session_token`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:n,...i?{domain:r}:{}}},csrfToken:{name:`${o}${s}.csrf_token`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*60*24*7,...i?{domain:r}:{}}},state:{name:`${o}${s}.state`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*15,...i?{domain:r}:{}}},pkCodeVerifier:{name:`${o}${s}.pk_code_verifier`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*15,...i?{domain:r}:{}}},dontRememberToken:{name:`${o}${s}.dont_remember`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,...i?{domain:r}:{}}},nonce:{name:`${o}${s}.nonce`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*15,...i?{domain:r}:{}}}}}function A(e){let o=(e.advanced?.useSecureCookies!==void 0?e.advanced?.useSecureCookies:e.baseURL?.startsWith("https://")||c.isProduction)?"__Secure-":"",s="better-auth",n=e.advanced?.crossSubDomainCookies?.domain||(e.baseURL?new URL(e.baseURL).hostname:void 0);function i(r,a){let u=e.advanced?.crossSubDomainCookies?.enabled?e.advanced.crossSubDomainCookies.additionalCookies?.includes(r):void 0;return{name:c.env.NODE_ENV==="production"?`${o}${s}.${r}`:`${s}.${r}`,options:{secure:!!o,sameSite:"lax",path:"/",maxAge:60*15,...a,...u?{domain:n}:{}}}}return i}async function y(e,t,o,s){let n=e.context.authCookies.sessionToken.options;n.maxAge=o?void 0:e.context.sessionConfig.expiresIn,await e.setSignedCookie(e.context.authCookies.sessionToken.name,t,e.context.secret,{...n,...s}),o&&await e.setSignedCookie(e.context.authCookies.dontRememberToken.name,"true",e.context.secret,e.context.authCookies.dontRememberToken.options)}function $(e){e.setCookie(e.context.authCookies.sessionToken.name,"",{maxAge:0}),e.setCookie(e.context.authCookies.dontRememberToken.name,"",{maxAge:0})}function v(e){let t=new Map;return e.split(", ").forEach(s=>{let[n,...i]=s.split("; "),[r,a]=n.split("="),u={value:a};i.forEach(m=>{let[C,h]=m.split("=");u[C.toLowerCase()]=h||!0}),t.set(r,u)}),t}function R(e){let t=e.split("; "),o=new Map;return t.forEach(s=>{let[n,i]=s.split("=");o.set(n,i)}),o}0&&(module.exports={createCookieGetter,deleteSessionCookie,getCookies,parseCookies,parseSetCookieHeader,setSessionCookie});
package/dist/cookies.js CHANGED
@@ -1 +1 @@
1
- import{TimeSpan as m}from"oslo";var u=class extends Error{constructor(i,o){super(i),this.name="BetterAuthError",this.message=i,this.cause=o,this.stack=""}};function l(e){let o=(e.advanced?.useSecureCookies!==void 0?e.advanced?.useSecureCookies:e.baseURL!==void 0?!!e.baseURL.startsWith("https://"):process.env.NODE_ENV==="production")?"__Secure-":"",t="better-auth",r=e.session?.expiresIn||new m(7,"d").seconds(),s=!!e.advanced?.crossSubDomainCookies?.enabled,n=s?e.advanced?.crossSubDomainCookies?.domain||(e.baseURL?new URL(e.baseURL).hostname:void 0):void 0;if(s&&!n)throw new u("baseURL is required when crossSubdomainCookies are enabled");let a=s?"none":"lax";return{sessionToken:{name:`${o}${t}.session_token`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:r,...s?{domain:n}:{}}},csrfToken:{name:`${o}${t}.csrf_token`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*60*24*7,...s?{domain:n}:{}}},state:{name:`${o}${t}.state`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*15,...s?{domain:n}:{}}},pkCodeVerifier:{name:`${o}${t}.pk_code_verifier`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*15,...s?{domain:n}:{}}},dontRememberToken:{name:`${o}${t}.dont_remember`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,...s?{domain:n}:{}}},nonce:{name:`${o}${t}.nonce`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*15,...s?{domain:n}:{}}}}}function b(e){let o=(e.advanced?.useSecureCookies!==void 0?e.advanced?.useSecureCookies:e.baseURL?.startsWith("https://")||process.env.NODE_ENV==="production")?"__Secure-":"",t="better-auth",r=e.advanced?.crossSubDomainCookies?.domain||(e.baseURL?new URL(e.baseURL).hostname:void 0);function s(n,a){let c=e.advanced?.crossSubDomainCookies?.enabled?e.advanced.crossSubDomainCookies.additionalCookies?.includes(n):void 0;return{name:process.env.NODE_ENV==="production"?`${o}${t}.${n}`:`${t}.${n}`,options:{secure:!!o,sameSite:"lax",path:"/",maxAge:60*15,...a,...c?{domain:r}:{}}}}return s}async function x(e,i,o,t){let r=e.context.authCookies.sessionToken.options;r.maxAge=o?void 0:e.context.sessionConfig.expiresIn,await e.setSignedCookie(e.context.authCookies.sessionToken.name,i,e.context.secret,{...r,...t}),o&&await e.setSignedCookie(e.context.authCookies.dontRememberToken.name,"true",e.context.secret,e.context.authCookies.dontRememberToken.options)}function g(e){e.setCookie(e.context.authCookies.sessionToken.name,"",{maxAge:0}),e.setCookie(e.context.authCookies.dontRememberToken.name,"",{maxAge:0})}function O(e){let i=new Map;return e.split(", ").forEach(t=>{let[r,...s]=t.split("; "),[n,a]=r.split("="),c={value:a};s.forEach(p=>{let[d,k]=p.split("=");c[d.toLowerCase()]=k||!0}),i.set(n,c)}),i}function S(e){let i=e.split("; "),o=new Map;return i.forEach(t=>{let[r,s]=t.split("=");o.set(r,s)}),o}export{b as createCookieGetter,g as deleteSessionCookie,l as getCookies,S as parseCookies,O as parseSetCookieHeader,x as setSessionCookie};
1
+ import{TimeSpan as C}from"oslo";var u=class extends Error{constructor(i,o){super(i),this.name="BetterAuthError",this.message=i,this.cause=o,this.stack=""}};import{env as h,isProduction as p}from"std-env";function g(e){let o=(e.advanced?.useSecureCookies!==void 0?e.advanced?.useSecureCookies:e.baseURL!==void 0?!!e.baseURL.startsWith("https://"):p)?"__Secure-":"",t="better-auth",r=e.session?.expiresIn||new C(7,"d").seconds(),s=!!e.advanced?.crossSubDomainCookies?.enabled,n=s?e.advanced?.crossSubDomainCookies?.domain||(e.baseURL?new URL(e.baseURL).hostname:void 0):void 0;if(s&&!n)throw new u("baseURL is required when crossSubdomainCookies are enabled");let a=s?"none":"lax";return{sessionToken:{name:`${o}${t}.session_token`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:r,...s?{domain:n}:{}}},csrfToken:{name:`${o}${t}.csrf_token`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*60*24*7,...s?{domain:n}:{}}},state:{name:`${o}${t}.state`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*15,...s?{domain:n}:{}}},pkCodeVerifier:{name:`${o}${t}.pk_code_verifier`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*15,...s?{domain:n}:{}}},dontRememberToken:{name:`${o}${t}.dont_remember`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,...s?{domain:n}:{}}},nonce:{name:`${o}${t}.nonce`,options:{httpOnly:!0,sameSite:a,path:"/",secure:!!o,maxAge:60*15,...s?{domain:n}:{}}}}}function S(e){let o=(e.advanced?.useSecureCookies!==void 0?e.advanced?.useSecureCookies:e.baseURL?.startsWith("https://")||p)?"__Secure-":"",t="better-auth",r=e.advanced?.crossSubDomainCookies?.domain||(e.baseURL?new URL(e.baseURL).hostname:void 0);function s(n,a){let c=e.advanced?.crossSubDomainCookies?.enabled?e.advanced.crossSubDomainCookies.additionalCookies?.includes(n):void 0;return{name:h.NODE_ENV==="production"?`${o}${t}.${n}`:`${t}.${n}`,options:{secure:!!o,sameSite:"lax",path:"/",maxAge:60*15,...a,...c?{domain:r}:{}}}}return s}async function O(e,i,o,t){let r=e.context.authCookies.sessionToken.options;r.maxAge=o?void 0:e.context.sessionConfig.expiresIn,await e.setSignedCookie(e.context.authCookies.sessionToken.name,i,e.context.secret,{...r,...t}),o&&await e.setSignedCookie(e.context.authCookies.dontRememberToken.name,"true",e.context.secret,e.context.authCookies.dontRememberToken.options)}function A(e){e.setCookie(e.context.authCookies.sessionToken.name,"",{maxAge:0}),e.setCookie(e.context.authCookies.dontRememberToken.name,"",{maxAge:0})}function y(e){let i=new Map;return e.split(", ").forEach(t=>{let[r,...s]=t.split("; "),[n,a]=r.split("="),c={value:a};s.forEach(k=>{let[d,m]=k.split("=");c[d.toLowerCase()]=m||!0}),i.set(n,c)}),i}function $(e){let i=e.split("; "),o=new Map;return i.forEach(t=>{let[r,s]=t.split("=");o.set(r,s)}),o}export{S as createCookieGetter,A as deleteSessionCookie,g as getCookies,$ as parseCookies,y as parseSetCookieHeader,O as setSessionCookie};
package/dist/db.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var R=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var H=Object.prototype.hasOwnProperty;var Z=(e,r)=>{for(var a in r)R(e,a,{get:r[a],enumerable:!0})},z=(e,r,a,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of $(r))!H.call(e,o)&&o!==a&&R(e,o,{get:()=>r[o],enumerable:!(i=W(r,o))||i.enumerable});return e};var J=e=>z(R({},"__esModule",{value:!0}),e);var ae={};Z(ae,{convertFromDB:()=>g,convertToDB:()=>q,createFieldAttribute:()=>X,createInternalAdapter:()=>G,getAdapter:()=>_,getAuthTables:()=>h,getMigrations:()=>ie,getSchema:()=>U,getWithHooks:()=>V,matchType:()=>L,toZodSchema:()=>Y});module.exports=J(ae);var B=(e,r="ms")=>new Date(Date.now()+(r==="sec"?e*1e3:e));var h=e=>{let r=e.plugins?.reduce((t,s)=>{let d=s.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},{}),a=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,...a?i:{}}};var M=require("nanoid"),A=e=>(0,M.nanoid)(e);var I=class extends Error{constructor(r,a){super(r),this.name="BetterAuthError",this.message=r,this.cause=a,this.stack=""}};var k=require("kysely"),w=require("kysely");function K(e){if("dialect"in e)return K(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 k.MssqlDialect)return"mssql"}return"aggregate"in e?"sqlite":"getConnection"in e?"mysql":"connect"in e?"postgres":null}var O=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.Kysely({dialect:r.dialect}),databaseType:r.type};let a,i=K(r);return"createDriver"in r&&(a=r),"aggregate"in r&&(a=new w.SqliteDialect({database:r})),"getConnection"in r&&(a=new w.MysqlDialect({pool:r})),"connect"in r&&(a=new w.PostgresDialect({pool:r})),{kysely:a?new k.Kysely({dialect:a}):null,databaseType:i}};function v(e){if(!e)return{and:null,or:null};let r={and:[],or:[]};return e.forEach(a=>{let{field:i,value:o,operator:n="=",connector:c="AND"}=a,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,a){for(let i in e){let o=r[i]||Object.values(r).find(n=>n.fieldName===i);e[i]===0&&o.type==="boolean"&&a?.boolean&&(e[i]=!1),e[i]===1&&o?.type==="boolean"&&a?.boolean&&(e[i]=!0),o?.type==="date"&&(e[i]instanceof Date||(e[i]=new Date(e[i])))}return e}function C(e,r){for(let a in e)typeof e[a]=="boolean"&&r?.boolean&&(e[a]=e[a]?1:0),e[a]instanceof Date&&(e[a]=e[a].toISOString());return e}var P=(e,r)=>({id:"kysely",async create(a){let{model:i,data:o,select:n}=a;r?.transform&&(o=C(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,s)=>c?.[s]?{...t,[s]:c[s]}:t,{}):null),c},async findOne(a){let{model:i,where:o,select:n}=a,{and:c,or:f}=v(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 s=await t.executeTakeFirst();if(n?.length&&(s=s?n.reduce((l,u)=>s?.[u]?{...l,[u]:s[u]}:l,{}):null),r?.transform){let d=r.transform.schema[i];return s=s&&d?S(s,d,r.transform):s,s||null}return s||null},async findMany(a){let{model:i,where:o,limit:n,offset:c,sortBy:f}=a,t=e.selectFrom(i),{and:s,or:d}=v(o);s&&(t=t.where(u=>u.and(s.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[i];return u?l.map(m=>S(m,u,r.transform)):l}return l},async update(a){let{model:i,where:o,update:n}=a,{and:c,or:f}=v(o);r?.transform&&(n=C(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 s=await t.returningAll().executeTakeFirst()||null;if(r?.transform){let d=r.transform.schema[i];return d?S(s,d,r.transform):s}return s},async delete(a){let{model:i,where:o}=a,{and:n,or:c}=v(o),f=e.deleteFrom(i);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(a){let{model:i,where:o}=a,{and:n,or:c}=v(o),f=e.deleteFrom(i);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 _(e){if(!e.database)throw new I("Database configuration is required");if("create"in e.database)return e.database;let{kysely:r,databaseType:a}=await O(e);if(!r)throw new I("Failed to initialize database adapter");let i=h(e),o={};for(let n of Object.values(i))o[n.tableName]=n.fields;return P(r,{transform:{schema:o,date:!0,boolean:a==="sqlite"},generateId:"generateId"in e.database?e.database.generateId:void 0})}function q(e,r){let a={id:r.id};for(let i in e){let o=e[i],n=r[i];a[o.fieldName||i]=n}return a}function g(e,r){if(!r)return null;let a={id:r.id};for(let[i,o]of Object.entries(e))a[i]=r[o.fieldName||i];return a}function V(e,r){let a=r.hooks,i=h(r.options);async function o(c,f,t){let s=c,d=i[f];for(let m of a||[]){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:d.tableName,data:{...q(d.fields,s),id:s.id||A()}}):l;for(let m of a||[]){let p=m[f]?.create?.after;p&&await p(u)}return g(d.fields,u)}async function n(c,f,t,s){let d=c;for(let m of a||[]){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=s?await s.fn(d):null,u=!s||s.executeMainFn?await e.update({model:i[t].tableName,update:q(i[t].fields,d),where:f}):l;for(let m of a||[]){let p=m[t]?.update?.after;p&&await p(u)}return g(i[t].fields,u)}return{createWithHooks:o,updateWithHooks:n}}function j(e){let r="127.0.0.1";if(process.env.NODE_ENV==="test")return r;let a=["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 a){let n=i.get(o);if(typeof n=="string"){let c=n.split(",")[0].trim();if(c)return c}}return null}var G=(e,r)=>{let a=r.options,i=a.secondaryStorage,o=a.session?.expiresIn||60*60*24*7,n=h(a),{createWithHooks:c,updateWithHooks:f}=V(e,r);return{createOAuthUser:async(t,s)=>{try{let d=await c({id:A(),createdAt:new Date,updatedAt:new Date,...t},"user"),l=await c({id:A(),...s,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,s,d,l)=>(await e.findMany({model:n.user.tableName,limit:t,offset:s,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,s,d,l)=>{let u=s instanceof Request?s.headers:s,m={id:A(),userId:t,expiresAt:d?B(60*60*24,"sec"):B(o,"sec"),ipAddress:s&&j(s)||"",userAgent:u?.get("user-agent")||"",...l};return await c(m,"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:a.session?.storeSessionInDatabase}:void 0)},findSession:async t=>{if(i){let l=await i.get(t);if(l){let u=JSON.parse(l);return{session:{...u.session,expiresAt:new Date(u.session.expiresAt)},user:{...u.user,createdAt:new Date(u.user.createdAt),updatedAt:new Date(u.user.updatedAt)}}}}let s=await e.findOne({model:n.session.tableName,where:[{value:t,field:"id"}]});if(!s)return null;let d=await e.findOne({model:n.user.tableName,where:[{value:s.userId,field:"id"}]});return d?{session:g(n.session.fields,s),user:g(n.user.fields,d)}:null},findSessions:async t=>{if(i){let u=[];for(let m of t){let p=await i.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"}]}),d=s.map(u=>u.userId),l=await e.findMany({model:n.user.tableName,where:[{field:"id",value:d,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",i?{async fn(l){let u=await i.get(t),m=null;if(u){let p=JSON.parse(u);m={...p.session,...l},await i.set(t,JSON.stringify({session:m,user:p.user}),p.session.expiresAt?new Date(p.session.expiresAt).getTime():void 0)}else return null},executeMainFn:a.session?.storeSessionInDatabase}:void 0),deleteSession:async t=>{if(i){await i.delete(t),a.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 s=await e.findMany({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]});for(let d of s)await i.delete(d.id);a.session?.storeSessionInDatabase&&await e.delete({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]});return}await e.delete({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]})},findUserByEmail:async(t,s)=>{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(s?.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:A(),...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(d=>g(n.account.fields,d)),updateAccount:async(t,s)=>await f(s,[{field:"id",value:t}],"account"),createVerificationValue:async t=>await c({id:A(),...t},"verification"),findVerificationValue:async t=>{let s=await e.findOne({model:n.verification.tableName,where:[{field:n.verification.fields.identifier.fieldName||"identifier",value:t}]});return g(n.verification.fields,s)},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 X=(e,r)=>({type:e,...r});var F=require("zod");function Y(e){return F.z.object({...Object.keys(e).reduce((a,i)=>{let o=e[i];if(!o)return a;if(o.type==="string[]"||o.type==="number[]")return{...a,[i]: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?a:{...a,[i]:n}},{})})}var Le=require("kysely");var E=require("consola"),x=(0,E.createConsola)({formatOptions:{date:!1,colors:!0,compact:!0},defaults:{tag:"Better Auth"}}),Q=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
- `)}}),D=Q();function U(e){let r=h(e),a={};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}),a[o.tableName]){a[o.tableName].fields={...a[o.tableName].fields,...c};continue}a[o.tableName]={fields:c,order:o.order||1/0}}return a}var ee={string:["character varying","text"],number:["int4","integer","bigint","smallint","numeric","real","double precision"],boolean:["bool","boolean"],date:["timestamp","date"]},te={string:["varchar","text"],number:["integer","int","bigint","smallint","decimal","float","double"],boolean:["boolean"],date:["date","datetime"]},re={string:["TEXT"],number:["INTEGER","REAL"],boolean:["INTEGER","BOOLEAN"],date:["DATE","INTEGER"]},ne={string:["nvarchar","varchar"],number:["int","bigint","smallint","decimal","float","double"],boolean:["bit","boolean"],date:["datetime","date"]},se={postgres:ee,mysql:te,sqlite:re,mssql:ne};function L(e,r,a){return r==="string[]"||r==="number[]"?e.toLowerCase().includes("json"):se[a][r].map(c=>c.toLowerCase()).includes(e.toLowerCase())}async function ie(e){let r=U(e),{kysely:a,databaseType:i}=await O(e);i||(D.warn("Could not determine database type, defaulting to sqlite. Please provide a type in the database options to avoid this."),i="sqlite"),a||(D.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 a.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}L(T.dataType,b.type,i)||D.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 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,m]of Object.entries(l.fields)){let p=t(m.type),y=a.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=a.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 d(){return f.map(u=>u.compile().sql).join(`;
1
+ "use strict";var R=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var H=Object.getOwnPropertyNames;var Z=Object.prototype.hasOwnProperty;var z=(e,r)=>{for(var a in r)R(e,a,{get:r[a],enumerable:!0})},J=(e,r,a,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of H(r))!Z.call(e,o)&&o!==a&&R(e,o,{get:()=>r[o],enumerable:!(i=$(r,o))||i.enumerable});return e};var _=e=>J(R({},"__esModule",{value:!0}),e);var oe={};z(oe,{convertFromDB:()=>g,convertToDB:()=>q,createFieldAttribute:()=>Y,createInternalAdapter:()=>X,getAdapter:()=>G,getAuthTables:()=>h,getMigrations:()=>ae,getSchema:()=>U,getWithHooks:()=>V,matchType:()=>W,toZodSchema:()=>Q});module.exports=_(oe);var B=(e,r="ms")=>new Date(Date.now()+(r==="sec"?e*1e3:e));var h=e=>{let r=e.plugins?.reduce((t,s)=>{let d=s.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},{}),a=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:f,...c}=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"},...f?.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},...c,...a?i:{}}};var M=require("nanoid"),A=e=>(0,M.nanoid)(e);var I=class extends Error{constructor(r,a){super(r),this.name="BetterAuthError",this.message=r,this.cause=a,this.stack=""}};var k=require("kysely"),w=require("kysely");function K(e){if("dialect"in e)return K(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 k.MssqlDialect)return"mssql"}return"aggregate"in e?"sqlite":"getConnection"in e?"mysql":"connect"in e?"postgres":null}var O=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.Kysely({dialect:r.dialect}),databaseType:r.type};let a,i=K(r);return"createDriver"in r&&(a=r),"aggregate"in r&&(a=new w.SqliteDialect({database:r})),"getConnection"in r&&(a=new w.MysqlDialect({pool:r})),"connect"in r&&(a=new w.PostgresDialect({pool:r})),{kysely:a?new k.Kysely({dialect:a}):null,databaseType:i}};function v(e){if(!e)return{and:null,or:null};let r={and:[],or:[]};return e.forEach(a=>{let{field:i,value:o,operator:n="=",connector:f="AND"}=a,c=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);f==="OR"?r.or.push(c):r.and.push(c)}),{and:r.and.length?r.and:null,or:r.or.length?r.or:null}}function S(e,r,a){for(let i in e){let o=r[i]||Object.values(r).find(n=>n.fieldName===i);e[i]===0&&o.type==="boolean"&&a?.boolean&&(e[i]=!1),e[i]===1&&o?.type==="boolean"&&a?.boolean&&(e[i]=!0),o?.type==="date"&&(e[i]instanceof Date||(e[i]=new Date(e[i])))}return e}function C(e,r){for(let a in e)typeof e[a]=="boolean"&&r?.boolean&&(e[a]=e[a]?1:0),e[a]instanceof Date&&(e[a]=e[a].toISOString());return e}var P=(e,r)=>({id:"kysely",async create(a){let{model:i,data:o,select:n}=a;r?.transform&&(o=C(o,r.transform)),r?.generateId!==void 0&&(o.id=r.generateId?r.generateId():void 0);let f=await e.insertInto(i).values(o).returningAll().executeTakeFirst();if(r?.transform){let c=r.transform.schema[i];f=c?S(o,c,r.transform):f}return n?.length&&(f=f?n.reduce((t,s)=>f?.[s]?{...t,[s]:f[s]}:t,{}):null),f},async findOne(a){let{model:i,where:o,select:n}=a,{and:f,or:c}=v(o),t=e.selectFrom(i).selectAll();f&&(t=t.where(d=>d.and(f.map(l=>l(d))))),c&&(t=t.where(d=>d.or(c.map(l=>l(d)))));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 d=r.transform.schema[i];return s=s&&d?S(s,d,r.transform):s,s||null}return s||null},async findMany(a){let{model:i,where:o,limit:n,offset:f,sortBy:c}=a,t=e.selectFrom(i),{and:s,or:d}=v(o);s&&(t=t.where(u=>u.and(s.map(m=>m(u))))),d&&(t=t.where(u=>u.or(d.map(m=>m(u))))),t=t.limit(n||100),f&&(t=t.offset(f)),c&&(t=t.orderBy(c.field,c.direction));let l=await t.selectAll().execute();if(r?.transform){let u=r.transform.schema[i];return u?l.map(m=>S(m,u,r.transform)):l}return l},async update(a){let{model:i,where:o,update:n}=a,{and:f,or:c}=v(o);r?.transform&&(n=C(n,r.transform)),n.id&&(n.id=void 0);let t=e.updateTable(i).set(n);f&&(t=t.where(d=>d.and(f.map(l=>l(d))))),c&&(t=t.where(d=>d.or(c.map(l=>l(d)))));let s=await t.returningAll().executeTakeFirst()||null;if(r?.transform){let d=r.transform.schema[i];return d?S(s,d,r.transform):s}return s},async delete(a){let{model:i,where:o}=a,{and:n,or:f}=v(o),c=e.deleteFrom(i);n&&(c=c.where(t=>t.and(n.map(s=>s(t))))),f&&(c=c.where(t=>t.or(f.map(s=>s(t))))),await c.execute()},async deleteMany(a){let{model:i,where:o}=a,{and:n,or:f}=v(o),c=e.deleteFrom(i);n&&(c=c.where(t=>t.and(n.map(s=>s(t))))),f&&(c=c.where(t=>t.or(f.map(s=>s(t))))),await c.execute()}});async function G(e){if(!e.database)throw new I("Database configuration is required");if("create"in e.database)return e.database;let{kysely:r,databaseType:a}=await O(e);if(!r)throw new I("Failed to initialize database adapter");let i=h(e),o={};for(let n of Object.values(i))o[n.tableName]=n.fields;return P(r,{transform:{schema:o,date:!0,boolean:a==="sqlite"},generateId:"generateId"in e.database?e.database.generateId:void 0})}function q(e,r){let a={id:r.id};for(let i in e){let o=e[i],n=r[i];a[o.fieldName||i]=n}return a}function g(e,r){if(!r)return null;let a={id:r.id};for(let[i,o]of Object.entries(e))a[i]=r[o.fieldName||i];return a}function V(e,r){let a=r.hooks,i=h(r.options);async function o(f,c,t){let s=f,d=i[c];for(let m of a||[]){let p=m[c]?.create?.before;if(p){let y=await p(f);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:d.tableName,data:{...q(d.fields,s),id:s.id||A()}}):l;for(let m of a||[]){let p=m[c]?.create?.after;p&&await p(u)}return g(d.fields,u)}async function n(f,c,t,s){let d=f;for(let m of a||[]){let p=m[t]?.update?.before;if(p){let y=await p(f);if(y===!1)return null;d=typeof y=="object"?y.data:y}}let l=s?await s.fn(d):null,u=!s||s.executeMainFn?await e.update({model:i[t].tableName,update:q(i[t].fields,d),where:c}):l;for(let m of a||[]){let p=m[t]?.update?.after;p&&await p(u)}return g(i[t].fields,u)}return{createWithHooks:o,updateWithHooks:n}}var j=require("std-env");function E(e){let r="127.0.0.1";if(j.isTest)return r;let a=["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 a){let n=i.get(o);if(typeof n=="string"){let f=n.split(",")[0].trim();if(f)return f}}return null}var X=(e,r)=>{let a=r.options,i=a.secondaryStorage,o=a.session?.expiresIn||60*60*24*7,n=h(a),{createWithHooks:f,updateWithHooks:c}=V(e,r);return{createOAuthUser:async(t,s)=>{try{let d=await f({id:A(),createdAt:new Date,updatedAt:new Date,...t},"user"),l=await f({id:A(),...s,userId:d.id||t.id},"account");return{user:d,account:l}}catch(d){return console.log(d),null}},createUser:async t=>await f({id:A(),createdAt:new Date,updatedAt:new Date,emailVerified:!1,...t},"user"),createAccount:async t=>await f({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,s,d,l)=>(await e.findMany({model:n.user.tableName,limit:t,offset:s,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,s,d,l)=>{let u=s instanceof Request?s.headers:s,m={id:A(),userId:t,expiresAt:d?B(60*60*24,"sec"):B(o,"sec"),ipAddress:s&&E(s)||"",userAgent:u?.get("user-agent")||"",...l};return await f(m,"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:a.session?.storeSessionInDatabase}:void 0)},findSession:async t=>{if(i){let l=await i.get(t);if(l){let u=JSON.parse(l);return{session:{...u.session,expiresAt:new Date(u.session.expiresAt)},user:{...u.user,createdAt:new Date(u.user.createdAt),updatedAt:new Date(u.user.updatedAt)}}}}let s=await e.findOne({model:n.session.tableName,where:[{value:t,field:"id"}]});if(!s)return null;let d=await e.findOne({model:n.user.tableName,where:[{value:s.userId,field:"id"}]});return d?{session:g(n.session.fields,s),user:g(n.user.fields,d)}:null},findSessions:async t=>{if(i){let u=[];for(let m of t){let p=await i.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"}]}),d=s.map(u=>u.userId),l=await e.findMany({model:n.user.tableName,where:[{field:"id",value:d,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 c(s,[{field:"id",value:t}],"session",i?{async fn(l){let u=await i.get(t),m=null;if(u){let p=JSON.parse(u);m={...p.session,...l},await i.set(t,JSON.stringify({session:m,user:p.user}),p.session.expiresAt?new Date(p.session.expiresAt).getTime():void 0)}else return null},executeMainFn:a.session?.storeSessionInDatabase}:void 0),deleteSession:async t=>{if(i){await i.delete(t),a.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 s=await e.findMany({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]});for(let d of s)await i.delete(d.id);a.session?.storeSessionInDatabase&&await e.delete({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]});return}await e.delete({model:n.session.tableName,where:[{field:n.session.fields.userId.fieldName||"userId",value:t}]})},findUserByEmail:async(t,s)=>{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(s?.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 f({id:A(),...t},"account"),updateUser:async(t,s)=>await c(s,[{field:"id",value:t}],"user"),updateUserByEmail:async(t,s)=>await c(s,[{field:n.user.fields.email.fieldName||"email",value:t}],"user"),updatePassword:async(t,s)=>await c({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(d=>g(n.account.fields,d)),updateAccount:async(t,s)=>await c(s,[{field:"id",value:t}],"account"),createVerificationValue:async t=>await f({id:A(),...t},"verification"),findVerificationValue:async t=>{let s=await e.findOne({model:n.verification.tableName,where:[{field:n.verification.fields.identifier.fieldName||"identifier",value:t}]});return g(n.verification.fields,s)},deleteVerificationValue:async t=>{await e.delete({model:n.verification.tableName,where:[{field:"id",value:t}]})},updateVerificationValue:async(t,s)=>await c(s,[{field:"id",value:t}],"verification")}};var Y=(e,r)=>({type:e,...r});var F=require("zod");function Q(e){return F.z.object({...Object.keys(e).reduce((a,i)=>{let o=e[i];if(!o)return a;if(o.type==="string[]"||o.type==="number[]")return{...a,[i]: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?a:{...a,[i]:n}},{})})}var We=require("kysely");var L=require("consola"),x=(0,L.createConsola)({formatOptions:{date:!1,colors:!0,compact:!0},defaults:{tag:"Better Auth"}}),ee=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
+ `)}}),D=ee();function U(e){let r=h(e),a={};for(let i in r){let o=r[i],n=o.fields,f={};if(Object.entries(n).forEach(([c,t])=>{f[t.fieldName||c]=t}),a[o.tableName]){a[o.tableName].fields={...a[o.tableName].fields,...f};continue}a[o.tableName]={fields:f,order:o.order||1/0}}return a}var te={string:["character varying","text"],number:["int4","integer","bigint","smallint","numeric","real","double precision"],boolean:["bool","boolean"],date:["timestamp","date"]},re={string:["varchar","text"],number:["integer","int","bigint","smallint","decimal","float","double"],boolean:["boolean"],date:["date","datetime"]},ne={string:["TEXT"],number:["INTEGER","REAL"],boolean:["INTEGER","BOOLEAN"],date:["DATE","INTEGER"]},se={string:["nvarchar","varchar"],number:["int","bigint","smallint","decimal","float","double"],boolean:["bit","boolean"],date:["datetime","date"]},ie={postgres:te,mysql:re,sqlite:ne,mssql:se};function W(e,r,a){return r==="string[]"||r==="number[]"?e.toLowerCase().includes("json"):ie[a][r].map(f=>f.toLowerCase()).includes(e.toLowerCase())}async function ae(e){let r=U(e),{kysely:a,databaseType:i}=await O(e);i||(D.warn("Could not determine database type, defaulting to sqlite. Please provide a type in the database options to avoid this."),i="sqlite"),a||(D.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 a.introspection.getTables(),n=[],f=[];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,i)||D.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&&f.push({table:l,fields:p,order:u.order||1/0})}let c=[];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(f.length)for(let l of f)for(let[u,m]of Object.entries(l.fields)){let p=t(m.type),y=a.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));c.push(y)}if(n.length)for(let l of n){let u=a.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))}c.push(u)}async function s(){for(let l of c)await l.execute()}async function d(){return c.map(u=>u.compile().sql).join(`;
3
3
 
4
- `)}return{toBeCreated:n,toBeAdded:c,runMigrations:s,compileMigrations:d}}0&&(module.exports={convertFromDB,convertToDB,createFieldAttribute,createInternalAdapter,getAdapter,getAuthTables,getMigrations,getSchema,getWithHooks,matchType,toZodSchema});
4
+ `)}return{toBeCreated:n,toBeAdded:f,runMigrations:s,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,n="ms")=>new Date(Date.now()+(n==="sec"?e*1e3:e));var h=e=>{let n=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},{}),a=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:d,session:r,account:c,...f}=n||{};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},...r?.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,...a?i:{}}};import{nanoid as E}from"nanoid";var A=e=>E(e);var F=class extends Error{constructor(n,a){super(n),this.name="BetterAuthError",this.message=n,this.cause=a,this.stack=""}};import{Kysely as D,MssqlDialect as L}from"kysely";import{MysqlDialect as R,PostgresDialect as B,SqliteDialect as V}from"kysely";function U(e){if("dialect"in e)return U(e.dialect);if("createDriver"in e){if(e instanceof V)return"sqlite";if(e instanceof R)return"mysql";if(e instanceof B)return"postgres";if(e instanceof L)return"mssql"}return"aggregate"in e?"sqlite":"getConnection"in e?"mysql":"connect"in e?"postgres":null}var k=async e=>{let n=e.database;if("db"in n)return{kysely:n.db,databaseType:n.type};if("dialect"in n)return{kysely:new D({dialect:n.dialect}),databaseType:n.type};let a,i=U(n);return"createDriver"in n&&(a=n),"aggregate"in n&&(a=new V({database:n})),"getConnection"in n&&(a=new R({pool:n})),"connect"in n&&(a=new B({pool:n})),{kysely:a?new D({dialect:a}):null,databaseType:i}};function N(e){if(!e)return{and:null,or:null};let n={and:[],or:[]};return e.forEach(a=>{let{field:i,value:d,operator:r="=",connector:c="AND"}=a,f=t=>r.toLowerCase()==="in"?t(i,"in",Array.isArray(d)?d:[d]):r==="contains"?t(i,"like",`%${d}%`):r==="starts_with"?t(i,"like",`${d}%`):r==="ends_with"?t(i,"like",`%${d}`):t(i,r,d);c==="OR"?n.or.push(f):n.and.push(f)}),{and:n.and.length?n.and:null,or:n.or.length?n.or:null}}function v(e,n,a){for(let i in e){let d=n[i]||Object.values(n).find(r=>r.fieldName===i);e[i]===0&&d.type==="boolean"&&a?.boolean&&(e[i]=!1),e[i]===1&&d?.type==="boolean"&&a?.boolean&&(e[i]=!0),d?.type==="date"&&(e[i]instanceof Date||(e[i]=new Date(e[i])))}return e}function M(e,n){for(let a in e)typeof e[a]=="boolean"&&n?.boolean&&(e[a]=e[a]?1:0),e[a]instanceof Date&&(e[a]=e[a].toISOString());return e}var K=(e,n)=>({id:"kysely",async create(a){let{model:i,data:d,select:r}=a;n?.transform&&(d=M(d,n.transform)),n?.generateId!==void 0&&(d.id=n.generateId?n.generateId():void 0);let c=await e.insertInto(i).values(d).returningAll().executeTakeFirst();if(n?.transform){let f=n.transform.schema[i];c=f?v(d,f,n.transform):c}return r?.length&&(c=c?r.reduce((t,s)=>c?.[s]?{...t,[s]:c[s]}:t,{}):null),c},async findOne(a){let{model:i,where:d,select:r}=a,{and:c,or:f}=N(d),t=e.selectFrom(i).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(r?.length&&(s=s?r.reduce((l,u)=>s?.[u]?{...l,[u]:s[u]}:l,{}):null),n?.transform){let o=n.transform.schema[i];return s=s&&o?v(s,o,n.transform):s,s||null}return s||null},async findMany(a){let{model:i,where:d,limit:r,offset:c,sortBy:f}=a,t=e.selectFrom(i),{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(r||100),c&&(t=t.offset(c)),f&&(t=t.orderBy(f.field,f.direction));let l=await t.selectAll().execute();if(n?.transform){let u=n.transform.schema[i];return u?l.map(m=>v(m,u,n.transform)):l}return l},async update(a){let{model:i,where:d,update:r}=a,{and:c,or:f}=N(d);n?.transform&&(r=M(r,n.transform)),r.id&&(r.id=void 0);let t=e.updateTable(i).set(r);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(n?.transform){let o=n.transform.schema[i];return o?v(s,o,n.transform):s}return s},async delete(a){let{model:i,where:d}=a,{and:r,or:c}=N(d),f=e.deleteFrom(i);r&&(f=f.where(t=>t.and(r.map(s=>s(t))))),c&&(f=f.where(t=>t.or(c.map(s=>s(t))))),await f.execute()},async deleteMany(a){let{model:i,where:d}=a,{and:r,or:c}=N(d),f=e.deleteFrom(i);r&&(f=f.where(t=>t.and(r.map(s=>s(t))))),c&&(f=f.where(t=>t.or(c.map(s=>s(t))))),await f.execute()}});async function be(e){if(!e.database)throw new F("Database configuration is required");if("create"in e.database)return e.database;let{kysely:n,databaseType:a}=await k(e);if(!n)throw new F("Failed to initialize database adapter");let i=h(e),d={};for(let r of Object.values(i))d[r.tableName]=r.fields;return K(n,{transform:{schema:d,date:!0,boolean:a==="sqlite"},generateId:"generateId"in e.database?e.database.generateId:void 0})}function q(e,n){let a={id:n.id};for(let i in e){let d=e[i],r=n[i];a[d.fieldName||i]=r}return a}function g(e,n){if(!n)return null;let a={id:n.id};for(let[i,d]of Object.entries(e))a[i]=n[d.fieldName||i];return a}function C(e,n){let a=n.hooks,i=h(n.options);async function d(c,f,t){let s=c,o=i[f];for(let m of a||[]){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:{...q(o.fields,s),id:s.id||A()}}):l;for(let m of a||[]){let p=m[f]?.create?.after;p&&await p(u)}return g(o.fields,u)}async function r(c,f,t,s){let o=c;for(let m of a||[]){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:i[t].tableName,update:q(i[t].fields,o),where:f}):l;for(let m of a||[]){let p=m[t]?.update?.after;p&&await p(u)}return g(i[t].fields,u)}return{createWithHooks:d,updateWithHooks:r}}function P(e){let n="127.0.0.1";if(process.env.NODE_ENV==="test")return n;let a=["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 d of a){let r=i.get(d);if(typeof r=="string"){let c=r.split(",")[0].trim();if(c)return c}}return null}var Se=(e,n)=>{let a=n.options,i=a.secondaryStorage,d=a.session?.expiresIn||60*60*24*7,r=h(a),{createWithHooks:c,updateWithHooks:f}=C(e,n);return{createOAuthUser:async(t,s)=>{try{let o=await c({id:A(),createdAt:new Date,updatedAt:new Date,...t},"user"),l=await c({id:A(),...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: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:r.session.tableName,where:[{field:r.session.fields.userId.fieldName||"userId",value:t}]}),listUsers:async(t,s,o,l)=>(await e.findMany({model:r.user.tableName,limit:t,offset:s,sortBy:o,where:l})).map(m=>g(r.user.fields,m)),deleteUser:async t=>{await e.delete({model:r.account.tableName,where:[{field:r.account.fields.userId.fieldName||"userId",value:t}]}),await e.deleteMany({model:r.session.tableName,where:[{field:r.session.fields.userId.fieldName||"userId",value:t}]}),await e.deleteMany({model:r.user.tableName,where:[{field:"id",value:t}]})},createSession:async(t,s,o,l)=>{let u=s instanceof Request?s.headers:s,m={id:A(),userId:t,expiresAt:o?S(60*60*24,"sec"):S(d,"sec"),ipAddress:s&&P(s)||"",userAgent:u?.get("user-agent")||"",...l};return await c(m,"session",i?{fn:async y=>{let b=await e.findOne({model:r.user.tableName,where:[{field:"id",value:t}]});return i.set(y.id,JSON.stringify({session:y,user:b}),d),y},executeMainFn:a.session?.storeSessionInDatabase}:void 0)},findSession:async t=>{if(i){let l=await i.get(t);if(l){let u=JSON.parse(l);return{session:{...u.session,expiresAt:new Date(u.session.expiresAt)},user:{...u.user,createdAt:new Date(u.user.createdAt),updatedAt:new Date(u.user.updatedAt)}}}}let s=await e.findOne({model:r.session.tableName,where:[{value:t,field:"id"}]});if(!s)return null;let o=await e.findOne({model:r.user.tableName,where:[{value:s.userId,field:"id"}]});return o?{session:g(r.session.fields,s),user:g(r.user.fields,o)}:null},findSessions:async t=>{if(i){let u=[];for(let m of t){let p=await i.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:r.session.tableName,where:[{field:"id",value:t,operator:"in"}]}),o=s.map(u=>u.userId),l=await e.findMany({model:r.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(r.session.fields,u),user:g(r.user.fields,m)}:null})},updateSession:async(t,s)=>await f(s,[{field:"id",value:t}],"session",i?{async fn(l){let u=await i.get(t),m=null;if(u){let p=JSON.parse(u);m={...p.session,...l},await i.set(t,JSON.stringify({session:m,user:p.user}),p.session.expiresAt?new Date(p.session.expiresAt).getTime():void 0)}else return null},executeMainFn:a.session?.storeSessionInDatabase}:void 0),deleteSession:async t=>{if(i){await i.delete(t),a.session?.storeSessionInDatabase&&await e.delete({model:r.session.tableName,where:[{field:"id",value:t}]});return}await e.delete({model:r.session.tableName,where:[{field:"id",value:t}]})},deleteSessions:async t=>{if(i){let s=await e.findMany({model:r.session.tableName,where:[{field:r.session.fields.userId.fieldName||"userId",value:t}]});for(let o of s)await i.delete(o.id);a.session?.storeSessionInDatabase&&await e.delete({model:r.session.tableName,where:[{field:r.session.fields.userId.fieldName||"userId",value:t}]});return}await e.delete({model:r.session.tableName,where:[{field:r.session.fields.userId.fieldName||"userId",value:t}]})},findUserByEmail:async(t,s)=>{let o=await e.findOne({model:r.user.tableName,where:[{value:t.toLowerCase(),field:r.user.fields.email.fieldName||"email"}]});if(!o)return null;if(s?.includeAccounts){let l=await e.findMany({model:r.account.tableName,where:[{value:o.id,field:r.account.fields.userId.fieldName||"userId"}]});return{user:g(r.user.fields,o),accounts:l.map(u=>g(r.account.fields,u))}}return{user:g(r.user.fields,o),accounts:[]}},findUserById:async t=>await e.findOne({model:r.user.tableName,where:[{field:"id",value:t}]}),linkAccount:async t=>await c({id:A(),...t},"account"),updateUser:async(t,s)=>await f(s,[{field:"id",value:t}],"user"),updateUserByEmail:async(t,s)=>await f(s,[{field:r.user.fields.email.fieldName||"email",value:t}],"user"),updatePassword:async(t,s)=>await f({password:s},[{field:r.account.fields.userId.fieldName||"userId",value:t},{field:r.account.fields.providerId.fieldName||"providerId",value:"credential"}],"account"),findAccounts:async t=>(await e.findMany({model:r.account.tableName,where:[{field:r.account.fields.userId.fieldName||"userId",value:t}]})).map(o=>g(r.account.fields,o)),updateAccount:async(t,s)=>await f(s,[{field:"id",value:t}],"account"),createVerificationValue:async t=>await c({id:A(),...t},"verification"),findVerificationValue:async t=>{let s=await e.findOne({model:r.verification.tableName,where:[{field:r.verification.fields.identifier.fieldName||"identifier",value:t}]});return g(r.verification.fields,s)},deleteVerificationValue:async t=>{await e.delete({model:r.verification.tableName,where:[{field:"id",value:t}]})},updateVerificationValue:async(t,s)=>await f(s,[{field:"id",value:t}],"verification")}};var De=(e,n)=>({type:e,...n});import{z as I}from"zod";function Ve(e){return I.object({...Object.keys(e).reduce((a,i)=>{let d=e[i];if(!d)return a;if(d.type==="string[]"||d.type==="number[]")return{...a,[i]:I.array(d.type==="string[]"?I.string():I.number())};let r=I[d.type]();return d?.required===!1&&(r=r.optional()),d?.returned===!1?a:{...a,[i]:r}},{})})}import"kysely";import{createConsola as W}from"consola";var w=W({formatOptions:{date:!1,colors:!0,compact:!0},defaults:{tag:"Better Auth"}}),$=e=>({log:(...n)=>{!e?.disabled&&w.log("",...n)},error:(...n)=>{!e?.disabled&&w.error("",...n)},warn:(...n)=>{!e?.disabled&&w.warn("",...n)},info:(...n)=>{!e?.disabled&&w.info("",...n)},debug:(...n)=>{!e?.disabled&&w.debug("",...n)},box:(...n)=>{!e?.disabled&&w.box("",...n)},success:(...n)=>{!e?.disabled&&w.success("",...n)},break:(...n)=>{!e?.disabled&&console.log(`
2
- `)}}),O=$();function j(e){let n=h(e),a={};for(let i in n){let d=n[i],r=d.fields,c={};if(Object.entries(r).forEach(([f,t])=>{c[t.fieldName||f]=t}),a[d.tableName]){a[d.tableName].fields={...a[d.tableName].fields,...c};continue}a[d.tableName]={fields:c,order:d.order||1/0}}return a}var H={string:["character varying","text"],number:["int4","integer","bigint","smallint","numeric","real","double precision"],boolean:["bool","boolean"],date:["timestamp","date"]},Z={string:["varchar","text"],number:["integer","int","bigint","smallint","decimal","float","double"],boolean:["boolean"],date:["date","datetime"]},z={string:["TEXT"],number:["INTEGER","REAL"],boolean:["INTEGER","BOOLEAN"],date:["DATE","INTEGER"]},J={string:["nvarchar","varchar"],number:["int","bigint","smallint","decimal","float","double"],boolean:["bit","boolean"],date:["datetime","date"]},_={postgres:H,mysql:Z,sqlite:z,mssql:J};function G(e,n,a){return n==="string[]"||n==="number[]"?e.toLowerCase().includes("json"):_[a][n].map(c=>c.toLowerCase()).includes(e.toLowerCase())}async function $e(e){let n=j(e),{kysely:a,databaseType:i}=await k(e);i||(O.warn("Could not determine database type, defaulting to sqlite. Please provide a type in the database options to avoid this."),i="sqlite"),a||(O.error("Only kysely adapter is supported for migrations. You can use `generate` command to generate the schema, if you're using a different adapter."),process.exit(1));let d=await a.introspection.getTables(),r=[],c=[];for(let[l,u]of Object.entries(n)){let m=d.find(y=>y.name===l);if(!m){let y=r.findIndex(T=>T.table===l),b={table:l,fields:u.fields,order:u.order||1/0},x=r.findIndex(T=>(T.order||1/0)>b.order);x===-1?y===-1?r.push(b):r[y].fields={...r[y].fields,...u.fields}:r.splice(x,0,b);continue}let p={};for(let[y,b]of Object.entries(u.fields)){let x=m.columns.find(T=>T.name===y);if(!x){p[y]=b;continue}G(x.dataType,b.type,i)||O.warn(`Field ${y} in table ${l} has a different type in the database. Expected ${b.type} but got ${x.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 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,m]of Object.entries(l.fields)){let p=t(m.type),y=a.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(r.length)for(let l of r){let u=a.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 S=(e,n="ms")=>new Date(Date.now()+(n==="sec"?e*1e3:e));var h=e=>{let n=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},{}),a=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:d,session:r,account:f,...c}=n||{};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},...r?.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"},...f?.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},...c,...a?i:{}}};import{nanoid as E}from"nanoid";var A=e=>E(e);var F=class extends Error{constructor(n,a){super(n),this.name="BetterAuthError",this.message=n,this.cause=a,this.stack=""}};import{Kysely as D,MssqlDialect as L}from"kysely";import{MysqlDialect as R,PostgresDialect as B,SqliteDialect as V}from"kysely";function U(e){if("dialect"in e)return U(e.dialect);if("createDriver"in e){if(e instanceof V)return"sqlite";if(e instanceof R)return"mysql";if(e instanceof B)return"postgres";if(e instanceof L)return"mssql"}return"aggregate"in e?"sqlite":"getConnection"in e?"mysql":"connect"in e?"postgres":null}var k=async e=>{let n=e.database;if("db"in n)return{kysely:n.db,databaseType:n.type};if("dialect"in n)return{kysely:new D({dialect:n.dialect}),databaseType:n.type};let a,i=U(n);return"createDriver"in n&&(a=n),"aggregate"in n&&(a=new V({database:n})),"getConnection"in n&&(a=new R({pool:n})),"connect"in n&&(a=new B({pool:n})),{kysely:a?new D({dialect:a}):null,databaseType:i}};function N(e){if(!e)return{and:null,or:null};let n={and:[],or:[]};return e.forEach(a=>{let{field:i,value:d,operator:r="=",connector:f="AND"}=a,c=t=>r.toLowerCase()==="in"?t(i,"in",Array.isArray(d)?d:[d]):r==="contains"?t(i,"like",`%${d}%`):r==="starts_with"?t(i,"like",`${d}%`):r==="ends_with"?t(i,"like",`%${d}`):t(i,r,d);f==="OR"?n.or.push(c):n.and.push(c)}),{and:n.and.length?n.and:null,or:n.or.length?n.or:null}}function v(e,n,a){for(let i in e){let d=n[i]||Object.values(n).find(r=>r.fieldName===i);e[i]===0&&d.type==="boolean"&&a?.boolean&&(e[i]=!1),e[i]===1&&d?.type==="boolean"&&a?.boolean&&(e[i]=!0),d?.type==="date"&&(e[i]instanceof Date||(e[i]=new Date(e[i])))}return e}function M(e,n){for(let a in e)typeof e[a]=="boolean"&&n?.boolean&&(e[a]=e[a]?1:0),e[a]instanceof Date&&(e[a]=e[a].toISOString());return e}var K=(e,n)=>({id:"kysely",async create(a){let{model:i,data:d,select:r}=a;n?.transform&&(d=M(d,n.transform)),n?.generateId!==void 0&&(d.id=n.generateId?n.generateId():void 0);let f=await e.insertInto(i).values(d).returningAll().executeTakeFirst();if(n?.transform){let c=n.transform.schema[i];f=c?v(d,c,n.transform):f}return r?.length&&(f=f?r.reduce((t,s)=>f?.[s]?{...t,[s]:f[s]}:t,{}):null),f},async findOne(a){let{model:i,where:d,select:r}=a,{and:f,or:c}=N(d),t=e.selectFrom(i).selectAll();f&&(t=t.where(o=>o.and(f.map(l=>l(o))))),c&&(t=t.where(o=>o.or(c.map(l=>l(o)))));let s=await t.executeTakeFirst();if(r?.length&&(s=s?r.reduce((l,u)=>s?.[u]?{...l,[u]:s[u]}:l,{}):null),n?.transform){let o=n.transform.schema[i];return s=s&&o?v(s,o,n.transform):s,s||null}return s||null},async findMany(a){let{model:i,where:d,limit:r,offset:f,sortBy:c}=a,t=e.selectFrom(i),{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(r||100),f&&(t=t.offset(f)),c&&(t=t.orderBy(c.field,c.direction));let l=await t.selectAll().execute();if(n?.transform){let u=n.transform.schema[i];return u?l.map(m=>v(m,u,n.transform)):l}return l},async update(a){let{model:i,where:d,update:r}=a,{and:f,or:c}=N(d);n?.transform&&(r=M(r,n.transform)),r.id&&(r.id=void 0);let t=e.updateTable(i).set(r);f&&(t=t.where(o=>o.and(f.map(l=>l(o))))),c&&(t=t.where(o=>o.or(c.map(l=>l(o)))));let s=await t.returningAll().executeTakeFirst()||null;if(n?.transform){let o=n.transform.schema[i];return o?v(s,o,n.transform):s}return s},async delete(a){let{model:i,where:d}=a,{and:r,or:f}=N(d),c=e.deleteFrom(i);r&&(c=c.where(t=>t.and(r.map(s=>s(t))))),f&&(c=c.where(t=>t.or(f.map(s=>s(t))))),await c.execute()},async deleteMany(a){let{model:i,where:d}=a,{and:r,or:f}=N(d),c=e.deleteFrom(i);r&&(c=c.where(t=>t.and(r.map(s=>s(t))))),f&&(c=c.where(t=>t.or(f.map(s=>s(t))))),await c.execute()}});async function ge(e){if(!e.database)throw new F("Database configuration is required");if("create"in e.database)return e.database;let{kysely:n,databaseType:a}=await k(e);if(!n)throw new F("Failed to initialize database adapter");let i=h(e),d={};for(let r of Object.values(i))d[r.tableName]=r.fields;return K(n,{transform:{schema:d,date:!0,boolean:a==="sqlite"},generateId:"generateId"in e.database?e.database.generateId:void 0})}function q(e,n){let a={id:n.id};for(let i in e){let d=e[i],r=n[i];a[d.fieldName||i]=r}return a}function g(e,n){if(!n)return null;let a={id:n.id};for(let[i,d]of Object.entries(e))a[i]=n[d.fieldName||i];return a}function C(e,n){let a=n.hooks,i=h(n.options);async function d(f,c,t){let s=f,o=i[c];for(let m of a||[]){let p=m[c]?.create?.before;if(p){let y=await p(f);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:{...q(o.fields,s),id:s.id||A()}}):l;for(let m of a||[]){let p=m[c]?.create?.after;p&&await p(u)}return g(o.fields,u)}async function r(f,c,t,s){let o=f;for(let m of a||[]){let p=m[t]?.update?.before;if(p){let y=await p(f);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:i[t].tableName,update:q(i[t].fields,o),where:c}):l;for(let m of a||[]){let p=m[t]?.update?.after;p&&await p(u)}return g(i[t].fields,u)}return{createWithHooks:d,updateWithHooks:r}}import{isTest as W}from"std-env";function P(e){let n="127.0.0.1";if(W)return n;let a=["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 d of a){let r=i.get(d);if(typeof r=="string"){let f=r.split(",")[0].trim();if(f)return f}}return null}var De=(e,n)=>{let a=n.options,i=a.secondaryStorage,d=a.session?.expiresIn||60*60*24*7,r=h(a),{createWithHooks:f,updateWithHooks:c}=C(e,n);return{createOAuthUser:async(t,s)=>{try{let o=await f({id:A(),createdAt:new Date,updatedAt:new Date,...t},"user"),l=await f({id:A(),...s,userId:o.id||t.id},"account");return{user:o,account:l}}catch(o){return console.log(o),null}},createUser:async t=>await f({id:A(),createdAt:new Date,updatedAt:new Date,emailVerified:!1,...t},"user"),createAccount:async t=>await f({id:A(),createdAt:new Date,updatedAt:new Date,...t},"account"),listSessions:async t=>await e.findMany({model:r.session.tableName,where:[{field:r.session.fields.userId.fieldName||"userId",value:t}]}),listUsers:async(t,s,o,l)=>(await e.findMany({model:r.user.tableName,limit:t,offset:s,sortBy:o,where:l})).map(m=>g(r.user.fields,m)),deleteUser:async t=>{await e.delete({model:r.account.tableName,where:[{field:r.account.fields.userId.fieldName||"userId",value:t}]}),await e.deleteMany({model:r.session.tableName,where:[{field:r.session.fields.userId.fieldName||"userId",value:t}]}),await e.deleteMany({model:r.user.tableName,where:[{field:"id",value:t}]})},createSession:async(t,s,o,l)=>{let u=s instanceof Request?s.headers:s,m={id:A(),userId:t,expiresAt:o?S(60*60*24,"sec"):S(d,"sec"),ipAddress:s&&P(s)||"",userAgent:u?.get("user-agent")||"",...l};return await f(m,"session",i?{fn:async y=>{let b=await e.findOne({model:r.user.tableName,where:[{field:"id",value:t}]});return i.set(y.id,JSON.stringify({session:y,user:b}),d),y},executeMainFn:a.session?.storeSessionInDatabase}:void 0)},findSession:async t=>{if(i){let l=await i.get(t);if(l){let u=JSON.parse(l);return{session:{...u.session,expiresAt:new Date(u.session.expiresAt)},user:{...u.user,createdAt:new Date(u.user.createdAt),updatedAt:new Date(u.user.updatedAt)}}}}let s=await e.findOne({model:r.session.tableName,where:[{value:t,field:"id"}]});if(!s)return null;let o=await e.findOne({model:r.user.tableName,where:[{value:s.userId,field:"id"}]});return o?{session:g(r.session.fields,s),user:g(r.user.fields,o)}:null},findSessions:async t=>{if(i){let u=[];for(let m of t){let p=await i.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:r.session.tableName,where:[{field:"id",value:t,operator:"in"}]}),o=s.map(u=>u.userId),l=await e.findMany({model:r.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(r.session.fields,u),user:g(r.user.fields,m)}:null})},updateSession:async(t,s)=>await c(s,[{field:"id",value:t}],"session",i?{async fn(l){let u=await i.get(t),m=null;if(u){let p=JSON.parse(u);m={...p.session,...l},await i.set(t,JSON.stringify({session:m,user:p.user}),p.session.expiresAt?new Date(p.session.expiresAt).getTime():void 0)}else return null},executeMainFn:a.session?.storeSessionInDatabase}:void 0),deleteSession:async t=>{if(i){await i.delete(t),a.session?.storeSessionInDatabase&&await e.delete({model:r.session.tableName,where:[{field:"id",value:t}]});return}await e.delete({model:r.session.tableName,where:[{field:"id",value:t}]})},deleteSessions:async t=>{if(i){let s=await e.findMany({model:r.session.tableName,where:[{field:r.session.fields.userId.fieldName||"userId",value:t}]});for(let o of s)await i.delete(o.id);a.session?.storeSessionInDatabase&&await e.delete({model:r.session.tableName,where:[{field:r.session.fields.userId.fieldName||"userId",value:t}]});return}await e.delete({model:r.session.tableName,where:[{field:r.session.fields.userId.fieldName||"userId",value:t}]})},findUserByEmail:async(t,s)=>{let o=await e.findOne({model:r.user.tableName,where:[{value:t.toLowerCase(),field:r.user.fields.email.fieldName||"email"}]});if(!o)return null;if(s?.includeAccounts){let l=await e.findMany({model:r.account.tableName,where:[{value:o.id,field:r.account.fields.userId.fieldName||"userId"}]});return{user:g(r.user.fields,o),accounts:l.map(u=>g(r.account.fields,u))}}return{user:g(r.user.fields,o),accounts:[]}},findUserById:async t=>await e.findOne({model:r.user.tableName,where:[{field:"id",value:t}]}),linkAccount:async t=>await f({id:A(),...t},"account"),updateUser:async(t,s)=>await c(s,[{field:"id",value:t}],"user"),updateUserByEmail:async(t,s)=>await c(s,[{field:r.user.fields.email.fieldName||"email",value:t}],"user"),updatePassword:async(t,s)=>await c({password:s},[{field:r.account.fields.userId.fieldName||"userId",value:t},{field:r.account.fields.providerId.fieldName||"providerId",value:"credential"}],"account"),findAccounts:async t=>(await e.findMany({model:r.account.tableName,where:[{field:r.account.fields.userId.fieldName||"userId",value:t}]})).map(o=>g(r.account.fields,o)),updateAccount:async(t,s)=>await c(s,[{field:"id",value:t}],"account"),createVerificationValue:async t=>await f({id:A(),...t},"verification"),findVerificationValue:async t=>{let s=await e.findOne({model:r.verification.tableName,where:[{field:r.verification.fields.identifier.fieldName||"identifier",value:t}]});return g(r.verification.fields,s)},deleteVerificationValue:async t=>{await e.delete({model:r.verification.tableName,where:[{field:"id",value:t}]})},updateVerificationValue:async(t,s)=>await c(s,[{field:"id",value:t}],"verification")}};var Be=(e,n)=>({type:e,...n});import{z as I}from"zod";function Me(e){return I.object({...Object.keys(e).reduce((a,i)=>{let d=e[i];if(!d)return a;if(d.type==="string[]"||d.type==="number[]")return{...a,[i]:I.array(d.type==="string[]"?I.string():I.number())};let r=I[d.type]();return d?.required===!1&&(r=r.optional()),d?.returned===!1?a:{...a,[i]:r}},{})})}import"kysely";import{createConsola as $}from"consola";var w=$({formatOptions:{date:!1,colors:!0,compact:!0},defaults:{tag:"Better Auth"}}),H=e=>({log:(...n)=>{!e?.disabled&&w.log("",...n)},error:(...n)=>{!e?.disabled&&w.error("",...n)},warn:(...n)=>{!e?.disabled&&w.warn("",...n)},info:(...n)=>{!e?.disabled&&w.info("",...n)},debug:(...n)=>{!e?.disabled&&w.debug("",...n)},box:(...n)=>{!e?.disabled&&w.box("",...n)},success:(...n)=>{!e?.disabled&&w.success("",...n)},break:(...n)=>{!e?.disabled&&console.log(`
2
+ `)}}),O=H();function j(e){let n=h(e),a={};for(let i in n){let d=n[i],r=d.fields,f={};if(Object.entries(r).forEach(([c,t])=>{f[t.fieldName||c]=t}),a[d.tableName]){a[d.tableName].fields={...a[d.tableName].fields,...f};continue}a[d.tableName]={fields:f,order:d.order||1/0}}return a}var Z={string:["character varying","text"],number:["int4","integer","bigint","smallint","numeric","real","double precision"],boolean:["bool","boolean"],date:["timestamp","date"]},z={string:["varchar","text"],number:["integer","int","bigint","smallint","decimal","float","double"],boolean:["boolean"],date:["date","datetime"]},J={string:["TEXT"],number:["INTEGER","REAL"],boolean:["INTEGER","BOOLEAN"],date:["DATE","INTEGER"]},_={string:["nvarchar","varchar"],number:["int","bigint","smallint","decimal","float","double"],boolean:["bit","boolean"],date:["datetime","date"]},G={postgres:Z,mysql:z,sqlite:J,mssql:_};function X(e,n,a){return n==="string[]"||n==="number[]"?e.toLowerCase().includes("json"):G[a][n].map(f=>f.toLowerCase()).includes(e.toLowerCase())}async function Ze(e){let n=j(e),{kysely:a,databaseType:i}=await k(e);i||(O.warn("Could not determine database type, defaulting to sqlite. Please provide a type in the database options to avoid this."),i="sqlite"),a||(O.error("Only kysely adapter is supported for migrations. You can use `generate` command to generate the schema, if you're using a different adapter."),process.exit(1));let d=await a.introspection.getTables(),r=[],f=[];for(let[l,u]of Object.entries(n)){let m=d.find(y=>y.name===l);if(!m){let y=r.findIndex(T=>T.table===l),b={table:l,fields:u.fields,order:u.order||1/0},x=r.findIndex(T=>(T.order||1/0)>b.order);x===-1?y===-1?r.push(b):r[y].fields={...r[y].fields,...u.fields}:r.splice(x,0,b);continue}let p={};for(let[y,b]of Object.entries(u.fields)){let x=m.columns.find(T=>T.name===y);if(!x){p[y]=b;continue}X(x.dataType,b.type,i)||O.warn(`Field ${y} in table ${l} has a different type in the database. Expected ${b.type} but got ${x.dataType}.`)}Object.keys(p).length>0&&f.push({table:l,fields:p,order:u.order||1/0})}let c=[];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(f.length)for(let l of f)for(let[u,m]of Object.entries(l.fields)){let p=t(m.type),y=a.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));c.push(y)}if(r.length)for(let l of r){let u=a.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))}c.push(u)}async function s(){for(let l of c)await l.execute()}async function o(){return c.map(u=>u.compile().sql).join(`;
3
3
 
4
- `)}return{toBeCreated:r,toBeAdded:c,runMigrations:s,compileMigrations:o}}export{g as convertFromDB,q as convertToDB,De as createFieldAttribute,Se as createInternalAdapter,be as getAdapter,h as getAuthTables,$e as getMigrations,j as getSchema,C as getWithHooks,G as matchType,Ve as toZodSchema};
4
+ `)}return{toBeCreated:r,toBeAdded:f,runMigrations:s,compileMigrations:o}}export{g as convertFromDB,q as convertToDB,Be as createFieldAttribute,De as createInternalAdapter,ge as getAdapter,h as getAuthTables,Ze as getMigrations,j as getSchema,C as getWithHooks,X as matchType,Me as toZodSchema};