better-auth 0.5.3-beta.8 → 0.5.3-beta.9
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/access.js +1 -0
- package/dist/access.js.map +1 -0
- package/dist/adapters/drizzle.js +2 -1
- package/dist/adapters/drizzle.js.map +1 -0
- package/dist/adapters/kysely.js +1 -0
- package/dist/adapters/kysely.js.map +1 -0
- package/dist/adapters/mongodb.js +1 -0
- package/dist/adapters/mongodb.js.map +1 -0
- package/dist/adapters/prisma.js +1 -0
- package/dist/adapters/prisma.js.map +1 -0
- package/dist/api.js +2 -1
- package/dist/api.js.map +1 -0
- package/dist/client/plugins.js +1 -0
- package/dist/client/plugins.js.map +1 -0
- package/dist/client.js +2 -1
- package/dist/client.js.map +1 -0
- package/dist/cookies.js +2 -1
- package/dist/cookies.js.map +1 -0
- package/dist/crypto.js +1 -0
- package/dist/crypto.js.map +1 -0
- package/dist/db.js +2 -1
- package/dist/db.js.map +1 -0
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -0
- package/dist/next-js.js +1 -0
- package/dist/next-js.js.map +1 -0
- package/dist/node.js +1 -0
- package/dist/node.js.map +1 -0
- package/dist/oauth2.js +1 -0
- package/dist/oauth2.js.map +1 -0
- package/dist/plugins.js +2 -1
- package/dist/plugins.js.map +1 -0
- package/dist/react.js +2 -1
- package/dist/react.js.map +1 -0
- package/dist/social.js +2 -1
- package/dist/social.js.map +1 -0
- package/dist/solid-start.js +1 -0
- package/dist/solid-start.js.map +1 -0
- package/dist/solid.js +2 -1
- package/dist/solid.js.map +1 -0
- package/dist/svelte-kit.js +2 -1
- package/dist/svelte-kit.js.map +1 -0
- package/dist/svelte.js +2 -1
- package/dist/svelte.js.map +1 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/vue.js +2 -1
- package/dist/vue.js.map +1 -0
- package/package.json +1 -1
package/dist/client.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
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
|
|
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}};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?.disableDefaultFetchPlugins?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};
|
|
2
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client/config.ts","../src/utils/url.ts","../src/error/index.ts","../src/client/fetch-plugins.ts","../src/utils/misc.ts","../src/client/proxy.ts","../src/client/session-atom.ts","../src/client/query.ts","../src/client/vanilla.ts"],"sourcesContent":["import { createFetch } from \"@better-fetch/fetch\";\nimport { getBaseURL } from \"../utils/url\";\nimport { type Atom } from \"nanostores\";\nimport type { AtomListener, ClientOptions } from \"./types\";\nimport { addCurrentURL, csrfPlugin, redirectPlugin } from \"./fetch-plugins\";\n\nexport const getClientConfig = <O extends ClientOptions>(options?: O) => {\n\tconst $fetch = createFetch({\n\t\tbaseURL: getBaseURL(options?.fetchOptions?.baseURL || options?.baseURL),\n\t\tcredentials: \"include\",\n\t\tmethod: \"GET\",\n\t\t...options?.fetchOptions,\n\t\tplugins: options?.disableDefaultFetchPlugins\n\t\t\t? options.fetchOptions?.plugins\n\t\t\t: [\n\t\t\t\t\t...(!options?.disableCSRFTokenCheck ? [csrfPlugin] : []),\n\t\t\t\t\tredirectPlugin,\n\t\t\t\t\taddCurrentURL,\n\t\t\t\t\t...(options?.fetchOptions?.plugins?.filter(\n\t\t\t\t\t\t(pl) => pl !== undefined,\n\t\t\t\t\t) || []),\n\t\t\t\t\t...(options?.plugins\n\t\t\t\t\t\t?.flatMap((plugin) => plugin.fetchPlugins)\n\t\t\t\t\t\t.filter((pl) => pl !== undefined) || []),\n\t\t\t\t],\n\t});\n\n\tconst plugins = options?.plugins || [];\n\tlet pluginsActions = {} as Record<string, any>;\n\tlet pluginsAtoms = {} as Record<string, Atom<any>>;\n\tlet pluginPathMethods: Record<string, \"POST\" | \"GET\"> = {\n\t\t\"/sign-out\": \"POST\",\n\t\t\"/user/revoke-sessions\": \"POST\",\n\t};\n\tconst atomListeners: AtomListener[] = [\n\t\t{\n\t\t\tsignal: \"_sessionSignal\",\n\t\t\tmatcher(path) {\n\t\t\t\treturn (\n\t\t\t\t\tpath === \"/sign-out\" ||\n\t\t\t\t\tpath === \"/user/update\" ||\n\t\t\t\t\tpath.startsWith(\"/sign-in\") ||\n\t\t\t\t\tpath.startsWith(\"/sign-up\")\n\t\t\t\t);\n\t\t\t},\n\t\t},\n\t];\n\tfor (const plugin of plugins) {\n\t\tif (plugin.getActions) {\n\t\t\tObject.assign(pluginsActions, plugin.getActions?.($fetch));\n\t\t}\n\t\tif (plugin.getAtoms) {\n\t\t\tObject.assign(pluginsAtoms, plugin.getAtoms?.($fetch));\n\t\t}\n\t\tif (plugin.pathMethods) {\n\t\t\tObject.assign(pluginPathMethods, plugin.pathMethods);\n\t\t}\n\t\tif (plugin.atomListeners) {\n\t\t\tatomListeners.push(...plugin.atomListeners);\n\t\t}\n\t}\n\treturn {\n\t\tpluginsActions,\n\t\tpluginsAtoms,\n\t\tpluginPathMethods,\n\t\tatomListeners,\n\t\t$fetch,\n\t};\n};\n","import { env } from \"std-env\";\nimport { BetterAuthError } from \"../error\";\n\nfunction checkHasPath(url: string): boolean {\n\ttry {\n\t\tconst parsedUrl = new URL(url);\n\t\treturn parsedUrl.pathname !== \"/\";\n\t} catch (error) {\n\t\tthrow new BetterAuthError(\n\t\t\t`Invalid base URL: ${url}. Please provide a valid base URL.`,\n\t\t);\n\t}\n}\n\nfunction withPath(url: string, path = \"/api/auth\") {\n\tconst hasPath = checkHasPath(url);\n\tif (hasPath) {\n\t\treturn url;\n\t}\n\tpath = path.startsWith(\"/\") ? path : `/${path}`;\n\treturn `${url}${path}`;\n}\n\nexport function getBaseURL(url?: string, path?: string) {\n\tif (url) {\n\t\treturn withPath(url, path);\n\t}\n\tconst fromEnv =\n\t\tenv.BETTER_AUTH_URL ||\n\t\tenv.NEXT_PUBLIC_BETTER_AUTH_URL ||\n\t\tenv.PUBLIC_BETTER_AUTH_URL ||\n\t\tenv.NUXT_PUBLIC_BETTER_AUTH_URL ||\n\t\tenv.NUXT_PUBLIC_AUTH_URL ||\n\t\t(env.BASE_URL !== \"/\" ? env.BASE_URL : undefined);\n\n\tif (fromEnv) {\n\t\treturn withPath(fromEnv, path);\n\t}\n\n\tif (typeof window !== \"undefined\") {\n\t\treturn withPath(window.location.origin, path);\n\t}\n\treturn undefined;\n}\n\nexport function getOrigin(url: string) {\n\tconst parsedUrl = new URL(url);\n\treturn parsedUrl.origin.replace(\"http://\", \"\").replace(\"https://\", \"\");\n}\n","export class BetterAuthError extends Error {\n\tconstructor(message: string, cause?: string) {\n\t\tsuper(message);\n\t\tthis.name = \"BetterAuthError\";\n\t\tthis.message = message;\n\t\tthis.cause = cause;\n\t}\n}\nexport class MissingDependencyError extends BetterAuthError {\n\tconstructor(pkgName: string) {\n\t\tsuper(\n\t\t\t`The package \"${pkgName}\" is required. Make sure it is installed.`,\n\t\t\tpkgName,\n\t\t);\n\t}\n}\n","import { type BetterFetchPlugin, betterFetch } from \"@better-fetch/fetch\";\nimport { BetterAuthError } from \"../error\";\n\nexport const redirectPlugin = {\n\tid: \"redirect\",\n\tname: \"Redirect\",\n\thooks: {\n\t\tonSuccess(context) {\n\t\t\tif (context.data?.url && context.data?.redirect) {\n\t\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\t\twindow.location.href = context.data.url;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n} satisfies BetterFetchPlugin;\n\nexport const addCurrentURL = {\n\tid: \"add-current-url\",\n\tname: \"Add current URL\",\n\thooks: {\n\t\tonRequest(context) {\n\t\t\tif (typeof window !== \"undefined\") {\n\t\t\t\tconst url = new URL(context.url);\n\t\t\t\turl.searchParams.set(\"currentURL\", window.location.href);\n\t\t\t\tcontext.url = url;\n\t\t\t}\n\t\t\treturn context;\n\t\t},\n\t},\n} satisfies BetterFetchPlugin;\n\nexport const csrfPlugin = {\n\tid: \"csrf\",\n\tname: \"CSRF Check\",\n\tasync init(url, options) {\n\t\tif (options?.method !== \"GET\") {\n\t\t\toptions = options || {};\n\t\t\tconst { data, error } = await betterFetch<{\n\t\t\t\tcsrfToken: string;\n\t\t\t}>(\"/csrf\", {\n\t\t\t\tbody: undefined,\n\t\t\t\tbaseURL: options.baseURL,\n\t\t\t\tplugins: [],\n\t\t\t\tmethod: \"GET\",\n\t\t\t\tcredentials: \"include\",\n\t\t\t\tcustomFetchImpl: options.customFetchImpl,\n\t\t\t});\n\t\t\tif (error) {\n\t\t\t\tif (error.status === 404) {\n\t\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\t\"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).\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (error.status === 429) {\n\t\t\t\t\treturn new Response(\n\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\tmessage: \"Too many requests. Please try again later.\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstatus: 429,\n\t\t\t\t\t\t\tstatusText: \"Too Many Requests\",\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\"Failed to fetch CSRF token: \" + error.message,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst csrfToken = data?.csrfToken;\n\t\t\toptions.body = {\n\t\t\t\t...options?.body,\n\t\t\t\tcsrfToken: csrfToken,\n\t\t\t};\n\t\t}\n\t\toptions.credentials = \"include\";\n\t\treturn { url, options };\n\t},\n} satisfies BetterFetchPlugin;\n","export function capitalizeFirstLetter(str: string) {\n\treturn str.charAt(0).toUpperCase() + str.slice(1);\n}\n","import type { BetterFetch, BetterFetchOption } from \"@better-fetch/fetch\";\nimport type { Atom, PreinitializedWritableAtom } from \"nanostores\";\nimport type { ProxyRequest } from \"./path-to-object\";\nimport type { BetterAuthClientPlugin } from \"./types\";\n\nfunction getMethod(\n\tpath: string,\n\tknownPathMethods: Record<string, \"POST\" | \"GET\">,\n\targs:\n\t\t| { fetchOptions?: BetterFetchOption; query?: Record<string, any> }\n\t\t| undefined,\n) {\n\tconst method = knownPathMethods[path];\n\tconst { fetchOptions, query, ...body } = args || {};\n\tif (method) {\n\t\treturn method;\n\t}\n\tif (fetchOptions?.method) {\n\t\treturn fetchOptions.method;\n\t}\n\tif (body && Object.keys(body).length > 0) {\n\t\treturn \"POST\";\n\t}\n\treturn \"GET\";\n}\n\nexport type AuthProxySignal = {\n\tatom: PreinitializedWritableAtom<boolean>;\n\tmatcher: (path: string) => boolean;\n};\n\nexport function createDynamicPathProxy<T extends Record<string, any>>(\n\troutes: T,\n\tclient: BetterFetch,\n\tknownPathMethods: Record<string, \"POST\" | \"GET\">,\n\tatoms: Record<string, Atom>,\n\tatomListeners: BetterAuthClientPlugin[\"atomListeners\"],\n): T {\n\tfunction createProxy(path: string[] = []): any {\n\t\treturn new Proxy(function () {}, {\n\t\t\tget(target, prop: string) {\n\t\t\t\tconst fullPath = [...path, prop];\n\t\t\t\tlet current: any = routes;\n\t\t\t\tfor (const segment of fullPath) {\n\t\t\t\t\tif (current && typeof current === \"object\" && segment in current) {\n\t\t\t\t\t\tcurrent = current[segment];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcurrent = undefined;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (typeof current === \"function\") {\n\t\t\t\t\treturn current;\n\t\t\t\t}\n\t\t\t\treturn createProxy(fullPath);\n\t\t\t},\n\t\t\tapply: async (_, __, args) => {\n\t\t\t\tconst routePath =\n\t\t\t\t\t\"/\" +\n\t\t\t\t\tpath\n\t\t\t\t\t\t.map((segment) =>\n\t\t\t\t\t\t\tsegment.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join(\"/\");\n\t\t\t\tconst arg = (args[0] || {}) as ProxyRequest;\n\t\t\t\tconst fetchOptions = (args[1] || {}) as BetterFetchOption;\n\t\t\t\tconst { query, fetchOptions: argFetchOptions, ...body } = arg;\n\t\t\t\tconst options = {\n\t\t\t\t\t...fetchOptions,\n\t\t\t\t\t...argFetchOptions,\n\t\t\t\t};\n\t\t\t\tconst method = getMethod(routePath, knownPathMethods, arg);\n\n\t\t\t\treturn await client(routePath, {\n\t\t\t\t\t...options,\n\t\t\t\t\tbody:\n\t\t\t\t\t\tmethod === \"GET\"\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: {\n\t\t\t\t\t\t\t\t\t...body,\n\t\t\t\t\t\t\t\t\t...(options?.body || {}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\tquery: query || options?.query,\n\t\t\t\t\tmethod,\n\t\t\t\t\tasync onSuccess(context) {\n\t\t\t\t\t\tawait options?.onSuccess?.(context);\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * We trigger listeners\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst matches = atomListeners?.find((s) => s.matcher(routePath));\n\t\t\t\t\t\tif (!matches) return;\n\t\t\t\t\t\tconst signal = atoms[matches.signal as any];\n\t\t\t\t\t\tif (!signal) return;\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * To avoid race conditions we set the signal in a setTimeout\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst val = signal.get();\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t//@ts-expect-error\n\t\t\t\t\t\t\tsignal.set(!val);\n\t\t\t\t\t\t}, 10);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\treturn createProxy() as T;\n}\n","import type { BetterFetch } from \"@better-fetch/fetch\";\nimport { atom } from \"nanostores\";\nimport type { Prettify } from \"../types/helper\";\nimport type {\n\tClientOptions,\n\tInferSessionFromClient,\n\tInferUserFromClient,\n} from \"./types\";\nimport { useAuthQuery } from \"./query\";\n\nexport function getSessionAtom<Option extends ClientOptions>(\n\t$fetch: BetterFetch,\n) {\n\ttype UserWithAdditionalFields = InferUserFromClient<Option>;\n\ttype SessionWithAdditionalFields = InferSessionFromClient<Option>;\n\tconst $signal = atom<boolean>(false);\n\tconst session = useAuthQuery<{\n\t\tuser: Prettify<UserWithAdditionalFields>;\n\t\tsession: Prettify<SessionWithAdditionalFields>;\n\t}>($signal, \"/session\", $fetch, {\n\t\tmethod: \"GET\",\n\t});\n\treturn {\n\t\t$session: session,\n\t\t_sessionSignal: $signal,\n\t\t$Infer: {} as {\n\t\t\tSession: {\n\t\t\t\tsession: SessionWithAdditionalFields;\n\t\t\t\tuser: UserWithAdditionalFields;\n\t\t\t};\n\t\t},\n\t};\n}\n","import {\n\tBetterFetchError,\n\ttype BetterFetch,\n\ttype BetterFetchOption,\n} from \"@better-fetch/fetch\";\nimport { atom, onMount, type PreinitializedWritableAtom } from \"nanostores\";\n\nexport const useAuthQuery = <T>(\n\tinitializedAtom:\n\t\t| PreinitializedWritableAtom<any>\n\t\t| PreinitializedWritableAtom<any>[],\n\tpath: string,\n\t$fetch: BetterFetch,\n\toptions?:\n\t\t| ((value: {\n\t\t\t\tdata: null | T;\n\t\t\t\terror: null | BetterFetchError;\n\t\t\t\tisPending: boolean;\n\t\t }) => BetterFetchOption)\n\t\t| BetterFetchOption,\n) => {\n\tconst value = atom<{\n\t\tdata: null | T;\n\t\terror: null | BetterFetchError;\n\t\tisPending: boolean;\n\t\tisRefetching: boolean;\n\t}>({\n\t\tdata: null,\n\t\terror: null,\n\t\tisPending: false,\n\t\tisRefetching: false,\n\t});\n\n\tconst fn = () => {\n\t\tconst opts =\n\t\t\ttypeof options === \"function\"\n\t\t\t\t? options({\n\t\t\t\t\t\tdata: value.get().data,\n\t\t\t\t\t\terror: value.get().error,\n\t\t\t\t\t\tisPending: value.get().isPending,\n\t\t\t\t\t})\n\t\t\t\t: options;\n\t\treturn $fetch<T>(path, {\n\t\t\t...opts,\n\t\t\tonSuccess: async (context) => {\n\t\t\t\tvalue.set({\n\t\t\t\t\tdata: context.data,\n\t\t\t\t\terror: null,\n\t\t\t\t\tisPending: false,\n\t\t\t\t\tisRefetching: false,\n\t\t\t\t});\n\t\t\t\tawait opts?.onSuccess?.(context);\n\t\t\t},\n\t\t\tasync onError(context) {\n\t\t\t\tvalue.set({\n\t\t\t\t\terror: context.error,\n\t\t\t\t\tdata: null,\n\t\t\t\t\tisPending: false,\n\t\t\t\t\tisRefetching: false,\n\t\t\t\t});\n\t\t\t\tawait opts?.onError?.(context);\n\t\t\t},\n\t\t\tasync onRequest(context) {\n\t\t\t\tconst currentValue = value.get();\n\t\t\t\tvalue.set({\n\t\t\t\t\tisPending: currentValue.data === null,\n\t\t\t\t\tdata: currentValue.data,\n\t\t\t\t\terror: null,\n\t\t\t\t\tisRefetching: true,\n\t\t\t\t});\n\t\t\t\tawait opts?.onRequest?.(context);\n\t\t\t},\n\t\t});\n\t};\n\n\tinitializedAtom = Array.isArray(initializedAtom)\n\t\t? initializedAtom\n\t\t: [initializedAtom];\n\tlet isMounted = false;\n\tfor (const initAtom of initializedAtom) {\n\t\tinitAtom.subscribe(() => {\n\t\t\tif (isMounted) {\n\t\t\t\tfn();\n\t\t\t} else {\n\t\t\t\tonMount(value, () => {\n\t\t\t\t\tfn();\n\t\t\t\t\tisMounted = true;\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tvalue.off();\n\t\t\t\t\t\tinitAtom.off();\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\treturn value;\n};\n","import { getClientConfig } from \"./config\";\nimport { capitalizeFirstLetter } from \"../utils/misc\";\nimport type {\n\tBetterAuthClientPlugin,\n\tClientOptions,\n\tInferActions,\n\tInferClientAPI,\n\tInferSessionFromClient,\n\tInferUserFromClient,\n\tIsSignal,\n} from \"./types\";\nimport { createDynamicPathProxy } from \"./proxy\";\nimport { getSessionAtom } from \"./session-atom\";\nimport type { UnionToIntersection } from \"../types/helper\";\n\ntype InferResolvedHooks<O extends ClientOptions> = O[\"plugins\"] extends Array<\n\tinfer Plugin\n>\n\t? Plugin extends BetterAuthClientPlugin\n\t\t? Plugin[\"getAtoms\"] extends (fetch: any) => infer Atoms\n\t\t\t? Atoms extends Record<string, any>\n\t\t\t\t? {\n\t\t\t\t\t\t[key in keyof Atoms as IsSignal<key> extends true\n\t\t\t\t\t\t\t? never\n\t\t\t\t\t\t\t: key extends string\n\t\t\t\t\t\t\t\t? `use${Capitalize<key>}`\n\t\t\t\t\t\t\t\t: never]: Atoms[key];\n\t\t\t\t\t}\n\t\t\t\t: {}\n\t\t\t: {}\n\t\t: {}\n\t: {};\n\nexport function createAuthClient<Option extends ClientOptions>(\n\toptions?: Option,\n) {\n\tconst {\n\t\tpluginPathMethods,\n\t\tpluginsActions,\n\t\tpluginsAtoms,\n\t\t$fetch,\n\t\tatomListeners,\n\t} = getClientConfig(options);\n\tlet resolvedHooks: Record<string, any> = {};\n\tfor (const [key, value] of Object.entries(pluginsAtoms)) {\n\t\tresolvedHooks[`use${capitalizeFirstLetter(key)}`] = value;\n\t}\n\n\tconst { $session, _sessionSignal } = getSessionAtom<Option>($fetch);\n\tconst routes = {\n\t\t...pluginsActions,\n\t\t...resolvedHooks,\n\t\t$fetch,\n\t\tuseSession: $session,\n\t};\n\tconst proxy = createDynamicPathProxy(\n\t\troutes,\n\t\t$fetch,\n\t\tpluginPathMethods,\n\t\t{\n\t\t\t...pluginsAtoms,\n\t\t\t_sessionSignal,\n\t\t},\n\t\tatomListeners,\n\t);\n\treturn proxy as UnionToIntersection<InferResolvedHooks<Option>> &\n\t\tInferClientAPI<Option> &\n\t\tInferActions<Option> & {\n\t\t\tuseSession: typeof $session;\n\t\t\t$fetch: typeof $fetch;\n\t\t\t$Infer: {\n\t\t\t\tSession: {\n\t\t\t\t\tsession: InferSessionFromClient<Option>;\n\t\t\t\t\tuser: InferUserFromClient<Option>;\n\t\t\t\t};\n\t\t\t};\n\t\t};\n}\n"],"mappings":"AAAA,OAAS,eAAAA,MAAmB,sBCA5B,OAAS,OAAAC,MAAW,UCAb,IAAMC,EAAN,cAA8B,KAAM,CAC1C,YAAYC,EAAiBC,EAAgB,CAC5C,MAAMD,CAAO,EACb,KAAK,KAAO,kBACZ,KAAK,QAAUA,EACf,KAAK,MAAQC,CACd,CACD,EDJA,SAASC,EAAaC,EAAsB,CAC3C,GAAI,CAEH,OADkB,IAAI,IAAIA,CAAG,EACZ,WAAa,GAC/B,MAAgB,CACf,MAAM,IAAIC,EACT,qBAAqBD,CAAG,oCACzB,CACD,CACD,CAEA,SAASE,EAASF,EAAaG,EAAO,YAAa,CAElD,OADgBJ,EAAaC,CAAG,EAExBA,GAERG,EAAOA,EAAK,WAAW,GAAG,EAAIA,EAAO,IAAIA,CAAI,GACtC,GAAGH,CAAG,GAAGG,CAAI,GACrB,CAEO,SAASC,EAAWJ,EAAcG,EAAe,CACvD,GAAIH,EACH,OAAOE,EAASF,EAAKG,CAAI,EAE1B,IAAME,EACLC,EAAI,iBACJA,EAAI,6BACJA,EAAI,wBACJA,EAAI,6BACJA,EAAI,uBACHA,EAAI,WAAa,IAAMA,EAAI,SAAW,QAExC,GAAID,EACH,OAAOH,EAASG,EAASF,CAAI,EAG9B,GAAI,OAAO,OAAW,IACrB,OAAOD,EAAS,OAAO,SAAS,OAAQC,CAAI,CAG9C,CDzCA,MAA0B,aGF1B,OAAiC,eAAAI,MAAmB,sBAG7C,IAAMC,EAAiB,CAC7B,GAAI,WACJ,KAAM,WACN,MAAO,CACN,UAAUC,EAAS,CACdA,EAAQ,MAAM,KAAOA,EAAQ,MAAM,UAClC,OAAO,OAAW,MACrB,OAAO,SAAS,KAAOA,EAAQ,KAAK,IAGvC,CACD,CACD,EAEaC,EAAgB,CAC5B,GAAI,kBACJ,KAAM,kBACN,MAAO,CACN,UAAUD,EAAS,CAClB,GAAI,OAAO,OAAW,IAAa,CAClC,IAAME,EAAM,IAAI,IAAIF,EAAQ,GAAG,EAC/BE,EAAI,aAAa,IAAI,aAAc,OAAO,SAAS,IAAI,EACvDF,EAAQ,IAAME,CACf,CACA,OAAOF,CACR,CACD,CACD,EAEaG,EAAa,CACzB,GAAI,OACJ,KAAM,aACN,MAAM,KAAKD,EAAKE,EAAS,CACxB,GAAIA,GAAS,SAAW,MAAO,CAC9BA,EAAUA,GAAW,CAAC,EACtB,GAAM,CAAE,KAAAC,EAAM,MAAAC,CAAM,EAAI,MAAMC,EAE3B,QAAS,CACX,KAAM,OACN,QAASH,EAAQ,QACjB,QAAS,CAAC,EACV,OAAQ,MACR,YAAa,UACb,gBAAiBA,EAAQ,eAC1B,CAAC,EACD,GAAIE,EAAO,CACV,GAAIA,EAAM,SAAW,IACpB,MAAM,IAAIE,EACT,gJACD,EAGD,GAAIF,EAAM,SAAW,IACpB,OAAO,IAAI,SACV,KAAK,UAAU,CACd,QAAS,4CACV,CAAC,EACD,CACC,OAAQ,IACR,WAAY,mBACb,CACD,EAED,MAAM,IAAIE,EACT,+BAAiCF,EAAM,OACxC,CACD,CACA,IAAMG,EAAYJ,GAAM,UACxBD,EAAQ,KAAO,CACd,GAAGA,GAAS,KACZ,UAAWK,CACZ,CACD,CACA,OAAAL,EAAQ,YAAc,UACf,CAAE,IAAAF,EAAK,QAAAE,CAAQ,CACvB,CACD,EHzEO,IAAMM,EAA4CC,GAAgB,CACxE,IAAMC,EAASC,EAAY,CAC1B,QAASC,EAAWH,GAAS,cAAc,SAAWA,GAAS,OAAO,EACtE,YAAa,UACb,OAAQ,MACR,GAAGA,GAAS,aACZ,QAASA,GAAS,2BACfA,EAAQ,cAAc,QACtB,CACA,GAAKA,GAAS,sBAAuC,CAAC,EAAhB,CAACI,CAAU,EACjDC,EACAC,EACA,GAAIN,GAAS,cAAc,SAAS,OAClCO,GAAOA,IAAO,MAChB,GAAK,CAAC,EACN,GAAIP,GAAS,SACV,QAASQ,GAAWA,EAAO,YAAY,EACxC,OAAQD,GAAOA,IAAO,MAAS,GAAK,CAAC,CACxC,CACH,CAAC,EAEKE,EAAUT,GAAS,SAAW,CAAC,EACjCU,EAAiB,CAAC,EAClBC,EAAe,CAAC,EAChBC,EAAoD,CACvD,YAAa,OACb,wBAAyB,MAC1B,EACMC,EAAgC,CACrC,CACC,OAAQ,iBACR,QAAQC,EAAM,CACb,OACCA,IAAS,aACTA,IAAS,gBACTA,EAAK,WAAW,UAAU,GAC1BA,EAAK,WAAW,UAAU,CAE5B,CACD,CACD,EACA,QAAWN,KAAUC,EAChBD,EAAO,YACV,OAAO,OAAOE,EAAgBF,EAAO,aAAaP,CAAM,CAAC,EAEtDO,EAAO,UACV,OAAO,OAAOG,EAAcH,EAAO,WAAWP,CAAM,CAAC,EAElDO,EAAO,aACV,OAAO,OAAOI,EAAmBJ,EAAO,WAAW,EAEhDA,EAAO,eACVK,EAAc,KAAK,GAAGL,EAAO,aAAa,EAG5C,MAAO,CACN,eAAAE,EACA,aAAAC,EACA,kBAAAC,EACA,cAAAC,EACA,OAAAZ,CACD,CACD,EIpEO,SAASc,EAAsBC,EAAa,CAClD,OAAOA,EAAI,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAI,MAAM,CAAC,CACjD,CCGA,SAASC,EACRC,EACAC,EACAC,EAGC,CACD,IAAMC,EAASF,EAAiBD,CAAI,EAC9B,CAAE,aAAAI,EAAc,MAAAC,EAAO,GAAGC,CAAK,EAAIJ,GAAQ,CAAC,EAClD,OAAIC,IAGAC,GAAc,OACVA,EAAa,OAEjBE,GAAQ,OAAO,KAAKA,CAAI,EAAE,OAAS,EAC/B,OAED,MACR,CAOO,SAASC,EACfC,EACAC,EACAR,EACAS,EACAC,EACI,CACJ,SAASC,EAAYZ,EAAiB,CAAC,EAAQ,CAC9C,OAAO,IAAI,MAAM,UAAY,CAAC,EAAG,CAChC,IAAIa,EAAQC,EAAc,CACzB,IAAMC,EAAW,CAAC,GAAGf,EAAMc,CAAI,EAC3BE,EAAeR,EACnB,QAAWS,KAAWF,EACrB,GAAIC,GAAW,OAAOA,GAAY,UAAYC,KAAWD,EACxDA,EAAUA,EAAQC,CAAO,MACnB,CACND,EAAU,OACV,KACD,CAED,OAAI,OAAOA,GAAY,WACfA,EAEDJ,EAAYG,CAAQ,CAC5B,EACA,MAAO,MAAOG,EAAGC,EAAIjB,IAAS,CAC7B,IAAMkB,EACL,IACApB,EACE,IAAKiB,GACLA,EAAQ,QAAQ,SAAWI,GAAW,IAAIA,EAAO,YAAY,CAAC,EAAE,CACjE,EACC,KAAK,GAAG,EACLC,EAAOpB,EAAK,CAAC,GAAK,CAAC,EACnBE,EAAgBF,EAAK,CAAC,GAAK,CAAC,EAC5B,CAAE,MAAAG,EAAO,aAAckB,EAAiB,GAAGjB,CAAK,EAAIgB,EACpDE,EAAU,CACf,GAAGpB,EACH,GAAGmB,CACJ,EACMpB,EAASJ,EAAUqB,EAAWnB,EAAkBqB,CAAG,EAEzD,OAAO,MAAMb,EAAOW,EAAW,CAC9B,GAAGI,EACH,KACCrB,IAAW,MACR,OACA,CACA,GAAGG,EACH,GAAIkB,GAAS,MAAQ,CAAC,CACvB,EACH,MAAOnB,GAASmB,GAAS,MACzB,OAAArB,EACA,MAAM,UAAUsB,EAAS,CACxB,MAAMD,GAAS,YAAYC,CAAO,EAIlC,IAAMC,EAAUf,GAAe,KAAMgB,GAAMA,EAAE,QAAQP,CAAS,CAAC,EAC/D,GAAI,CAACM,EAAS,OACd,IAAME,EAASlB,EAAMgB,EAAQ,MAAa,EAC1C,GAAI,CAACE,EAAQ,OAIb,IAAMC,EAAMD,EAAO,IAAI,EACvB,WAAW,IAAM,CAEhBA,EAAO,IAAI,CAACC,CAAG,CAChB,EAAG,EAAE,CACN,CACD,CAAC,CACF,CACD,CAAC,CACF,CACA,OAAOjB,EAAY,CACpB,CC1GA,OAAS,QAAAkB,MAAY,aCDrB,MAIO,sBACP,OAAS,QAAAC,EAAM,WAAAC,MAAgD,aAExD,IAAMC,EAAe,CAC3BC,EAGAC,EACAC,EACAC,IAOI,CACJ,IAAMC,EAAQP,EAKX,CACF,KAAM,KACN,MAAO,KACP,UAAW,GACX,aAAc,EACf,CAAC,EAEKQ,EAAK,IAAM,CAChB,IAAMC,EACL,OAAOH,GAAY,WAChBA,EAAQ,CACR,KAAMC,EAAM,IAAI,EAAE,KAClB,MAAOA,EAAM,IAAI,EAAE,MACnB,UAAWA,EAAM,IAAI,EAAE,SACxB,CAAC,EACAD,EACJ,OAAOD,EAAUD,EAAM,CACtB,GAAGK,EACH,UAAW,MAAOC,GAAY,CAC7BH,EAAM,IAAI,CACT,KAAMG,EAAQ,KACd,MAAO,KACP,UAAW,GACX,aAAc,EACf,CAAC,EACD,MAAMD,GAAM,YAAYC,CAAO,CAChC,EACA,MAAM,QAAQA,EAAS,CACtBH,EAAM,IAAI,CACT,MAAOG,EAAQ,MACf,KAAM,KACN,UAAW,GACX,aAAc,EACf,CAAC,EACD,MAAMD,GAAM,UAAUC,CAAO,CAC9B,EACA,MAAM,UAAUA,EAAS,CACxB,IAAMC,EAAeJ,EAAM,IAAI,EAC/BA,EAAM,IAAI,CACT,UAAWI,EAAa,OAAS,KACjC,KAAMA,EAAa,KACnB,MAAO,KACP,aAAc,EACf,CAAC,EACD,MAAMF,GAAM,YAAYC,CAAO,CAChC,CACD,CAAC,CACF,EAEAP,EAAkB,MAAM,QAAQA,CAAe,EAC5CA,EACA,CAACA,CAAe,EACnB,IAAIS,EAAY,GAChB,QAAWC,KAAYV,EACtBU,EAAS,UAAU,IAAM,CACpBD,EACHJ,EAAG,EAEHP,EAAQM,EAAO,KACdC,EAAG,EACHI,EAAY,GACL,IAAM,CACZL,EAAM,IAAI,EACVM,EAAS,IAAI,CACd,EACA,CAEH,CAAC,EAEF,OAAON,CACR,EDtFO,SAASO,EACfC,EACC,CAGD,IAAMC,EAAUC,EAAc,EAAK,EAOnC,MAAO,CACN,SAPeC,EAGbF,EAAS,WAAYD,EAAQ,CAC/B,OAAQ,KACT,CAAC,EAGA,eAAgBC,EAChB,OAAQ,CAAC,CAMV,CACD,CECO,SAASG,GACfC,EACC,CACD,GAAM,CACL,kBAAAC,EACA,eAAAC,EACA,aAAAC,EACA,OAAAC,EACA,cAAAC,CACD,EAAIC,EAAgBN,CAAO,EACvBO,EAAqC,CAAC,EAC1C,OAAW,CAACC,EAAKC,CAAK,IAAK,OAAO,QAAQN,CAAY,EACrDI,EAAc,MAAMG,EAAsBF,CAAG,CAAC,EAAE,EAAIC,EAGrD,GAAM,CAAE,SAAAE,EAAU,eAAAC,CAAe,EAAIC,EAAuBT,CAAM,EAC5DU,EAAS,CACd,GAAGZ,EACH,GAAGK,EACH,OAAAH,EACA,WAAYO,CACb,EAWA,OAVcI,EACbD,EACAV,EACAH,EACA,CACC,GAAGE,EACH,eAAAS,CACD,EACAP,CACD,CAaD","names":["createFetch","env","BetterAuthError","message","cause","checkHasPath","url","BetterAuthError","withPath","path","getBaseURL","fromEnv","env","betterFetch","redirectPlugin","context","addCurrentURL","url","csrfPlugin","options","data","error","betterFetch","BetterAuthError","csrfToken","getClientConfig","options","$fetch","createFetch","getBaseURL","csrfPlugin","redirectPlugin","addCurrentURL","pl","plugin","plugins","pluginsActions","pluginsAtoms","pluginPathMethods","atomListeners","path","capitalizeFirstLetter","str","getMethod","path","knownPathMethods","args","method","fetchOptions","query","body","createDynamicPathProxy","routes","client","atoms","atomListeners","createProxy","target","prop","fullPath","current","segment","_","__","routePath","letter","arg","argFetchOptions","options","context","matches","s","signal","val","atom","atom","onMount","useAuthQuery","initializedAtom","path","$fetch","options","value","fn","opts","context","currentValue","isMounted","initAtom","getSessionAtom","$fetch","$signal","atom","useAuthQuery","createAuthClient","options","pluginPathMethods","pluginsActions","pluginsAtoms","$fetch","atomListeners","getClientConfig","resolvedHooks","key","value","capitalizeFirstLetter","$session","_sessionSignal","getSessionAtom","routes","createDynamicPathProxy"]}
|
package/dist/cookies.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
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
|
|
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}};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(d=>{let[k,m]=d.split("=");c[k.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};
|
|
2
|
+
//# sourceMappingURL=cookies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cookies/index.ts","../src/error/index.ts"],"sourcesContent":["import type { CookieOptions } from \"better-call\";\nimport { TimeSpan } from \"oslo\";\nimport type { BetterAuthOptions } from \"../types/options\";\nimport type { GenericEndpointContext } from \"../types/context\";\nimport { BetterAuthError } from \"../error\";\nimport { env, isProduction } from \"std-env\";\n\nexport function getCookies(options: BetterAuthOptions) {\n\tconst secure =\n\t\toptions.advanced?.useSecureCookies !== undefined\n\t\t\t? options.advanced?.useSecureCookies\n\t\t\t: options.baseURL !== undefined\n\t\t\t\t? options.baseURL.startsWith(\"https://\")\n\t\t\t\t\t? true\n\t\t\t\t\t: false\n\t\t\t\t: isProduction;\n\n\tconst secureCookiePrefix = secure ? \"__Secure-\" : \"\";\n\tconst cookiePrefix = \"better-auth\";\n\tconst sessionMaxAge =\n\t\toptions.session?.expiresIn || new TimeSpan(7, \"d\").seconds();\n\tconst crossSubdomainEnabled =\n\t\t!!options.advanced?.crossSubDomainCookies?.enabled;\n\n\tconst domain = crossSubdomainEnabled\n\t\t? options.advanced?.crossSubDomainCookies?.domain ||\n\t\t\t(options.baseURL ? new URL(options.baseURL).hostname : undefined)\n\t\t: undefined;\n\n\tif (crossSubdomainEnabled && !domain) {\n\t\tthrow new BetterAuthError(\n\t\t\t\"baseURL is required when crossSubdomainCookies are enabled\",\n\t\t);\n\t}\n\n\tconst sameSite = crossSubdomainEnabled ? \"none\" : \"lax\";\n\treturn {\n\t\tsessionToken: {\n\t\t\tname: `${secureCookiePrefix}${cookiePrefix}.session_token`,\n\t\t\toptions: {\n\t\t\t\thttpOnly: true,\n\t\t\t\tsameSite,\n\t\t\t\tpath: \"/\",\n\t\t\t\tsecure: !!secureCookiePrefix,\n\t\t\t\tmaxAge: sessionMaxAge,\n\t\t\t\t...(crossSubdomainEnabled ? { domain } : {}),\n\t\t\t} satisfies CookieOptions,\n\t\t},\n\t\tcsrfToken: {\n\t\t\tname: `${secureCookiePrefix}${cookiePrefix}.csrf_token`,\n\t\t\toptions: {\n\t\t\t\thttpOnly: true,\n\t\t\t\tsameSite,\n\t\t\t\tpath: \"/\",\n\t\t\t\tsecure: !!secureCookiePrefix,\n\t\t\t\tmaxAge: 60 * 60 * 24 * 7,\n\t\t\t\t...(crossSubdomainEnabled ? { domain } : {}),\n\t\t\t} satisfies CookieOptions,\n\t\t},\n\t\tstate: {\n\t\t\tname: `${secureCookiePrefix}${cookiePrefix}.state`,\n\t\t\toptions: {\n\t\t\t\thttpOnly: true,\n\t\t\t\tsameSite,\n\t\t\t\tpath: \"/\",\n\t\t\t\tsecure: !!secureCookiePrefix,\n\t\t\t\tmaxAge: 60 * 15,\n\t\t\t\t...(crossSubdomainEnabled ? { domain } : {}),\n\t\t\t} satisfies CookieOptions,\n\t\t},\n\t\tpkCodeVerifier: {\n\t\t\tname: `${secureCookiePrefix}${cookiePrefix}.pk_code_verifier`,\n\t\t\toptions: {\n\t\t\t\thttpOnly: true,\n\t\t\t\tsameSite,\n\t\t\t\tpath: \"/\",\n\t\t\t\tsecure: !!secureCookiePrefix,\n\t\t\t\tmaxAge: 60 * 15,\n\t\t\t\t...(crossSubdomainEnabled ? { domain } : {}),\n\t\t\t} as CookieOptions,\n\t\t},\n\t\tdontRememberToken: {\n\t\t\tname: `${secureCookiePrefix}${cookiePrefix}.dont_remember`,\n\t\t\toptions: {\n\t\t\t\thttpOnly: true,\n\t\t\t\tsameSite,\n\t\t\t\tpath: \"/\",\n\t\t\t\tsecure: !!secureCookiePrefix,\n\t\t\t\t//no max age so it expires when the browser closes\n\t\t\t\t...(crossSubdomainEnabled ? { domain } : {}),\n\t\t\t} as CookieOptions,\n\t\t},\n\t\tnonce: {\n\t\t\tname: `${secureCookiePrefix}${cookiePrefix}.nonce`,\n\t\t\toptions: {\n\t\t\t\thttpOnly: true,\n\t\t\t\tsameSite,\n\t\t\t\tpath: \"/\",\n\t\t\t\tsecure: !!secureCookiePrefix,\n\t\t\t\tmaxAge: 60 * 15,\n\t\t\t\t...(crossSubdomainEnabled ? { domain } : {}),\n\t\t\t} as CookieOptions,\n\t\t},\n\t};\n}\n\nexport function createCookieGetter(options: BetterAuthOptions) {\n\tconst secure =\n\t\toptions.advanced?.useSecureCookies !== undefined\n\t\t\t? options.advanced?.useSecureCookies\n\t\t\t: options.baseURL?.startsWith(\"https://\") || isProduction;\n\tconst secureCookiePrefix = secure ? \"__Secure-\" : \"\";\n\tconst cookiePrefix = \"better-auth\";\n\n\tconst domain =\n\t\toptions.advanced?.crossSubDomainCookies?.domain ||\n\t\t(options.baseURL ? new URL(options.baseURL).hostname : undefined);\n\n\tfunction getCookie(cookieName: string, opts?: CookieOptions) {\n\t\tconst crossSubdomainEnabled = options.advanced?.crossSubDomainCookies\n\t\t\t?.enabled\n\t\t\t? options.advanced.crossSubDomainCookies.additionalCookies?.includes(\n\t\t\t\t\tcookieName,\n\t\t\t\t)\n\t\t\t: undefined;\n\t\treturn {\n\t\t\tname:\n\t\t\t\tenv.NODE_ENV === \"production\"\n\t\t\t\t\t? `${secureCookiePrefix}${cookiePrefix}.${cookieName}`\n\t\t\t\t\t: `${cookiePrefix}.${cookieName}`,\n\t\t\toptions: {\n\t\t\t\tsecure: !!secureCookiePrefix,\n\t\t\t\tsameSite: \"lax\",\n\t\t\t\tpath: \"/\",\n\t\t\t\tmaxAge: 60 * 15, // 15 minutes in seconds\n\t\t\t\t...opts,\n\t\t\t\t...(crossSubdomainEnabled ? { domain } : {}),\n\t\t\t} as CookieOptions,\n\t\t};\n\t}\n\treturn getCookie;\n}\nexport type BetterAuthCookies = ReturnType<typeof getCookies>;\n\nexport async function setSessionCookie(\n\tctx: GenericEndpointContext,\n\tsessionToken: string,\n\tdontRememberMe?: boolean,\n\toverrides?: Partial<CookieOptions>,\n) {\n\tconst options = ctx.context.authCookies.sessionToken.options;\n\t//@ts-expect-error\n\toptions.maxAge = dontRememberMe\n\t\t? undefined\n\t\t: ctx.context.sessionConfig.expiresIn;\n\n\tawait ctx.setSignedCookie(\n\t\tctx.context.authCookies.sessionToken.name,\n\t\tsessionToken,\n\t\tctx.context.secret,\n\t\t{\n\t\t\t...options,\n\t\t\t...overrides,\n\t\t},\n\t);\n\tif (dontRememberMe) {\n\t\tawait ctx.setSignedCookie(\n\t\t\tctx.context.authCookies.dontRememberToken.name,\n\t\t\t\"true\",\n\t\t\tctx.context.secret,\n\t\t\tctx.context.authCookies.dontRememberToken.options,\n\t\t);\n\t}\n}\n\nexport function deleteSessionCookie(ctx: GenericEndpointContext) {\n\tctx.setCookie(ctx.context.authCookies.sessionToken.name, \"\", {\n\t\tmaxAge: 0,\n\t});\n\tctx.setCookie(ctx.context.authCookies.dontRememberToken.name, \"\", {\n\t\tmaxAge: 0,\n\t});\n}\n\ntype CookieAttributes = {\n\tvalue: string;\n\t[key: string]: string | boolean;\n};\n\nexport function parseSetCookieHeader(\n\theader: string,\n): Map<string, CookieAttributes> {\n\tconst cookieMap = new Map<string, CookieAttributes>();\n\n\t// Split the header into individual cookies\n\tconst cookies = header.split(\", \");\n\n\tcookies.forEach((cookie) => {\n\t\tconst [nameValue, ...attributes] = cookie.split(\"; \");\n\t\tconst [name, value] = nameValue.split(\"=\");\n\n\t\tconst cookieObj: CookieAttributes = { value };\n\n\t\tattributes.forEach((attr) => {\n\t\t\tconst [attrName, attrValue] = attr.split(\"=\");\n\t\t\tcookieObj[attrName.toLowerCase()] = attrValue || true;\n\t\t});\n\n\t\tcookieMap.set(name, cookieObj);\n\t});\n\n\treturn cookieMap;\n}\nexport function parseCookies(cookieHeader: string) {\n\tconst cookies = cookieHeader.split(\"; \");\n\tconst cookieMap = new Map<string, string>();\n\n\tcookies.forEach((cookie) => {\n\t\tconst [name, value] = cookie.split(\"=\");\n\t\tcookieMap.set(name, value);\n\t});\n\treturn cookieMap;\n}\n\nexport type EligibleCookies = (string & {}) | (keyof BetterAuthCookies & {});\n","export class BetterAuthError extends Error {\n\tconstructor(message: string, cause?: string) {\n\t\tsuper(message);\n\t\tthis.name = \"BetterAuthError\";\n\t\tthis.message = message;\n\t\tthis.cause = cause;\n\t}\n}\nexport class MissingDependencyError extends BetterAuthError {\n\tconstructor(pkgName: string) {\n\t\tsuper(\n\t\t\t`The package \"${pkgName}\" is required. Make sure it is installed.`,\n\t\t\tpkgName,\n\t\t);\n\t}\n}\n"],"mappings":"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","names":["TimeSpan","BetterAuthError","message","cause","env","isProduction","getCookies","options","secureCookiePrefix","cookiePrefix","sessionMaxAge","TimeSpan","crossSubdomainEnabled","domain","BetterAuthError","sameSite","createCookieGetter","getCookie","cookieName","opts","setSessionCookie","ctx","sessionToken","dontRememberMe","overrides","deleteSessionCookie","parseSetCookieHeader","header","cookieMap","cookie","nameValue","attributes","name","value","cookieObj","attr","attrName","attrValue","parseCookies","cookieHeader","cookies"]}
|
package/dist/crypto.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
1
|
import{xchacha20poly1305 as u}from"@noble/ciphers/chacha";import{bytesToHex as B,hexToBytes as S,utf8ToBytes as T}from"@noble/ciphers/utils";import{managedNonce as g}from"@noble/ciphers/webcrypto";import{sha256 as l}from"oslo/crypto";import f from"uncrypto";function c(t,e){let r=new Uint8Array(t),n=new Uint8Array(e);if(r.length!==n.length)return!1;let o=0;for(let a=0;a<r.length;a++)o|=r[a]^n[a];return o===0}import{decodeHex as d,encodeHex as y}from"oslo/encoding";import{scryptAsync as h}from"@noble/hashes/scrypt";import{getRandomValues as w}from"uncrypto";var s={N:16384,r:16,p:1,dkLen:64};async function m(t,e){return await h(t.normalize("NFKC"),e,{N:s.N,p:s.p,r:s.r,dkLen:s.dkLen,maxmem:128*s.N*s.r*2})}var D=async t=>{let e=y(w(new Uint8Array(16))),r=await m(t,e);return`${e}:${y(r)}`},H=async(t,e)=>{let[r,n]=t.split(":"),o=await m(e,r);return c(o,d(n))};import i from"uncrypto";function A(t){return t.toString(2).padStart(8,"0")}function x(t){return[...t].map(e=>A(e)).join("")}function p(t){return parseInt(x(t),2)}function C(){let t=new ArrayBuffer(8),e=i.getRandomValues(new Uint8Array(t));return e[0]=63,e[1]=e[1]|240,new DataView(t).getFloat64(0)-1}function b(t){if(t<0||!Number.isInteger(t))throw new Error("Argument 'max' must be an integer greater than or equal to 0");let e=(t-1).toString(2).length,r=e%8,n=new Uint8Array(Math.ceil(e/8));i.getRandomValues(n),r!==0&&(n[0]&=(1<<r)-1);let o=p(n);for(;o>=t;)i.getRandomValues(n),r!==0&&(n[0]&=(1<<r)-1),o=p(n);return o}function I(t,e){let r="";for(let n=0;n<t;n++)r+=e[b(e.length)];return r}function K(...t){let e=new Set(t),r="";for(let n of e)n==="a-z"?r+="abcdefghijklmnopqrstuvwxyz":n==="A-Z"?r+="ABCDEFGHIJKLMNOPQRSTUVWXYZ":n==="0-9"?r+="0123456789":r+=n;return r}async function M(t,e){let r=new TextEncoder,n={name:"HMAC",hash:"SHA-256"},o=await f.subtle.importKey("raw",r.encode(t),n,!1,["sign","verify"]),a=await f.subtle.sign(n.name,o,r.encode(e));return btoa(String.fromCharCode(...new Uint8Array(a)))}var Z=async({key:t,data:e})=>{let r=await l(new TextEncoder().encode(t)),n=T(e),o=g(u)(new Uint8Array(r));return B(o.encrypt(n))},j=async({key:t,data:e})=>{let r=await l(new TextEncoder().encode(t)),n=S(e),o=g(u)(new Uint8Array(r));return new TextDecoder().decode(o.decrypt(n))};export{K as alphabet,A as byteToBinary,x as bytesToBinary,p as bytesToInteger,c as constantTimeEqual,b as generateRandomInteger,I as generateRandomString,D as hashPassword,M as hs256,C as random,j as symmetricDecrypt,Z as symmetricEncrypt,H as verifyPassword};
|
|
2
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/crypto/index.ts","../src/crypto/buffer.ts","../src/crypto/password.ts","../src/crypto/random.ts"],"sourcesContent":["import { xchacha20poly1305 } from \"@noble/ciphers/chacha\";\nimport { bytesToHex, hexToBytes, utf8ToBytes } from \"@noble/ciphers/utils\";\nimport { managedNonce } from \"@noble/ciphers/webcrypto\";\nimport { sha256 } from \"oslo/crypto\";\nimport crypto from \"uncrypto\";\n\nexport async function hs256(secretKey: string, message: string) {\n\tconst enc = new TextEncoder();\n\tconst algorithm = { name: \"HMAC\", hash: \"SHA-256\" };\n\tconst key = await crypto.subtle.importKey(\n\t\t\"raw\",\n\t\tenc.encode(secretKey),\n\t\talgorithm,\n\t\tfalse,\n\t\t[\"sign\", \"verify\"],\n\t);\n\tconst signature = await crypto.subtle.sign(\n\t\talgorithm.name,\n\t\tkey,\n\t\tenc.encode(message),\n\t);\n\treturn btoa(String.fromCharCode(...new Uint8Array(signature)));\n}\n\nexport type SymmetricEncryptOptions = {\n\tkey: string;\n\tdata: string;\n};\n\nexport const symmetricEncrypt = async ({\n\tkey,\n\tdata,\n}: SymmetricEncryptOptions) => {\n\tconst keyAsBytes = await sha256(new TextEncoder().encode(key));\n\tconst dataAsBytes = utf8ToBytes(data);\n\tconst chacha = managedNonce(xchacha20poly1305)(new Uint8Array(keyAsBytes));\n\treturn bytesToHex(chacha.encrypt(dataAsBytes));\n};\n\nexport type SymmetricDecryptOptions = {\n\tkey: string;\n\tdata: string;\n};\n\nexport const symmetricDecrypt = async ({\n\tkey,\n\tdata,\n}: SymmetricDecryptOptions) => {\n\tconst keyAsBytes = await sha256(new TextEncoder().encode(key));\n\tconst dataAsBytes = hexToBytes(data);\n\tconst chacha = managedNonce(xchacha20poly1305)(new Uint8Array(keyAsBytes));\n\treturn new TextDecoder().decode(chacha.decrypt(dataAsBytes));\n};\n\nexport * from \"./buffer\";\nexport * from \"./password\";\nexport * from \"./random\";\nexport * from \"./buffer\";\n","/**\n * Compare two buffers in constant time.\n */\nexport function constantTimeEqual(\n\ta: ArrayBuffer | Uint8Array,\n\tb: ArrayBuffer | Uint8Array,\n): boolean {\n\tconst aBuffer = new Uint8Array(a);\n\tconst bBuffer = new Uint8Array(b);\n\tif (aBuffer.length !== bBuffer.length) {\n\t\treturn false;\n\t}\n\tlet c = 0;\n\tfor (let i = 0; i < aBuffer.length; i++) {\n\t\tc |= aBuffer[i]! ^ bBuffer[i]!; // ^: XOR operator\n\t}\n\treturn c === 0;\n}\n","import { decodeHex, encodeHex } from \"oslo/encoding\";\nimport { constantTimeEqual } from \"./buffer\";\nimport { scryptAsync } from \"@noble/hashes/scrypt\";\nimport { getRandomValues } from \"uncrypto\";\n\nconst config = {\n\tN: 16384,\n\tr: 16,\n\tp: 1,\n\tdkLen: 64,\n};\n\nasync function generateKey(password: string, salt: string) {\n\treturn await scryptAsync(password.normalize(\"NFKC\"), salt, {\n\t\tN: config.N,\n\t\tp: config.p,\n\t\tr: config.r,\n\t\tdkLen: config.dkLen,\n\t\tmaxmem: 128 * config.N * config.r * 2,\n\t});\n}\n\nexport const hashPassword = async (password: string) => {\n\tconst salt = encodeHex(getRandomValues(new Uint8Array(16)));\n\tconst key = await generateKey(password, salt);\n\treturn `${salt}:${encodeHex(key)}`;\n};\n\nexport const verifyPassword = async (hash: string, password: string) => {\n\tconst [salt, key] = hash.split(\":\");\n\tconst targetKey = await generateKey(password, salt!);\n\treturn constantTimeEqual(targetKey, decodeHex(key!));\n};\n","//https://github.com/pilcrowOnPaper/oslo/blob/main/src/crypto/random.ts\nimport crypto from \"uncrypto\";\n\nexport function byteToBinary(byte: number): string {\n\treturn byte.toString(2).padStart(8, \"0\");\n}\n\nexport function bytesToBinary(bytes: Uint8Array): string {\n\treturn [...bytes].map((val) => byteToBinary(val)).join(\"\");\n}\n\nexport function bytesToInteger(bytes: Uint8Array): number {\n\treturn parseInt(bytesToBinary(bytes), 2);\n}\n\nexport function random(): number {\n\tconst buffer = new ArrayBuffer(8);\n\tconst bytes = crypto.getRandomValues(new Uint8Array(buffer));\n\n\t// sets the exponent value (11 bits) to 01111111111 (1023)\n\t// since the bias is 1023 (2 * (11 - 1) - 1), 1023 - 1023 = 0\n\t// 2^0 * (1 + [52 bit number between 0-1]) = number between 1-2\n\tbytes[0] = 63;\n\tbytes[1] = bytes[1]! | 240;\n\n\treturn new DataView(buffer).getFloat64(0) - 1;\n}\n\nexport function generateRandomInteger(max: number): number {\n\tif (max < 0 || !Number.isInteger(max)) {\n\t\tthrow new Error(\n\t\t\t\"Argument 'max' must be an integer greater than or equal to 0\",\n\t\t);\n\t}\n\tconst bitLength = (max - 1).toString(2).length;\n\tconst shift = bitLength % 8;\n\tconst bytes = new Uint8Array(Math.ceil(bitLength / 8));\n\n\tcrypto.getRandomValues(bytes);\n\n\t// This zeroes bits that can be ignored to increase the chance `result` < `max`.\n\t// For example, if `max` can be represented with 10 bits, the leading 6 bits of the random 16 bits (2 bytes) can be ignored.\n\tif (shift !== 0) {\n\t\tbytes[0] &= (1 << shift) - 1;\n\t}\n\tlet result = bytesToInteger(bytes);\n\twhile (result >= max) {\n\t\tcrypto.getRandomValues(bytes);\n\t\tif (shift !== 0) {\n\t\t\tbytes[0] &= (1 << shift) - 1;\n\t\t}\n\t\tresult = bytesToInteger(bytes);\n\t}\n\treturn result;\n}\n\nexport function generateRandomString(length: number, alphabet: string): string {\n\tlet result = \"\";\n\tfor (let i = 0; i < length; i++) {\n\t\tresult += alphabet[generateRandomInteger(alphabet.length)];\n\t}\n\treturn result;\n}\n\ntype AlphabetPattern = \"a-z\" | \"A-Z\" | \"0-9\" | \"-\" | \"_\";\n\nexport function alphabet(...patterns: AlphabetPattern[]): string {\n\tconst patternSet = new Set<AlphabetPattern>(patterns);\n\tlet result = \"\";\n\tfor (const pattern of patternSet) {\n\t\tif (pattern === \"a-z\") {\n\t\t\tresult += \"abcdefghijklmnopqrstuvwxyz\";\n\t\t} else if (pattern === \"A-Z\") {\n\t\t\tresult += \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\t\t} else if (pattern === \"0-9\") {\n\t\t\tresult += \"0123456789\";\n\t\t} else {\n\t\t\tresult += pattern;\n\t\t}\n\t}\n\treturn result;\n}\n"],"mappings":"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","names":["xchacha20poly1305","bytesToHex","hexToBytes","utf8ToBytes","managedNonce","sha256","crypto","constantTimeEqual","a","b","aBuffer","bBuffer","c","i","decodeHex","encodeHex","scryptAsync","getRandomValues","config","generateKey","password","salt","hashPassword","encodeHex","key","verifyPassword","hash","targetKey","constantTimeEqual","decodeHex","crypto","byteToBinary","byte","bytesToBinary","bytes","val","bytesToInteger","random","buffer","generateRandomInteger","max","bitLength","shift","result","generateRandomString","length","alphabet","i","patterns","patternSet","pattern","hs256","secretKey","message","enc","algorithm","key","crypto","signature","symmetricEncrypt","data","keyAsBytes","sha256","dataAsBytes","utf8ToBytes","chacha","managedNonce","xchacha20poly1305","bytesToHex","symmetricDecrypt","hexToBytes"]}
|
package/dist/db.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
var q=(e,s="ms")=>new Date(Date.now()+(s==="sec"?e*1e3:e));var h=e=>{let s=e.plugins?.reduce((t,i)=>{let o=i.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",n={rateLimit:{tableName:e.rateLimit?.tableName||"rateLimit",fields:{key:{type:"string",fieldName:e.rateLimit?.fields?.key||"key"},count:{type:"number",fieldName:e.rateLimit?.fields?.count||"count"},lastRequest:{type:"number",fieldName:e.rateLimit?.fields?.lastRequest||"lastRequest"}}}},{user:d,session:r,account:c,...f}=s||{};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?n:{}}};import{nanoid as E}from"nanoid";var A=e=>E(e);var F=class extends Error{constructor(s,a){super(s),this.name="BetterAuthError",this.message=s,this.cause=a,this.stack=""}};import{Kysely as S,MssqlDialect as L}from"kysely";import{MysqlDialect as R,PostgresDialect as B,SqliteDialect as V}from"kysely";function M(e){if("dialect"in e)return M(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 s=e.database;if("db"in s)return{kysely:s.db,databaseType:s.type};if("dialect"in s)return{kysely:new S({dialect:s.dialect}),databaseType:s.type};let a,n=M(s);return"createDriver"in s&&(a=s),"aggregate"in s&&(a=new V({database:s})),"getConnection"in s&&(a=new R({pool:s})),"connect"in s&&(a=new B({pool:s})),{kysely:a?new S({dialect:a}):null,databaseType:n}};function N(e){if(!e)return{and:null,or:null};let s={and:[],or:[]};return e.forEach(a=>{let{field:n,value:d,operator:r="=",connector:c="AND"}=a,f=t=>r.toLowerCase()==="in"?t(n,"in",Array.isArray(d)?d:[d]):r==="contains"?t(n,"like",`%${d}%`):r==="starts_with"?t(n,"like",`${d}%`):r==="ends_with"?t(n,"like",`%${d}`):t(n,r,d);c==="OR"?s.or.push(f):s.and.push(f)}),{and:s.and.length?s.and:null,or:s.or.length?s.or:null}}function v(e,s,a){for(let n in e){let d=s[n]||Object.values(s).find(r=>r.fieldName===n);e[n]===0&&d.type==="boolean"&&a?.boolean&&(e[n]=!1),e[n]===1&&d?.type==="boolean"&&a?.boolean&&(e[n]=!0),d?.type==="date"&&(e[n]instanceof Date||(e[n]=new Date(e[n])))}return e}function U(e,s){for(let a in e)typeof e[a]=="boolean"&&s?.boolean&&(e[a]=e[a]?1:0),e[a]instanceof Date&&(e[a]=e[a].toISOString());return e}var K=(e,s)=>({id:"kysely",async create(a){let{model:n,data:d,select:r}=a;s?.transform&&(d=U(d,s.transform)),s?.generateId!==void 0&&(d.id=s.generateId?s.generateId():void 0);let c=await e.insertInto(n).values(d).returningAll().executeTakeFirst();if(s?.transform){let f=s.transform.schema[n];c=f?v(d,f,s.transform):c}return r?.length&&(c=c?r.reduce((t,i)=>c?.[i]?{...t,[i]:c[i]}:t,{}):null),c},async findOne(a){let{model:n,where:d,select:r}=a,{and:c,or:f}=N(d),t=e.selectFrom(n).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 i=await t.executeTakeFirst();if(r?.length&&(i=i?r.reduce((l,u)=>i?.[u]?{...l,[u]:i[u]}:l,{}):null),s?.transform){let o=s.transform.schema[n];return i=i&&o?v(i,o,s.transform):i,i||null}return i||null},async findMany(a){let{model:n,where:d,limit:r,offset:c,sortBy:f}=a,t=e.selectFrom(n),{and:i,or:o}=N(d);i&&(t=t.where(u=>u.and(i.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(s?.transform){let u=s.transform.schema[n];return u?l.map(m=>v(m,u,s.transform)):l}return l},async update(a){let{model:n,where:d,update:r}=a,{and:c,or:f}=N(d);s?.transform&&(r=U(r,s.transform)),r.id&&(r.id=void 0);let t=e.updateTable(n).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 i=await t.returningAll().executeTakeFirst()||null;if(s?.transform){let o=s.transform.schema[n];return o?v(i,o,s.transform):i}return i},async delete(a){let{model:n,where:d}=a,{and:r,or:c}=N(d),f=e.deleteFrom(n);r&&(f=f.where(t=>t.and(r.map(i=>i(t))))),c&&(f=f.where(t=>t.or(c.map(i=>i(t))))),await f.execute()},async deleteMany(a){let{model:n,where:d}=a,{and:r,or:c}=N(d),f=e.deleteFrom(n);r&&(f=f.where(t=>t.and(r.map(i=>i(t))))),c&&(f=f.where(t=>t.or(c.map(i=>i(t))))),await f.execute()}});async function me(e){if(!e.database)throw new F("Database configuration is required");if("create"in e.database)return e.database;let{kysely:s,databaseType:a}=await k(e);if(!s)throw new F("Failed to initialize database adapter");let n=h(e),d={};for(let r of Object.values(n))d[r.tableName]=r.fields;return K(s,{transform:{schema:d,date:!0,boolean:a==="sqlite"},generateId:"generateId"in e.database?e.database.generateId:void 0})}function D(e,s){let a={id:s.id};for(let n in e){let d=e[n],r=s[n];a[d.fieldName||n]=r}return a}function g(e,s){if(!s)return null;let a={id:s.id};for(let[n,d]of Object.entries(e))a[n]=s[d.fieldName||n];return a}function C(e,s){let a=s.hooks,n=h(s.options);async function d(c,f,t){let i=c,o=n[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&&(i=y.data)}}let l=t?await t.fn(i):null,u=!t||t.executeMainFn?await e.create({model:o.tableName,data:{...D(o.fields,i),id:i.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,i){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=i?await i.fn(o):null,u=!i||i.executeMainFn?await e.update({model:n[t].tableName,update:D(n[t].fields,o),where:f}):l;for(let m of a||[]){let p=m[t]?.update?.after;p&&await p(u)}return g(n[t].fields,u)}return{createWithHooks:d,updateWithHooks:r}}import{isTest as $}from"std-env";function j(e){let s="127.0.0.1";if($)return s;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"],n=e instanceof Request?e.headers:e;for(let d of a){let r=n.get(d);if(typeof r=="string"){let c=r.split(",")[0].trim();if(c)return c}}return null}var ve=(e,s)=>{let a=s.options,n=a.secondaryStorage,d=a.session?.expiresIn||60*60*24*7,r=h(a),{createWithHooks:c,updateWithHooks:f}=C(e,s);return{createOAuthUser:async(t,i)=>{try{let o=await c({id:A(),createdAt:new Date,updatedAt:new Date,...t},"user"),l=await c({id:A(),...i,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,i,o,l)=>(await e.findMany({model:r.user.tableName,limit:t,offset:i,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,i,o,l)=>{let u=i instanceof Request?i.headers:i,m={id:A(),userId:t,expiresAt:o?q(60*60*24,"sec"):q(d,"sec"),ipAddress:i&&j(i)||"",userAgent:u?.get("user-agent")||"",...l};return await c(m,"session",n?{fn:async y=>{let b=await e.findOne({model:r.user.tableName,where:[{field:"id",value:t}]});return n.set(y.id,JSON.stringify({session:y,user:b}),d),y},executeMainFn:a.session?.storeSessionInDatabase}:void 0)},findSession:async t=>{if(n){let l=await n.get(t);if(l){let u=JSON.parse(l);return{session:{...u.session,expiresAt:new Date(u.session.expiresAt)},user:{...u.user,createdAt:new Date(u.user.createdAt),updatedAt:new Date(u.user.updatedAt)}}}}let i=await e.findOne({model:r.session.tableName,where:[{value:t,field:"id"}]});if(!i)return null;let o=await e.findOne({model:r.user.tableName,where:[{value:i.userId,field:"id"}]});return o?{session:g(r.session.fields,i),user:g(r.user.fields,o)}:null},findSessions:async t=>{if(n){let u=[];for(let m of t){let p=await n.get(m);if(p){let y=JSON.parse(p),b={session:{...y.session,expiresAt:new Date(y.session.expiresAt)},user:{...y.user,createdAt:new Date(y.user.createdAt),updatedAt:new Date(y.user.updatedAt)}};u.push(b)}}return u}let i=await e.findMany({model:r.session.tableName,where:[{field:"id",value:t,operator:"in"}]}),o=i.map(u=>u.userId);if(!o.length)return[];let l=await e.findMany({model:r.user.tableName,where:[{field:"id",value:o,operator:"in"}]});return i.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,i)=>await f(i,[{field:"id",value:t}],"session",n?{async fn(l){let u=await n.get(t),m=null;if(u){let p=JSON.parse(u);m={...p.session,...l},await n.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(n){await n.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(n){let i=await e.findMany({model:r.session.tableName,where:[{field:r.session.fields.userId.fieldName||"userId",value:t}]});for(let o of i)await n.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.deleteMany({model:r.session.tableName,where:[{field:r.session.fields.userId.fieldName||"userId",value:t}]})},findUserByEmail:async(t,i)=>{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(i?.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,i)=>await f(i,[{field:"id",value:t}],"user"),updateUserByEmail:async(t,i)=>await f(i,[{field:r.user.fields.email.fieldName||"email",value:t}],"user"),updatePassword:async(t,i)=>await f({password:i},[{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,i)=>await f(i,[{field:"id",value:t}],"account"),createVerificationValue:async t=>await c({id:A(),...t},"verification"),findVerificationValue:async t=>{let i=await e.findOne({model:r.verification.tableName,where:[{field:r.verification.fields.identifier.fieldName||"identifier",value:t}]});return g(r.verification.fields,i)},deleteVerificationValue:async t=>{await e.delete({model:r.verification.tableName,where:[{field:"id",value:t}]})},updateVerificationValue:async(t,i)=>await f(i,[{field:"id",value:t}],"verification")}};var qe=(e,s)=>({type:e,...s});import{z as I}from"zod";function Re(e){return I.object({...Object.keys(e).reduce((a,n)=>{let d=e[n];if(!d)return a;if(d.type==="string[]"||d.type==="number[]")return{...a,[n]: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,[n]:r}},{})})}import"kysely";import{createConsola as W}from"consola";var w=W({formatOptions:{date:!1,colors:!0,compact:!0},defaults:{tag:"Better Auth"}}),H=e=>({log:(...s)=>{!e?.disabled&&w.log("",...s)},error:(...s)=>{!e?.disabled&&w.error("",...s)},warn:(...s)=>{!e?.disabled&&w.warn("",...s)},info:(...s)=>{!e?.disabled&&w.info("",...s)},debug:(...s)=>{!e?.disabled&&w.debug("",...s)},box:(...s)=>{!e?.disabled&&w.box("",...s)},success:(...s)=>{!e?.disabled&&w.success("",...s)},break:(...s)=>{!e?.disabled&&console.log(`
|
|
1
|
+
var q=(e,s="ms")=>new Date(Date.now()+(s==="sec"?e*1e3:e));var h=e=>{let s=e.plugins?.reduce((t,i)=>{let o=i.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",n={rateLimit:{tableName:e.rateLimit?.tableName||"rateLimit",fields:{key:{type:"string",fieldName:e.rateLimit?.fields?.key||"key"},count:{type:"number",fieldName:e.rateLimit?.fields?.count||"count"},lastRequest:{type:"number",fieldName:e.rateLimit?.fields?.lastRequest||"lastRequest"}}}},{user:d,session:r,account:c,...f}=s||{};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?n:{}}};import{nanoid as E}from"nanoid";var A=e=>E(e);var F=class extends Error{constructor(s,a){super(s),this.name="BetterAuthError",this.message=s,this.cause=a}};import{Kysely as S,MssqlDialect as L}from"kysely";import{MysqlDialect as R,PostgresDialect as B,SqliteDialect as V}from"kysely";function M(e){if("dialect"in e)return M(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 s=e.database;if("db"in s)return{kysely:s.db,databaseType:s.type};if("dialect"in s)return{kysely:new S({dialect:s.dialect}),databaseType:s.type};let a,n=M(s);return"createDriver"in s&&(a=s),"aggregate"in s&&(a=new V({database:s})),"getConnection"in s&&(a=new R({pool:s})),"connect"in s&&(a=new B({pool:s})),{kysely:a?new S({dialect:a}):null,databaseType:n}};function N(e){if(!e)return{and:null,or:null};let s={and:[],or:[]};return e.forEach(a=>{let{field:n,value:d,operator:r="=",connector:c="AND"}=a,f=t=>r.toLowerCase()==="in"?t(n,"in",Array.isArray(d)?d:[d]):r==="contains"?t(n,"like",`%${d}%`):r==="starts_with"?t(n,"like",`${d}%`):r==="ends_with"?t(n,"like",`%${d}`):t(n,r,d);c==="OR"?s.or.push(f):s.and.push(f)}),{and:s.and.length?s.and:null,or:s.or.length?s.or:null}}function v(e,s,a){for(let n in e){let d=s[n]||Object.values(s).find(r=>r.fieldName===n);e[n]===0&&d.type==="boolean"&&a?.boolean&&(e[n]=!1),e[n]===1&&d?.type==="boolean"&&a?.boolean&&(e[n]=!0),d?.type==="date"&&(e[n]instanceof Date||(e[n]=new Date(e[n])))}return e}function U(e,s){for(let a in e)typeof e[a]=="boolean"&&s?.boolean&&(e[a]=e[a]?1:0),e[a]instanceof Date&&(e[a]=e[a].toISOString());return e}var K=(e,s)=>({id:"kysely",async create(a){let{model:n,data:d,select:r}=a;s?.transform&&(d=U(d,s.transform)),s?.generateId!==void 0&&(d.id=s.generateId?s.generateId():void 0);let c=await e.insertInto(n).values(d).returningAll().executeTakeFirst();if(s?.transform){let f=s.transform.schema[n];c=f?v(d,f,s.transform):c}return r?.length&&(c=c?r.reduce((t,i)=>c?.[i]?{...t,[i]:c[i]}:t,{}):null),c},async findOne(a){let{model:n,where:d,select:r}=a,{and:c,or:f}=N(d),t=e.selectFrom(n).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 i=await t.executeTakeFirst();if(r?.length&&(i=i?r.reduce((l,u)=>i?.[u]?{...l,[u]:i[u]}:l,{}):null),s?.transform){let o=s.transform.schema[n];return i=i&&o?v(i,o,s.transform):i,i||null}return i||null},async findMany(a){let{model:n,where:d,limit:r,offset:c,sortBy:f}=a,t=e.selectFrom(n),{and:i,or:o}=N(d);i&&(t=t.where(u=>u.and(i.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(s?.transform){let u=s.transform.schema[n];return u?l.map(m=>v(m,u,s.transform)):l}return l},async update(a){let{model:n,where:d,update:r}=a,{and:c,or:f}=N(d);s?.transform&&(r=U(r,s.transform)),r.id&&(r.id=void 0);let t=e.updateTable(n).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 i=await t.returningAll().executeTakeFirst()||null;if(s?.transform){let o=s.transform.schema[n];return o?v(i,o,s.transform):i}return i},async delete(a){let{model:n,where:d}=a,{and:r,or:c}=N(d),f=e.deleteFrom(n);r&&(f=f.where(t=>t.and(r.map(i=>i(t))))),c&&(f=f.where(t=>t.or(c.map(i=>i(t))))),await f.execute()},async deleteMany(a){let{model:n,where:d}=a,{and:r,or:c}=N(d),f=e.deleteFrom(n);r&&(f=f.where(t=>t.and(r.map(i=>i(t))))),c&&(f=f.where(t=>t.or(c.map(i=>i(t))))),await f.execute()}});async function me(e){if(!e.database)throw new F("Database configuration is required");if("create"in e.database)return e.database;let{kysely:s,databaseType:a}=await k(e);if(!s)throw new F("Failed to initialize database adapter");let n=h(e),d={};for(let r of Object.values(n))d[r.tableName]=r.fields;return K(s,{transform:{schema:d,date:!0,boolean:a==="sqlite"},generateId:"generateId"in e.database?e.database.generateId:void 0})}function D(e,s){let a={id:s.id};for(let n in e){let d=e[n],r=s[n];a[d.fieldName||n]=r}return a}function g(e,s){if(!s)return null;let a={id:s.id};for(let[n,d]of Object.entries(e))a[n]=s[d.fieldName||n];return a}function C(e,s){let a=s.hooks,n=h(s.options);async function d(c,f,t){let i=c,o=n[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&&(i=y.data)}}let l=t?await t.fn(i):null,u=!t||t.executeMainFn?await e.create({model:o.tableName,data:{...D(o.fields,i),id:i.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,i){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=i?await i.fn(o):null,u=!i||i.executeMainFn?await e.update({model:n[t].tableName,update:D(n[t].fields,o),where:f}):l;for(let m of a||[]){let p=m[t]?.update?.after;p&&await p(u)}return g(n[t].fields,u)}return{createWithHooks:d,updateWithHooks:r}}import{isTest as $}from"std-env";function j(e){let s="127.0.0.1";if($)return s;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"],n=e instanceof Request?e.headers:e;for(let d of a){let r=n.get(d);if(typeof r=="string"){let c=r.split(",")[0].trim();if(c)return c}}return null}var ve=(e,s)=>{let a=s.options,n=a.secondaryStorage,d=a.session?.expiresIn||60*60*24*7,r=h(a),{createWithHooks:c,updateWithHooks:f}=C(e,s);return{createOAuthUser:async(t,i)=>{try{let o=await c({id:A(),createdAt:new Date,updatedAt:new Date,...t},"user"),l=await c({id:A(),...i,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,i,o,l)=>(await e.findMany({model:r.user.tableName,limit:t,offset:i,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,i,o,l)=>{let u=i instanceof Request?i.headers:i,m={id:A(),userId:t,expiresAt:o?q(60*60*24,"sec"):q(d,"sec"),ipAddress:i&&j(i)||"",userAgent:u?.get("user-agent")||"",...l};return await c(m,"session",n?{fn:async y=>{let b=await e.findOne({model:r.user.tableName,where:[{field:"id",value:t}]});return n.set(y.id,JSON.stringify({session:y,user:b}),d),y},executeMainFn:a.session?.storeSessionInDatabase}:void 0)},findSession:async t=>{if(n){let l=await n.get(t);if(l){let u=JSON.parse(l);return{session:{...u.session,expiresAt:new Date(u.session.expiresAt)},user:{...u.user,createdAt:new Date(u.user.createdAt),updatedAt:new Date(u.user.updatedAt)}}}}let i=await e.findOne({model:r.session.tableName,where:[{value:t,field:"id"}]});if(!i)return null;let o=await e.findOne({model:r.user.tableName,where:[{value:i.userId,field:"id"}]});return o?{session:g(r.session.fields,i),user:g(r.user.fields,o)}:null},findSessions:async t=>{if(n){let u=[];for(let m of t){let p=await n.get(m);if(p){let y=JSON.parse(p),b={session:{...y.session,expiresAt:new Date(y.session.expiresAt)},user:{...y.user,createdAt:new Date(y.user.createdAt),updatedAt:new Date(y.user.updatedAt)}};u.push(b)}}return u}let i=await e.findMany({model:r.session.tableName,where:[{field:"id",value:t,operator:"in"}]}),o=i.map(u=>u.userId);if(!o.length)return[];let l=await e.findMany({model:r.user.tableName,where:[{field:"id",value:o,operator:"in"}]});return i.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,i)=>await f(i,[{field:"id",value:t}],"session",n?{async fn(l){let u=await n.get(t),m=null;if(u){let p=JSON.parse(u);m={...p.session,...l},await n.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(n){await n.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(n){let i=await e.findMany({model:r.session.tableName,where:[{field:r.session.fields.userId.fieldName||"userId",value:t}]});for(let o of i)await n.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.deleteMany({model:r.session.tableName,where:[{field:r.session.fields.userId.fieldName||"userId",value:t}]})},findUserByEmail:async(t,i)=>{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(i?.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,i)=>await f(i,[{field:"id",value:t}],"user"),updateUserByEmail:async(t,i)=>await f(i,[{field:r.user.fields.email.fieldName||"email",value:t}],"user"),updatePassword:async(t,i)=>await f({password:i},[{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,i)=>await f(i,[{field:"id",value:t}],"account"),createVerificationValue:async t=>await c({id:A(),...t},"verification"),findVerificationValue:async t=>{let i=await e.findOne({model:r.verification.tableName,where:[{field:r.verification.fields.identifier.fieldName||"identifier",value:t}]});return g(r.verification.fields,i)},deleteVerificationValue:async t=>{await e.delete({model:r.verification.tableName,where:[{field:"id",value:t}]})},updateVerificationValue:async(t,i)=>await f(i,[{field:"id",value:t}],"verification")}};var qe=(e,s)=>({type:e,...s});import{z as I}from"zod";function Re(e){return I.object({...Object.keys(e).reduce((a,n)=>{let d=e[n];if(!d)return a;if(d.type==="string[]"||d.type==="number[]")return{...a,[n]: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,[n]:r}},{})})}import"kysely";import{createConsola as W}from"consola";var w=W({formatOptions:{date:!1,colors:!0,compact:!0},defaults:{tag:"Better Auth"}}),H=e=>({log:(...s)=>{!e?.disabled&&w.log("",...s)},error:(...s)=>{!e?.disabled&&w.error("",...s)},warn:(...s)=>{!e?.disabled&&w.warn("",...s)},info:(...s)=>{!e?.disabled&&w.info("",...s)},debug:(...s)=>{!e?.disabled&&w.debug("",...s)},box:(...s)=>{!e?.disabled&&w.box("",...s)},success:(...s)=>{!e?.disabled&&w.success("",...s)},break:(...s)=>{!e?.disabled&&console.log(`
|
|
2
2
|
`)}}),O=H();function P(e){let s=h(e),a={};for(let n in s){let d=s[n],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 J={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"]},_={string:["nvarchar","varchar"],number:["int","bigint","smallint","decimal","float","double"],boolean:["bit","boolean"],date:["datetime","date"]},G={postgres:J,mysql:Z,sqlite:z,mssql:_};function X(e,s,a){return s==="string[]"||s==="number[]"?e.toLowerCase().includes("json"):G[a][s].map(c=>c.toLowerCase()).includes(e.toLowerCase())}async function Le(e){let s=P(e),{kysely:a,databaseType:n}=await k(e);n||(O.warn("Could not determine database type, defaulting to sqlite. Please provide a type in the database options to avoid this."),n="sqlite"),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(s)){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,n)||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 n==="mysql"&&l==="string"?"varchar(255)":n==="sqlite"&&(l==="string[]"||l==="number[]")?"text":l==="string[]"||l==="number[]"?"jsonb":u[l]}if(c.length)for(let l of c)for(let[u,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 i(){for(let l of f)await l.execute()}async function o(){return f.map(u=>u.compile().sql).join(`;
|
|
3
3
|
|
|
4
4
|
`)}return{toBeCreated:r,toBeAdded:c,runMigrations:i,compileMigrations:o}}export{g as convertFromDB,D as convertToDB,qe as createFieldAttribute,ve as createInternalAdapter,me as getAdapter,h as getAuthTables,Le as getMigrations,P as getSchema,C as getWithHooks,X as matchType,Re as toZodSchema};
|
|
5
|
+
//# sourceMappingURL=db.js.map
|
package/dist/db.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/date.ts","../src/db/get-tables.ts","../src/utils/id.ts","../src/error/index.ts","../src/adapters/kysely-adapter/dialect.ts","../src/adapters/kysely-adapter/index.ts","../src/db/utils.ts","../src/db/with-hooks.ts","../src/utils/get-request-ip.ts","../src/db/internal-adapter.ts","../src/db/field.ts","../src/db/to-zod.ts","../src/db/get-migration.ts","../src/utils/logger.ts","../src/db/get-schema.ts"],"sourcesContent":["export const getDate = (span: number, unit: \"sec\" | \"ms\" = \"ms\") => {\n\treturn new Date(Date.now() + (unit === \"sec\" ? span * 1000 : span));\n};\n","import type { FieldAttribute } from \".\";\nimport type { BetterAuthOptions } from \"../types\";\n\nexport type BetterAuthDbSchema = Record<\n\tstring,\n\t{\n\t\t/**\n\t\t * The name of the table in the database\n\t\t */\n\t\ttableName: string;\n\t\t/**\n\t\t * The fields of the table\n\t\t */\n\t\tfields: Record<string, FieldAttribute>;\n\t\t/**\n\t\t * Whether to disable migrations for this table\n\t\t * @default false\n\t\t */\n\t\tdisableMigrations?: boolean;\n\t\t/**\n\t\t * The order of the table\n\t\t */\n\t\torder?: number;\n\t}\n>;\n\nexport const getAuthTables = (\n\toptions: BetterAuthOptions,\n): BetterAuthDbSchema => {\n\tconst pluginSchema = options.plugins?.reduce(\n\t\t(acc, plugin) => {\n\t\t\tconst schema = plugin.schema;\n\t\t\tif (!schema) return acc;\n\t\t\tfor (const [key, value] of Object.entries(schema)) {\n\t\t\t\tacc[key] = {\n\t\t\t\t\tfields: {\n\t\t\t\t\t\t...acc[key]?.fields,\n\t\t\t\t\t\t...value.fields,\n\t\t\t\t\t},\n\t\t\t\t\ttableName: value.tableName || key,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn acc;\n\t\t},\n\t\t{} as Record<\n\t\t\tstring,\n\t\t\t{ fields: Record<string, FieldAttribute>; tableName: string }\n\t\t>,\n\t);\n\n\tconst shouldAddRateLimitTable = options.rateLimit?.storage === \"database\";\n\tconst rateLimitTable = {\n\t\trateLimit: {\n\t\t\ttableName: options.rateLimit?.tableName || \"rateLimit\",\n\t\t\tfields: {\n\t\t\t\tkey: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tfieldName: options.rateLimit?.fields?.key || \"key\",\n\t\t\t\t},\n\t\t\t\tcount: {\n\t\t\t\t\ttype: \"number\",\n\t\t\t\t\tfieldName: options.rateLimit?.fields?.count || \"count\",\n\t\t\t\t},\n\t\t\t\tlastRequest: {\n\t\t\t\t\ttype: \"number\",\n\t\t\t\t\tfieldName: options.rateLimit?.fields?.lastRequest || \"lastRequest\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t} satisfies BetterAuthDbSchema;\n\n\tconst { user, session, account, ...pluginTables } = pluginSchema || {};\n\treturn {\n\t\tuser: {\n\t\t\ttableName: options.user?.modelName || \"user\",\n\t\t\tfields: {\n\t\t\t\tname: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: true,\n\t\t\t\t\tfieldName: options.user?.fields?.name || \"name\",\n\t\t\t\t},\n\t\t\t\temail: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tunique: true,\n\t\t\t\t\trequired: true,\n\t\t\t\t\tfieldName: options.user?.fields?.email || \"email\",\n\t\t\t\t},\n\t\t\t\temailVerified: {\n\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\tdefaultValue: () => false,\n\t\t\t\t\trequired: true,\n\t\t\t\t\tfieldName: options.user?.fields?.emailVerified || \"emailVerified\",\n\t\t\t\t},\n\t\t\t\timage: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t\tfieldName: options.user?.fields?.image || \"image\",\n\t\t\t\t},\n\t\t\t\tcreatedAt: {\n\t\t\t\t\ttype: \"date\",\n\t\t\t\t\tdefaultValue: () => new Date(),\n\t\t\t\t\trequired: true,\n\t\t\t\t\tfieldName: options.user?.fields?.createdAt || \"createdAt\",\n\t\t\t\t},\n\t\t\t\tupdatedAt: {\n\t\t\t\t\ttype: \"date\",\n\t\t\t\t\tdefaultValue: () => new Date(),\n\t\t\t\t\trequired: true,\n\t\t\t\t\tfieldName: options.user?.fields?.updatedAt || \"updatedAt\",\n\t\t\t\t},\n\t\t\t\t...user?.fields,\n\t\t\t\t...options.user?.additionalFields,\n\t\t\t},\n\t\t\torder: 1,\n\t\t},\n\t\tsession: {\n\t\t\ttableName: options.session?.modelName || \"session\",\n\t\t\tfields: {\n\t\t\t\texpiresAt: {\n\t\t\t\t\ttype: \"date\",\n\t\t\t\t\trequired: true,\n\t\t\t\t\tfieldName: options.session?.fields?.expiresAt || \"expiresAt\",\n\t\t\t\t},\n\t\t\t\tipAddress: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t\tfieldName: options.session?.fields?.ipAddress || \"ipAddress\",\n\t\t\t\t},\n\t\t\t\tuserAgent: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t\tfieldName: options.session?.fields?.userAgent || \"userAgent\",\n\t\t\t\t},\n\t\t\t\tuserId: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tfieldName: options.session?.fields?.userId || \"userId\",\n\t\t\t\t\treferences: {\n\t\t\t\t\t\tmodel: options.user?.modelName || \"user\",\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tonDelete: \"cascade\",\n\t\t\t\t\t},\n\t\t\t\t\trequired: true,\n\t\t\t\t},\n\t\t\t\t...session?.fields,\n\t\t\t\t...options.session?.additionalFields,\n\t\t\t},\n\t\t\torder: 2,\n\t\t},\n\t\taccount: {\n\t\t\ttableName: options.account?.modelName || \"account\",\n\t\t\tfields: {\n\t\t\t\taccountId: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: true,\n\t\t\t\t\tfieldName: options.account?.fields?.accountId || \"accountId\",\n\t\t\t\t},\n\t\t\t\tproviderId: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: true,\n\t\t\t\t\tfieldName: options.account?.fields?.providerId || \"providerId\",\n\t\t\t\t},\n\t\t\t\tuserId: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\treferences: {\n\t\t\t\t\t\tmodel: options.user?.modelName || \"user\",\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tonDelete: \"cascade\",\n\t\t\t\t\t},\n\t\t\t\t\trequired: true,\n\t\t\t\t\tfieldName: options.account?.fields?.userId || \"userId\",\n\t\t\t\t},\n\t\t\t\taccessToken: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t\tfieldName: options.account?.fields?.accessToken || \"accessToken\",\n\t\t\t\t},\n\t\t\t\trefreshToken: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t\tfieldName: options.account?.fields?.refreshToken || \"refreshToken\",\n\t\t\t\t},\n\t\t\t\tidToken: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t\tfieldName: options.account?.fields?.idToken || \"idToken\",\n\t\t\t\t},\n\t\t\t\texpiresAt: {\n\t\t\t\t\ttype: \"date\",\n\t\t\t\t\trequired: false,\n\t\t\t\t\tfieldName: options.account?.fields?.expiresAt || \"expiresAt\",\n\t\t\t\t},\n\t\t\t\tpassword: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t\tfieldName: options.account?.fields?.password || \"password\",\n\t\t\t\t},\n\t\t\t\t...account?.fields,\n\t\t\t},\n\t\t\torder: 3,\n\t\t},\n\t\tverification: {\n\t\t\ttableName: options.verification?.modelName || \"verification\",\n\t\t\tfields: {\n\t\t\t\tidentifier: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: true,\n\t\t\t\t\tfieldName: options.verification?.fields?.identifier || \"identifier\",\n\t\t\t\t},\n\t\t\t\tvalue: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: true,\n\t\t\t\t\tfieldName: options.verification?.fields?.value || \"value\",\n\t\t\t\t},\n\t\t\t\texpiresAt: {\n\t\t\t\t\ttype: \"date\",\n\t\t\t\t\trequired: true,\n\t\t\t\t\tfieldName: options.verification?.fields?.expiresAt || \"expiresAt\",\n\t\t\t\t},\n\t\t\t},\n\t\t\torder: 4,\n\t\t},\n\t\t...pluginTables,\n\t\t...(shouldAddRateLimitTable ? rateLimitTable : {}),\n\t} satisfies BetterAuthDbSchema;\n};\n","import { nanoid } from \"nanoid\";\n\nexport const generateId = (size?: number) => {\n\treturn nanoid(size);\n};\n","export class BetterAuthError extends Error {\n\tconstructor(message: string, cause?: string) {\n\t\tsuper(message);\n\t\tthis.name = \"BetterAuthError\";\n\t\tthis.message = message;\n\t\tthis.cause = cause;\n\t}\n}\nexport class MissingDependencyError extends BetterAuthError {\n\tconstructor(pkgName: string) {\n\t\tsuper(\n\t\t\t`The package \"${pkgName}\" is required. Make sure it is installed.`,\n\t\t\tpkgName,\n\t\t);\n\t}\n}\n","import { Kysely, MssqlDialect } from \"kysely\";\nimport {\n\ttype Dialect,\n\tMysqlDialect,\n\tPostgresDialect,\n\tSqliteDialect,\n} from \"kysely\";\nimport type { BetterAuthOptions } from \"../../types\";\nimport type { KyselyDatabaseType } from \"./types\";\n\nfunction getDatabaseType(\n\tdb: BetterAuthOptions[\"database\"],\n): KyselyDatabaseType | null {\n\tif (\"dialect\" in db) {\n\t\treturn getDatabaseType(db.dialect as Dialect);\n\t}\n\tif (\"createDriver\" in db) {\n\t\tif (db instanceof SqliteDialect) {\n\t\t\treturn \"sqlite\";\n\t\t}\n\t\tif (db instanceof MysqlDialect) {\n\t\t\treturn \"mysql\";\n\t\t}\n\t\tif (db instanceof PostgresDialect) {\n\t\t\treturn \"postgres\";\n\t\t}\n\t\tif (db instanceof MssqlDialect) {\n\t\t\treturn \"mssql\";\n\t\t}\n\t}\n\tif (\"aggregate\" in db) {\n\t\treturn \"sqlite\";\n\t}\n\n\tif (\"getConnection\" in db) {\n\t\treturn \"mysql\";\n\t}\n\tif (\"connect\" in db) {\n\t\treturn \"postgres\";\n\t}\n\n\treturn null;\n}\n\nexport const createKyselyAdapter = async (config: BetterAuthOptions) => {\n\tconst db = config.database;\n\n\tif (\"db\" in db) {\n\t\treturn {\n\t\t\tkysely: db.db,\n\t\t\tdatabaseType: db.type,\n\t\t};\n\t}\n\n\tif (\"dialect\" in db) {\n\t\treturn {\n\t\t\tkysely: new Kysely({ dialect: db.dialect }),\n\t\t\tdatabaseType: db.type,\n\t\t};\n\t}\n\n\tlet dialect: Dialect | undefined = undefined;\n\n\tconst databaseType = getDatabaseType(db);\n\n\tif (\"createDriver\" in db) {\n\t\tdialect = db;\n\t}\n\n\tif (\"aggregate\" in db) {\n\t\tdialect = new SqliteDialect({\n\t\t\tdatabase: db,\n\t\t});\n\t}\n\n\tif (\"getConnection\" in db) {\n\t\tdialect = new MysqlDialect({\n\t\t\tpool: db,\n\t\t});\n\t}\n\n\tif (\"connect\" in db) {\n\t\tdialect = new PostgresDialect({\n\t\t\tpool: db,\n\t\t});\n\t}\n\n\treturn {\n\t\tkysely: dialect ? new Kysely({ dialect }) : null,\n\t\tdatabaseType,\n\t};\n};\n","import type { Kysely } from \"kysely\";\nimport type { FieldAttribute } from \"../../db\";\nimport type { Adapter, Where } from \"../../types\";\n\nfunction convertWhere(w?: Where[]) {\n\tif (!w)\n\t\treturn {\n\t\t\tand: null,\n\t\t\tor: null,\n\t\t};\n\n\tconst conditions = {\n\t\tand: [] as any[],\n\t\tor: [] as any[],\n\t};\n\n\tw.forEach((condition) => {\n\t\tconst { field, value, operator = \"=\", connector = \"AND\" } = condition;\n\t\tconst expr = (eb: any) => {\n\t\t\tif (operator.toLowerCase() === \"in\") {\n\t\t\t\treturn eb(field, \"in\", Array.isArray(value) ? value : [value]);\n\t\t\t}\n\n\t\t\tif (operator === \"contains\") {\n\t\t\t\treturn eb(field, \"like\", `%${value}%`);\n\t\t\t}\n\n\t\t\tif (operator === \"starts_with\") {\n\t\t\t\treturn eb(field, \"like\", `${value}%`);\n\t\t\t}\n\n\t\t\tif (operator === \"ends_with\") {\n\t\t\t\treturn eb(field, \"like\", `%${value}`);\n\t\t\t}\n\n\t\t\treturn eb(field, operator, value);\n\t\t};\n\n\t\tif (connector === \"OR\") {\n\t\t\tconditions.or.push(expr);\n\t\t} else {\n\t\t\tconditions.and.push(expr);\n\t\t}\n\t});\n\n\treturn {\n\t\tand: conditions.and.length ? conditions.and : null,\n\t\tor: conditions.or.length ? conditions.or : null,\n\t};\n}\n\nfunction transformTo(\n\tval: any,\n\tfields: Record<string, FieldAttribute>,\n\ttransform: KyselyAdapterConfig[\"transform\"],\n) {\n\tfor (const key in val) {\n\t\tconst field =\n\t\t\tfields[key] || Object.values(fields).find((f) => f.fieldName === key);\n\t\tif (val[key] === 0 && field.type === \"boolean\" && transform?.boolean) {\n\t\t\tval[key] = false;\n\t\t}\n\t\tif (val[key] === 1 && field?.type === \"boolean\" && transform?.boolean) {\n\t\t\tval[key] = true;\n\t\t}\n\t\tif (field?.type === \"date\") {\n\t\t\tif (!(val[key] instanceof Date)) {\n\t\t\t\tval[key] = new Date(val[key]);\n\t\t\t}\n\t\t}\n\t}\n\treturn val;\n}\n\nfunction transformFrom(val: any, transform: KyselyAdapterConfig[\"transform\"]) {\n\tfor (const key in val) {\n\t\tif (typeof val[key] === \"boolean\" && transform?.boolean) {\n\t\t\tval[key] = val[key] ? 1 : 0;\n\t\t}\n\t\tif (val[key] instanceof Date) {\n\t\t\tval[key] = val[key].toISOString();\n\t\t}\n\t}\n\treturn val;\n}\n\nexport interface KyselyAdapterConfig {\n\t/**\n\t * Transform dates and booleans for sqlite.\n\t */\n\ttransform?: {\n\t\tschema: {\n\t\t\t[table: string]: Record<string, FieldAttribute>;\n\t\t};\n\t\tboolean: boolean;\n\t\tdate: boolean;\n\t};\n\t/**\n\t * Custom generateId function.\n\t *\n\t * If not provided, nanoid will be used.\n\t * If set to false, the database's auto generated id will be used.\n\t *\n\t * @default nanoid\n\t */\n\tgenerateId?: ((size?: number) => string) | false;\n}\n\nexport const kyselyAdapter = (\n\tdb: Kysely<any>,\n\tconfig?: KyselyAdapterConfig,\n): Adapter => {\n\treturn {\n\t\tid: \"kysely\",\n\t\tasync create(data) {\n\t\t\tlet { model, data: val, select } = data;\n\t\t\tif (config?.transform) {\n\t\t\t\tval = transformFrom(val, config.transform);\n\t\t\t}\n\t\t\tif (config?.generateId !== undefined) {\n\t\t\t\tval.id = config.generateId ? config.generateId() : undefined;\n\t\t\t}\n\t\t\tlet res = await db\n\t\t\t\t.insertInto(model)\n\t\t\t\t.values(val as any)\n\t\t\t\t.returningAll()\n\t\t\t\t.executeTakeFirst();\n\n\t\t\tif (config?.transform) {\n\t\t\t\tconst schema = config.transform.schema[model];\n\t\t\t\tres = schema ? transformTo(val, schema, config.transform) : res;\n\t\t\t}\n\n\t\t\tif (select?.length) {\n\t\t\t\tconst data = res\n\t\t\t\t\t? select.reduce((acc, cur) => {\n\t\t\t\t\t\t\tif (res?.[cur]) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t\t\t[cur]: res[cur],\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t}, {} as any)\n\t\t\t\t\t: null;\n\t\t\t\tres = data;\n\t\t\t}\n\n\t\t\treturn res as any;\n\t\t},\n\t\tasync findOne(data) {\n\t\t\tconst { model, where, select } = data;\n\t\t\tconst { and, or } = convertWhere(where);\n\t\t\tlet query = db.selectFrom(model).selectAll();\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and.map((expr) => expr(eb))));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or.map((expr) => expr(eb))));\n\t\t\t}\n\t\t\tlet res = await query.executeTakeFirst();\n\t\t\tif (select?.length) {\n\t\t\t\tconst data = res\n\t\t\t\t\t? select.reduce((acc, cur) => {\n\t\t\t\t\t\t\tif (res?.[cur]) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\t\t\t[cur]: res[cur],\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t}, {} as any)\n\t\t\t\t\t: null;\n\t\t\t\tres = data;\n\t\t\t}\n\n\t\t\tif (config?.transform) {\n\t\t\t\tconst schema = config.transform.schema[model];\n\t\t\t\tres = res && schema ? transformTo(res, schema, config.transform) : res;\n\n\t\t\t\treturn res || null;\n\t\t\t}\n\t\t\treturn (res || null) as any;\n\t\t},\n\t\tasync findMany(data) {\n\t\t\tconst { model, where, limit, offset, sortBy } = data;\n\t\t\tlet query = db.selectFrom(model);\n\t\t\tconst { and, or } = convertWhere(where);\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and.map((expr) => expr(eb))));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or.map((expr) => expr(eb))));\n\t\t\t}\n\t\t\tquery = query.limit(limit || 100);\n\t\t\tif (offset) {\n\t\t\t\tquery = query.offset(offset);\n\t\t\t}\n\t\t\tif (sortBy) {\n\t\t\t\tquery = query.orderBy(sortBy.field, sortBy.direction);\n\t\t\t}\n\t\t\tconst res = await query.selectAll().execute();\n\t\t\tif (config?.transform) {\n\t\t\t\tconst schema = config.transform.schema[model];\n\t\t\t\treturn schema\n\t\t\t\t\t? res.map((v) => transformTo(v, schema, config.transform))\n\t\t\t\t\t: res;\n\t\t\t}\n\t\t\treturn res as any;\n\t\t},\n\t\tasync update(data) {\n\t\t\tlet { model, where, update: val } = data;\n\t\t\tconst { and, or } = convertWhere(where);\n\n\t\t\tif (config?.transform) {\n\t\t\t\tval = transformFrom(val, config.transform);\n\t\t\t}\n\n\t\t\tif (val.id) {\n\t\t\t\tval.id = undefined;\n\t\t\t}\n\n\t\t\tlet query = db.updateTable(model).set(val);\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and.map((expr) => expr(eb))));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or.map((expr) => expr(eb))));\n\t\t\t}\n\t\t\tconst res = (await query.returningAll().executeTakeFirst()) || null;\n\t\t\tif (config?.transform) {\n\t\t\t\tconst schema = config.transform.schema[model];\n\t\t\t\treturn schema ? transformTo(res, schema, config.transform) : res;\n\t\t\t}\n\t\t\treturn res as any;\n\t\t},\n\t\tasync delete(data) {\n\t\t\tconst { model, where } = data;\n\t\t\tconst { and, or } = convertWhere(where);\n\t\t\tlet query = db.deleteFrom(model);\n\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and.map((expr) => expr(eb))));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or.map((expr) => expr(eb))));\n\t\t\t}\n\n\t\t\tawait query.execute();\n\t\t},\n\t\tasync deleteMany(data) {\n\t\t\tconst { model, where } = data;\n\t\t\tconst { and, or } = convertWhere(where);\n\t\t\tlet query = db.deleteFrom(model);\n\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and.map((expr) => expr(eb))));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or.map((expr) => expr(eb))));\n\t\t\t}\n\n\t\t\tawait query.execute();\n\t\t},\n\t};\n};\nexport * from \"./dialect\";\nexport * from \"./types\";\n","import type { FieldAttribute } from \".\";\nimport { BetterAuthError } from \"../error\";\nimport type { BetterAuthOptions } from \"../types\";\nimport type { Adapter } from \"../types/adapter\";\nimport { getAuthTables } from \"./get-tables\";\nimport { createKyselyAdapter } from \"../adapters/kysely-adapter/dialect\";\nimport { kyselyAdapter } from \"../adapters/kysely-adapter\";\n\nexport async function getAdapter(options: BetterAuthOptions): Promise<Adapter> {\n\tif (!options.database) {\n\t\tthrow new BetterAuthError(\"Database configuration is required\");\n\t}\n\n\tif (\"create\" in options.database) {\n\t\treturn options.database;\n\t}\n\n\tconst { kysely, databaseType } = await createKyselyAdapter(options);\n\tif (!kysely) {\n\t\tthrow new BetterAuthError(\"Failed to initialize database adapter\");\n\t}\n\tconst tables = getAuthTables(options);\n\tlet schema: Record<string, Record<string, FieldAttribute>> = {};\n\tfor (const table of Object.values(tables)) {\n\t\tschema[table.tableName] = table.fields;\n\t}\n\treturn kyselyAdapter(kysely, {\n\t\ttransform: {\n\t\t\tschema,\n\t\t\tdate: true,\n\t\t\tboolean: databaseType === \"sqlite\",\n\t\t},\n\t\tgenerateId:\n\t\t\t\"generateId\" in options.database\n\t\t\t\t? options.database.generateId\n\t\t\t\t: undefined,\n\t});\n}\n\nexport function convertToDB<T extends Record<string, any>>(\n\tfields: Record<string, FieldAttribute>,\n\tvalues: T,\n) {\n\tlet result: Record<string, any> = {\n\t\tid: values.id,\n\t};\n\tfor (const key in fields) {\n\t\tconst field = fields[key];\n\t\tconst value = values[key];\n\t\tresult[field.fieldName || key] = value;\n\t}\n\treturn result as T;\n}\n\nexport function convertFromDB<T extends Record<string, any>>(\n\tfields: Record<string, FieldAttribute>,\n\tvalues: T | null,\n) {\n\tif (!values) {\n\t\treturn null;\n\t}\n\tlet result: Record<string, any> = {\n\t\tid: values.id,\n\t};\n\tfor (const [key, value] of Object.entries(fields)) {\n\t\tresult[key] = values[value.fieldName || key];\n\t}\n\treturn result as T;\n}\n","import type { Adapter, Where } from \"./../types/adapter\";\nimport type { BetterAuthOptions } from \"../types\";\nimport { getAuthTables } from \"./get-tables\";\nimport { generateId } from \"../utils/id\";\nimport { convertFromDB, convertToDB } from \"./utils\";\n\nexport function getWithHooks(\n\tadapter: Adapter,\n\tctx: {\n\t\toptions: BetterAuthOptions;\n\t\thooks: Exclude<BetterAuthOptions[\"databaseHooks\"], undefined>[];\n\t},\n) {\n\tconst hooks = ctx.hooks;\n\tconst tables = getAuthTables(ctx.options);\n\n\ttype Models = \"user\" | \"account\" | \"session\" | \"verification\";\n\tasync function createWithHooks<T extends Record<string, any>>(\n\t\tdata: T,\n\t\tmodel: Models,\n\t\tcustomCreateFn?: {\n\t\t\tfn: (data: Record<string, any>) => void | Promise<any>;\n\t\t\texecuteMainFn?: boolean;\n\t\t},\n\t) {\n\t\tlet actualData = data;\n\t\tconst table = tables[model];\n\t\tfor (const hook of hooks || []) {\n\t\t\tconst toRun = hook[model]?.create?.before;\n\t\t\tif (toRun) {\n\t\t\t\tconst result = await toRun(data as any);\n\t\t\t\tif (result === false) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst isObject = typeof result === \"object\" && \"data\" in result;\n\t\t\t\tif (isObject) {\n\t\t\t\t\tactualData = result.data as T;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst customCreated = customCreateFn\n\t\t\t? await customCreateFn.fn(actualData)\n\t\t\t: null;\n\t\tconst created =\n\t\t\t!customCreateFn || customCreateFn.executeMainFn\n\t\t\t\t? await adapter.create<T>({\n\t\t\t\t\t\tmodel: table.tableName,\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t...convertToDB(table.fields, actualData),\n\t\t\t\t\t\t\tid: actualData.id || generateId(),\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t: customCreated;\n\n\t\tfor (const hook of hooks || []) {\n\t\t\tconst toRun = hook[model]?.create?.after;\n\t\t\tif (toRun) {\n\t\t\t\tawait toRun(created as any);\n\t\t\t}\n\t\t}\n\n\t\treturn convertFromDB(table.fields, created);\n\t}\n\n\tasync function updateWithHooks<T extends Record<string, any>>(\n\t\tdata: any,\n\t\twhere: Where[],\n\t\tmodel: Models,\n\t\tcustomUpdateFn?: {\n\t\t\tfn: (data: Record<string, any>) => void | Promise<any>;\n\t\t\texecuteMainFn?: boolean;\n\t\t},\n\t) {\n\t\tlet actualData = data;\n\n\t\tfor (const hook of hooks || []) {\n\t\t\tconst toRun = hook[model]?.update?.before;\n\t\t\tif (toRun) {\n\t\t\t\tconst result = await toRun(data as any);\n\t\t\t\tif (result === false) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst isObject = typeof result === \"object\";\n\t\t\t\tactualData = isObject ? (result as any).data : result;\n\t\t\t}\n\t\t}\n\n\t\tconst customUpdated = customUpdateFn\n\t\t\t? await customUpdateFn.fn(actualData)\n\t\t\t: null;\n\n\t\tconst updated =\n\t\t\t!customUpdateFn || customUpdateFn.executeMainFn\n\t\t\t\t? await adapter.update<T>({\n\t\t\t\t\t\tmodel: tables[model].tableName,\n\t\t\t\t\t\tupdate: convertToDB(tables[model].fields, actualData),\n\t\t\t\t\t\twhere,\n\t\t\t\t\t})\n\t\t\t\t: customUpdated;\n\n\t\tfor (const hook of hooks || []) {\n\t\t\tconst toRun = hook[model]?.update?.after;\n\t\t\tif (toRun) {\n\t\t\t\tawait toRun(updated as any);\n\t\t\t}\n\t\t}\n\n\t\treturn convertFromDB(tables[model].fields, updated);\n\t}\n\treturn {\n\t\tcreateWithHooks,\n\t\tupdateWithHooks,\n\t};\n}\n","import { isTest } from \"std-env\";\n\nexport function getIp(req: Request | Headers): string | null {\n\tconst testIP = \"127.0.0.1\";\n\tif (isTest) {\n\t\treturn testIP;\n\t}\n\tconst keys = [\n\t\t\"x-client-ip\",\n\t\t\"x-forwarded-for\",\n\t\t\"cf-connecting-ip\",\n\t\t\"fastly-client-ip\",\n\t\t\"x-real-ip\",\n\t\t\"x-cluster-client-ip\",\n\t\t\"x-forwarded\",\n\t\t\"forwarded-for\",\n\t\t\"forwarded\",\n\t];\n\tconst headers = req instanceof Request ? req.headers : req;\n\tfor (const key of keys) {\n\t\tconst value = headers.get(key);\n\t\tif (typeof value === \"string\") {\n\t\t\tconst ip = value.split(\",\")[0].trim();\n\t\t\tif (ip) return ip;\n\t\t}\n\t}\n\treturn null;\n}\n","import type { BetterAuthOptions } from \"../types\";\nimport type { Adapter, Where } from \"../types/adapter\";\nimport { getDate } from \"../utils/date\";\nimport { getAuthTables } from \"./get-tables\";\nimport type { Account, Session, User, Verification } from \"./schema\";\nimport { generateId } from \"../utils/id\";\nimport { getWithHooks } from \"./with-hooks\";\nimport { getIp } from \"../utils/get-request-ip\";\nimport { convertFromDB } from \"./utils\";\n\nexport const createInternalAdapter = (\n\tadapter: Adapter,\n\tctx: {\n\t\toptions: BetterAuthOptions;\n\t\thooks: Exclude<BetterAuthOptions[\"databaseHooks\"], undefined>[];\n\t},\n) => {\n\tconst options = ctx.options;\n\tconst secondaryStorage = options.secondaryStorage;\n\tconst sessionExpiration = options.session?.expiresIn || 60 * 60 * 24 * 7; // 7 days\n\tconst tables = getAuthTables(options);\n\tconst { createWithHooks, updateWithHooks } = getWithHooks(adapter, ctx);\n\treturn {\n\t\tcreateOAuthUser: async (\n\t\t\tuser: Omit<User, \"id\" | \"createdAt\" | \"updatedAt\"> & Partial<User>,\n\t\t\taccount: Omit<Account, \"userId\" | \"id\"> & Partial<Account>,\n\t\t) => {\n\t\t\ttry {\n\t\t\t\tconst createdUser = await createWithHooks(\n\t\t\t\t\t{\n\t\t\t\t\t\tid: generateId(),\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t\t...user,\n\t\t\t\t\t},\n\t\t\t\t\t\"user\",\n\t\t\t\t);\n\t\t\t\tconst createdAccount = await createWithHooks(\n\t\t\t\t\t{\n\t\t\t\t\t\tid: generateId(),\n\t\t\t\t\t\t...account,\n\t\t\t\t\t\tuserId: createdUser.id || user.id,\n\t\t\t\t\t},\n\t\t\t\t\t\"account\",\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tuser: createdUser,\n\t\t\t\t\taccount: createdAccount,\n\t\t\t\t};\n\t\t\t} catch (e) {\n\t\t\t\tconsole.log(e);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\tcreateUser: async <T>(\n\t\t\tuser: Omit<User, \"id\" | \"createdAt\" | \"updatedAt\" | \"emailVerified\"> &\n\t\t\t\tPartial<User> &\n\t\t\t\tRecord<string, any>,\n\t\t) => {\n\t\t\tconst createdUser = await createWithHooks(\n\t\t\t\t{\n\t\t\t\t\tid: generateId(),\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\temailVerified: false,\n\t\t\t\t\t...user,\n\t\t\t\t},\n\t\t\t\t\"user\",\n\t\t\t);\n\t\t\treturn createdUser as T & User;\n\t\t},\n\t\tcreateAccount: async <T>(\n\t\t\taccount: Omit<Account, \"id\" | \"createdAt\" | \"updatedAt\"> &\n\t\t\t\tPartial<Account> &\n\t\t\t\tRecord<string, any>,\n\t\t) => {\n\t\t\tconst createdAccount = await createWithHooks(\n\t\t\t\t{\n\t\t\t\t\tid: generateId(),\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t...account,\n\t\t\t\t},\n\t\t\t\t\"account\",\n\t\t\t);\n\t\t\treturn createdAccount as T & Account;\n\t\t},\n\t\tlistSessions: async (userId: string) => {\n\t\t\tconst sessions = await adapter.findMany<Session>({\n\t\t\t\tmodel: tables.session.tableName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: tables.session.fields.userId.fieldName || \"userId\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn sessions;\n\t\t},\n\t\tlistUsers: async (\n\t\t\tlimit?: number,\n\t\t\toffset?: number,\n\t\t\tsortBy?: {\n\t\t\t\tfield: string;\n\t\t\t\tdirection: \"asc\" | \"desc\";\n\t\t\t},\n\t\t\twhere?: Where[],\n\t\t) => {\n\t\t\tconst users = await adapter.findMany<User>({\n\t\t\t\tmodel: tables.user.tableName,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\tsortBy,\n\t\t\t\twhere,\n\t\t\t});\n\t\t\treturn users.map((user) => convertFromDB(tables.user.fields, user));\n\t\t},\n\t\tdeleteUser: async (userId: string) => {\n\t\t\tawait adapter.delete({\n\t\t\t\tmodel: tables.account.tableName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: tables.account.fields.userId.fieldName || \"userId\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tawait adapter.deleteMany({\n\t\t\t\tmodel: tables.session.tableName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: tables.session.fields.userId.fieldName || \"userId\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tawait adapter.deleteMany({\n\t\t\t\tmodel: tables.user.tableName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t},\n\t\tcreateSession: async (\n\t\t\tuserId: string,\n\t\t\trequest?: Request | Headers,\n\t\t\tdontRememberMe?: boolean,\n\t\t\toverride?: Partial<Session> & Record<string, any>,\n\t\t) => {\n\t\t\tconst headers = request instanceof Request ? request.headers : request;\n\t\t\tconst data: Session = {\n\t\t\t\tid: generateId(),\n\t\t\t\tuserId,\n\t\t\t\t/**\n\t\t\t\t * If the user doesn't want to be remembered\n\t\t\t\t * set the session to expire in 1 day.\n\t\t\t\t * The cookie will be set to expire at the end of the session\n\t\t\t\t */\n\t\t\t\texpiresAt: dontRememberMe\n\t\t\t\t\t? getDate(60 * 60 * 24, \"sec\") // 1 day\n\t\t\t\t\t: getDate(sessionExpiration, \"sec\"),\n\t\t\t\tipAddress: request ? getIp(request) || \"\" : \"\",\n\t\t\t\tuserAgent: headers?.get(\"user-agent\") || \"\",\n\t\t\t\t...override,\n\t\t\t};\n\t\t\tconst res = await createWithHooks(\n\t\t\t\tdata,\n\t\t\t\t\"session\",\n\t\t\t\tsecondaryStorage\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tfn: async (data) => {\n\t\t\t\t\t\t\t\tconst user = await adapter.findOne<User>({\n\t\t\t\t\t\t\t\t\tmodel: tables.user.tableName,\n\t\t\t\t\t\t\t\t\twhere: [{ field: \"id\", value: userId }],\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tsecondaryStorage.set(\n\t\t\t\t\t\t\t\t\tdata.id,\n\t\t\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\t\t\tsession: data,\n\t\t\t\t\t\t\t\t\t\tuser,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\tsessionExpiration,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn data;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\texecuteMainFn: options.session?.storeSessionInDatabase,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t);\n\t\t\treturn res;\n\t\t},\n\t\tfindSession: async (sessionId: string) => {\n\t\t\tif (secondaryStorage) {\n\t\t\t\tconst sessionStringified = await secondaryStorage.get(sessionId);\n\t\t\t\tif (sessionStringified) {\n\t\t\t\t\tconst s = JSON.parse(sessionStringified);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsession: {\n\t\t\t\t\t\t\t...s.session,\n\t\t\t\t\t\t\texpiresAt: new Date(s.session.expiresAt),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\t...s.user,\n\t\t\t\t\t\t\tcreatedAt: new Date(s.user.createdAt),\n\t\t\t\t\t\t\tupdatedAt: new Date(s.user.updatedAt),\n\t\t\t\t\t\t},\n\t\t\t\t\t} as {\n\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\tuser: User;\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst session = await adapter.findOne<Session>({\n\t\t\t\tmodel: tables.session.tableName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue: sessionId,\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\n\t\t\tif (!session) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst user = await adapter.findOne<User>({\n\t\t\t\tmodel: tables.user.tableName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue: session.userId,\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tif (!user) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tsession: convertFromDB(tables.session.fields, session)!,\n\t\t\t\tuser: convertFromDB(tables.user.fields, user)!,\n\t\t\t};\n\t\t},\n\t\tfindSessions: async (sessionIds: string[]) => {\n\t\t\tif (secondaryStorage) {\n\t\t\t\tconst sessions: {\n\t\t\t\t\tsession: Session;\n\t\t\t\t\tuser: User;\n\t\t\t\t}[] = [];\n\t\t\t\tfor (const sessionId of sessionIds) {\n\t\t\t\t\tconst sessionStringified = await secondaryStorage.get(sessionId);\n\t\t\t\t\tif (sessionStringified) {\n\t\t\t\t\t\tconst s = JSON.parse(sessionStringified);\n\t\t\t\t\t\tconst session = {\n\t\t\t\t\t\t\tsession: {\n\t\t\t\t\t\t\t\t...s.session,\n\t\t\t\t\t\t\t\texpiresAt: new Date(s.session.expiresAt),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\t\t...s.user,\n\t\t\t\t\t\t\t\tcreatedAt: new Date(s.user.createdAt),\n\t\t\t\t\t\t\t\tupdatedAt: new Date(s.user.updatedAt),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} as {\n\t\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\t\tuser: User;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tsessions.push(session);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn sessions;\n\t\t\t}\n\n\t\t\tconst sessions = await adapter.findMany<Session>({\n\t\t\t\tmodel: tables.session.tableName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: sessionIds,\n\t\t\t\t\t\toperator: \"in\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tconst userIds = sessions.map((session) => session.userId);\n\t\t\tif (!userIds.length) return [];\n\t\t\tconst users = await adapter.findMany<User>({\n\t\t\t\tmodel: tables.user.tableName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: userIds,\n\t\t\t\t\t\toperator: \"in\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn sessions.map((session) => {\n\t\t\t\tconst user = users.find((u) => u.id === session.userId);\n\t\t\t\tif (!user) return null;\n\t\t\t\treturn {\n\t\t\t\t\tsession: convertFromDB(tables.session.fields, session)!,\n\t\t\t\t\tuser: convertFromDB(tables.user.fields, user)!,\n\t\t\t\t};\n\t\t\t}) as {\n\t\t\t\tsession: Session;\n\t\t\t\tuser: User;\n\t\t\t}[];\n\t\t},\n\t\tupdateSession: async (sessionId: string, session: Partial<Session>) => {\n\t\t\tconst updatedSession = await updateWithHooks<Session>(\n\t\t\t\tsession,\n\t\t\t\t[{ field: \"id\", value: sessionId }],\n\t\t\t\t\"session\",\n\t\t\t\tsecondaryStorage\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tasync fn(data) {\n\t\t\t\t\t\t\t\tconst currentSession = await secondaryStorage.get(sessionId);\n\t\t\t\t\t\t\t\tlet updatedSession: Session | null = null;\n\t\t\t\t\t\t\t\tif (currentSession) {\n\t\t\t\t\t\t\t\t\tconst parsedSession = JSON.parse(currentSession) as {\n\t\t\t\t\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\t\t\t\t\tuser: User;\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\tupdatedSession = {\n\t\t\t\t\t\t\t\t\t\t...parsedSession.session,\n\t\t\t\t\t\t\t\t\t\t...data,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\t\t\t\tsession: updatedSession,\n\t\t\t\t\t\t\t\t\t\t\tuser: parsedSession.user,\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\tparsedSession.session.expiresAt\n\t\t\t\t\t\t\t\t\t\t\t? new Date(parsedSession.session.expiresAt).getTime()\n\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\texecuteMainFn: options.session?.storeSessionInDatabase,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t);\n\t\t\treturn updatedSession;\n\t\t},\n\t\tdeleteSession: async (id: string) => {\n\t\t\tif (secondaryStorage) {\n\t\t\t\tawait secondaryStorage.delete(id);\n\t\t\t\tif (options.session?.storeSessionInDatabase) {\n\t\t\t\t\tawait adapter.delete<Session>({\n\t\t\t\t\t\tmodel: tables.session.tableName,\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t\tvalue: id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait adapter.delete<Session>({\n\t\t\t\tmodel: tables.session.tableName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t},\n\t\tdeleteSessions: async (userId: string) => {\n\t\t\tif (secondaryStorage) {\n\t\t\t\tconst sessions = await adapter.findMany<Session>({\n\t\t\t\t\tmodel: tables.session.tableName,\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: tables.session.fields.userId.fieldName || \"userId\",\n\t\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\tfor (const session of sessions) {\n\t\t\t\t\tawait secondaryStorage.delete(session.id);\n\t\t\t\t}\n\t\t\t\tif (options.session?.storeSessionInDatabase) {\n\t\t\t\t\tawait adapter.delete({\n\t\t\t\t\t\tmodel: tables.session.tableName,\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: tables.session.fields.userId.fieldName || \"userId\",\n\t\t\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait adapter.deleteMany({\n\t\t\t\tmodel: tables.session.tableName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: tables.session.fields.userId.fieldName || \"userId\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t},\n\t\tfindUserByEmail: async (\n\t\t\temail: string,\n\t\t\toptions?: { includeAccounts: boolean },\n\t\t) => {\n\t\t\tconst user = await adapter.findOne<User>({\n\t\t\t\tmodel: tables.user.tableName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue: email.toLowerCase(),\n\t\t\t\t\t\tfield: tables.user.fields.email.fieldName || \"email\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tif (!user) return null;\n\t\t\tif (options?.includeAccounts) {\n\t\t\t\tconst accounts = await adapter.findMany<Account>({\n\t\t\t\t\tmodel: tables.account.tableName,\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t\t\tfield: tables.account.fields.userId.fieldName || \"userId\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tuser: convertFromDB(tables.user.fields, user)!,\n\t\t\t\t\taccounts: accounts.map(\n\t\t\t\t\t\t(account) => convertFromDB(tables.account.fields, account)!,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tuser: convertFromDB(tables.user.fields, user)!,\n\t\t\t\taccounts: [],\n\t\t\t};\n\t\t},\n\t\tfindUserById: async (userId: string) => {\n\t\t\tconst user = await adapter.findOne<User>({\n\t\t\t\tmodel: tables.user.tableName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn user;\n\t\t},\n\t\tlinkAccount: async (account: Omit<Account, \"id\"> & Partial<Account>) => {\n\t\t\tconst _account = await createWithHooks(\n\t\t\t\t{\n\t\t\t\t\tid: generateId(),\n\t\t\t\t\t...account,\n\t\t\t\t},\n\t\t\t\t\"account\",\n\t\t\t);\n\t\t\treturn _account;\n\t\t},\n\t\tupdateUser: async (\n\t\t\tuserId: string,\n\t\t\tdata: Partial<User> & Record<string, any>,\n\t\t) => {\n\t\t\tconst user = await updateWithHooks<User>(\n\t\t\t\tdata,\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"user\",\n\t\t\t);\n\t\t\treturn user;\n\t\t},\n\t\tupdateUserByEmail: async (\n\t\t\temail: string,\n\t\t\tdata: Partial<User & Record<string, any>>,\n\t\t) => {\n\t\t\tconst user = await updateWithHooks<User>(\n\t\t\t\tdata,\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: tables.user.fields.email.fieldName || \"email\",\n\t\t\t\t\t\tvalue: email,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"user\",\n\t\t\t);\n\t\t\treturn user;\n\t\t},\n\t\tupdatePassword: async (userId: string, password: string) => {\n\t\t\tconst account = await updateWithHooks<Account>(\n\t\t\t\t{\n\t\t\t\t\tpassword,\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: tables.account.fields.userId.fieldName || \"userId\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: tables.account.fields.providerId.fieldName || \"providerId\",\n\t\t\t\t\t\tvalue: \"credential\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"account\",\n\t\t\t);\n\t\t\treturn account;\n\t\t},\n\t\tfindAccounts: async (userId: string) => {\n\t\t\tconst accounts = await adapter.findMany<Account>({\n\t\t\t\tmodel: tables.account.tableName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: tables.account.fields.userId.fieldName || \"userId\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn accounts.map(\n\t\t\t\t(account) => convertFromDB(tables.account.fields, account) as Account,\n\t\t\t);\n\t\t},\n\t\tupdateAccount: async (accountId: string, data: Partial<Account>) => {\n\t\t\tconst account = await updateWithHooks<Account>(\n\t\t\t\tdata,\n\t\t\t\t[{ field: \"id\", value: accountId }],\n\t\t\t\t\"account\",\n\t\t\t);\n\t\t\treturn account;\n\t\t},\n\t\tcreateVerificationValue: async (data: Omit<Verification, \"id\">) => {\n\t\t\tconst verification = await createWithHooks(\n\t\t\t\t{\n\t\t\t\t\tid: generateId(),\n\t\t\t\t\t...data,\n\t\t\t\t},\n\t\t\t\t\"verification\",\n\t\t\t);\n\t\t\treturn verification;\n\t\t},\n\t\tfindVerificationValue: async (identifier: string) => {\n\t\t\tconst verification = await adapter.findOne<Verification>({\n\t\t\t\tmodel: tables.verification.tableName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield:\n\t\t\t\t\t\t\ttables.verification.fields.identifier.fieldName || \"identifier\",\n\t\t\t\t\t\tvalue: identifier,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn convertFromDB(tables.verification.fields, verification);\n\t\t},\n\t\tdeleteVerificationValue: async (id: string) => {\n\t\t\tawait adapter.delete<Verification>({\n\t\t\t\tmodel: tables.verification.tableName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t},\n\t\tupdateVerificationValue: async (\n\t\t\tid: string,\n\t\t\tdata: Partial<Verification>,\n\t\t) => {\n\t\t\tconst verification = await updateWithHooks<Verification>(\n\t\t\t\tdata,\n\t\t\t\t[{ field: \"id\", value: id }],\n\t\t\t\t\"verification\",\n\t\t\t);\n\t\t\treturn verification;\n\t\t},\n\t};\n};\n\nexport type InternalAdapter = ReturnType<typeof createInternalAdapter>;\n","import type { ZodSchema } from \"zod\";\nimport type { BetterAuthOptions } from \"../types\";\n\nexport type FieldType =\n\t| \"string\"\n\t| \"number\"\n\t| \"boolean\"\n\t| \"date\"\n\t| `${\"string\" | \"number\"}[]`;\n\nexport type FieldAttributeConfig<T extends FieldType = FieldType> = {\n\t/**\n\t * If the field should be required on a new record.\n\t * @default false\n\t */\n\trequired?: boolean;\n\t/**\n\t * If the value should be returned on a response body.\n\t * @default true\n\t */\n\treturned?: boolean;\n\t/**\n\t * If a value should be provided when creating a new record.\n\t * @default true\n\t */\n\tinput?: boolean;\n\t/**\n\t * If the value should be hashed when it's stored.\n\t * @default false\n\t */\n\thashValue?: boolean;\n\t/**\n\t * Default value for the field\n\t *\n\t * Note: This will not create a default value on the database level. It will only\n\t * be used when creating a new record.\n\t */\n\tdefaultValue?: any;\n\t/**\n\t * transform the value before storing it.\n\t */\n\ttransform?: (value: InferValueType<T>) => InferValueType<T>;\n\t/**\n\t * Reference to another model.\n\t */\n\treferences?: {\n\t\t/**\n\t\t * The model to reference.\n\t\t */\n\t\tmodel: string;\n\t\t/**\n\t\t * The field on the referenced model.\n\t\t */\n\t\tfield: string;\n\t\t/**\n\t\t * The action to perform when the reference is deleted.\n\t\t * @default \"cascade\"\n\t\t */\n\t\tonDelete?:\n\t\t\t| \"no action\"\n\t\t\t| \"restrict\"\n\t\t\t| \"cascade\"\n\t\t\t| \"set null\"\n\t\t\t| \"set default\";\n\t};\n\tunique?: boolean;\n\t/**\n\t * A zod schema to validate the value.\n\t */\n\tvalidator?: ZodSchema;\n\t/**\n\t * The name of the field on the database.\n\t *\n\t * @default\n\t * ```txt\n\t * the key in the fields object.\n\t * ```\n\t */\n\tfieldName?: string;\n};\n\nexport type FieldAttribute<T extends FieldType = FieldType> = {\n\ttype: T;\n} & FieldAttributeConfig<T>;\n\nexport const createFieldAttribute = <\n\tT extends FieldType,\n\tC extends Omit<FieldAttributeConfig<T>, \"type\">,\n>(\n\ttype: T,\n\tconfig?: C,\n) => {\n\treturn {\n\t\ttype,\n\t\t...config,\n\t} satisfies FieldAttribute<T>;\n};\n\nexport type InferValueType<T extends FieldType> = T extends \"string\"\n\t? string\n\t: T extends \"number\"\n\t\t? number\n\t\t: T extends \"boolean\"\n\t\t\t? boolean\n\t\t\t: T extends `${infer T}[]`\n\t\t\t\t? T extends \"string\"\n\t\t\t\t\t? string[]\n\t\t\t\t\t: number[]\n\t\t\t\t: never;\n\nexport type InferFieldsOutput<Field> = Field extends Record<\n\tinfer Key,\n\tFieldAttribute\n>\n\t? {\n\t\t\t[key in Key as Field[key][\"required\"] extends false\n\t\t\t\t? Field[key][\"defaultValue\"] extends boolean | string | number | Date\n\t\t\t\t\t? key\n\t\t\t\t\t: never\n\t\t\t\t: key]: InferFieldOutput<Field[key]>;\n\t\t} & {\n\t\t\t[key in Key as Field[key][\"returned\"] extends false\n\t\t\t\t? never\n\t\t\t\t: key]?: InferFieldOutput<Field[key]>;\n\t\t}\n\t: {};\n\nexport type InferFieldsInput<Field> = Field extends Record<\n\tinfer Key,\n\tFieldAttribute\n>\n\t? {\n\t\t\t[key in Key as Field[key][\"required\"] extends false\n\t\t\t\t? never\n\t\t\t\t: Field[key][\"defaultValue\"] extends string | number | boolean | Date\n\t\t\t\t\t? never\n\t\t\t\t\t: key]: InferFieldInput<Field[key]>;\n\t\t} & {\n\t\t\t[key in Key as Field[key][\"input\"] extends false ? never : key]:\n\t\t\t\t| InferFieldInput<Field[key]>\n\t\t\t\t| undefined;\n\t\t}\n\t: {};\n\n/**\n * For client will add \"?\" on optional fields\n */\nexport type InferFieldsInputClient<Field> = Field extends Record<\n\tinfer Key,\n\tFieldAttribute\n>\n\t? {\n\t\t\t[key in Key as Field[key][\"required\"] extends false\n\t\t\t\t? never\n\t\t\t\t: Field[key][\"defaultValue\"] extends string | number | boolean | Date\n\t\t\t\t\t? never\n\t\t\t\t\t: key]: InferFieldInput<Field[key]>;\n\t\t} & {\n\t\t\t[key in Key]?: InferFieldInput<Field[key]> | undefined;\n\t\t}\n\t: {};\n\ntype InferFieldOutput<T extends FieldAttribute> = T[\"returned\"] extends false\n\t? never\n\t: T[\"required\"] extends false\n\t\t? InferValueType<T[\"type\"]> | undefined\n\t\t: InferValueType<T[\"type\"]>;\n\ntype InferFieldInput<T extends FieldAttribute> = InferValueType<T[\"type\"]>;\n\nexport type PluginFieldAttribute = Omit<\n\tFieldAttribute,\n\t\"transform\" | \"defaultValue\" | \"hashValue\"\n>;\n\nexport type InferFieldsFromPlugins<\n\tOptions extends BetterAuthOptions,\n\tKey extends string,\n\tFormat extends \"output\" | \"input\" = \"output\",\n> = Options[\"plugins\"] extends Array<infer T>\n\t? T extends {\n\t\t\tschema: {\n\t\t\t\t[key in Key]: {\n\t\t\t\t\tfields: infer Field;\n\t\t\t\t};\n\t\t\t};\n\t\t}\n\t\t? Format extends \"output\"\n\t\t\t? InferFieldsOutput<Field>\n\t\t\t: InferFieldsInput<Field>\n\t\t: {}\n\t: {};\n\nexport type InferFieldsFromOptions<\n\tOptions extends BetterAuthOptions,\n\tKey extends \"session\" | \"user\",\n\tFormat extends \"output\" | \"input\" = \"output\",\n> = Options[Key] extends {\n\tadditionalFields: infer Field;\n}\n\t? Format extends \"output\"\n\t\t? InferFieldsOutput<Field>\n\t\t: InferFieldsInput<Field>\n\t: {};\n","import { type ZodSchema, z } from \"zod\";\nimport type { FieldAttribute } from \".\";\n\nexport function toZodSchema(fields: Record<string, FieldAttribute>) {\n\tconst schema = z.object({\n\t\t...Object.keys(fields).reduce((acc, key) => {\n\t\t\tconst field = fields[key];\n\t\t\tif (!field) {\n\t\t\t\treturn acc;\n\t\t\t}\n\t\t\tif (field.type === \"string[]\" || field.type === \"number[]\") {\n\t\t\t\treturn {\n\t\t\t\t\t...acc,\n\t\t\t\t\t[key]: z.array(field.type === \"string[]\" ? z.string() : z.number()),\n\t\t\t\t};\n\t\t\t}\n\t\t\tlet schema: ZodSchema = z[field.type]();\n\t\t\tif (field?.required === false) {\n\t\t\t\tschema = schema.optional();\n\t\t\t}\n\t\t\tif (field?.returned === false) {\n\t\t\t\treturn acc;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t[key]: schema,\n\t\t\t};\n\t\t}, {}),\n\t});\n\treturn schema;\n}\n","import {\n\ttype AlterTableColumnAlteringBuilder,\n\ttype CreateTableBuilder,\n} from \"kysely\";\nimport type { FieldAttribute, FieldType } from \".\";\nimport { logger } from \"../utils/logger\";\nimport type { BetterAuthOptions } from \"../types\";\nimport { createKyselyAdapter } from \"../adapters/kysely-adapter/dialect\";\nimport type { KyselyDatabaseType } from \"../adapters/kysely-adapter/types\";\nimport { getSchema } from \"./get-schema\";\n\nconst postgresMap = {\n\tstring: [\"character varying\", \"text\"],\n\tnumber: [\n\t\t\"int4\",\n\t\t\"integer\",\n\t\t\"bigint\",\n\t\t\"smallint\",\n\t\t\"numeric\",\n\t\t\"real\",\n\t\t\"double precision\",\n\t],\n\tboolean: [\"bool\", \"boolean\"],\n\tdate: [\"timestamp\", \"date\"],\n};\nconst mysqlMap = {\n\tstring: [\"varchar\", \"text\"],\n\tnumber: [\n\t\t\"integer\",\n\t\t\"int\",\n\t\t\"bigint\",\n\t\t\"smallint\",\n\t\t\"decimal\",\n\t\t\"float\",\n\t\t\"double\",\n\t],\n\tboolean: [\"boolean\"],\n\tdate: [\"date\", \"datetime\"],\n};\n\nconst sqliteMap = {\n\tstring: [\"TEXT\"],\n\tnumber: [\"INTEGER\", \"REAL\"],\n\tboolean: [\"INTEGER\", \"BOOLEAN\"], // 0 or 1\n\tdate: [\"DATE\", \"INTEGER\"],\n};\n\nconst mssqlMap = {\n\tstring: [\"nvarchar\", \"varchar\"],\n\tnumber: [\"int\", \"bigint\", \"smallint\", \"decimal\", \"float\", \"double\"],\n\tboolean: [\"bit\", \"boolean\"],\n\tdate: [\"datetime\", \"date\"],\n};\n\nconst map = {\n\tpostgres: postgresMap,\n\tmysql: mysqlMap,\n\tsqlite: sqliteMap,\n\tmssql: mssqlMap,\n};\n\nexport function matchType(\n\tcolumnDataType: string,\n\tfieldType: FieldType,\n\tdbType: KyselyDatabaseType,\n) {\n\tif (fieldType === \"string[]\" || fieldType === \"number[]\") {\n\t\treturn columnDataType.toLowerCase().includes(\"json\");\n\t}\n\tconst types = map[dbType];\n\tconst type = types[fieldType].map((t) => t.toLowerCase());\n\tconst matches = type.includes(columnDataType.toLowerCase());\n\treturn matches;\n}\n\nexport async function getMigrations(config: BetterAuthOptions) {\n\tconst betterAuthSchema = getSchema(config);\n\n\tlet { kysely: db, databaseType: dbType } = await createKyselyAdapter(config);\n\n\tif (!dbType) {\n\t\tlogger.warn(\n\t\t\t\"Could not determine database type, defaulting to sqlite. Please provide a type in the database options to avoid this.\",\n\t\t);\n\t\tdbType = \"sqlite\";\n\t}\n\n\tif (!db) {\n\t\tlogger.error(\n\t\t\t\"Only kysely adapter is supported for migrations. You can use `generate` command to generate the schema, if you're using a different adapter.\",\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\tconst tableMetadata = await db.introspection.getTables();\n\tconst toBeCreated: {\n\t\ttable: string;\n\t\tfields: Record<string, FieldAttribute>;\n\t\torder: number;\n\t}[] = [];\n\tconst toBeAdded: {\n\t\ttable: string;\n\t\tfields: Record<string, FieldAttribute>;\n\t\torder: number;\n\t}[] = [];\n\n\tfor (const [key, value] of Object.entries(betterAuthSchema)) {\n\t\tconst table = tableMetadata.find((t) => t.name === key);\n\t\tif (!table) {\n\t\t\tconst tIndex = toBeCreated.findIndex((t) => t.table === key);\n\t\t\tconst tableData = {\n\t\t\t\ttable: key,\n\t\t\t\tfields: value.fields,\n\t\t\t\torder: value.order || Infinity,\n\t\t\t};\n\n\t\t\tconst insertIndex = toBeCreated.findIndex(\n\t\t\t\t(t) => (t.order || Infinity) > tableData.order,\n\t\t\t);\n\n\t\t\tif (insertIndex === -1) {\n\t\t\t\tif (tIndex === -1) {\n\t\t\t\t\ttoBeCreated.push(tableData);\n\t\t\t\t} else {\n\t\t\t\t\ttoBeCreated[tIndex].fields = {\n\t\t\t\t\t\t...toBeCreated[tIndex].fields,\n\t\t\t\t\t\t...value.fields,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttoBeCreated.splice(insertIndex, 0, tableData);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tlet toBeAddedFields: Record<string, FieldAttribute> = {};\n\t\tfor (const [fieldName, field] of Object.entries(value.fields)) {\n\t\t\tconst column = table.columns.find((c) => c.name === fieldName);\n\t\t\tif (!column) {\n\t\t\t\ttoBeAddedFields[fieldName] = field;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (matchType(column.dataType, field.type, dbType)) {\n\t\t\t\tcontinue;\n\t\t\t} else {\n\t\t\t\tlogger.warn(\n\t\t\t\t\t`Field ${fieldName} in table ${key} has a different type in the database. Expected ${field.type} but got ${column.dataType}.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tif (Object.keys(toBeAddedFields).length > 0) {\n\t\t\ttoBeAdded.push({\n\t\t\t\ttable: key,\n\t\t\t\tfields: toBeAddedFields,\n\t\t\t\torder: value.order || Infinity,\n\t\t\t});\n\t\t}\n\t}\n\n\tconst migrations: (\n\t\t| AlterTableColumnAlteringBuilder\n\t\t| CreateTableBuilder<string, string>\n\t)[] = [];\n\n\tfunction getType(type: FieldType) {\n\t\tconst typeMap = {\n\t\t\tstring: \"text\",\n\t\t\tboolean: \"boolean\",\n\t\t\tnumber: \"integer\",\n\t\t\tdate: \"date\",\n\t\t} as const;\n\t\tif (dbType === \"mysql\" && type === \"string\") {\n\t\t\treturn \"varchar(255)\";\n\t\t}\n\t\tif (dbType === \"sqlite\" && (type === \"string[]\" || type === \"number[]\")) {\n\t\t\treturn \"text\";\n\t\t}\n\t\tif (type === \"string[]\" || type === \"number[]\") {\n\t\t\treturn \"jsonb\";\n\t\t}\n\t\treturn typeMap[type];\n\t}\n\tif (toBeAdded.length) {\n\t\tfor (const table of toBeAdded) {\n\t\t\tfor (const [fieldName, field] of Object.entries(table.fields)) {\n\t\t\t\tconst type = getType(field.type);\n\t\t\t\tconst exec = db.schema\n\t\t\t\t\t.alterTable(table.table)\n\t\t\t\t\t.addColumn(fieldName, type, (col) => {\n\t\t\t\t\t\tcol = field.required !== false ? col.notNull() : col;\n\t\t\t\t\t\tif (field.references) {\n\t\t\t\t\t\t\tcol = col.references(\n\t\t\t\t\t\t\t\t`${field.references.model}.${field.references.field}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn col;\n\t\t\t\t\t});\n\t\t\t\tmigrations.push(exec);\n\t\t\t}\n\t\t}\n\t}\n\tif (toBeCreated.length) {\n\t\tfor (const table of toBeCreated) {\n\t\t\tlet dbT = db.schema\n\t\t\t\t.createTable(table.table)\n\t\t\t\t.addColumn(\"id\", getType(\"string\"), (col) =>\n\t\t\t\t\tcol.primaryKey().notNull(),\n\t\t\t\t);\n\n\t\t\tfor (const [fieldName, field] of Object.entries(table.fields)) {\n\t\t\t\tconst type = getType(field.type);\n\t\t\t\tdbT = dbT.addColumn(fieldName, type, (col) => {\n\t\t\t\t\tcol = field.required !== false ? col.notNull() : col;\n\t\t\t\t\tif (field.references) {\n\t\t\t\t\t\tcol = col.references(\n\t\t\t\t\t\t\t`${field.references.model}.${field.references.field}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (field.unique) {\n\t\t\t\t\t\tcol = col.unique();\n\t\t\t\t\t}\n\t\t\t\t\treturn col;\n\t\t\t\t});\n\t\t\t}\n\t\t\tmigrations.push(dbT);\n\t\t}\n\t}\n\tasync function runMigrations() {\n\t\tfor (const migration of migrations) {\n\t\t\tawait migration.execute();\n\t\t}\n\t}\n\tasync function compileMigrations() {\n\t\tconst compiled = migrations.map((m) => m.compile().sql);\n\t\treturn compiled.join(\";\\n\\n\");\n\t}\n\treturn { toBeCreated, toBeAdded, runMigrations, compileMigrations };\n}\n","import { createConsola } from \"consola\";\n\nconst consola = createConsola({\n\tformatOptions: {\n\t\tdate: false,\n\t\tcolors: true,\n\t\tcompact: true,\n\t},\n\tdefaults: {\n\t\ttag: \"Better Auth\",\n\t},\n});\n\nexport const createLogger = (options?: {\n\tdisabled?: boolean;\n}) => {\n\treturn {\n\t\tlog: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.log(\"\", ...args);\n\t\t},\n\t\terror: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.error(\"\", ...args);\n\t\t},\n\t\twarn: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.warn(\"\", ...args);\n\t\t},\n\t\tinfo: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.info(\"\", ...args);\n\t\t},\n\t\tdebug: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.debug(\"\", ...args);\n\t\t},\n\t\tbox: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.box(\"\", ...args);\n\t\t},\n\t\tsuccess: (...args: any[]) => {\n\t\t\t!options?.disabled && consola.success(\"\", ...args);\n\t\t},\n\t\tbreak: (...args: any[]) => {\n\t\t\t!options?.disabled && console.log(\"\\n\");\n\t\t},\n\t};\n};\n\nexport const logger = createLogger();\n","import { getAuthTables, type FieldAttribute } from \".\";\nimport type { BetterAuthOptions } from \"../types\";\n\nexport function getSchema(config: BetterAuthOptions) {\n\tconst tables = getAuthTables(config);\n\tlet schema: Record<\n\t\tstring,\n\t\t{\n\t\t\tfields: Record<string, FieldAttribute>;\n\t\t\torder: number;\n\t\t}\n\t> = {};\n\tfor (const key in tables) {\n\t\tconst table = tables[key];\n\t\tconst fields = table.fields;\n\t\tlet actualFields: Record<string, FieldAttribute> = {};\n\t\tObject.entries(fields).forEach(([key, field]) => {\n\t\t\tactualFields[field.fieldName || key] = field;\n\t\t});\n\t\tif (schema[table.tableName]) {\n\t\t\tschema[table.tableName].fields = {\n\t\t\t\t...schema[table.tableName].fields,\n\t\t\t\t...actualFields,\n\t\t\t};\n\t\t\tcontinue;\n\t\t}\n\t\tschema[table.tableName] = {\n\t\t\tfields: actualFields,\n\t\t\torder: table.order || Infinity,\n\t\t};\n\t}\n\treturn schema;\n}\n"],"mappings":"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","names":["getDate","span","unit","getAuthTables","options","pluginSchema","acc","plugin","schema","key","value","shouldAddRateLimitTable","rateLimitTable","user","session","account","pluginTables","nanoid","generateId","size","BetterAuthError","message","cause","Kysely","MssqlDialect","MysqlDialect","PostgresDialect","SqliteDialect","getDatabaseType","db","createKyselyAdapter","config","dialect","databaseType","convertWhere","w","conditions","condition","field","value","operator","connector","expr","eb","transformTo","val","fields","transform","key","f","transformFrom","kyselyAdapter","db","config","data","model","select","res","schema","acc","cur","where","and","or","query","limit","offset","sortBy","v","getAdapter","options","BetterAuthError","kysely","databaseType","createKyselyAdapter","tables","getAuthTables","schema","table","kyselyAdapter","convertToDB","fields","values","result","key","field","value","convertFromDB","getWithHooks","adapter","ctx","hooks","tables","getAuthTables","createWithHooks","data","model","customCreateFn","actualData","table","hook","toRun","result","customCreated","created","convertToDB","generateId","convertFromDB","updateWithHooks","where","customUpdateFn","customUpdated","updated","isTest","getIp","req","testIP","keys","headers","key","value","ip","createInternalAdapter","adapter","ctx","options","secondaryStorage","sessionExpiration","tables","getAuthTables","createWithHooks","updateWithHooks","getWithHooks","user","account","createdUser","generateId","createdAccount","e","userId","limit","offset","sortBy","where","convertFromDB","request","dontRememberMe","override","headers","data","getDate","getIp","sessionId","sessionStringified","s","session","sessionIds","sessions","userIds","users","u","currentSession","updatedSession","parsedSession","id","email","accounts","password","accountId","identifier","verification","createFieldAttribute","type","config","z","toZodSchema","fields","acc","key","field","schema","createConsola","consola","createLogger","options","args","logger","getSchema","config","tables","getAuthTables","schema","key","table","fields","actualFields","field","postgresMap","mysqlMap","sqliteMap","mssqlMap","map","matchType","columnDataType","fieldType","dbType","t","getMigrations","config","betterAuthSchema","getSchema","db","createKyselyAdapter","logger","tableMetadata","toBeCreated","toBeAdded","key","value","table","tIndex","tableData","insertIndex","toBeAddedFields","fieldName","field","column","c","migrations","getType","type","typeMap","exec","col","dbT","runMigrations","migration","compileMigrations","m"]}
|