better-auth 0.0.9-beta.13 → 0.0.9-beta.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client.d.ts CHANGED
@@ -5,12 +5,12 @@ import * as _better_fetch_fetch from '@better-fetch/fetch';
5
5
  import { BetterFetch, BetterFetchOption, BetterFetchError } from '@better-fetch/fetch';
6
6
  import { B as BetterAuthPlugin, F as FieldAttribute, I as InferFieldOutput } from './internal-adapter-D-6pvxDj.js';
7
7
  import { U as UnionToIntersection } from './helper-D8dhRz72.js';
8
- import { C as ClientOptions, I as InferClientAPI, a as InferActions, A as AuthClientPlugin, c as InferSessionFromClient, d as InferUserFromClient, b as IsSignal } from './types-DtaLn_7o.js';
8
+ import { C as ClientOptions, I as InferClientAPI, a as InferActions, A as AuthClientPlugin, c as InferSessionFromClient, d as InferUserFromClient, b as IsSignal } from './types-Bbz_v64N.js';
9
9
  import 'kysely';
10
10
  import './index-CcxejJTH.js';
11
11
  import 'arctic';
12
12
  import 'better-call';
13
- import './index-Bzhxi8vQ.js';
13
+ import './index-DR55Ilth.js';
14
14
 
15
15
  type InferResolvedHooks<O extends ClientOptions> = O["plugins"] extends Array<infer Plugin> ? Plugin extends AuthClientPlugin ? Plugin["getAtoms"] extends (fetch: any) => infer Atoms ? Atoms extends Record<string, any> ? {
16
16
  [key in keyof Atoms as IsSignal<key> extends true ? never : key extends string ? `use${Capitalize<key>}` : never]: Atoms[key];
@@ -80,14 +80,14 @@ declare const router: <C extends AuthContext, Option extends BetterAuthOptions>(
80
80
  }>>;
81
81
  body: zod.ZodObject<{
82
82
  callbackURL: zod.ZodOptional<zod.ZodString>;
83
- provider: zod.ZodEnum<["github", ...("github" | "apple" | "discord" | "facebook" | "google" | "spotify" | "twitch" | "twitter")[]]>;
83
+ provider: zod.ZodEnum<["github", ...("apple" | "discord" | "facebook" | "github" | "google" | "spotify" | "twitch" | "twitter")[]]>;
84
84
  dontRememberMe: zod.ZodOptional<zod.ZodDefault<zod.ZodBoolean>>;
85
85
  }, "strip", zod.ZodTypeAny, {
86
- provider: "github" | "apple" | "discord" | "facebook" | "google" | "spotify" | "twitch" | "twitter";
86
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "spotify" | "twitch" | "twitter";
87
87
  callbackURL?: string | undefined;
88
88
  dontRememberMe?: boolean | undefined;
89
89
  }, {
90
- provider: "github" | "apple" | "discord" | "facebook" | "google" | "spotify" | "twitch" | "twitter";
90
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "spotify" | "twitch" | "twitter";
91
91
  callbackURL?: string | undefined;
92
92
  dontRememberMe?: boolean | undefined;
93
93
  }>;
@@ -110,14 +110,14 @@ declare const router: <C extends AuthContext, Option extends BetterAuthOptions>(
110
110
  }>>;
111
111
  body: zod.ZodObject<{
112
112
  callbackURL: zod.ZodOptional<zod.ZodString>;
113
- provider: zod.ZodEnum<["github", ...("github" | "apple" | "discord" | "facebook" | "google" | "spotify" | "twitch" | "twitter")[]]>;
113
+ provider: zod.ZodEnum<["github", ...("apple" | "discord" | "facebook" | "github" | "google" | "spotify" | "twitch" | "twitter")[]]>;
114
114
  dontRememberMe: zod.ZodOptional<zod.ZodDefault<zod.ZodBoolean>>;
115
115
  }, "strip", zod.ZodTypeAny, {
116
- provider: "github" | "apple" | "discord" | "facebook" | "google" | "spotify" | "twitch" | "twitter";
116
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "spotify" | "twitch" | "twitter";
117
117
  callbackURL?: string | undefined;
118
118
  dontRememberMe?: boolean | undefined;
119
119
  }, {
120
- provider: "github" | "apple" | "discord" | "facebook" | "google" | "spotify" | "twitch" | "twitter";
120
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "spotify" | "twitch" | "twitter";
121
121
  callbackURL?: string | undefined;
122
122
  dontRememberMe?: boolean | undefined;
123
123
  }>;
@@ -979,14 +979,14 @@ declare const betterAuth: <O extends BetterAuthOptions>(options: O) => {
979
979
  }>>;
980
980
  body: zod.ZodObject<{
981
981
  callbackURL: zod.ZodOptional<zod.ZodString>;
982
- provider: zod.ZodEnum<["github", ...("github" | "apple" | "discord" | "facebook" | "google" | "spotify" | "twitch" | "twitter")[]]>;
982
+ provider: zod.ZodEnum<["github", ...("apple" | "discord" | "facebook" | "github" | "google" | "spotify" | "twitch" | "twitter")[]]>;
983
983
  dontRememberMe: zod.ZodOptional<zod.ZodDefault<zod.ZodBoolean>>;
984
984
  }, "strip", zod.ZodTypeAny, {
985
- provider: "github" | "apple" | "discord" | "facebook" | "google" | "spotify" | "twitch" | "twitter";
985
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "spotify" | "twitch" | "twitter";
986
986
  callbackURL?: string | undefined;
987
987
  dontRememberMe?: boolean | undefined;
988
988
  }, {
989
- provider: "github" | "apple" | "discord" | "facebook" | "google" | "spotify" | "twitch" | "twitter";
989
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "spotify" | "twitch" | "twitter";
990
990
  callbackURL?: string | undefined;
991
991
  dontRememberMe?: boolean | undefined;
992
992
  }>;
@@ -1009,14 +1009,14 @@ declare const betterAuth: <O extends BetterAuthOptions>(options: O) => {
1009
1009
  }>>;
1010
1010
  body: zod.ZodObject<{
1011
1011
  callbackURL: zod.ZodOptional<zod.ZodString>;
1012
- provider: zod.ZodEnum<["github", ...("github" | "apple" | "discord" | "facebook" | "google" | "spotify" | "twitch" | "twitter")[]]>;
1012
+ provider: zod.ZodEnum<["github", ...("apple" | "discord" | "facebook" | "github" | "google" | "spotify" | "twitch" | "twitter")[]]>;
1013
1013
  dontRememberMe: zod.ZodOptional<zod.ZodDefault<zod.ZodBoolean>>;
1014
1014
  }, "strip", zod.ZodTypeAny, {
1015
- provider: "github" | "apple" | "discord" | "facebook" | "google" | "spotify" | "twitch" | "twitter";
1015
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "spotify" | "twitch" | "twitter";
1016
1016
  callbackURL?: string | undefined;
1017
1017
  dontRememberMe?: boolean | undefined;
1018
1018
  }, {
1019
- provider: "github" | "apple" | "discord" | "facebook" | "google" | "spotify" | "twitch" | "twitter";
1019
+ provider: "apple" | "discord" | "facebook" | "github" | "google" | "spotify" | "twitch" | "twitter";
1020
1020
  callbackURL?: string | undefined;
1021
1021
  dontRememberMe?: boolean | undefined;
1022
1022
  }>;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as Auth, b as betterAuth } from './index-Bzhxi8vQ.js';
1
+ export { A as Auth, b as betterAuth } from './index-DR55Ilth.js';
2
2
  import './internal-adapter-D-6pvxDj.js';
3
3
  import 'kysely';
4
4
  import './index-CcxejJTH.js';
package/dist/index.js CHANGED
@@ -2024,8 +2024,8 @@ var router = (ctx, options) => {
2024
2024
  ...middlewares
2025
2025
  ],
2026
2026
  onError(e) {
2027
- if (process.env.NODE_ENV === "development" && !options.disableLog) {
2028
- logger.error(e);
2027
+ if (options.disableLog !== true) {
2028
+ logger.warn(e);
2029
2029
  }
2030
2030
  }
2031
2031
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/crypto/index.ts","../src/api/call.ts","../src/api/middlewares/csrf.ts","../src/error/better-auth-error.ts","../src/utils/base-url.ts","../src/social-providers/utils.ts","../src/social-providers/apple.ts","../src/social-providers/discord.ts","../src/social-providers/facebook.ts","../src/social-providers/github.ts","../src/utils/logger.ts","../src/social-providers/google.ts","../src/social-providers/spotify.ts","../src/social-providers/twitch.ts","../src/social-providers/twitter.ts","../src/social-providers/index.ts","../src/utils/state.ts","../src/utils/date.ts","../src/utils/cookies.ts","../src/api/middlewares/session.ts","../src/api/routes/session.ts","../src/api/routes/sign-in.ts","../src/adapters/schema.ts","../src/utils/id.ts","../src/utils/hide-metadata.ts","../src/utils/getAccount.ts","../src/api/routes/callback.ts","../src/api/routes/sign-out.ts","../src/api/routes/forget-password.ts","../src/api/routes/verify-email.ts","../src/api/routes/csrf.ts","../src/api/routes/ok.ts","../src/api/routes/sign-up.ts","../src/api/routes/error.ts","../src/api/routes/update-user.ts","../src/api/index.ts","../src/adapters/get-tables.ts","../src/adapters/kysely.ts","../src/adapters/utils.ts","../src/crypto/password.ts","../src/adapters/internal-adapter.ts","../src/utils/constants.ts","../src/init.ts","../src/auth.ts"],"names":["error","betterFetch","parseJWT","generateStateOAuth","z","options","APIError","TimeSpan","createJWT","validateJWT","generateRandomString","alphabet","account","ctx","w","config","data"],"mappings":"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","file":"index.js","sourcesContent":["import { xchacha20poly1305 } from \"@noble/ciphers/chacha\";\nimport { bytesToHex, hexToBytes, utf8ToBytes } from \"@noble/ciphers/utils\";\nimport { managedNonce } from \"@noble/ciphers/webcrypto\";\nimport { sha256 } from \"@noble/hashes/sha256\";\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 = ({ key, data }: SymmetricEncryptOptions) => {\n\tconst keyAsBytes = sha256(key);\n\tconst dataAsBytes = utf8ToBytes(data);\n\tconst chacha = managedNonce(xchacha20poly1305)(keyAsBytes);\n\treturn bytesToHex(chacha.encrypt(dataAsBytes));\n};\n\nexport type SymmetricDecryptOptions = {\n\tkey: string;\n\tdata: string;\n};\n\nexport const symmetricDecrypt = ({ key, data }: SymmetricDecryptOptions) => {\n\tconst keyAsBytes = sha256(key);\n\tconst dataAsBytes = hexToBytes(data);\n\tconst chacha = managedNonce(xchacha20poly1305)(keyAsBytes);\n\treturn chacha.decrypt(dataAsBytes);\n};\n","import {\n\ttype Endpoint,\n\ttype EndpointResponse,\n\tcreateEndpointCreator,\n\tcreateMiddleware,\n\tcreateMiddlewareCreator,\n} from \"better-call\";\nimport type { AuthContext } from \"../init\";\nimport type { BetterAuthOptions } from \"../types/options\";\n\nexport const optionsMiddleware = createMiddleware(async () => {\n\t/**\n\t * This will be passed on the instance of\n\t * the context. Used to infer the type\n\t * here.\n\t */\n\treturn {} as AuthContext;\n});\n\nexport const createAuthMiddleware = createMiddlewareCreator({\n\tuse: [\n\t\toptionsMiddleware,\n\t\t/**\n\t\t * This of for hooks. to tell ts there will a\n\t\t * return response object\n\t\t */\n\t\tcreateMiddleware(async () => {\n\t\t\treturn {} as {\n\t\t\t\treturned?: Response;\n\t\t\t};\n\t\t}),\n\t],\n});\n\nexport const createAuthEndpoint = createEndpointCreator({\n\tuse: [optionsMiddleware],\n});\n\nexport type AuthEndpoint = Endpoint<\n\t(ctx: {\n\t\toptions: BetterAuthOptions;\n\t\tbody: any;\n\t\tquery: any;\n\t\theaders: Headers;\n\t}) => Promise<EndpointResponse>\n>;\n\nexport type AuthMiddleware = ReturnType<typeof createAuthMiddleware>;\n","import { APIError } from \"better-call\";\nimport { z } from \"zod\";\nimport { hs256 } from \"../../crypto\";\nimport { createAuthMiddleware } from \"../call\";\n\nexport const csrfMiddleware = createAuthMiddleware(\n\t{\n\t\tbody: z\n\t\t\t.object({\n\t\t\t\tcsrfToken: z.string().optional(),\n\t\t\t})\n\t\t\t.optional(),\n\t},\n\tasync (ctx) => {\n\t\tif (\n\t\t\tctx.request?.method !== \"POST\" ||\n\t\t\tctx.context.options.advanced?.disableCSRFCheck\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tconst url = new URL(ctx.request.url);\n\t\t/**\n\t\t * If origin is the same as baseURL or if the\n\t\t * origin is in the trustedOrigins then we\n\t\t * don't need to check the CSRF token.\n\t\t */\n\t\tif (\n\t\t\turl.origin === new URL(ctx.context.baseURL).origin ||\n\t\t\tctx.context.options.trustedOrigins?.includes(url.origin)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst csrfToken = ctx.body?.csrfToken;\n\t\tconst csrfCookie = await ctx.getSignedCookie(\n\t\t\tctx.context.authCookies.csrfToken.name,\n\t\t\tctx.context.secret,\n\t\t);\n\t\tconst [token, hash] = csrfCookie?.split(\"!\") || [null, null];\n\t\tif (\n\t\t\t!csrfToken ||\n\t\t\t!csrfCookie ||\n\t\t\t!token ||\n\t\t\t!hash ||\n\t\t\tcsrfCookie !== csrfToken\n\t\t) {\n\t\t\tctx.setCookie(ctx.context.authCookies.csrfToken.name, \"\", {\n\t\t\t\tmaxAge: 0,\n\t\t\t});\n\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\tmessage: \"Invalid CSRF Token\",\n\t\t\t});\n\t\t}\n\t\tconst expectedHash = await hs256(ctx.context.secret, token);\n\t\tif (hash !== expectedHash) {\n\t\t\tctx.setCookie(ctx.context.authCookies.csrfToken.name, \"\", {\n\t\t\t\tmaxAge: 0,\n\t\t\t});\n\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\tmessage: \"Invalid CSRF Token\",\n\t\t\t});\n\t\t}\n\t},\n);\n","export class BetterAuthError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t}\n}\n","import { BetterAuthError } from \"../error/better-auth-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 env: any = typeof process !== \"undefined\" ? process.env : {};\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\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","import { createOAuth2Request, sendTokenRequest } from \"arctic/dist/request\";\nimport type { ProviderOptions } from \".\";\nimport { getBaseURL } from \"../utils/base-url\";\n\nexport function getRedirectURI(providerId: string, redirectURI?: string) {\n\treturn redirectURI || `${getBaseURL()}/callback/${providerId}`;\n}\n\nexport async function validateAuthorizationCode({\n\tcode,\n\tcodeVerifier,\n\tredirectURI,\n\toptions,\n\ttokenEndpoint,\n}: {\n\tcode: string;\n\tredirectURI: string;\n\toptions: ProviderOptions;\n\tcodeVerifier?: string;\n\ttokenEndpoint: string;\n}) {\n\tconst body = new URLSearchParams();\n\tbody.set(\"grant_type\", \"authorization_code\");\n\tbody.set(\"code\", code);\n\tbody.set(\"code_verifier\", codeVerifier || \"\");\n\tbody.set(\"redirect_uri\", redirectURI);\n\tbody.set(\"client_id\", options.clientId);\n\tbody.set(\"client_secret\", options.clientSecret);\n\tconst request = createOAuth2Request(tokenEndpoint, body);\n\tconst tokens = await sendTokenRequest(request);\n\treturn tokens;\n}\n","import { OAuth2Tokens } from \"arctic\";\nimport type { OAuthProvider } from \".\";\nimport { parseJWT } from \"oslo/jwt\";\nimport { betterFetch } from \"@better-fetch/fetch\";\nimport { BetterAuthError } from \"../error/better-auth-error\";\nimport { getRedirectURI } from \"./utils\";\nexport interface AppleProfile {\n\t/**\n\t * The subject registered claim identifies the principal that’s the subject\n\t * of the identity token. Because this token is for your app, the value is\n\t * the unique identifier for the user.\n\t */\n\tsub: string;\n\t/**\n\t * A String value representing the user's email address.\n\t * The email address is either the user's real email address or the proxy\n\t * address, depending on their status private email relay service.\n\t */\n\temail: string;\n\t/**\n\t * A string or Boolean value that indicates whether the service verifies\n\t * the email. The value can either be a string (\"true\" or \"false\") or a\n\t * Boolean (true or false). The system may not verify email addresses for\n\t * Sign in with Apple at Work & School users, and this claim is \"false\" or\n\t * false for those users.\n\t */\n\temail_verified: true | \"true\";\n\t/**\n\t * A string or Boolean value that indicates whether the email that the user\n\t * shares is the proxy address. The value can either be a string (\"true\" or\n\t * \"false\") or a Boolean (true or false).\n\t */\n\tis_private_email: boolean;\n\t/**\n\t * An Integer value that indicates whether the user appears to be a real\n\t * person. Use the value of this claim to mitigate fraud. The possible\n\t * values are: 0 (or Unsupported), 1 (or Unknown), 2 (or LikelyReal). For\n\t * more information, see ASUserDetectionStatus. This claim is present only\n\t * in iOS 14 and later, macOS 11 and later, watchOS 7 and later, tvOS 14\n\t * and later. The claim isn’t present or supported for web-based apps.\n\t */\n\treal_user_status: number;\n\t/**\n\t * The user’s full name in the format provided during the authorization\n\t * process.\n\t */\n\tname: string;\n}\n\nexport interface AppleOptions {\n\tclientId: string;\n\tclientSecret: string;\n\tredirectURI?: string;\n}\n\nexport const apple = ({\n\tclientId,\n\tclientSecret,\n\tredirectURI,\n}: AppleOptions) => {\n\tconst tokenEndpoint = \"https://appleid.apple.com/auth/token\";\n\tredirectURI = getRedirectURI(\"apple\", redirectURI);\n\treturn {\n\t\tid: \"apple\",\n\t\tname: \"Apple\",\n\t\tcreateAuthorizationURL({ state, scopes }) {\n\t\t\tconst _scope = scopes || [\"email\", \"name\", \"openid\"];\n\t\t\treturn new URL(\n\t\t\t\t`https://appleid.apple.com/auth/authorize?client_id=${clientId}&response_type=code&redirect_uri=${redirectURI}&scope=${_scope.join(\n\t\t\t\t\t\" \",\n\t\t\t\t)}&state=${state}`,\n\t\t\t);\n\t\t},\n\t\tvalidateAuthorizationCode: async (code) => {\n\t\t\tconst data = await betterFetch<OAuth2Tokens>(tokenEndpoint, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tbody: new URLSearchParams({\n\t\t\t\t\tclient_id: clientId,\n\t\t\t\t\tclient_secret: clientSecret,\n\t\t\t\t\tgrant_type: \"authorization_code\",\n\t\t\t\t\tcode,\n\t\t\t\t}),\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/x-www-form-urlencoded\",\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (data.error) {\n\t\t\t\tthrow new BetterAuthError(data.error?.message || \"\");\n\t\t\t}\n\t\t\treturn data.data;\n\t\t},\n\t\tasync getUserInfo(token) {\n\t\t\tconst data = parseJWT(token.idToken())?.payload as AppleProfile | null;\n\t\t\tif (!data) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tuser: {\n\t\t\t\t\tid: data.sub,\n\t\t\t\t\tname: data.name,\n\t\t\t\t\temail: data.email,\n\t\t\t\t\temailVerified: data.email_verified === \"true\",\n\t\t\t\t},\n\t\t\t\tdata,\n\t\t\t};\n\t\t},\n\t} satisfies OAuthProvider<AppleProfile>;\n};\n","import { betterFetch } from \"@better-fetch/fetch\";\nimport { Discord } from \"arctic\";\nimport type { OAuthProvider } from \".\";\nimport { getRedirectURI, validateAuthorizationCode } from \"./utils\";\nimport { createOAuth2Request, sendTokenRequest } from \"arctic/dist/request\";\n\nexport interface DiscordProfile extends Record<string, any> {\n\t/** the user's id (i.e. the numerical snowflake) */\n\tid: string;\n\t/** the user's username, not unique across the platform */\n\tusername: string;\n\t/** the user's Discord-tag */\n\tdiscriminator: string;\n\t/** the user's display name, if it is set */\n\tglobal_name: string | null;\n\t/**\n\t * the user's avatar hash:\n\t * https://discord.com/developers/docs/reference#image-formatting\n\t */\n\tavatar: string | null;\n\t/** whether the user belongs to an OAuth2 application */\n\tbot?: boolean;\n\t/**\n\t * whether the user is an Official Discord System user (part of the urgent\n\t * message system)\n\t */\n\tsystem?: boolean;\n\t/** whether the user has two factor enabled on their account */\n\tmfa_enabled: boolean;\n\t/**\n\t * the user's banner hash:\n\t * https://discord.com/developers/docs/reference#image-formatting\n\t */\n\tbanner: string | null;\n\n\t/** the user's banner color encoded as an integer representation of hexadecimal color code */\n\taccent_color: number | null;\n\n\t/**\n\t * the user's chosen language option:\n\t * https://discord.com/developers/docs/reference#locales\n\t */\n\tlocale: string;\n\t/** whether the email on this account has been verified */\n\tverified: boolean;\n\t/** the user's email */\n\temail: string;\n\t/**\n\t * the flags on a user's account:\n\t * https://discord.com/developers/docs/resources/user#user-object-user-flags\n\t */\n\tflags: number;\n\t/**\n\t * the type of Nitro subscription on a user's account:\n\t * https://discord.com/developers/docs/resources/user#user-object-premium-types\n\t */\n\tpremium_type: number;\n\t/**\n\t * the public flags on a user's account:\n\t * https://discord.com/developers/docs/resources/user#user-object-user-flags\n\t */\n\tpublic_flags: number;\n\t/** undocumented field; corresponds to the user's custom nickname */\n\tdisplay_name: string | null;\n\t/**\n\t * undocumented field; corresponds to the Discord feature where you can e.g.\n\t * put your avatar inside of an ice cube\n\t */\n\tavatar_decoration: string | null;\n\t/**\n\t * undocumented field; corresponds to the premium feature where you can\n\t * select a custom banner color\n\t */\n\tbanner_color: string | null;\n\t/** undocumented field; the CDN URL of their profile picture */\n\timage_url: string;\n}\n\nexport interface DiscordOptions {\n\tclientId: string;\n\tclientSecret: string;\n\tredirectURI?: string;\n}\n\nexport const discord = (options: DiscordOptions) => {\n\tconst discordArctic = new Discord(\n\t\toptions.clientId,\n\t\toptions.clientSecret,\n\t\tgetRedirectURI(\"discord\", options.redirectURI),\n\t);\n\treturn {\n\t\tid: \"discord\",\n\t\tname: \"Discord\",\n\t\tcreateAuthorizationURL({ state, scopes }) {\n\t\t\tconst _scope = scopes || [\"email\"];\n\t\t\treturn discordArctic.createAuthorizationURL(state, _scope);\n\t\t},\n\t\tvalidateAuthorizationCode: async (code, codeVerifier, redirectURI) => {\n\t\t\treturn validateAuthorizationCode({\n\t\t\t\tcode,\n\t\t\t\tcodeVerifier,\n\t\t\t\tredirectURI:\n\t\t\t\t\tredirectURI || getRedirectURI(\"discord\", options.redirectURI),\n\t\t\t\toptions,\n\t\t\t\ttokenEndpoint: \"https://discord.com/api/oauth2/token\",\n\t\t\t});\n\t\t},\n\t\tasync getUserInfo(token) {\n\t\t\tconst { data: profile, error } = await betterFetch<DiscordProfile>(\n\t\t\t\t\"https://discord.com/api/users/@me\",\n\t\t\t\t{\n\t\t\t\t\tauth: {\n\t\t\t\t\t\ttype: \"Bearer\",\n\t\t\t\t\t\ttoken: token.accessToken(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (error) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tuser: {\n\t\t\t\t\tid: profile.id,\n\t\t\t\t\tname: profile.display_name || profile.username || \"\",\n\t\t\t\t\temail: profile.email,\n\t\t\t\t\temailVerified: profile.verified,\n\t\t\t\t},\n\t\t\t\tdata: profile,\n\t\t\t};\n\t\t},\n\t} satisfies OAuthProvider<DiscordProfile>;\n};\n","import { betterFetch } from \"@better-fetch/fetch\";\nimport { Facebook } from \"arctic\";\nimport type { OAuthProvider } from \".\";\nimport { getRedirectURI, validateAuthorizationCode } from \"./utils\";\nimport { createOAuth2Request, sendTokenRequest } from \"arctic/dist/request\";\n\nexport interface FacebookProfile {\n\tid: string;\n\tname: string;\n\temail: string;\n\temail_verified: boolean;\n\tpicture: {\n\t\tdata: {\n\t\t\theight: number;\n\t\t\tis_silhouette: boolean;\n\t\t\turl: string;\n\t\t\twidth: number;\n\t\t};\n\t};\n}\nexport interface FacebookOptions {\n\tclientId: string;\n\tclientSecret: string;\n\tredirectURI?: string;\n}\nexport const facebook = (options: FacebookOptions) => {\n\tconst facebookArctic = new Facebook(\n\t\toptions.clientId,\n\t\toptions.clientSecret,\n\t\tgetRedirectURI(\"facebook\", options.redirectURI),\n\t);\n\treturn {\n\t\tid: \"facebook\",\n\t\tname: \"Facebook\",\n\t\tcreateAuthorizationURL({ state, scopes }) {\n\t\t\tconst _scopes = scopes || [\"email\", \"public_profile\"];\n\t\t\treturn facebookArctic.createAuthorizationURL(state, _scopes);\n\t\t},\n\t\tvalidateAuthorizationCode: async (code, codeVerifier, redirectURI) => {\n\t\t\treturn validateAuthorizationCode({\n\t\t\t\tcode,\n\t\t\t\tcodeVerifier,\n\t\t\t\tredirectURI:\n\t\t\t\t\tredirectURI || getRedirectURI(\"facebook\", options.redirectURI),\n\t\t\t\toptions,\n\t\t\t\ttokenEndpoint: \"https://graph.facebook.com/v16.0/oauth/access_token\",\n\t\t\t});\n\t\t},\n\t\tasync getUserInfo(token) {\n\t\t\tconst { data: profile, error } = await betterFetch<FacebookProfile>(\n\t\t\t\t\"https://graph.facebook.com/me\",\n\t\t\t\t{\n\t\t\t\t\tauth: {\n\t\t\t\t\t\ttype: \"Bearer\",\n\t\t\t\t\t\ttoken: token.accessToken(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (error) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tuser: {\n\t\t\t\t\tid: profile.id,\n\t\t\t\t\tname: profile.name,\n\t\t\t\t\temail: profile.email,\n\t\t\t\t\temailVerified: profile.email_verified,\n\t\t\t\t},\n\t\t\t\tdata: profile,\n\t\t\t};\n\t\t},\n\t} satisfies OAuthProvider<FacebookProfile>;\n};\n","import { betterFetch } from \"@better-fetch/fetch\";\nimport { GitHub } from \"arctic\";\nimport type { OAuthProvider } from \".\";\nimport { getRedirectURI } from \"./utils\";\n\nexport interface GithubProfile {\n\tlogin: string;\n\tid: string;\n\tnode_id: string;\n\tavatar_url: string;\n\tgravatar_id: string;\n\turl: string;\n\thtml_url: string;\n\tfollowers_url: string;\n\tfollowing_url: string;\n\tgists_url: string;\n\tstarred_url: string;\n\tsubscriptions_url: string;\n\torganizations_url: string;\n\trepos_url: string;\n\tevents_url: string;\n\treceived_events_url: string;\n\ttype: string;\n\tsite_admin: boolean;\n\tname: string;\n\tcompany: string;\n\tblog: string;\n\tlocation: string;\n\temail: string;\n\thireable: boolean;\n\tbio: string;\n\ttwitter_username: string;\n\tpublic_repos: string;\n\tpublic_gists: string;\n\tfollowers: string;\n\tfollowing: string;\n\tcreated_at: string;\n\tupdated_at: string;\n\tprivate_gists: string;\n\ttotal_private_repos: string;\n\towned_private_repos: string;\n\tdisk_usage: string;\n\tcollaborators: string;\n\ttwo_factor_authentication: boolean;\n\tplan: {\n\t\tname: string;\n\t\tspace: string;\n\t\tprivate_repos: string;\n\t\tcollaborators: string;\n\t};\n\tfirst_name: string;\n\tlast_name: string;\n}\n\nexport interface GithubOptions {\n\tclientId: string;\n\tclientSecret: string;\n\tredirectURI?: string;\n}\nexport const github = ({\n\tclientId,\n\tclientSecret,\n\tredirectURI,\n}: GithubOptions) => {\n\tconst githubArctic = new GitHub(\n\t\tclientId,\n\t\tclientSecret,\n\t\tgetRedirectURI(\"github\", redirectURI),\n\t);\n\treturn {\n\t\tid: \"github\",\n\t\tname: \"Github\",\n\t\tcreateAuthorizationURL({ state, scopes }) {\n\t\t\tconst _scopes = scopes || [\"user:email\"];\n\t\t\treturn githubArctic.createAuthorizationURL(state, _scopes);\n\t\t},\n\t\tvalidateAuthorizationCode: async (state) => {\n\t\t\treturn await githubArctic.validateAuthorizationCode(state);\n\t\t},\n\t\tasync getUserInfo(token) {\n\t\t\tconsole.log(`Bearer ${token.accessToken()}`);\n\t\t\tconst { data: profile, error } = await betterFetch<GithubProfile>(\n\t\t\t\t\"https://api.github.com/user\",\n\t\t\t\t{\n\t\t\t\t\tauth: {\n\t\t\t\t\t\ttype: \"Bearer\",\n\t\t\t\t\t\ttoken: token.accessToken(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (error) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tlet emailVerified = false;\n\t\t\tif (!profile.email) {\n\t\t\t\tconst { data, error } = await betterFetch<\n\t\t\t\t\t{\n\t\t\t\t\t\temail: string;\n\t\t\t\t\t\tprimary: boolean;\n\t\t\t\t\t\tverified: boolean;\n\t\t\t\t\t\tvisibility: \"public\" | \"private\";\n\t\t\t\t\t}[]\n\t\t\t\t>(\"https://api.github.com/user/emails\", {\n\t\t\t\t\tauth: {\n\t\t\t\t\t\ttype: \"Bearer\",\n\t\t\t\t\t\ttoken: token.accessToken(),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tif (!error) {\n\t\t\t\t\tprofile.email = (data.find((e) => e.primary) ?? data[0])\n\t\t\t\t\t\t?.email as string;\n\t\t\t\t\temailVerified =\n\t\t\t\t\t\tdata.find((e) => e.email === profile.email)?.verified ?? false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tuser: {\n\t\t\t\t\tid: profile.id,\n\t\t\t\t\tname: profile.name,\n\t\t\t\t\temail: profile.email,\n\t\t\t\t\timage: profile.avatar_url,\n\t\t\t\t\temailVerified,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t\tdata: profile,\n\t\t\t};\n\t\t},\n\t} satisfies OAuthProvider<GithubProfile>;\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 { Google } from \"arctic\";\nimport { parseJWT } from \"oslo/jwt\";\nimport type { OAuthProvider, ProviderOptions } from \".\";\nimport { BetterAuthError } from \"../error/better-auth-error\";\nimport { logger } from \"../utils/logger\";\nimport { createOAuth2Request, sendTokenRequest } from \"arctic/dist/request\";\nimport { getRedirectURI, validateAuthorizationCode } from \"./utils\";\n\nexport interface GoogleProfile {\n\taud: string;\n\tazp: string;\n\temail: string;\n\temail_verified: boolean;\n\texp: number;\n\t/**\n\t * The family name of the user, or last name in most\n\t * Western languages.\n\t */\n\tfamily_name: string;\n\t/*s*\n\t * The given name of the user, or first name in most\n\t * Western languages.\n\t */\n\tgiven_name: string;\n\thd?: string;\n\tiat: number;\n\tiss: string;\n\tjti?: string;\n\tlocale?: string;\n\tname: string;\n\tnbf?: number;\n\tpicture: string;\n\tsub: string;\n}\n\nexport interface GoogleOptions extends ProviderOptions {}\n\nexport const google = (options: GoogleOptions) => {\n\tconst googleArctic = new Google(\n\t\toptions.clientId,\n\t\toptions.clientSecret,\n\t\tgetRedirectURI(\"google\", options.redirectURI),\n\t);\n\treturn {\n\t\tid: \"google\",\n\t\tname: \"Google\",\n\t\tcreateAuthorizationURL({ state, scopes, codeVerifier, redirectURI }) {\n\t\t\tif (!options.clientId || !options.clientSecret) {\n\t\t\t\tlogger.error(\n\t\t\t\t\t\"clientId and clientSecret is required for Google. Make sure to you have provided them in the options\",\n\t\t\t\t);\n\t\t\t\tthrow new BetterAuthError(\"clientId is required for Google\");\n\t\t\t}\n\t\t\tif (!codeVerifier) {\n\t\t\t\tthrow new BetterAuthError(\"codeVerifier is required for Google\");\n\t\t\t}\n\t\t\tconst _scopes = scopes || [\"email\", \"profile\"];\n\t\t\treturn googleArctic.createAuthorizationURL(state, codeVerifier, _scopes);\n\t\t},\n\t\tvalidateAuthorizationCode: async (code, codeVerifier, redirectURI) => {\n\t\t\treturn validateAuthorizationCode({\n\t\t\t\tcode,\n\t\t\t\tcodeVerifier,\n\t\t\t\tredirectURI:\n\t\t\t\t\tredirectURI || getRedirectURI(\"google\", options.redirectURI),\n\t\t\t\toptions,\n\t\t\t\ttokenEndpoint: \"https://oauth2.googleapis.com/token\",\n\t\t\t});\n\t\t},\n\t\tasync getUserInfo(token) {\n\t\t\tif (!token.idToken) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst user = parseJWT(token.idToken())?.payload as GoogleProfile;\n\t\t\treturn {\n\t\t\t\tuser: {\n\t\t\t\t\tid: user.sub,\n\t\t\t\t\tname: user.name,\n\t\t\t\t\temail: user.email,\n\t\t\t\t\timage: user.picture,\n\t\t\t\t\temailVerified: user.email_verified,\n\t\t\t\t},\n\t\t\t\tdata: user,\n\t\t\t};\n\t\t},\n\t} satisfies OAuthProvider<GoogleProfile>;\n};\n","import { betterFetch } from \"@better-fetch/fetch\";\nimport { Spotify } from \"arctic\";\nimport type { OAuthProvider } from \".\";\nimport { getRedirectURI, validateAuthorizationCode } from \"./utils\";\n\nexport interface SpotifyProfile {\n\tid: string;\n\tdisplay_name: string;\n\temail: string;\n\timages: {\n\t\turl: string;\n\t}[];\n}\n\nexport interface SpotifyOptions {\n\tclientId: string;\n\tclientSecret: string;\n\tredirectURI?: string;\n}\n\nexport const spotify = (options: SpotifyOptions) => {\n\tconst spotifyArctic = new Spotify(\n\t\toptions.clientId,\n\t\toptions.clientSecret,\n\t\tgetRedirectURI(\"spotify\", options.redirectURI),\n\t);\n\treturn {\n\t\tid: \"spotify\",\n\t\tname: \"Spotify\",\n\t\tcreateAuthorizationURL({ state, scopes }) {\n\t\t\tconst _scopes = scopes || [\"user-read-email\"];\n\t\t\treturn spotifyArctic.createAuthorizationURL(state, _scopes);\n\t\t},\n\t\tvalidateAuthorizationCode: async (code, codeVerifier, redirectURI) => {\n\t\t\treturn validateAuthorizationCode({\n\t\t\t\tcode,\n\t\t\t\tcodeVerifier,\n\t\t\t\tredirectURI:\n\t\t\t\t\tredirectURI || getRedirectURI(\"spotify\", options.redirectURI),\n\t\t\t\toptions,\n\t\t\t\ttokenEndpoint: \"https://accounts.spotify.com/api/token\",\n\t\t\t});\n\t\t},\n\t\tasync getUserInfo(token) {\n\t\t\tconst { data: profile, error } = await betterFetch<SpotifyProfile>(\n\t\t\t\t\"https://api.spotify.com/v1/me\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer ${token.accessToken()}`,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (error) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tuser: {\n\t\t\t\t\tid: profile.id,\n\t\t\t\t\tname: profile.display_name,\n\t\t\t\t\temail: profile.email,\n\t\t\t\t\timage: profile.images[0]?.url,\n\t\t\t\t\temailVerified: false,\n\t\t\t\t},\n\t\t\t\tdata: profile,\n\t\t\t};\n\t\t},\n\t} satisfies OAuthProvider<SpotifyProfile>;\n};\n","import { betterFetch } from \"@better-fetch/fetch\";\nimport { Twitch } from \"arctic\";\nimport type { OAuthProvider } from \".\";\nimport { getRedirectURI, validateAuthorizationCode } from \"./utils\";\n\nexport interface TwitchProfile {\n\t/**\n\t * The sub of the user\n\t */\n\tsub: string;\n\t/**\n\t * The preferred username of the user\n\t */\n\tpreferred_username: string;\n\t/**\n\t * The email of the user\n\t */\n\temail: string;\n\t/**\n\t * The picture of the user\n\t */\n\tpicture: string;\n}\n\nexport interface TwitchOptions {\n\tclientId: string;\n\tclientSecret: string;\n\tredirectURI?: string;\n}\n\nexport const twitch = (options: TwitchOptions) => {\n\tconst twitchArctic = new Twitch(\n\t\toptions.clientId,\n\t\toptions.clientSecret,\n\t\tgetRedirectURI(\"twitch\", options.redirectURI),\n\t);\n\treturn {\n\t\tid: \"twitch\",\n\t\tname: \"Twitch\",\n\t\tcreateAuthorizationURL({ state, scopes }) {\n\t\t\tconst _scopes = scopes || [\"activity:write\", \"read\"];\n\t\t\treturn twitchArctic.createAuthorizationURL(state, _scopes);\n\t\t},\n\t\tvalidateAuthorizationCode: async (code, codeVerifier, redirectURI) => {\n\t\t\treturn validateAuthorizationCode({\n\t\t\t\tcode,\n\t\t\t\tcodeVerifier,\n\t\t\t\tredirectURI:\n\t\t\t\t\tredirectURI || getRedirectURI(\"twitch\", options.redirectURI),\n\t\t\t\toptions,\n\t\t\t\ttokenEndpoint: \"https://id.twitch.tv/oauth2/token\",\n\t\t\t});\n\t\t},\n\t\tasync getUserInfo(token) {\n\t\t\tconst { data: profile, error } = await betterFetch<TwitchProfile>(\n\t\t\t\t\"https://api.twitch.tv/helix/users\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer ${token.accessToken()}`,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (error) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tuser: {\n\t\t\t\t\tid: profile.sub,\n\t\t\t\t\tname: profile.preferred_username,\n\t\t\t\t\temail: profile.email,\n\t\t\t\t\timage: profile.picture,\n\t\t\t\t\temailVerified: false,\n\t\t\t\t},\n\t\t\t\tdata: profile,\n\t\t\t};\n\t\t},\n\t} satisfies OAuthProvider<TwitchProfile>;\n};\n","import { betterFetch } from \"@better-fetch/fetch\";\nimport { Twitter } from \"arctic\";\nimport type { OAuthProvider } from \".\";\nimport { getRedirectURI, validateAuthorizationCode } from \"./utils\";\nimport { BetterAuthError } from \"../error/better-auth-error\";\n\nexport interface TwitterProfile {\n\tdata: {\n\t\t/**\n\t\t * Unique identifier of this user. This is returned as a string in order to avoid complications with languages and tools\n\t\t * that cannot handle large integers.\n\t\t */\n\t\tid: string;\n\t\t/** The friendly name of this user, as shown on their profile. */\n\t\tname: string;\n\t\t/** @note Email is currently unsupported by Twitter. */\n\t\temail?: string;\n\t\t/** The Twitter handle (screen name) of this user. */\n\t\tusername: string;\n\t\t/**\n\t\t * The location specified in the user's profile, if the user provided one.\n\t\t * As this is a freeform value, it may not indicate a valid location, but it may be fuzzily evaluated when performing searches with location queries.\n\t\t *\n\t\t * To return this field, add `user.fields=location` in the authorization request's query parameter.\n\t\t */\n\t\tlocation?: string;\n\t\t/**\n\t\t * This object and its children fields contain details about text that has a special meaning in the user's description.\n\t\t *\n\t\t *To return this field, add `user.fields=entities` in the authorization request's query parameter.\n\t\t */\n\t\tentities?: {\n\t\t\t/** Contains details about the user's profile website. */\n\t\t\turl: {\n\t\t\t\t/** Contains details about the user's profile website. */\n\t\t\t\turls: Array<{\n\t\t\t\t\t/** The start position (zero-based) of the recognized user's profile website. All start indices are inclusive. */\n\t\t\t\t\tstart: number;\n\t\t\t\t\t/** The end position (zero-based) of the recognized user's profile website. This end index is exclusive. */\n\t\t\t\t\tend: number;\n\t\t\t\t\t/** The URL in the format entered by the user. */\n\t\t\t\t\turl: string;\n\t\t\t\t\t/** The fully resolved URL. */\n\t\t\t\t\texpanded_url: string;\n\t\t\t\t\t/** The URL as displayed in the user's profile. */\n\t\t\t\t\tdisplay_url: string;\n\t\t\t\t}>;\n\t\t\t};\n\t\t\t/** Contains details about URLs, Hashtags, Cashtags, or mentions located within a user's description. */\n\t\t\tdescription: {\n\t\t\t\thashtags: Array<{\n\t\t\t\t\tstart: number;\n\t\t\t\t\tend: number;\n\t\t\t\t\ttag: string;\n\t\t\t\t}>;\n\t\t\t};\n\t\t};\n\t\t/**\n\t\t * Indicate if this user is a verified Twitter user.\n\t\t *\n\t\t * To return this field, add `user.fields=verified` in the authorization request's query parameter.\n\t\t */\n\t\tverified?: boolean;\n\t\t/**\n\t\t * The text of this user's profile description (also known as bio), if the user provided one.\n\t\t *\n\t\t * To return this field, add `user.fields=description` in the authorization request's query parameter.\n\t\t */\n\t\tdescription?: string;\n\t\t/**\n\t\t * The URL specified in the user's profile, if present.\n\t\t *\n\t\t * To return this field, add `user.fields=url` in the authorization request's query parameter.\n\t\t */\n\t\turl?: string;\n\t\t/** The URL to the profile image for this user, as shown on the user's profile. */\n\t\tprofile_image_url?: string;\n\t\tprotected?: boolean;\n\t\t/**\n\t\t * Unique identifier of this user's pinned Tweet.\n\t\t *\n\t\t * You can obtain the expanded object in `includes.tweets` by adding `expansions=pinned_tweet_id` in the authorization request's query parameter.\n\t\t */\n\t\tpinned_tweet_id?: string;\n\t\tcreated_at?: string;\n\t};\n\tincludes?: {\n\t\ttweets?: Array<{\n\t\t\tid: string;\n\t\t\ttext: string;\n\t\t}>;\n\t};\n\t[claims: string]: unknown;\n}\n\nexport interface TwitterOption {\n\tclientId: string;\n\tclientSecret: string;\n\tredirectURI?: string;\n}\n\nexport const twitter = (options: TwitterOption) => {\n\tconst twitterArctic = new Twitter(\n\t\toptions.clientId,\n\t\toptions.clientSecret,\n\t\tgetRedirectURI(\"twitter\", options.redirectURI),\n\t);\n\treturn {\n\t\tid: \"twitter\",\n\t\tname: \"Twitter\",\n\t\tcreateAuthorizationURL(data) {\n\t\t\tconst _scopes = data.scopes || [\"account_info.read\"];\n\t\t\treturn twitterArctic.createAuthorizationURL(\n\t\t\t\tdata.state,\n\t\t\t\tdata.codeVerifier,\n\t\t\t\t_scopes,\n\t\t\t);\n\t\t},\n\t\tvalidateAuthorizationCode: async (code, codeVerifier, redirectURI) => {\n\t\t\treturn validateAuthorizationCode({\n\t\t\t\tcode,\n\t\t\t\tcodeVerifier,\n\t\t\t\tredirectURI:\n\t\t\t\t\tredirectURI || getRedirectURI(\"twitch\", options.redirectURI),\n\t\t\t\toptions,\n\t\t\t\ttokenEndpoint: \"https://id.twitch.tv/oauth2/token\",\n\t\t\t});\n\t\t},\n\t\tasync getUserInfo(token) {\n\t\t\tconst { data: profile, error } = await betterFetch<TwitterProfile>(\n\t\t\t\t\"https://api.x.com/2/users/me?user.fields=profile_image_url\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer ${token.accessToken()}`,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (error) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (!profile.data.email) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tuser: {\n\t\t\t\t\tid: profile.data.id,\n\t\t\t\t\tname: profile.data.name,\n\t\t\t\t\temail: profile.data.email,\n\t\t\t\t\timage: profile.data.profile_image_url,\n\t\t\t\t\temailVerified: profile.data.verified || false,\n\t\t\t\t},\n\t\t\t\tdata: profile,\n\t\t\t};\n\t\t},\n\t} satisfies OAuthProvider<TwitterProfile>;\n};\n","import { apple } from \"./apple\";\nimport { discord } from \"./discord\";\nimport { facebook } from \"./facebook\";\nimport { github } from \"./github\";\nimport { google } from \"./google\";\nimport { spotify } from \"./spotify\";\nimport { twitch } from \"./twitch\";\nimport { twitter } from \"./twitter\";\n\nexport const oAuthProviders = {\n\tapple,\n\tdiscord,\n\tfacebook,\n\tgithub,\n\tgoogle,\n\tspotify,\n\ttwitch,\n\ttwitter,\n};\n\nexport const oAuthProviderList = Object.keys(oAuthProviders) as [\n\t\"github\",\n\t...(keyof typeof oAuthProviders)[],\n];\n\nexport * from \"./github\";\nexport * from \"./google\";\nexport * from \"./apple\";\nexport * from \"./discord\";\nexport * from \"./spotify\";\nexport * from \"./twitch\";\nexport * from \"./facebook\";\nexport * from \"./twitter\";\nexport * from \"../types/provider\";\n","import { generateState as generateStateOAuth } from \"oslo/oauth2\";\nimport { z } from \"zod\";\n\nexport function generateState(\n\tcallbackURL?: string,\n\tcurrentURL?: string,\n\tdontRememberMe?: boolean,\n) {\n\tconst code = generateStateOAuth();\n\tconst state = JSON.stringify({\n\t\tcode,\n\t\tcallbackURL,\n\t\tcurrentURL,\n\t\tdontRememberMe,\n\t});\n\treturn { state, code };\n}\n\nexport function parseState(state: string) {\n\tconst data = z\n\t\t.object({\n\t\t\tcode: z.string(),\n\t\t\tcallbackURL: z.string().optional(),\n\t\t\tcurrentURL: z.string().optional(),\n\t\t\tdontRememberMe: z.boolean().optional(),\n\t\t})\n\t\t.safeParse(JSON.parse(state));\n\treturn data;\n}\n","export const getDate = (span: number, isSeconds = false) => {\n\tconst date = new Date();\n\treturn new Date(date.getTime() + (isSeconds ? span * 1000 : span));\n};\n","import type { Context, CookieOptions } from \"better-call\";\nimport { TimeSpan } from \"oslo\";\nimport type { BetterAuthOptions } from \"../types/options\";\nimport type { GenericEndpointContext } from \"../types/context\";\n\nexport function getCookies(options: BetterAuthOptions) {\n\tconst secure =\n\t\t!!options.advanced?.useSecureCookies ||\n\t\t(process.env.NODE_ENV !== \"development\" && process.env.NODE_ENV !== \"test\");\n\tconst secureCookiePrefix = secure ? \"__Secure-\" : \"\";\n\tconst cookiePrefix = \"better-auth\";\n\tconst sessionMaxAge = new TimeSpan(7, \"d\").seconds();\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: \"lax\",\n\t\t\t\tpath: \"/\",\n\t\t\t\tsecure: !!secureCookiePrefix,\n\t\t\t\tmaxAge: sessionMaxAge,\n\t\t\t} satisfies CookieOptions,\n\t\t},\n\t\tcsrfToken: {\n\t\t\tname: `${secureCookiePrefix ? \"__Host-\" : \"\"}${cookiePrefix}.csrf_token`,\n\t\t\toptions: {\n\t\t\t\thttpOnly: true,\n\t\t\t\tsameSite: \"lax\",\n\t\t\t\tpath: \"/\",\n\t\t\t\tsecure: !!secureCookiePrefix,\n\t\t\t\tmaxAge: 60 * 60 * 24 * 7,\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: \"lax\",\n\t\t\t\tpath: \"/\",\n\t\t\t\tsecure: !!secureCookiePrefix,\n\t\t\t\tmaxAge: 60 * 15, // 15 minutes in seconds\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: \"lax\",\n\t\t\t\tpath: \"/\",\n\t\t\t\tsecure: !!secureCookiePrefix,\n\t\t\t\tmaxAge: 60 * 15, // 15 minutes in seconds\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: \"lax\",\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} 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: \"lax\",\n\t\t\t\tpath: \"/\",\n\t\t\t\tsecure: !!secureCookiePrefix,\n\t\t\t\tmaxAge: 60 * 15, // 15 minutes in seconds\n\t\t\t} as CookieOptions,\n\t\t},\n\t};\n}\n\nexport function createCookieGetter(options: BetterAuthOptions) {\n\tconst secure =\n\t\t!!options.advanced?.useSecureCookies ||\n\t\tprocess.env.NODE_ENV === \"production\";\n\tconst secureCookiePrefix = secure ? \"__Secure-\" : \"\";\n\tconst cookiePrefix = \"better-auth\";\n\tfunction getCookie(cookieName: string, options?: CookieOptions) {\n\t\treturn {\n\t\t\tname:\n\t\t\t\tprocess.env.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...options,\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 ? undefined : options.maxAge;\n\tawait ctx.setSignedCookie(\n\t\tctx.context.authCookies.sessionToken.name,\n\t\tsessionToken,\n\t\tctx.context.secret,\n\t\toptions,\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\t// biome-ignore lint/complexity/noForEach: <explanation>\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\t// biome-ignore lint/complexity/noForEach: <explanation>\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}\n","import { APIError } from \"better-call\";\nimport { createAuthMiddleware } from \"../call\";\nimport { getSessionFromCtx } from \"../routes\";\n\nexport const sessionMiddleware = createAuthMiddleware(async (ctx) => {\n\tconst session = await getSessionFromCtx(ctx);\n\tif (!session?.session) {\n\t\tthrow new APIError(\"UNAUTHORIZED\");\n\t}\n\treturn {\n\t\tsession,\n\t};\n});\n","import type { Context } from \"better-call\";\nimport { createAuthEndpoint } from \"../call\";\nimport { getDate } from \"../../utils/date\";\nimport { deleteSessionCookie, setSessionCookie } from \"../../utils/cookies\";\nimport { sessionMiddleware } from \"../middlewares/session\";\nimport type { Session } from \"../../adapters/schema\";\nimport { z } from \"zod\";\n\nexport const getSession = createAuthEndpoint(\n\t\"/session\",\n\t{\n\t\tmethod: \"GET\",\n\t\trequireHeaders: true,\n\t},\n\tasync (ctx) => {\n\t\ttry {\n\t\t\tconst sessionCookieToken = await ctx.getSignedCookie(\n\t\t\t\tctx.context.authCookies.sessionToken.name,\n\t\t\t\tctx.context.secret,\n\t\t\t);\n\n\t\t\tif (!sessionCookieToken) {\n\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\tstatus: 401,\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst session =\n\t\t\t\tawait ctx.context.internalAdapter.findSession(sessionCookieToken);\n\n\t\t\tif (!session || session.session.expiresAt < new Date()) {\n\t\t\t\tdeleteSessionCookie(ctx);\n\t\t\t\tif (session) {\n\t\t\t\t\t/**\n\t\t\t\t\t * if session expired clean up the session\n\t\t\t\t\t */\n\t\t\t\t\tawait ctx.context.internalAdapter.deleteSession(session.session.id);\n\t\t\t\t}\n\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\tstatus: 401,\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst dontRememberMe = await ctx.getSignedCookie(\n\t\t\t\tctx.context.authCookies.dontRememberToken.name,\n\t\t\t\tctx.context.secret,\n\t\t\t);\n\t\t\t/**\n\t\t\t * We don't need to update the session if the user doesn't want to be remembered\n\t\t\t */\n\t\t\tif (dontRememberMe) {\n\t\t\t\treturn ctx.json(session);\n\t\t\t}\n\t\t\tconst expiresIn = ctx.context.session.expiresIn;\n\t\t\tconst updateAge = ctx.context.session.updateAge;\n\t\t\t/**\n\t\t\t * Calculate last updated date to throttle write updates to database\n\t\t\t * Formula: ({expiry date} - sessionMaxAge) + sessionUpdateAge\n\t\t\t *\n\t\t\t * e.g. ({expiry date} - 30 days) + 1 hour\n\t\t\t *\n\t\t\t * inspired by: https://github.com/nextauthjs/next-auth/blob/main/packages/core/src/lib/\n\t\t\t * actions/session.ts\n\t\t\t */\n\t\t\tconst sessionIsDueToBeUpdatedDate =\n\t\t\t\tsession.session.expiresAt.valueOf() -\n\t\t\t\texpiresIn * 1000 +\n\t\t\t\tupdateAge * 1000;\n\t\t\tconst shouldBeUpdated = sessionIsDueToBeUpdatedDate <= Date.now();\n\n\t\t\tif (shouldBeUpdated) {\n\t\t\t\tconst updatedSession = await ctx.context.internalAdapter.updateSession(\n\t\t\t\t\tsession.session.id,\n\t\t\t\t\t{\n\t\t\t\t\t\texpiresAt: getDate(ctx.context.session.expiresIn, true),\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (!updatedSession) {\n\t\t\t\t\t/**\n\t\t\t\t\t * Handle case where session update fails (e.g., concurrent deletion)\n\t\t\t\t\t */\n\t\t\t\t\tdeleteSessionCookie(ctx);\n\t\t\t\t\treturn ctx.json(null, { status: 401 });\n\t\t\t\t}\n\t\t\t\tconst maxAge = (updatedSession.expiresAt.valueOf() - Date.now()) / 1000;\n\t\t\t\tawait setSessionCookie(ctx, updatedSession.id, false, {\n\t\t\t\t\tmaxAge,\n\t\t\t\t});\n\t\t\t\treturn ctx.json({\n\t\t\t\t\tsession: updatedSession,\n\t\t\t\t\tuser: session.user,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn ctx.json(session);\n\t\t} catch (error) {\n\t\t\tctx.context.logger.error(error);\n\t\t\treturn ctx.json(null, { status: 500 });\n\t\t}\n\t},\n);\n\nexport const getSessionFromCtx = async (ctx: Context<any, any>) => {\n\tconst session = await getSession({\n\t\t...ctx,\n\t\t//@ts-expect-error: By default since this request context comes from a router it'll have a `router` flag which force it to be a request object\n\t\t_flag: undefined,\n\t});\n\treturn session;\n};\n\n/**\n * user active sessions list\n */\nexport const listSessions = createAuthEndpoint(\n\t\"/user/list-sessions\",\n\t{\n\t\tmethod: \"GET\",\n\t\tuse: [sessionMiddleware],\n\t\trequireHeaders: true,\n\t},\n\tasync (ctx) => {\n\t\tconst sessions = await ctx.context.adapter.findMany<Session>({\n\t\t\tmodel: ctx.context.tables.session.tableName,\n\t\t\twhere: [\n\t\t\t\t{\n\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\tvalue: ctx.context.session.user.id,\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t\tconst activeSessions = sessions.filter((session) => {\n\t\t\treturn session.expiresAt > new Date();\n\t\t});\n\t\treturn ctx.json(activeSessions);\n\t},\n);\n\n/**\n * revoke a single session\n */\nexport const revokeSession = createAuthEndpoint(\n\t\"/user/revoke-session\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\tid: z.string(),\n\t\t}),\n\t\tuse: [sessionMiddleware],\n\t\trequireHeaders: true,\n\t},\n\tasync (ctx) => {\n\t\tconst id = ctx.body.id;\n\t\tawait ctx.context.internalAdapter.deleteSession(id);\n\t\treturn ctx.json({\n\t\t\tstatus: true,\n\t\t});\n\t},\n);\n/**\n * revoke all user sessions\n */\nexport const revokeSessions = createAuthEndpoint(\n\t\"/user/revoke-sessions\",\n\t{\n\t\tmethod: \"POST\",\n\t\tuse: [sessionMiddleware],\n\t\trequireHeaders: true,\n\t},\n\tasync (ctx) => {\n\t\tawait ctx.context.internalAdapter.deleteSessions(\n\t\t\tctx.context.session.user.id,\n\t\t);\n\t\treturn ctx.json({\n\t\t\tstatus: true,\n\t\t});\n\t},\n);\n","import { APIError } from \"better-call\";\nimport { generateCodeVerifier } from \"oslo/oauth2\";\nimport { z } from \"zod\";\nimport { oAuthProviderList } from \"../../social-providers\";\nimport { generateState } from \"../../utils/state\";\nimport { createAuthEndpoint } from \"../call\";\nimport { getSessionFromCtx } from \"./session\";\nimport { setSessionCookie } from \"../../utils/cookies\";\n\nexport const signInOAuth = createAuthEndpoint(\n\t\"/sign-in/social\",\n\t{\n\t\tmethod: \"POST\",\n\t\trequireHeaders: true,\n\t\tquery: z\n\t\t\t.object({\n\t\t\t\t/**\n\t\t\t\t * Redirect to the current URL after the\n\t\t\t\t * user has signed in.\n\t\t\t\t */\n\t\t\t\tcurrentURL: z.string().optional(),\n\t\t\t})\n\t\t\t.optional(),\n\t\tbody: z.object({\n\t\t\t/**\n\t\t\t * Callback URL to redirect to after the user has signed in.\n\t\t\t */\n\t\t\tcallbackURL: z.string().optional(),\n\t\t\t/**\n\t\t\t * OAuth2 provider to use`\n\t\t\t */\n\t\t\tprovider: z.enum(oAuthProviderList),\n\t\t\t/**\n\t\t\t * If this is true the session will only be valid for the current browser session\n\t\t\t */\n\t\t\tdontRememberMe: z.boolean().default(false).optional(),\n\t\t}),\n\t},\n\tasync (c) => {\n\t\tconst provider = c.context.options.socialProvider?.find(\n\t\t\t(p) => p.id === c.body.provider,\n\t\t);\n\t\tif (!provider) {\n\t\t\tc.context.logger.error(\n\t\t\t\t\"Provider not found. Make sure to add the provider to your auth config\",\n\t\t\t\t{\n\t\t\t\t\tprovider: c.body.provider,\n\t\t\t\t},\n\t\t\t);\n\t\t\tthrow new APIError(\"NOT_FOUND\", {\n\t\t\t\tmessage: \"Provider not found\",\n\t\t\t});\n\t\t}\n\t\tconst cookie = c.context.authCookies;\n\t\tconst currentURL = c.query?.currentURL\n\t\t\t? new URL(c.query?.currentURL)\n\t\t\t: null;\n\t\tconst callbackURL = c.body.callbackURL?.startsWith(\"http\")\n\t\t\t? c.body.callbackURL\n\t\t\t: `${currentURL?.origin}${c.body.callbackURL || \"\"}`;\n\t\tconst state = generateState(\n\t\t\tcallbackURL || currentURL?.origin || c.context.baseURL,\n\t\t\tc.query?.currentURL,\n\t\t);\n\t\ttry {\n\t\t\tawait c.setSignedCookie(\n\t\t\t\tcookie.state.name,\n\t\t\t\tstate.code,\n\t\t\t\tc.context.secret,\n\t\t\t\tcookie.state.options,\n\t\t\t);\n\t\t\tconst codeVerifier = generateCodeVerifier();\n\t\t\tawait c.setSignedCookie(\n\t\t\t\tcookie.pkCodeVerifier.name,\n\t\t\t\tcodeVerifier,\n\t\t\t\tc.context.secret,\n\t\t\t\tcookie.pkCodeVerifier.options,\n\t\t\t);\n\t\t\tconst url = provider.createAuthorizationURL({\n\t\t\t\tstate: state.state,\n\t\t\t\tcodeVerifier,\n\t\t\t});\n\t\t\turl.searchParams.set(\n\t\t\t\t\"redirect_uri\",\n\t\t\t\t`${c.context.baseURL}/callback/${c.body.provider}`,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\turl: url.toString(),\n\t\t\t\tstate: state.state,\n\t\t\t\tcodeVerifier,\n\t\t\t\tredirect: true,\n\t\t\t};\n\t\t} catch (e) {\n\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\");\n\t\t}\n\t},\n);\n\nexport const signInEmail = createAuthEndpoint(\n\t\"/sign-in/email\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\temail: z.string().email(),\n\t\t\tpassword: z.string(),\n\t\t\tcallbackURL: z.string().optional(),\n\t\t\t/**\n\t\t\t * If this is true the session will only be valid for the current browser session\n\t\t\t * @default false\n\t\t\t */\n\t\t\tdontRememberMe: z.boolean().default(false).optional(),\n\t\t}),\n\t},\n\tasync (ctx) => {\n\t\tif (!ctx.context.options?.emailAndPassword?.enabled) {\n\t\t\tctx.context.logger.error(\"Email and password is not enabled\");\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Email and password is not enabled\",\n\t\t\t});\n\t\t}\n\t\tconst currentSession = await getSessionFromCtx(ctx);\n\t\tif (currentSession) {\n\t\t\t/**\n\t\t\t * Delete the current session if it exists\n\t\t\t */\n\t\t\tawait ctx.context.internalAdapter.deleteSession(\n\t\t\t\tcurrentSession.session.id,\n\t\t\t);\n\t\t}\n\t\tconst { email, password } = ctx.body;\n\t\tconst checkEmail = z.string().email().safeParse(email);\n\t\tif (!checkEmail.success) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Invalid email\",\n\t\t\t});\n\t\t}\n\t\tconst user = await ctx.context.internalAdapter.findUserByEmail(email);\n\t\tif (!user) {\n\t\t\tawait ctx.context.password.hash(password);\n\t\t\tctx.context.logger.error(\"User not found\", { email });\n\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\tmessage: \"Invalid email or password\",\n\t\t\t});\n\t\t}\n\t\tconst credentialAccount = user.accounts.find(\n\t\t\t(a) => a.providerId === \"credential\",\n\t\t);\n\t\tif (!credentialAccount) {\n\t\t\tctx.context.logger.error(\"Credential account not found\", { email });\n\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\tmessage: \"Invalid email or password\",\n\t\t\t});\n\t\t}\n\t\tconst currentPassword = credentialAccount?.password;\n\t\tif (!currentPassword) {\n\t\t\tctx.context.logger.error(\"Password not found\", { email });\n\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\tmessage: \"Unexpected error\",\n\t\t\t});\n\t\t}\n\t\tconst validPassword = await ctx.context.password.verify(\n\t\t\tcurrentPassword,\n\t\t\tpassword,\n\t\t);\n\t\tif (!validPassword) {\n\t\t\tctx.context.logger.error(\"Invalid password\");\n\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\tmessage: \"Invalid email or password\",\n\t\t\t});\n\t\t}\n\t\tconst session = await ctx.context.internalAdapter.createSession(\n\t\t\tuser.user.id,\n\t\t\tctx.headers,\n\t\t\tctx.body.dontRememberMe,\n\t\t);\n\t\tawait setSessionCookie(ctx, session.id, ctx.body.dontRememberMe);\n\t\treturn ctx.json({\n\t\t\tuser: user.user,\n\t\t\tsession,\n\t\t\tredirect: !!ctx.body.callbackURL,\n\t\t\turl: ctx.body.callbackURL,\n\t\t});\n\t},\n);\n","import { z } from \"zod\";\nimport type { FieldAttribute } from \"../db\";\nimport type { BetterAuthOptions } from \"../types\";\n\nexport const accountSchema = z.object({\n\tid: z.string(),\n\tproviderId: z.string(),\n\taccountId: z.string(),\n\tuserId: z.string(),\n\taccessToken: z.string().nullable().optional(),\n\trefreshToken: z.string().nullable().optional(),\n\tidToken: z.string().nullable().optional(),\n\taccessTokenExpiresAt: z.date().nullable().optional(),\n\trefreshTokenExpiresAt: z.date().nullable().optional(),\n\t/**\n\t * Password is only stored in the credential provider\n\t */\n\tpassword: z.string().optional().nullable(),\n});\n\nexport const userSchema = z.object({\n\tid: z.string(),\n\temail: z.string().transform((val) => val.toLowerCase()),\n\temailVerified: z.boolean().default(false),\n\tname: z.string(),\n\timage: z.string().optional(),\n\tcreatedAt: z.date().default(new Date()),\n\tupdatedAt: z.date().default(new Date()),\n});\n\nexport const sessionSchema = z.object({\n\tid: z.string(),\n\tuserId: z.string(),\n\texpiresAt: z.date(),\n\tipAddress: z.string().optional(),\n\tuserAgent: z.string().optional(),\n});\n\nexport type User = z.infer<typeof userSchema>;\nexport type Account = z.infer<typeof accountSchema>;\nexport type Session = z.infer<typeof sessionSchema>;\nexport interface MigrationTable {\n\tname: string;\n\ttimestamp: string;\n}\n\nexport function parseData<T extends Record<string, any>>(\n\tdata: T,\n\tschema: {\n\t\tfields: Record<string, FieldAttribute>;\n\t},\n) {\n\tconst fields = schema.fields;\n\tconst parsedData: Record<string, any> = {};\n\tfor (const key in data) {\n\t\tconst field = fields[key];\n\t\tif (!field) {\n\t\t\tparsedData[key] = data[key];\n\t\t\tcontinue;\n\t\t}\n\t\tif (field.returned === false) {\n\t\t\tcontinue;\n\t\t}\n\t\tparsedData[key] = data[key];\n\t}\n\treturn parsedData as T;\n}\n\nexport function getAllFields(options: BetterAuthOptions, table: string) {\n\tlet schema: Record<string, FieldAttribute> = {};\n\tfor (const plugin of options.plugins || []) {\n\t\tif (plugin.schema && plugin.schema[table]) {\n\t\t\tschema = {\n\t\t\t\t...schema,\n\t\t\t\t...plugin.schema[table].fields,\n\t\t\t};\n\t\t}\n\t}\n\treturn schema;\n}\n\nexport function parseUser(options: BetterAuthOptions, user: User) {\n\tconst schema = getAllFields(options, \"user\");\n\treturn parseData(user, { fields: schema });\n}\n\nexport function parseAccount(options: BetterAuthOptions, account: Account) {\n\tconst schema = getAllFields(options, \"account\");\n\treturn parseData(account, { fields: schema });\n}\n\nexport function parseSession(options: BetterAuthOptions, session: Session) {\n\tconst schema = getAllFields(options, \"session\");\n\treturn parseData(session, { fields: schema });\n}\n","import { alphabet, generateRandomString } from \"oslo/crypto\";\nexport const generateId = () => {\n\treturn generateRandomString(36, alphabet(\"a-z\", \"0-9\"));\n};\n","export const HIDE_METADATA = {\n\tisAction: false as const,\n};\n","import type { OAuth2Tokens } from \"arctic\";\n\nexport function getAccountTokens(tokens: OAuth2Tokens) {\n\tconst accessToken = tokens.accessToken();\n\tlet refreshToken = undefined;\n\n\ttry {\n\t\trefreshToken = tokens.refreshToken();\n\t} catch {}\n\tlet accessTokenExpiresAt = undefined;\n\tlet refreshTokenExpiresAt = undefined;\n\ttry {\n\t\taccessTokenExpiresAt = tokens.accessTokenExpiresAt();\n\t} catch {}\n\ttry {\n\t\trefreshTokenExpiresAt = tokens.refreshTokenExpiresAt();\n\t} catch {}\n\treturn {\n\t\taccessToken,\n\t\trefreshToken,\n\t\taccessTokenExpiresAt,\n\t\trefreshTokenExpiresAt,\n\t};\n}\n","import { APIError } from \"better-call\";\nimport { z } from \"zod\";\nimport { userSchema } from \"../../adapters/schema\";\nimport { generateId } from \"../../utils/id\";\nimport { parseState } from \"../../utils/state\";\nimport { createAuthEndpoint } from \"../call\";\nimport { HIDE_METADATA } from \"../../utils/hide-metadata\";\nimport { getAccountTokens } from \"../../utils/getAccount\";\nimport { setSessionCookie } from \"../../utils/cookies\";\nimport type { OAuth2Tokens } from \"arctic\";\n\nexport const callbackOAuth = createAuthEndpoint(\n\t\"/callback/:id\",\n\t{\n\t\tmethod: \"GET\",\n\t\tquery: z.object({\n\t\t\tstate: z.string(),\n\t\t\tcode: z.string(),\n\t\t}),\n\t\tmetadata: HIDE_METADATA,\n\t},\n\tasync (c) => {\n\t\tconst provider = c.context.options.socialProvider?.find(\n\t\t\t(p) => p.id === c.params.id,\n\t\t);\n\t\tif (!provider) {\n\t\t\tc.context.logger.error(\n\t\t\t\t\"Oauth provider with id\",\n\t\t\t\tc.params.id,\n\t\t\t\t\"not found\",\n\t\t\t);\n\t\t\tthrow c.redirect(\n\t\t\t\t`${c.context.baseURL}/error?error=oauth_provider_not_found`,\n\t\t\t);\n\t\t}\n\t\tconst codeVerifier = await c.getSignedCookie(\n\t\t\tc.context.authCookies.pkCodeVerifier.name,\n\t\t\tc.context.secret,\n\t\t);\n\t\tlet tokens: OAuth2Tokens;\n\t\ttry {\n\t\t\tconsole.log({\n\t\t\t\tdata: c.query.code,\n\t\t\t\tcodeVerifier,\n\t\t\t});\n\t\t\ttokens = await provider.validateAuthorizationCode(\n\t\t\t\tc.query.code,\n\t\t\t\tcodeVerifier,\n\t\t\t\t`${c.context.baseURL}/callback/${provider.id}`,\n\t\t\t);\n\t\t} catch (e) {\n\t\t\tc.context.logger.error(e);\n\t\t\tthrow c.redirect(\n\t\t\t\t`${c.context.baseURL}/error?error=oauth_code_verification_failed`,\n\t\t\t);\n\t\t}\n\n\t\tconst user = await provider.getUserInfo(tokens).then((res) => res?.user);\n\t\tconst id = generateId();\n\t\tconst data = userSchema.safeParse({\n\t\t\t...user,\n\t\t\tid,\n\t\t});\n\t\tconst parsedState = parseState(c.query.state);\n\t\tif (!parsedState.success) {\n\t\t\tc.context.logger.error(\"Unable to parse state\");\n\t\t\tthrow c.redirect(\n\t\t\t\t`${c.context.baseURL}/error?error=invalid_state_parameter`,\n\t\t\t);\n\t\t}\n\t\tconst { callbackURL, currentURL, dontRememberMe } = parsedState.data;\n\t\tif (!user || data.success === false) {\n\t\t\tthrow c.redirect(\n\t\t\t\t`${c.context.baseURL}/error?error=oauth_validation_failed`,\n\t\t\t);\n\t\t}\n\t\tif (!callbackURL) {\n\t\t\tthrow c.redirect(\n\t\t\t\t`${c.context.baseURL}/error?error=oauth_callback_url_not_found`,\n\t\t\t);\n\t\t}\n\t\t//find user in db\n\t\tconst dbUser = await c.context.internalAdapter.findUserByEmail(user.email);\n\t\tconst userId = dbUser?.user.id;\n\t\tif (dbUser) {\n\t\t\t//check if user has already linked this provider\n\t\t\tconst hasBeenLinked = dbUser.accounts.find(\n\t\t\t\t(a) => a.providerId === provider.id,\n\t\t\t);\n\t\t\tif (!hasBeenLinked && !user.emailVerified) {\n\t\t\t\tc.context.logger.error(\"User already exists\");\n\t\t\t\tconst url = new URL(currentURL || callbackURL);\n\t\t\t\turl.searchParams.set(\"error\", \"user_already_exists\");\n\t\t\t\tthrow c.redirect(url.toString());\n\t\t\t}\n\n\t\t\tif (!hasBeenLinked && user.emailVerified) {\n\t\t\t\tawait c.context.internalAdapter.linkAccount({\n\t\t\t\t\tproviderId: provider.id,\n\t\t\t\t\taccountId: user.id,\n\t\t\t\t\tid: `${provider.id}:${user.id}`,\n\t\t\t\t\tuserId: dbUser.user.id,\n\t\t\t\t\t...getAccountTokens(tokens),\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tawait c.context.internalAdapter.createOAuthUser(data.data, {\n\t\t\t\t\t...getAccountTokens(tokens),\n\t\t\t\t\tid: `${provider.id}:${user.id}`,\n\t\t\t\t\tproviderId: provider.id,\n\t\t\t\t\taccountId: user.id,\n\t\t\t\t\tuserId: id,\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tconst url = new URL(currentURL || callbackURL);\n\t\t\t\turl.searchParams.set(\"error\", \"unable_to_create_user\");\n\t\t\t\tc.setHeader(\"Location\", url.toString());\n\t\t\t\tthrow c.redirect(url.toString());\n\t\t\t}\n\t\t}\n\t\t//this should never happen\n\t\tif (!userId && !id)\n\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\tmessage: \"Unable to create user\",\n\t\t\t});\n\t\t//create session\n\t\tconst session = await c.context.internalAdapter.createSession(\n\t\t\tuserId || id,\n\t\t\tc.request,\n\t\t\tdontRememberMe,\n\t\t);\n\t\ttry {\n\t\t\tawait setSessionCookie(c, session.id, dontRememberMe);\n\t\t} catch (e) {\n\t\t\tc.context.logger.error(\"Unable to set session cookie\", e);\n\t\t\tconst url = new URL(currentURL || callbackURL);\n\t\t\turl.searchParams.set(\"error\", \"unable_to_create_session\");\n\t\t\tthrow c.redirect(url.toString());\n\t\t}\n\t\tthrow c.redirect(callbackURL);\n\t},\n);\n","import { z } from \"zod\";\nimport { createAuthEndpoint } from \"../call\";\nimport { deleteSessionCookie } from \"../../utils/cookies\";\n\nexport const signOut = createAuthEndpoint(\n\t\"/sign-out\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z\n\t\t\t.object({\n\t\t\t\tcallbackURL: z.string().optional(),\n\t\t\t})\n\t\t\t.optional(),\n\t},\n\tasync (ctx) => {\n\t\tconst sessionCookieToken = await ctx.getSignedCookie(\n\t\t\tctx.context.authCookies.sessionToken.name,\n\t\t\tctx.context.secret,\n\t\t);\n\t\tif (!sessionCookieToken) {\n\t\t\treturn ctx.json(null);\n\t\t}\n\t\tawait ctx.context.internalAdapter.deleteSession(sessionCookieToken);\n\t\tdeleteSessionCookie(ctx);\n\t\treturn ctx.json(null, {\n\t\t\tbody: {\n\t\t\t\tredirect: !!ctx.body?.callbackURL,\n\t\t\t\turl: ctx.body?.callbackURL,\n\t\t\t},\n\t\t});\n\t},\n);\n","import { TimeSpan } from \"oslo\";\nimport { createJWT } from \"oslo/jwt\";\nimport { validateJWT } from \"oslo/jwt\";\nimport { z } from \"zod\";\nimport { createAuthEndpoint } from \"../call\";\n\nexport const forgetPassword = createAuthEndpoint(\n\t\"/forget-password\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\t/**\n\t\t\t * The email address of the user to send a password reset email to.\n\t\t\t */\n\t\t\temail: z.string().email(),\n\t\t}),\n\t},\n\tasync (ctx) => {\n\t\tif (!ctx.context.options.emailAndPassword?.sendResetPasswordToken) {\n\t\t\tctx.context.logger.error(\n\t\t\t\t\"Reset password isn't enabled.Please pass an emailAndPassword.sendResetPasswordToken function to your auth config!\",\n\t\t\t);\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tstatusText: \"RESET_PASSWORD_EMAIL_NOT_SENT\",\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Reset password isn't enabled\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst { email } = ctx.body;\n\t\tconst user = await ctx.context.internalAdapter.findUserByEmail(email);\n\t\tif (!user) {\n\t\t\treturn ctx.json(\n\t\t\t\t{\n\t\t\t\t\terror: \"User not found\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tstatus: 400,\n\t\t\t\t\tstatusText: \"USER_NOT_FOUND\",\n\t\t\t\t\tbody: {\n\t\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\tconst token = await createJWT(\n\t\t\t\"HS256\",\n\t\t\tBuffer.from(ctx.context.secret),\n\t\t\t{\n\t\t\t\temail: user.user.email,\n\t\t\t},\n\t\t\t{\n\t\t\t\texpiresIn: new TimeSpan(1, \"h\"),\n\t\t\t\tissuer: \"better-auth\",\n\t\t\t\tsubject: \"forget-password\",\n\t\t\t\taudiences: [user.user.email],\n\t\t\t\tincludeIssuedTimestamp: true,\n\t\t\t},\n\t\t);\n\t\tawait ctx.context.options.emailAndPassword.sendResetPasswordToken(\n\t\t\ttoken,\n\t\t\tuser.user,\n\t\t);\n\t\treturn ctx.json({\n\t\t\tstatus: true,\n\t\t});\n\t},\n);\n\nexport const resetPassword = createAuthEndpoint(\n\t\"/reset-password\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\ttoken: z.string(),\n\t\t\tnewPassword: z.string(),\n\t\t\tcallbackURL: z.string().optional(),\n\t\t}),\n\t},\n\tasync (ctx) => {\n\t\tconst { token, newPassword } = ctx.body;\n\t\ttry {\n\t\t\tconst jwt = await validateJWT(\n\t\t\t\t\"HS256\",\n\t\t\t\tBuffer.from(ctx.context.secret),\n\t\t\t\ttoken,\n\t\t\t);\n\t\t\tconst email = z\n\t\t\t\t.string()\n\t\t\t\t.email()\n\t\t\t\t.parse((jwt.payload as { email: string }).email);\n\t\t\tconst user = await ctx.context.internalAdapter.findUserByEmail(email);\n\t\t\tif (!user) {\n\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\tstatus: 400,\n\t\t\t\t\tstatusText: \"USER_NOT_FOUND\",\n\t\t\t\t\tbody: {\n\t\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (\n\t\t\t\tnewPassword.length <\n\t\t\t\t\t(ctx.context.options.emailAndPassword?.minPasswordLength || 8) ||\n\t\t\t\tnewPassword.length >\n\t\t\t\t\t(ctx.context.options.emailAndPassword?.maxPasswordLength || 32)\n\t\t\t) {\n\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\tstatus: 400,\n\t\t\t\t\tstatusText: \"INVALID_PASSWORD_LENGTH\",\n\t\t\t\t\tbody: {\n\t\t\t\t\t\tmessage: \"Password length must be between 8 and 32\",\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst hashedPassword = await ctx.context.password.hash(newPassword);\n\t\t\tconst updatedUser = await ctx.context.internalAdapter.updatePassword(\n\t\t\t\tuser.user.id,\n\t\t\t\thashedPassword,\n\t\t\t);\n\t\t\tif (!updatedUser) {\n\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\tstatus: 500,\n\t\t\t\t\tstatusText: \"INTERNAL_SERVER_ERROR\",\n\t\t\t\t\tbody: {\n\t\t\t\t\t\tmessage: \"Internal server error\",\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn ctx.json({\n\t\t\t\tstatus: true,\n\t\t\t\turl: ctx.body.callbackURL,\n\t\t\t\tredirect: !!ctx.body.callbackURL,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tstatusText: \"INVALID_TOKEN\",\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Invalid token\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t},\n);\n","import { TimeSpan } from \"oslo\";\nimport { createJWT, validateJWT, type JWT } from \"oslo/jwt\";\nimport { z } from \"zod\";\nimport { createAuthEndpoint } from \"../call\";\n\nexport async function createEmailVerificationToken(\n\tsecret: string,\n\temail: string,\n) {\n\tconst token = await createJWT(\n\t\t\"HS256\",\n\t\tBuffer.from(secret),\n\t\t{\n\t\t\temail: email.toLowerCase(),\n\t\t},\n\t\t{\n\t\t\texpiresIn: new TimeSpan(1, \"h\"),\n\t\t\tissuer: \"better-auth\",\n\t\t\tsubject: \"verify-email\",\n\t\t\taudiences: [email],\n\t\t\tincludeIssuedTimestamp: true,\n\t\t},\n\t);\n\treturn token;\n}\n\nexport const sendVerificationEmail = createAuthEndpoint(\n\t\"/send-verification-email\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\temail: z.string().email(),\n\t\t\tcallbackURL: z.string().optional(),\n\t\t}),\n\t},\n\tasync (ctx) => {\n\t\tif (!ctx.context.options.emailAndPassword?.sendVerificationEmail) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tstatusText: \"VERIFICATION_EMAIL_NOT_SENT\",\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Verification email isn't enabled\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst { email } = ctx.body;\n\t\tconst token = await createEmailVerificationToken(ctx.context.secret, email);\n\t\tconst url = `${ctx.context.baseURL}/verify-email?token=${token}?callbackURL=${ctx.body.callbackURL}`;\n\t\tawait ctx.context.options.emailAndPassword.sendVerificationEmail(\n\t\t\temail,\n\t\t\turl,\n\t\t\ttoken,\n\t\t);\n\t\treturn ctx.json({\n\t\t\tstatus: true,\n\t\t});\n\t},\n);\n\nexport const verifyEmail = createAuthEndpoint(\n\t\"/verify-email\",\n\t{\n\t\tmethod: \"GET\",\n\t\tquery: z.object({\n\t\t\ttoken: z.string(),\n\t\t\tcallbackURL: z.string().optional(),\n\t\t}),\n\t},\n\tasync (ctx) => {\n\t\tconst { token } = ctx.query;\n\t\tlet jwt: JWT;\n\t\ttry {\n\t\t\tjwt = await validateJWT(\"HS256\", Buffer.from(ctx.context.secret), token);\n\t\t} catch (e) {\n\t\t\tctx.context.logger.error(\"Failed to verify email\", e);\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tstatusText: \"INVALID_TOKEN\",\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Invalid token\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tconst schema = z.object({\n\t\t\temail: z.string().email(),\n\t\t});\n\t\tconst parsed = schema.parse(jwt.payload);\n\t\tconst user = await ctx.context.internalAdapter.findUserByEmail(\n\t\t\tparsed.email,\n\t\t);\n\t\tif (!user) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tstatusText: \"USER_NOT_FOUND\",\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst account = user.accounts.find((a) => a.providerId === \"credential\");\n\t\tif (!account) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tstatusText: \"ACCOUNT_NOT_FOUND\",\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Account not found\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tawait ctx.context.internalAdapter.updateUserByEmail(parsed.email, {\n\t\t\temailVerified: true,\n\t\t});\n\t\tif (ctx.query.callbackURL) {\n\t\t\tthrow ctx.redirect(ctx.query.callbackURL);\n\t\t}\n\t\treturn ctx.json({\n\t\t\tstatus: true,\n\t\t});\n\t},\n);\n","import { alphabet, generateRandomString } from \"oslo/crypto\";\nimport { hs256 } from \"../../crypto\";\nimport { createAuthEndpoint } from \"../call\";\nimport { HIDE_METADATA } from \"../../utils/hide-metadata\";\n\nexport const getCSRFToken = createAuthEndpoint(\n\t\"/csrf\",\n\t{\n\t\tmethod: \"GET\",\n\t\tmetadata: HIDE_METADATA,\n\t},\n\tasync (ctx) => {\n\t\tconst csrfToken = await ctx.getSignedCookie(\n\t\t\tctx.context.authCookies.csrfToken.name,\n\t\t\tctx.context.secret,\n\t\t);\n\n\t\tif (csrfToken) {\n\t\t\treturn {\n\t\t\t\tcsrfToken,\n\t\t\t};\n\t\t}\n\n\t\tconst token = generateRandomString(32, alphabet(\"a-z\", \"0-9\", \"A-Z\"));\n\t\tconst hash = await hs256(ctx.context.secret, token);\n\t\tconst cookie = `${token}!${hash}`;\n\t\tawait ctx.setSignedCookie(\n\t\t\tctx.context.authCookies.csrfToken.name,\n\t\t\tcookie,\n\t\t\tctx.context.secret,\n\t\t\tctx.context.authCookies.csrfToken.options,\n\t\t);\n\t\treturn {\n\t\t\tcsrfToken: token,\n\t\t};\n\t},\n);\n","import { HIDE_METADATA } from \"../../utils/hide-metadata\";\nimport { createAuthEndpoint } from \"../call\";\n\nexport const ok = createAuthEndpoint(\n\t\"/ok\",\n\t{\n\t\tmethod: \"GET\",\n\t\tmetadata: HIDE_METADATA,\n\t},\n\tasync (ctx) => {\n\t\treturn ctx.json({\n\t\t\tok: true,\n\t\t});\n\t},\n);\n","import { alphabet, generateRandomString } from \"oslo/crypto\";\nimport { z } from \"zod\";\nimport { createAuthEndpoint } from \"../call\";\nimport { createEmailVerificationToken } from \"./verify-email\";\n\nexport const signUpEmail = createAuthEndpoint(\n\t\"/sign-up/email\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\tname: z.string(),\n\t\t\temail: z.string(),\n\t\t\tpassword: z.string(),\n\t\t\timage: z.string().optional(),\n\t\t\tcallbackURL: z.string().optional(),\n\t\t}),\n\t},\n\tasync (ctx) => {\n\t\tif (!ctx.context.options.emailAndPassword?.enabled) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Email and password is not enabled\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst { name, email, password, image } = ctx.body;\n\t\tconst isValidEmail = z.string().email().safeParse(email);\n\t\tif (!isValidEmail.success) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Invalid email address\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst minPasswordLength =\n\t\t\tctx.context.options?.emailAndPassword?.minPasswordLength || 8;\n\t\tif (password.length < minPasswordLength) {\n\t\t\tctx.context.logger.error(\"Password is too short\");\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: { message: \"Password is too short\" },\n\t\t\t});\n\t\t}\n\t\tconst dbUser = await ctx.context.internalAdapter.findUserByEmail(email);\n\t\t/**\n\t\t * hash first to avoid timing attacks\n\t\t */\n\t\tconst hash = await ctx.context.password.hash(password);\n\t\tif (dbUser?.user) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"User already exists\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst createdUser = await ctx.context.internalAdapter.createUser({\n\t\t\tid: generateRandomString(32, alphabet(\"a-z\", \"0-9\", \"A-Z\")),\n\t\t\temail: email.toLowerCase(),\n\t\t\tname,\n\t\t\timage,\n\t\t\temailVerified: false,\n\t\t\tcreatedAt: new Date(),\n\t\t\tupdatedAt: new Date(),\n\t\t});\n\t\t/**\n\t\t * Link the account to the user\n\t\t */\n\t\tawait ctx.context.internalAdapter.linkAccount({\n\t\t\tid: generateRandomString(32, alphabet(\"a-z\", \"0-9\", \"A-Z\")),\n\t\t\tuserId: createdUser.id,\n\t\t\tproviderId: \"credential\",\n\t\t\taccountId: createdUser.id,\n\t\t\tpassword: hash,\n\t\t});\n\t\tconst session = await ctx.context.internalAdapter.createSession(\n\t\t\tcreatedUser.id,\n\t\t\tctx.request,\n\t\t);\n\t\tawait ctx.setSignedCookie(\n\t\t\tctx.context.authCookies.sessionToken.name,\n\t\t\tsession.id,\n\t\t\tctx.context.secret,\n\t\t\tctx.context.authCookies.sessionToken.options,\n\t\t);\n\t\tif (ctx.context.options.emailAndPassword.sendEmailVerificationOnSignUp) {\n\t\t\tconst token = await createEmailVerificationToken(\n\t\t\t\tctx.context.secret,\n\t\t\t\tcreatedUser.email,\n\t\t\t);\n\t\t\tconst url = `${ctx.context.baseURL}/verify-email?token=${token}?callbackURL=${ctx.body.callbackURL}`;\n\t\t\tawait ctx.context.options.emailAndPassword.sendVerificationEmail?.(\n\t\t\t\tcreatedUser.email,\n\t\t\t\turl,\n\t\t\t\ttoken,\n\t\t\t);\n\t\t}\n\t\treturn ctx.json(\n\t\t\t{\n\t\t\t\tuser: createdUser,\n\t\t\t\tsession,\n\t\t\t},\n\t\t\t{\n\t\t\t\tbody: ctx.body.callbackURL\n\t\t\t\t\t? {\n\t\t\t\t\t\t\turl: ctx.body.callbackURL,\n\t\t\t\t\t\t\tredirect: true,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tuser: createdUser,\n\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t},\n\t\t\t},\n\t\t);\n\t},\n);\n","import { HIDE_METADATA } from \"../../utils/hide-metadata\";\nimport { createAuthEndpoint } from \"../call\";\n\nconst html = (errorCode: string = \"Unknown\") => `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Authentication Error</title>\n <style>\n :root {\n --bg-color: #f8f9fa;\n --text-color: #212529;\n --accent-color: #000000;\n --error-color: #dc3545;\n --border-color: #e9ecef;\n }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n background-color: var(--bg-color);\n color: var(--text-color);\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100vh;\n margin: 0;\n line-height: 1.5;\n }\n .error-container {\n background-color: #ffffff;\n border-radius: 12px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);\n padding: 2.5rem;\n text-align: center;\n max-width: 90%;\n width: 400px;\n }\n h1 {\n color: var(--error-color);\n font-size: 1.75rem;\n margin-bottom: 1rem;\n font-weight: 600;\n }\n p {\n margin-bottom: 1.5rem;\n color: #495057;\n }\n .btn {\n background-color: var(--accent-color);\n color: #ffffff;\n text-decoration: none;\n padding: 0.75rem 1.5rem;\n border-radius: 6px;\n transition: all 0.3s ease;\n display: inline-block;\n font-weight: 500;\n border: 2px solid var(--accent-color);\n }\n .btn:hover {\n background-color: #131721;\n }\n .error-code {\n font-size: 0.875rem;\n color: #6c757d;\n margin-top: 1.5rem;\n padding-top: 1.5rem;\n border-top: 1px solid var(--border-color);\n }\n .icon {\n font-size: 3rem;\n margin-bottom: 1rem;\n }\n </style>\n</head>\n<body>\n <div class=\"error-container\">\n <div class=\"icon\">⚠️</div>\n <h1>Better Auth Error</h1>\n <p>We encountered an issue while processing your request. Please try again or contact the application owner if the problem persists.</p>\n <a href=\"#\" id=\"returnLink\" class=\"btn\">Return to Application</a>\n <div class=\"error-code\">Error Code: <span id=\"errorCode\">${errorCode}</span></div>\n </div>\n</body>\n</html>`;\n\nexport const error = createAuthEndpoint(\n\t\"/error\",\n\t{\n\t\tmethod: \"GET\",\n\t\tmetadata: HIDE_METADATA,\n\t},\n\tasync (c) => {\n\t\tconst query =\n\t\t\tnew URL(c.request?.url || \"\").searchParams.get(\"error\") || \"Unknown\";\n\t\treturn new Response(html(query), {\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"text/html\",\n\t\t\t},\n\t\t});\n\t},\n);\n","import { z } from \"zod\";\nimport { createAuthEndpoint } from \"../call\";\nimport { sessionMiddleware } from \"../middlewares/session\";\nimport { alphabet, generateRandomString } from \"oslo/crypto\";\nimport { setSessionCookie } from \"../../utils/cookies\";\n\nexport const updateUser = createAuthEndpoint(\n\t\"/user/update\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\tname: z.string().optional(),\n\t\t\timage: z.string().optional(),\n\t\t}),\n\t\tuse: [sessionMiddleware],\n\t},\n\tasync (ctx) => {\n\t\tconst { name, image } = ctx.body;\n\t\tconst session = ctx.context.session;\n\t\tconst user = await ctx.context.internalAdapter.updateUserByEmail(\n\t\t\tsession.user.email,\n\t\t\t{\n\t\t\t\tname,\n\t\t\t\timage,\n\t\t\t},\n\t\t);\n\t\treturn ctx.json(user);\n\t},\n);\n\nexport const changePassword = createAuthEndpoint(\n\t\"/user/change-password\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\t/**\n\t\t\t * The new password to set\n\t\t\t */\n\t\t\tnewPassword: z.string(),\n\t\t\t/**\n\t\t\t * The current password of the user\n\t\t\t */\n\t\t\tcurrentPassword: z.string(),\n\t\t\t/**\n\t\t\t * revoke all sessions that are not the\n\t\t\t * current one logged in by the user\n\t\t\t */\n\t\t\trevokeOtherSessions: z.boolean().optional(),\n\t\t}),\n\t\tuse: [sessionMiddleware],\n\t},\n\tasync (ctx) => {\n\t\tconst { newPassword, currentPassword, revokeOtherSessions } = ctx.body;\n\t\tconst session = ctx.context.session;\n\t\tconst minPasswordLength =\n\t\t\tctx.context.options?.emailAndPassword?.minPasswordLength || 8;\n\t\tif (newPassword.length < minPasswordLength) {\n\t\t\tctx.context.logger.error(\"Password is too short\");\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: { message: \"Password is too short\" },\n\t\t\t});\n\t\t}\n\t\tconst accounts = await ctx.context.internalAdapter.findAccounts(\n\t\t\tsession.user.id,\n\t\t);\n\t\tconst account = accounts.find(\n\t\t\t(account) => account.providerId === \"credential\" && account.password,\n\t\t);\n\t\tconst passwordHash = await ctx.context.password.hash(newPassword);\n\t\tif (!account) {\n\t\t\tawait ctx.context.internalAdapter.linkAccount({\n\t\t\t\tid: generateRandomString(32, alphabet(\"a-z\", \"0-9\", \"A-Z\")),\n\t\t\t\tuserId: session.user.id,\n\t\t\t\tproviderId: \"credential\",\n\t\t\t\taccountId: session.user.id,\n\t\t\t\tpassword: passwordHash,\n\t\t\t});\n\t\t\treturn ctx.json(session.user);\n\t\t}\n\t\tif (account.password) {\n\t\t\tconst verify = await ctx.context.password.verify(\n\t\t\t\taccount.password,\n\t\t\t\tcurrentPassword,\n\t\t\t);\n\t\t\tif (!verify) {\n\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\tstatus: 400,\n\t\t\t\t\tbody: { message: \"Invalid password\" },\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tawait ctx.context.internalAdapter.updateAccount(account.id, {\n\t\t\tpassword: passwordHash,\n\t\t});\n\t\tif (revokeOtherSessions) {\n\t\t\tawait ctx.context.internalAdapter.deleteSessions(session.user.id);\n\t\t\tconst newSession = await ctx.context.internalAdapter.createSession(\n\t\t\t\tsession.user.id,\n\t\t\t\tctx.headers,\n\t\t\t);\n\t\t\t// set the new session cookie\n\t\t\tawait setSessionCookie(ctx, newSession.id);\n\t\t}\n\t\treturn ctx.json(session.user);\n\t},\n);\n","import {\n\tAPIError,\n\ttype Context,\n\ttype Endpoint,\n\tcreateRouter,\n} from \"better-call\";\nimport type { AuthContext } from \"../init\";\nimport type { BetterAuthOptions, InferSession, InferUser } from \"../types\";\nimport type { Prettify } from \"../types/helper\";\nimport { csrfMiddleware } from \"./middlewares/csrf\";\nimport {\n\tcallbackOAuth,\n\tforgetPassword,\n\tgetSession,\n\tlistSessions,\n\tresetPassword,\n\trevokeSession,\n\trevokeSessions,\n\tsendVerificationEmail,\n\tsignInEmail,\n\tsignInOAuth,\n\tsignOut,\n\tverifyEmail,\n} from \"./routes\";\nimport { getCSRFToken } from \"./routes/csrf\";\nimport { ok } from \"./routes/ok\";\nimport { signUpEmail } from \"./routes/sign-up\";\nimport { error } from \"./routes/error\";\nimport { logger } from \"../utils/logger\";\nimport { changePassword, updateUser } from \"./routes/update-user\";\n\nexport function getEndpoints<\n\tC extends AuthContext,\n\tOption extends BetterAuthOptions,\n>(ctx: C, options: Option) {\n\tconst pluginEndpoints = ctx.options.plugins?.reduce(\n\t\t(acc, plugin) => {\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t...plugin.endpoints,\n\t\t\t};\n\t\t},\n\t\t{} as Record<string, any>,\n\t);\n\n\tconst middlewares =\n\t\tctx.options.plugins\n\t\t\t?.map((plugin) =>\n\t\t\t\tplugin.middlewares?.map((m) => {\n\t\t\t\t\tconst middleware = (async (context: any) => {\n\t\t\t\t\t\treturn m.middleware({\n\t\t\t\t\t\t\t...context,\n\t\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\t\t...ctx,\n\t\t\t\t\t\t\t\t...context.context,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}) as Endpoint;\n\t\t\t\t\tmiddleware.path = m.path;\n\t\t\t\t\tmiddleware.options = m.middleware.options;\n\t\t\t\t\tmiddleware.headers = m.middleware.headers;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpath: m.path,\n\t\t\t\t\t\tmiddleware,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.filter((plugin) => plugin !== undefined)\n\t\t\t.flat() || [];\n\n\t/**\n\t * Helper function to type the session output\n\t * TODO: find a better way to do this\n\t */\n\tasync function typedSession(\n\t\tctx: Context<\n\t\t\t\"/session\",\n\t\t\t{\n\t\t\t\tmethod: \"GET\";\n\t\t\t\trequireHeaders: true;\n\t\t\t}\n\t\t>,\n\t) {\n\t\tconst handler = await getSession(ctx);\n\t\treturn handler as {\n\t\t\tsession: Prettify<InferSession<Option>>;\n\t\t\tuser: Prettify<InferUser<Option>>;\n\t\t} | null;\n\t}\n\ttypedSession.path = getSession.path;\n\ttypedSession.method = getSession.method;\n\ttypedSession.options = getSession.options;\n\ttypedSession.headers = getSession.headers;\n\n\t/**\n\t * Helper function to type the list sessions output\n\t * TODO: find a better way to do this\n\t */\n\tasync function typeListSessions(\n\t\tctx: Context<\n\t\t\t\"/user/sessions\",\n\t\t\t{\n\t\t\t\tmethod: \"GET\";\n\t\t\t\trequireHeaders: true;\n\t\t\t}\n\t\t>,\n\t) {\n\t\tconst handler = await listSessions(ctx);\n\t\treturn handler as unknown as Prettify<InferSession<Option>>[];\n\t}\n\ttypeListSessions.path = listSessions.path;\n\ttypeListSessions.method = listSessions.method;\n\ttypeListSessions.options = listSessions.options;\n\ttypeListSessions.headers = listSessions.headers;\n\n\tconst baseEndpoints = {\n\t\tsignInOAuth,\n\t\tcallbackOAuth,\n\t\tgetCSRFToken,\n\t\tgetSession: typedSession,\n\t\tsignOut,\n\t\tsignUpEmail,\n\t\tsignInEmail,\n\t\tforgetPassword,\n\t\tresetPassword,\n\t\tverifyEmail,\n\t\tsendVerificationEmail,\n\t\tchangePassword,\n\t\tupdateUser,\n\t\tlistSessions: typeListSessions,\n\t\trevokeSession,\n\t\trevokeSessions,\n\t};\n\tconst endpoints = {\n\t\t...baseEndpoints,\n\t\t...pluginEndpoints,\n\t\tok,\n\t\terror,\n\t};\n\tlet api: Record<string, any> = {};\n\tfor (const [key, value] of Object.entries(endpoints)) {\n\t\tapi[key] = async (context: any) => {\n\t\t\tfor (const plugin of ctx.options.plugins || []) {\n\t\t\t\tif (plugin.hooks?.before) {\n\t\t\t\t\tfor (const hook of plugin.hooks.before) {\n\t\t\t\t\t\tconst match = hook.matcher({\n\t\t\t\t\t\t\t...context,\n\t\t\t\t\t\t\t...value,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\tconst hookRes = await hook.handler(context);\n\t\t\t\t\t\t\tif (hookRes && \"context\" in hookRes) {\n\t\t\t\t\t\t\t\tcontext = {\n\t\t\t\t\t\t\t\t\t...context,\n\t\t\t\t\t\t\t\t\t...hookRes.context,\n\t\t\t\t\t\t\t\t\t...value,\n\t\t\t\t\t\t\t\t};\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}\n\t\t\t/**\n\t\t\t * TODO: move this to respond a json response\n\t\t\t * instead of response object.\n\t\t\t */\n\t\t\t//@ts-ignore\n\t\t\tconst endpointRes = await value({\n\t\t\t\t...context,\n\t\t\t\tcontext: {\n\t\t\t\t\t...ctx,\n\t\t\t\t\t...context.context,\n\t\t\t\t},\n\t\t\t});\n\t\t\tlet response = endpointRes;\n\t\t\tfor (const plugin of ctx.options.plugins || []) {\n\t\t\t\tif (plugin.hooks?.after) {\n\t\t\t\t\tfor (const hook of plugin.hooks.after) {\n\t\t\t\t\t\tconst match = hook.matcher(context);\n\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\tconst obj = Object.assign(context, {\n\t\t\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\t\t\t...ctx,\n\t\t\t\t\t\t\t\t\treturned: response,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconst hookRes = await hook.handler(obj);\n\t\t\t\t\t\t\tif (hookRes && \"response\" in hookRes) {\n\t\t\t\t\t\t\t\tresponse = hookRes.response as any;\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}\n\t\t\treturn response;\n\t\t};\n\t\tapi[key].path = value.path;\n\t\tapi[key].method = value.method;\n\t\tapi[key].options = value.options;\n\t\tapi[key].headers = value.headers;\n\t}\n\treturn {\n\t\tapi: api as typeof endpoints,\n\t\tmiddlewares,\n\t};\n}\n\nexport const router = <C extends AuthContext, Option extends BetterAuthOptions>(\n\tctx: C,\n\toptions: Option,\n) => {\n\tconst { api, middlewares } = getEndpoints(ctx, options);\n\tconst basePath = new URL(ctx.baseURL).pathname;\n\n\treturn createRouter(api as Omit<typeof api, \"error\" | \"ok\" | \"welcome\">, {\n\t\textraContext: ctx,\n\t\tbasePath,\n\t\trouterMiddleware: [\n\t\t\t{\n\t\t\t\tpath: \"/**\",\n\t\t\t\tmiddleware: csrfMiddleware,\n\t\t\t},\n\t\t\t...middlewares,\n\t\t],\n\t\tonError(e) {\n\t\t\tif (process.env.NODE_ENV === \"development\" && !options.disableLog) {\n\t\t\t\tlogger.error(e);\n\t\t\t}\n\t\t},\n\t});\n};\n","import type { FieldAttribute } from \"../db\";\nimport type { BetterAuthOptions } from \"../types\";\n\nexport type BetterAuthDbSchema = Record<\n\tstring,\n\t{\n\t\ttableName: string;\n\t\tfields: Record<string, FieldAttribute>;\n\t\tdisableMigrations?: boolean;\n\t\torder?: number;\n\t}\n>;\n\nexport const getAuthTables = (options: BetterAuthOptions) => {\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: 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\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},\n\t\t\t\temail: {\n\t\t\t\t\ttype: \"string\",\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},\n\t\t\t\timage: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\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},\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},\n\t\t\t\t...pluginSchema?.user?.fields,\n\t\t\t},\n\t\t\torder: 0,\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},\n\t\t\t\tipAddress: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\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},\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: \"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},\n\t\t\t\t...pluginSchema?.session?.fields,\n\t\t\t},\n\t\t\torder: 1,\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},\n\t\t\t\tproviderId: {\n\t\t\t\t\ttype: \"string\",\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: \"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},\n\t\t\t\taccessToken: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\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},\n\t\t\t\tidToken: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\taccessTokenExpiresAt: {\n\t\t\t\t\ttype: \"date\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\trefreshTokenExpiresAt: {\n\t\t\t\t\ttype: \"date\",\n\t\t\t\t\trequired: false,\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},\n\t\t\t\t...pluginSchema?.account?.fields,\n\t\t\t},\n\t\t\torder: 2,\n\t\t},\n\t\t...pluginSchema,\n\t} satisfies BetterAuthDbSchema;\n};\n","import Database from \"better-sqlite3\";\nimport { Kysely } from \"kysely\";\nimport {\n\ttype Dialect,\n\tMysqlDialect,\n\tPostgresDialect,\n\tSqliteDialect,\n} from \"kysely\";\nimport { createPool } from \"mysql2\";\nimport postgres from \"postgres\";\nimport type { FieldAttribute } from \"../db\";\nimport type { BetterAuthOptions } from \"../types\";\nimport type { Adapter, Where } from \"../types/adapter\";\nimport { PostgresJSDialect } from \"kysely-postgres-js\";\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\tconst and = w\n\t\t?.filter((w) => w.connector === \"AND\" || !w.connector)\n\t\t.reduce(\n\t\t\t(acc, w) =>\n\t\t\t\t({\n\t\t\t\t\t...acc,\n\t\t\t\t\t[w.field]: w.value,\n\t\t\t\t}) as any,\n\t\t\t{},\n\t\t);\n\tconst or = w\n\t\t?.filter((w) => w.connector === \"OR\")\n\t\t.reduce(\n\t\t\t(acc, w) =>\n\t\t\t\t({\n\t\t\t\t\t...acc,\n\t\t\t\t\t[w.field]: w.value,\n\t\t\t\t}) as any,\n\t\t\t{},\n\t\t);\n\treturn {\n\t\tand: Object.keys(and).length ? and : null,\n\t\tor: Object.keys(or).length ? 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\tif (\n\t\t\tval[key] === 0 &&\n\t\t\tfields[key]?.type === \"boolean\" &&\n\t\t\ttransform?.boolean\n\t\t) {\n\t\t\tval[key] = false;\n\t\t}\n\t\tif (\n\t\t\tval[key] === 1 &&\n\t\t\tfields[key]?.type === \"boolean\" &&\n\t\t\ttransform?.boolean\n\t\t) {\n\t\t\tval[key] = true;\n\t\t}\n\t\tif (fields[key]?.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}\n\nexport const kyselyAdapter = (\n\tdb: Kysely<any>,\n\tconfig?: KyselyAdapterConfig,\n): Adapter => {\n\treturn {\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\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 (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or));\n\t\t\t}\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and));\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 } = 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));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or));\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\tlet query = db.updateTable(model).set(val);\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or));\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\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));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or));\n\t\t\t}\n\n\t\t\tawait query.execute();\n\t\t},\n\t};\n};\n\nexport const getDialect = (config: BetterAuthOptions) => {\n\tif (!config.database) {\n\t\treturn null;\n\t}\n\tif (\"createDriver\" in config.database) {\n\t\treturn config.database;\n\t}\n\tlet dialect: Dialect | null = null;\n\tif (\"provider\" in config.database) {\n\t\tconst provider = config.database.provider;\n\t\tconst connectionString = config.database?.url?.trim();\n\t\tif (provider === \"postgres\") {\n\t\t\tconst pg = postgres(connectionString, {\n\t\t\t\tprepare: false,\n\t\t\t});\n\t\t\tdialect = new PostgresJSDialect({\n\t\t\t\tpostgres: pg,\n\t\t\t});\n\t\t}\n\t\tif (provider === \"mysql\") {\n\t\t\tconst params = new URL(connectionString);\n\t\t\tconst pool = createPool({\n\t\t\t\thost: params.hostname,\n\t\t\t\tuser: params.username,\n\t\t\t\tpassword: params.password,\n\t\t\t\tdatabase: params.pathname.split(\"/\")[1],\n\t\t\t\tport: Number(params.port),\n\t\t\t});\n\t\t\tdialect = new MysqlDialect({ pool });\n\t\t}\n\n\t\tif (provider === \"sqlite\") {\n\t\t\tconst db = new Database(connectionString);\n\t\t\tdialect = new SqliteDialect({\n\t\t\t\tdatabase: db,\n\t\t\t});\n\t\t}\n\t}\n\treturn dialect;\n};\n\nexport const createKyselyAdapter = (config: BetterAuthOptions) => {\n\tconst dialect = getDialect(config);\n\tif (!dialect) {\n\t\treturn null;\n\t}\n\tconst db = new Kysely<any>({\n\t\tdialect,\n\t});\n\treturn db;\n};\n\nexport const getDatabaseType = (config: BetterAuthOptions) => {\n\tif (\"provider\" in config.database) {\n\t\treturn config.database.provider;\n\t}\n\tif (\"dialect\" in config.database) {\n\t\tif (config.database.dialect instanceof PostgresDialect) {\n\t\t\treturn \"postgres\";\n\t\t}\n\t\tif (config.database.dialect instanceof MysqlDialect) {\n\t\t\treturn \"mysql\";\n\t\t}\n\t\tif (config.database.dialect instanceof SqliteDialect) {\n\t\t\treturn \"sqlite\";\n\t\t}\n\t}\n\treturn \"sqlite\";\n};\n","import type { FieldAttribute } from \"../db\";\nimport { BetterAuthError } from \"../error/better-auth-error\";\nimport type { BetterAuthOptions } from \"../types\";\nimport type { Adapter } from \"../types/adapter\";\nimport { getAuthTables } from \"./get-tables\";\nimport { createKyselyAdapter, getDatabaseType, kyselyAdapter } from \"./kysely\";\n\nexport function getAdapter(options: BetterAuthOptions): Adapter {\n\tif (!options.database) {\n\t\tthrow new BetterAuthError(\"Database configuration is required\");\n\t}\n\tconst db = createKyselyAdapter(options);\n\tif (!db) {\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(db, {\n\t\ttransform: {\n\t\t\tschema,\n\t\t\tdate: true,\n\t\t\tboolean: getDatabaseType(options) === \"sqlite\",\n\t\t},\n\t});\n}\n","import { scrypt } from \"node:crypto\";\nimport { decodeHex, encodeHex } from \"oslo/encoding\";\nimport { constantTimeEqual } from \"oslo/crypto\";\n\nconst config = {\n\tN: 16384,\n\tr: 16,\n\tp: 1,\n\tdkLen: 64,\n};\n\nasync function generateKey(\n\tpassword: string,\n\tsalt: string,\n): Promise<ArrayBuffer> {\n\treturn await new Promise<ArrayBuffer>((resolve, reject) => {\n\t\tscrypt(\n\t\t\tpassword.normalize(\"NFKC\"),\n\t\t\tsalt!,\n\t\t\tconfig.dkLen,\n\t\t\t{\n\t\t\t\tN: config.N,\n\t\t\t\tp: config.p,\n\t\t\t\tr: config.r,\n\t\t\t\t// errors when 128 * N * r > `maxmem` (approximately)\n\t\t\t\tmaxmem: 128 * config.N * config.r * 2,\n\t\t\t},\n\t\t\t(err, buff) => {\n\t\t\t\tif (err) return reject(err);\n\t\t\t\t// @ts-ignore\n\t\t\t\treturn resolve(buff);\n\t\t\t},\n\t\t);\n\t});\n}\n\nexport const hashPassword = async (password: string) => {\n\tconst salt = encodeHex(crypto.getRandomValues(new Uint8Array(16)));\n\tconst key = await generateKey(password, salt);\n\treturn `${salt}:${encodeHex(key)}`;\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","import { alphabet, generateRandomString } from \"oslo/crypto\";\nimport type { BetterAuthOptions } from \"../types\";\nimport type { Adapter } from \"../types/adapter\";\nimport { getDate } from \"../utils/date\";\nimport { getAuthTables } from \"./get-tables\";\nimport type { Account, Session, User } from \"./schema\";\nimport type { Kysely } from \"kysely\";\n\nexport const createInternalAdapter = (\n\tadapter: Adapter,\n\tdb: Kysely<any>,\n\toptions: BetterAuthOptions,\n) => {\n\tconst sessionExpiration = options.session?.expiresIn || 60 * 60 * 24 * 7; // 7 days\n\tconst tables = getAuthTables(options);\n\treturn {\n\t\tcreateOAuthUser: async (user: User, account: Account) => {\n\t\t\ttry {\n\t\t\t\tconst createdUser = await adapter.create({\n\t\t\t\t\tmodel: tables.user.tableName,\n\t\t\t\t\tdata: user,\n\t\t\t\t});\n\t\t\t\tconst createdAccount = await adapter.create({\n\t\t\t\t\tmodel: tables.account.tableName,\n\t\t\t\t\tdata: 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 (user: User) => {\n\t\t\tconst createdUser = await adapter.create<User>({\n\t\t\t\tmodel: tables.user.tableName,\n\t\t\t\tdata: user,\n\t\t\t});\n\t\t\treturn createdUser;\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) => {\n\t\t\tconst headers = request instanceof Request ? request.headers : request;\n\t\t\tconst data: Session = {\n\t\t\t\tid: generateRandomString(32, alphabet(\"a-z\", \"0-9\", \"A-Z\")),\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(1000 * 60 * 60 * 24) // 1 day\n\t\t\t\t\t: getDate(sessionExpiration, true),\n\t\t\t\tipAddress: headers?.get(\"x-forwarded-for\") || \"\",\n\t\t\t\tuserAgent: headers?.get(\"user-agent\") || \"\",\n\t\t\t};\n\t\t\tconst session = adapter.create<Session>({\n\t\t\t\tmodel: tables.session.tableName,\n\t\t\t\tdata,\n\t\t\t});\n\t\t\treturn session;\n\t\t},\n\t\tfindSession: async (sessionId: string) => {\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\t\t\tif (!session) {\n\t\t\t\treturn null;\n\t\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: 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,\n\t\t\t\tuser,\n\t\t\t};\n\t\t},\n\t\tupdateSession: async (sessionId: string, session: Partial<Session>) => {\n\t\t\tconst updatedSession = await adapter.update<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: sessionId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tupdate: session,\n\t\t\t});\n\t\t\treturn updatedSession;\n\t\t},\n\t\tdeleteSession: async (id: string) => {\n\t\t\tconst session = await 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\treturn session;\n\t\t},\n\t\t/**\n\t\t * @requires\n\t\t */\n\t\tdeleteSessions: async (userId: string) => {\n\t\t\tconst sessions = await db\n\t\t\t\t.deleteFrom(tables.session.tableName)\n\t\t\t\t.where(\"userId\", \"=\", userId)\n\t\t\t\t.execute();\n\t\t\treturn sessions;\n\t\t},\n\t\tfindUserByEmail: async (email: 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\tvalue: email.toLowerCase(),\n\t\t\t\t\t\tfield: \"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\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\tvalue: user.id,\n\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tuser,\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: Account) => {\n\t\t\tconst _account = await adapter.create<Account>({\n\t\t\t\tmodel: tables.account.tableName,\n\t\t\t\tdata: account,\n\t\t\t});\n\t\t\treturn _account;\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 adapter.update<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,\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tupdate: data,\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 adapter.update<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\tvalue: userId,\n\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"providerId\",\n\t\t\t\t\t\tvalue: \"credential\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tupdate: {\n\t\t\t\t\tpassword,\n\t\t\t\t},\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: \"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;\n\t\t},\n\t\tupdateAccount: async (accountId: string, data: Partial<Account>) => {\n\t\t\tconst account = await adapter.update<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: \"id\",\n\t\t\t\t\t\tvalue: accountId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tupdate: data,\n\t\t\t});\n\t\t\treturn account;\n\t\t},\n\t};\n};\n\nexport type InternalAdapter = ReturnType<typeof createInternalAdapter>;\n","export const DEFAULT_SECRET = \"better-auth-secret-123456789\";\n","import { getAuthTables } from \"./adapters/get-tables\";\nimport { createKyselyAdapter } from \"./adapters/kysely\";\nimport { getAdapter } from \"./adapters/utils\";\nimport { hashPassword, verifyPassword } from \"./crypto/password\";\nimport { createInternalAdapter } from \"./db\";\nimport type { BetterAuthOptions } from \"./types\";\nimport { getBaseURL } from \"./utils/base-url\";\nimport { DEFAULT_SECRET } from \"./utils/constants\";\nimport {\n\ttype BetterAuthCookies,\n\tcreateCookieGetter,\n\tgetCookies,\n} from \"./utils/cookies\";\nimport { createLogger } from \"./utils/logger\";\n\nexport const init = (options: BetterAuthOptions) => {\n\tconst adapter = getAdapter(options);\n\tconst db = createKyselyAdapter(options);\n\tif (!db) {\n\t\tthrow new Error(\"No database adapter found\");\n\t}\n\tconst baseURL = getBaseURL(options.baseURL, options.basePath);\n\n\tconst secret =\n\t\toptions.secret ||\n\t\tprocess.env.BETTER_AUTH_SECRET ||\n\t\tprocess.env.AUTH_SECRET ||\n\t\tDEFAULT_SECRET;\n\n\tconst cookies = getCookies(options);\n\tconst tables = getAuthTables(options);\n\treturn {\n\t\tappName: options.appName || \"Better Auth\",\n\t\toptions: {\n\t\t\t...options,\n\t\t\tbaseURL: baseURL ? new URL(baseURL).origin : \"\",\n\t\t\tbasePath: options.basePath || \"/api/auth\",\n\t\t},\n\t\ttables,\n\t\tbaseURL: baseURL || \"\",\n\t\tsession: {\n\t\t\tupdateAge: options.session?.updateAge || 24 * 60 * 60, // 24 hours\n\t\t\texpiresIn: options.session?.expiresIn || 60 * 60 * 24 * 7, // 7 days\n\t\t},\n\t\tsecret,\n\t\tauthCookies: cookies,\n\t\tlogger: createLogger({\n\t\t\tdisabled: options.disableLog,\n\t\t}),\n\t\tdb,\n\t\tpassword: {\n\t\t\thash: options.emailAndPassword?.password?.hash || hashPassword,\n\t\t\tverify: options.emailAndPassword?.password?.verify || verifyPassword,\n\t\t},\n\t\tadapter: adapter,\n\t\tinternalAdapter: createInternalAdapter(adapter, db, options),\n\t\tcreateAuthCookie: createCookieGetter(options),\n\t};\n};\n\nexport type AuthContext = {\n\toptions: BetterAuthOptions;\n\tappName: string;\n\tbaseURL: string;\n\tauthCookies: BetterAuthCookies;\n\tlogger: ReturnType<typeof createLogger>;\n\tdb: ReturnType<typeof createKyselyAdapter>;\n\tadapter: ReturnType<typeof getAdapter>;\n\tinternalAdapter: ReturnType<typeof createInternalAdapter>;\n\tcreateAuthCookie: ReturnType<typeof createCookieGetter>;\n\tsecret: string;\n\tsession: {\n\t\tupdateAge: number;\n\t\texpiresIn: number;\n\t};\n\tpassword: {\n\t\thash: (password: string) => Promise<string>;\n\t\tverify: (hash: string, password: string) => Promise<boolean>;\n\t};\n\ttables: ReturnType<typeof getAuthTables>;\n};\n","import type { Endpoint, Prettify } from \"better-call\";\nimport { getEndpoints, router } from \"./api\";\nimport { init } from \"./init\";\nimport type { BetterAuthOptions } from \"./types/options\";\nimport type { InferSession, InferUser } from \"./types\";\n\ntype InferAPI<API> = Omit<\n\tAPI,\n\tAPI extends { [key in infer K]: Endpoint }\n\t\t? K extends string\n\t\t\t? API[K][\"options\"][\"metadata\"] extends { isAction: false }\n\t\t\t\t? K\n\t\t\t\t: never\n\t\t\t: never\n\t\t: never\n>;\n\nexport const betterAuth = <O extends BetterAuthOptions>(options: O) => {\n\tconst authContext = init(options);\n\tconst { api } = getEndpoints(authContext, options);\n\ttype API = typeof api;\n\treturn {\n\t\thandler: async (request: Request) => {\n\t\t\tconst basePath = authContext.options.basePath;\n\t\t\tconst url = new URL(request.url);\n\t\t\tif (!authContext.options.baseURL) {\n\t\t\t\tconst baseURL = `${url.origin}/api/auth`;\n\t\t\t\tauthContext.options.baseURL = baseURL;\n\t\t\t\tauthContext.baseURL = baseURL;\n\t\t\t}\n\t\t\tif (!authContext.options.baseURL) {\n\t\t\t\treturn new Response(\"Base URL not set\", { status: 400 });\n\t\t\t}\n\t\t\tif (url.pathname === basePath || url.pathname === `${basePath}/`) {\n\t\t\t\treturn new Response(\"Welcome to BetterAuth\", { status: 200 });\n\t\t\t}\n\t\t\tconst { handler } = router(authContext, options);\n\t\t\treturn handler(request);\n\t\t},\n\t\tapi: api as InferAPI<typeof api>,\n\t\toptions: authContext.options as O,\n\t\t$infer: {} as {\n\t\t\tsession: {\n\t\t\t\tsession: Prettify<InferSession<O>>;\n\t\t\t\tuser: Prettify<InferUser<O>>;\n\t\t\t};\n\t\t},\n\t};\n};\n\nexport type Auth = {\n\thandler: (request: Request) => Promise<Response>;\n\tapi: InferAPI<ReturnType<typeof router>[\"endpoints\"]>;\n\toptions: BetterAuthOptions;\n};\n"]}
1
+ {"version":3,"sources":["../src/crypto/index.ts","../src/api/call.ts","../src/api/middlewares/csrf.ts","../src/error/better-auth-error.ts","../src/utils/base-url.ts","../src/social-providers/utils.ts","../src/social-providers/apple.ts","../src/social-providers/discord.ts","../src/social-providers/facebook.ts","../src/social-providers/github.ts","../src/utils/logger.ts","../src/social-providers/google.ts","../src/social-providers/spotify.ts","../src/social-providers/twitch.ts","../src/social-providers/twitter.ts","../src/social-providers/index.ts","../src/utils/state.ts","../src/utils/date.ts","../src/utils/cookies.ts","../src/api/middlewares/session.ts","../src/api/routes/session.ts","../src/api/routes/sign-in.ts","../src/adapters/schema.ts","../src/utils/id.ts","../src/utils/hide-metadata.ts","../src/utils/getAccount.ts","../src/api/routes/callback.ts","../src/api/routes/sign-out.ts","../src/api/routes/forget-password.ts","../src/api/routes/verify-email.ts","../src/api/routes/csrf.ts","../src/api/routes/ok.ts","../src/api/routes/sign-up.ts","../src/api/routes/error.ts","../src/api/routes/update-user.ts","../src/api/index.ts","../src/adapters/get-tables.ts","../src/adapters/kysely.ts","../src/adapters/utils.ts","../src/crypto/password.ts","../src/adapters/internal-adapter.ts","../src/utils/constants.ts","../src/init.ts","../src/auth.ts"],"names":["error","betterFetch","parseJWT","generateStateOAuth","z","options","APIError","TimeSpan","createJWT","validateJWT","generateRandomString","alphabet","account","ctx","w","config","data"],"mappings":"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","file":"index.js","sourcesContent":["import { xchacha20poly1305 } from \"@noble/ciphers/chacha\";\nimport { bytesToHex, hexToBytes, utf8ToBytes } from \"@noble/ciphers/utils\";\nimport { managedNonce } from \"@noble/ciphers/webcrypto\";\nimport { sha256 } from \"@noble/hashes/sha256\";\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 = ({ key, data }: SymmetricEncryptOptions) => {\n\tconst keyAsBytes = sha256(key);\n\tconst dataAsBytes = utf8ToBytes(data);\n\tconst chacha = managedNonce(xchacha20poly1305)(keyAsBytes);\n\treturn bytesToHex(chacha.encrypt(dataAsBytes));\n};\n\nexport type SymmetricDecryptOptions = {\n\tkey: string;\n\tdata: string;\n};\n\nexport const symmetricDecrypt = ({ key, data }: SymmetricDecryptOptions) => {\n\tconst keyAsBytes = sha256(key);\n\tconst dataAsBytes = hexToBytes(data);\n\tconst chacha = managedNonce(xchacha20poly1305)(keyAsBytes);\n\treturn chacha.decrypt(dataAsBytes);\n};\n","import {\n\ttype Endpoint,\n\ttype EndpointResponse,\n\tcreateEndpointCreator,\n\tcreateMiddleware,\n\tcreateMiddlewareCreator,\n} from \"better-call\";\nimport type { AuthContext } from \"../init\";\nimport type { BetterAuthOptions } from \"../types/options\";\n\nexport const optionsMiddleware = createMiddleware(async () => {\n\t/**\n\t * This will be passed on the instance of\n\t * the context. Used to infer the type\n\t * here.\n\t */\n\treturn {} as AuthContext;\n});\n\nexport const createAuthMiddleware = createMiddlewareCreator({\n\tuse: [\n\t\toptionsMiddleware,\n\t\t/**\n\t\t * This of for hooks. to tell ts there will a\n\t\t * return response object\n\t\t */\n\t\tcreateMiddleware(async () => {\n\t\t\treturn {} as {\n\t\t\t\treturned?: Response;\n\t\t\t};\n\t\t}),\n\t],\n});\n\nexport const createAuthEndpoint = createEndpointCreator({\n\tuse: [optionsMiddleware],\n});\n\nexport type AuthEndpoint = Endpoint<\n\t(ctx: {\n\t\toptions: BetterAuthOptions;\n\t\tbody: any;\n\t\tquery: any;\n\t\theaders: Headers;\n\t}) => Promise<EndpointResponse>\n>;\n\nexport type AuthMiddleware = ReturnType<typeof createAuthMiddleware>;\n","import { APIError } from \"better-call\";\nimport { z } from \"zod\";\nimport { hs256 } from \"../../crypto\";\nimport { createAuthMiddleware } from \"../call\";\n\nexport const csrfMiddleware = createAuthMiddleware(\n\t{\n\t\tbody: z\n\t\t\t.object({\n\t\t\t\tcsrfToken: z.string().optional(),\n\t\t\t})\n\t\t\t.optional(),\n\t},\n\tasync (ctx) => {\n\t\tif (\n\t\t\tctx.request?.method !== \"POST\" ||\n\t\t\tctx.context.options.advanced?.disableCSRFCheck\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tconst url = new URL(ctx.request.url);\n\t\t/**\n\t\t * If origin is the same as baseURL or if the\n\t\t * origin is in the trustedOrigins then we\n\t\t * don't need to check the CSRF token.\n\t\t */\n\t\tif (\n\t\t\turl.origin === new URL(ctx.context.baseURL).origin ||\n\t\t\tctx.context.options.trustedOrigins?.includes(url.origin)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst csrfToken = ctx.body?.csrfToken;\n\t\tconst csrfCookie = await ctx.getSignedCookie(\n\t\t\tctx.context.authCookies.csrfToken.name,\n\t\t\tctx.context.secret,\n\t\t);\n\t\tconst [token, hash] = csrfCookie?.split(\"!\") || [null, null];\n\t\tif (\n\t\t\t!csrfToken ||\n\t\t\t!csrfCookie ||\n\t\t\t!token ||\n\t\t\t!hash ||\n\t\t\tcsrfCookie !== csrfToken\n\t\t) {\n\t\t\tctx.setCookie(ctx.context.authCookies.csrfToken.name, \"\", {\n\t\t\t\tmaxAge: 0,\n\t\t\t});\n\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\tmessage: \"Invalid CSRF Token\",\n\t\t\t});\n\t\t}\n\t\tconst expectedHash = await hs256(ctx.context.secret, token);\n\t\tif (hash !== expectedHash) {\n\t\t\tctx.setCookie(ctx.context.authCookies.csrfToken.name, \"\", {\n\t\t\t\tmaxAge: 0,\n\t\t\t});\n\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\tmessage: \"Invalid CSRF Token\",\n\t\t\t});\n\t\t}\n\t},\n);\n","export class BetterAuthError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t}\n}\n","import { BetterAuthError } from \"../error/better-auth-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 env: any = typeof process !== \"undefined\" ? process.env : {};\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\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","import { createOAuth2Request, sendTokenRequest } from \"arctic/dist/request\";\nimport type { ProviderOptions } from \".\";\nimport { getBaseURL } from \"../utils/base-url\";\n\nexport function getRedirectURI(providerId: string, redirectURI?: string) {\n\treturn redirectURI || `${getBaseURL()}/callback/${providerId}`;\n}\n\nexport async function validateAuthorizationCode({\n\tcode,\n\tcodeVerifier,\n\tredirectURI,\n\toptions,\n\ttokenEndpoint,\n}: {\n\tcode: string;\n\tredirectURI: string;\n\toptions: ProviderOptions;\n\tcodeVerifier?: string;\n\ttokenEndpoint: string;\n}) {\n\tconst body = new URLSearchParams();\n\tbody.set(\"grant_type\", \"authorization_code\");\n\tbody.set(\"code\", code);\n\tbody.set(\"code_verifier\", codeVerifier || \"\");\n\tbody.set(\"redirect_uri\", redirectURI);\n\tbody.set(\"client_id\", options.clientId);\n\tbody.set(\"client_secret\", options.clientSecret);\n\tconst request = createOAuth2Request(tokenEndpoint, body);\n\tconst tokens = await sendTokenRequest(request);\n\treturn tokens;\n}\n","import { OAuth2Tokens } from \"arctic\";\nimport type { OAuthProvider } from \".\";\nimport { parseJWT } from \"oslo/jwt\";\nimport { betterFetch } from \"@better-fetch/fetch\";\nimport { BetterAuthError } from \"../error/better-auth-error\";\nimport { getRedirectURI } from \"./utils\";\nexport interface AppleProfile {\n\t/**\n\t * The subject registered claim identifies the principal that’s the subject\n\t * of the identity token. Because this token is for your app, the value is\n\t * the unique identifier for the user.\n\t */\n\tsub: string;\n\t/**\n\t * A String value representing the user's email address.\n\t * The email address is either the user's real email address or the proxy\n\t * address, depending on their status private email relay service.\n\t */\n\temail: string;\n\t/**\n\t * A string or Boolean value that indicates whether the service verifies\n\t * the email. The value can either be a string (\"true\" or \"false\") or a\n\t * Boolean (true or false). The system may not verify email addresses for\n\t * Sign in with Apple at Work & School users, and this claim is \"false\" or\n\t * false for those users.\n\t */\n\temail_verified: true | \"true\";\n\t/**\n\t * A string or Boolean value that indicates whether the email that the user\n\t * shares is the proxy address. The value can either be a string (\"true\" or\n\t * \"false\") or a Boolean (true or false).\n\t */\n\tis_private_email: boolean;\n\t/**\n\t * An Integer value that indicates whether the user appears to be a real\n\t * person. Use the value of this claim to mitigate fraud. The possible\n\t * values are: 0 (or Unsupported), 1 (or Unknown), 2 (or LikelyReal). For\n\t * more information, see ASUserDetectionStatus. This claim is present only\n\t * in iOS 14 and later, macOS 11 and later, watchOS 7 and later, tvOS 14\n\t * and later. The claim isn’t present or supported for web-based apps.\n\t */\n\treal_user_status: number;\n\t/**\n\t * The user’s full name in the format provided during the authorization\n\t * process.\n\t */\n\tname: string;\n}\n\nexport interface AppleOptions {\n\tclientId: string;\n\tclientSecret: string;\n\tredirectURI?: string;\n}\n\nexport const apple = ({\n\tclientId,\n\tclientSecret,\n\tredirectURI,\n}: AppleOptions) => {\n\tconst tokenEndpoint = \"https://appleid.apple.com/auth/token\";\n\tredirectURI = getRedirectURI(\"apple\", redirectURI);\n\treturn {\n\t\tid: \"apple\",\n\t\tname: \"Apple\",\n\t\tcreateAuthorizationURL({ state, scopes }) {\n\t\t\tconst _scope = scopes || [\"email\", \"name\", \"openid\"];\n\t\t\treturn new URL(\n\t\t\t\t`https://appleid.apple.com/auth/authorize?client_id=${clientId}&response_type=code&redirect_uri=${redirectURI}&scope=${_scope.join(\n\t\t\t\t\t\" \",\n\t\t\t\t)}&state=${state}`,\n\t\t\t);\n\t\t},\n\t\tvalidateAuthorizationCode: async (code) => {\n\t\t\tconst data = await betterFetch<OAuth2Tokens>(tokenEndpoint, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tbody: new URLSearchParams({\n\t\t\t\t\tclient_id: clientId,\n\t\t\t\t\tclient_secret: clientSecret,\n\t\t\t\t\tgrant_type: \"authorization_code\",\n\t\t\t\t\tcode,\n\t\t\t\t}),\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": \"application/x-www-form-urlencoded\",\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (data.error) {\n\t\t\t\tthrow new BetterAuthError(data.error?.message || \"\");\n\t\t\t}\n\t\t\treturn data.data;\n\t\t},\n\t\tasync getUserInfo(token) {\n\t\t\tconst data = parseJWT(token.idToken())?.payload as AppleProfile | null;\n\t\t\tif (!data) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tuser: {\n\t\t\t\t\tid: data.sub,\n\t\t\t\t\tname: data.name,\n\t\t\t\t\temail: data.email,\n\t\t\t\t\temailVerified: data.email_verified === \"true\",\n\t\t\t\t},\n\t\t\t\tdata,\n\t\t\t};\n\t\t},\n\t} satisfies OAuthProvider<AppleProfile>;\n};\n","import { betterFetch } from \"@better-fetch/fetch\";\nimport { Discord } from \"arctic\";\nimport type { OAuthProvider } from \".\";\nimport { getRedirectURI, validateAuthorizationCode } from \"./utils\";\nimport { createOAuth2Request, sendTokenRequest } from \"arctic/dist/request\";\n\nexport interface DiscordProfile extends Record<string, any> {\n\t/** the user's id (i.e. the numerical snowflake) */\n\tid: string;\n\t/** the user's username, not unique across the platform */\n\tusername: string;\n\t/** the user's Discord-tag */\n\tdiscriminator: string;\n\t/** the user's display name, if it is set */\n\tglobal_name: string | null;\n\t/**\n\t * the user's avatar hash:\n\t * https://discord.com/developers/docs/reference#image-formatting\n\t */\n\tavatar: string | null;\n\t/** whether the user belongs to an OAuth2 application */\n\tbot?: boolean;\n\t/**\n\t * whether the user is an Official Discord System user (part of the urgent\n\t * message system)\n\t */\n\tsystem?: boolean;\n\t/** whether the user has two factor enabled on their account */\n\tmfa_enabled: boolean;\n\t/**\n\t * the user's banner hash:\n\t * https://discord.com/developers/docs/reference#image-formatting\n\t */\n\tbanner: string | null;\n\n\t/** the user's banner color encoded as an integer representation of hexadecimal color code */\n\taccent_color: number | null;\n\n\t/**\n\t * the user's chosen language option:\n\t * https://discord.com/developers/docs/reference#locales\n\t */\n\tlocale: string;\n\t/** whether the email on this account has been verified */\n\tverified: boolean;\n\t/** the user's email */\n\temail: string;\n\t/**\n\t * the flags on a user's account:\n\t * https://discord.com/developers/docs/resources/user#user-object-user-flags\n\t */\n\tflags: number;\n\t/**\n\t * the type of Nitro subscription on a user's account:\n\t * https://discord.com/developers/docs/resources/user#user-object-premium-types\n\t */\n\tpremium_type: number;\n\t/**\n\t * the public flags on a user's account:\n\t * https://discord.com/developers/docs/resources/user#user-object-user-flags\n\t */\n\tpublic_flags: number;\n\t/** undocumented field; corresponds to the user's custom nickname */\n\tdisplay_name: string | null;\n\t/**\n\t * undocumented field; corresponds to the Discord feature where you can e.g.\n\t * put your avatar inside of an ice cube\n\t */\n\tavatar_decoration: string | null;\n\t/**\n\t * undocumented field; corresponds to the premium feature where you can\n\t * select a custom banner color\n\t */\n\tbanner_color: string | null;\n\t/** undocumented field; the CDN URL of their profile picture */\n\timage_url: string;\n}\n\nexport interface DiscordOptions {\n\tclientId: string;\n\tclientSecret: string;\n\tredirectURI?: string;\n}\n\nexport const discord = (options: DiscordOptions) => {\n\tconst discordArctic = new Discord(\n\t\toptions.clientId,\n\t\toptions.clientSecret,\n\t\tgetRedirectURI(\"discord\", options.redirectURI),\n\t);\n\treturn {\n\t\tid: \"discord\",\n\t\tname: \"Discord\",\n\t\tcreateAuthorizationURL({ state, scopes }) {\n\t\t\tconst _scope = scopes || [\"email\"];\n\t\t\treturn discordArctic.createAuthorizationURL(state, _scope);\n\t\t},\n\t\tvalidateAuthorizationCode: async (code, codeVerifier, redirectURI) => {\n\t\t\treturn validateAuthorizationCode({\n\t\t\t\tcode,\n\t\t\t\tcodeVerifier,\n\t\t\t\tredirectURI:\n\t\t\t\t\tredirectURI || getRedirectURI(\"discord\", options.redirectURI),\n\t\t\t\toptions,\n\t\t\t\ttokenEndpoint: \"https://discord.com/api/oauth2/token\",\n\t\t\t});\n\t\t},\n\t\tasync getUserInfo(token) {\n\t\t\tconst { data: profile, error } = await betterFetch<DiscordProfile>(\n\t\t\t\t\"https://discord.com/api/users/@me\",\n\t\t\t\t{\n\t\t\t\t\tauth: {\n\t\t\t\t\t\ttype: \"Bearer\",\n\t\t\t\t\t\ttoken: token.accessToken(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (error) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tuser: {\n\t\t\t\t\tid: profile.id,\n\t\t\t\t\tname: profile.display_name || profile.username || \"\",\n\t\t\t\t\temail: profile.email,\n\t\t\t\t\temailVerified: profile.verified,\n\t\t\t\t},\n\t\t\t\tdata: profile,\n\t\t\t};\n\t\t},\n\t} satisfies OAuthProvider<DiscordProfile>;\n};\n","import { betterFetch } from \"@better-fetch/fetch\";\nimport { Facebook } from \"arctic\";\nimport type { OAuthProvider } from \".\";\nimport { getRedirectURI, validateAuthorizationCode } from \"./utils\";\nimport { createOAuth2Request, sendTokenRequest } from \"arctic/dist/request\";\n\nexport interface FacebookProfile {\n\tid: string;\n\tname: string;\n\temail: string;\n\temail_verified: boolean;\n\tpicture: {\n\t\tdata: {\n\t\t\theight: number;\n\t\t\tis_silhouette: boolean;\n\t\t\turl: string;\n\t\t\twidth: number;\n\t\t};\n\t};\n}\nexport interface FacebookOptions {\n\tclientId: string;\n\tclientSecret: string;\n\tredirectURI?: string;\n}\nexport const facebook = (options: FacebookOptions) => {\n\tconst facebookArctic = new Facebook(\n\t\toptions.clientId,\n\t\toptions.clientSecret,\n\t\tgetRedirectURI(\"facebook\", options.redirectURI),\n\t);\n\treturn {\n\t\tid: \"facebook\",\n\t\tname: \"Facebook\",\n\t\tcreateAuthorizationURL({ state, scopes }) {\n\t\t\tconst _scopes = scopes || [\"email\", \"public_profile\"];\n\t\t\treturn facebookArctic.createAuthorizationURL(state, _scopes);\n\t\t},\n\t\tvalidateAuthorizationCode: async (code, codeVerifier, redirectURI) => {\n\t\t\treturn validateAuthorizationCode({\n\t\t\t\tcode,\n\t\t\t\tcodeVerifier,\n\t\t\t\tredirectURI:\n\t\t\t\t\tredirectURI || getRedirectURI(\"facebook\", options.redirectURI),\n\t\t\t\toptions,\n\t\t\t\ttokenEndpoint: \"https://graph.facebook.com/v16.0/oauth/access_token\",\n\t\t\t});\n\t\t},\n\t\tasync getUserInfo(token) {\n\t\t\tconst { data: profile, error } = await betterFetch<FacebookProfile>(\n\t\t\t\t\"https://graph.facebook.com/me\",\n\t\t\t\t{\n\t\t\t\t\tauth: {\n\t\t\t\t\t\ttype: \"Bearer\",\n\t\t\t\t\t\ttoken: token.accessToken(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (error) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tuser: {\n\t\t\t\t\tid: profile.id,\n\t\t\t\t\tname: profile.name,\n\t\t\t\t\temail: profile.email,\n\t\t\t\t\temailVerified: profile.email_verified,\n\t\t\t\t},\n\t\t\t\tdata: profile,\n\t\t\t};\n\t\t},\n\t} satisfies OAuthProvider<FacebookProfile>;\n};\n","import { betterFetch } from \"@better-fetch/fetch\";\nimport { GitHub } from \"arctic\";\nimport type { OAuthProvider } from \".\";\nimport { getRedirectURI } from \"./utils\";\n\nexport interface GithubProfile {\n\tlogin: string;\n\tid: string;\n\tnode_id: string;\n\tavatar_url: string;\n\tgravatar_id: string;\n\turl: string;\n\thtml_url: string;\n\tfollowers_url: string;\n\tfollowing_url: string;\n\tgists_url: string;\n\tstarred_url: string;\n\tsubscriptions_url: string;\n\torganizations_url: string;\n\trepos_url: string;\n\tevents_url: string;\n\treceived_events_url: string;\n\ttype: string;\n\tsite_admin: boolean;\n\tname: string;\n\tcompany: string;\n\tblog: string;\n\tlocation: string;\n\temail: string;\n\thireable: boolean;\n\tbio: string;\n\ttwitter_username: string;\n\tpublic_repos: string;\n\tpublic_gists: string;\n\tfollowers: string;\n\tfollowing: string;\n\tcreated_at: string;\n\tupdated_at: string;\n\tprivate_gists: string;\n\ttotal_private_repos: string;\n\towned_private_repos: string;\n\tdisk_usage: string;\n\tcollaborators: string;\n\ttwo_factor_authentication: boolean;\n\tplan: {\n\t\tname: string;\n\t\tspace: string;\n\t\tprivate_repos: string;\n\t\tcollaborators: string;\n\t};\n\tfirst_name: string;\n\tlast_name: string;\n}\n\nexport interface GithubOptions {\n\tclientId: string;\n\tclientSecret: string;\n\tredirectURI?: string;\n}\nexport const github = ({\n\tclientId,\n\tclientSecret,\n\tredirectURI,\n}: GithubOptions) => {\n\tconst githubArctic = new GitHub(\n\t\tclientId,\n\t\tclientSecret,\n\t\tgetRedirectURI(\"github\", redirectURI),\n\t);\n\treturn {\n\t\tid: \"github\",\n\t\tname: \"Github\",\n\t\tcreateAuthorizationURL({ state, scopes }) {\n\t\t\tconst _scopes = scopes || [\"user:email\"];\n\t\t\treturn githubArctic.createAuthorizationURL(state, _scopes);\n\t\t},\n\t\tvalidateAuthorizationCode: async (state) => {\n\t\t\treturn await githubArctic.validateAuthorizationCode(state);\n\t\t},\n\t\tasync getUserInfo(token) {\n\t\t\tconsole.log(`Bearer ${token.accessToken()}`);\n\t\t\tconst { data: profile, error } = await betterFetch<GithubProfile>(\n\t\t\t\t\"https://api.github.com/user\",\n\t\t\t\t{\n\t\t\t\t\tauth: {\n\t\t\t\t\t\ttype: \"Bearer\",\n\t\t\t\t\t\ttoken: token.accessToken(),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (error) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tlet emailVerified = false;\n\t\t\tif (!profile.email) {\n\t\t\t\tconst { data, error } = await betterFetch<\n\t\t\t\t\t{\n\t\t\t\t\t\temail: string;\n\t\t\t\t\t\tprimary: boolean;\n\t\t\t\t\t\tverified: boolean;\n\t\t\t\t\t\tvisibility: \"public\" | \"private\";\n\t\t\t\t\t}[]\n\t\t\t\t>(\"https://api.github.com/user/emails\", {\n\t\t\t\t\tauth: {\n\t\t\t\t\t\ttype: \"Bearer\",\n\t\t\t\t\t\ttoken: token.accessToken(),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tif (!error) {\n\t\t\t\t\tprofile.email = (data.find((e) => e.primary) ?? data[0])\n\t\t\t\t\t\t?.email as string;\n\t\t\t\t\temailVerified =\n\t\t\t\t\t\tdata.find((e) => e.email === profile.email)?.verified ?? false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tuser: {\n\t\t\t\t\tid: profile.id,\n\t\t\t\t\tname: profile.name,\n\t\t\t\t\temail: profile.email,\n\t\t\t\t\timage: profile.avatar_url,\n\t\t\t\t\temailVerified,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t},\n\t\t\t\tdata: profile,\n\t\t\t};\n\t\t},\n\t} satisfies OAuthProvider<GithubProfile>;\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 { Google } from \"arctic\";\nimport { parseJWT } from \"oslo/jwt\";\nimport type { OAuthProvider, ProviderOptions } from \".\";\nimport { BetterAuthError } from \"../error/better-auth-error\";\nimport { logger } from \"../utils/logger\";\nimport { createOAuth2Request, sendTokenRequest } from \"arctic/dist/request\";\nimport { getRedirectURI, validateAuthorizationCode } from \"./utils\";\n\nexport interface GoogleProfile {\n\taud: string;\n\tazp: string;\n\temail: string;\n\temail_verified: boolean;\n\texp: number;\n\t/**\n\t * The family name of the user, or last name in most\n\t * Western languages.\n\t */\n\tfamily_name: string;\n\t/*s*\n\t * The given name of the user, or first name in most\n\t * Western languages.\n\t */\n\tgiven_name: string;\n\thd?: string;\n\tiat: number;\n\tiss: string;\n\tjti?: string;\n\tlocale?: string;\n\tname: string;\n\tnbf?: number;\n\tpicture: string;\n\tsub: string;\n}\n\nexport interface GoogleOptions extends ProviderOptions {}\n\nexport const google = (options: GoogleOptions) => {\n\tconst googleArctic = new Google(\n\t\toptions.clientId,\n\t\toptions.clientSecret,\n\t\tgetRedirectURI(\"google\", options.redirectURI),\n\t);\n\treturn {\n\t\tid: \"google\",\n\t\tname: \"Google\",\n\t\tcreateAuthorizationURL({ state, scopes, codeVerifier, redirectURI }) {\n\t\t\tif (!options.clientId || !options.clientSecret) {\n\t\t\t\tlogger.error(\n\t\t\t\t\t\"clientId and clientSecret is required for Google. Make sure to you have provided them in the options\",\n\t\t\t\t);\n\t\t\t\tthrow new BetterAuthError(\"clientId is required for Google\");\n\t\t\t}\n\t\t\tif (!codeVerifier) {\n\t\t\t\tthrow new BetterAuthError(\"codeVerifier is required for Google\");\n\t\t\t}\n\t\t\tconst _scopes = scopes || [\"email\", \"profile\"];\n\t\t\treturn googleArctic.createAuthorizationURL(state, codeVerifier, _scopes);\n\t\t},\n\t\tvalidateAuthorizationCode: async (code, codeVerifier, redirectURI) => {\n\t\t\treturn validateAuthorizationCode({\n\t\t\t\tcode,\n\t\t\t\tcodeVerifier,\n\t\t\t\tredirectURI:\n\t\t\t\t\tredirectURI || getRedirectURI(\"google\", options.redirectURI),\n\t\t\t\toptions,\n\t\t\t\ttokenEndpoint: \"https://oauth2.googleapis.com/token\",\n\t\t\t});\n\t\t},\n\t\tasync getUserInfo(token) {\n\t\t\tif (!token.idToken) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst user = parseJWT(token.idToken())?.payload as GoogleProfile;\n\t\t\treturn {\n\t\t\t\tuser: {\n\t\t\t\t\tid: user.sub,\n\t\t\t\t\tname: user.name,\n\t\t\t\t\temail: user.email,\n\t\t\t\t\timage: user.picture,\n\t\t\t\t\temailVerified: user.email_verified,\n\t\t\t\t},\n\t\t\t\tdata: user,\n\t\t\t};\n\t\t},\n\t} satisfies OAuthProvider<GoogleProfile>;\n};\n","import { betterFetch } from \"@better-fetch/fetch\";\nimport { Spotify } from \"arctic\";\nimport type { OAuthProvider } from \".\";\nimport { getRedirectURI, validateAuthorizationCode } from \"./utils\";\n\nexport interface SpotifyProfile {\n\tid: string;\n\tdisplay_name: string;\n\temail: string;\n\timages: {\n\t\turl: string;\n\t}[];\n}\n\nexport interface SpotifyOptions {\n\tclientId: string;\n\tclientSecret: string;\n\tredirectURI?: string;\n}\n\nexport const spotify = (options: SpotifyOptions) => {\n\tconst spotifyArctic = new Spotify(\n\t\toptions.clientId,\n\t\toptions.clientSecret,\n\t\tgetRedirectURI(\"spotify\", options.redirectURI),\n\t);\n\treturn {\n\t\tid: \"spotify\",\n\t\tname: \"Spotify\",\n\t\tcreateAuthorizationURL({ state, scopes }) {\n\t\t\tconst _scopes = scopes || [\"user-read-email\"];\n\t\t\treturn spotifyArctic.createAuthorizationURL(state, _scopes);\n\t\t},\n\t\tvalidateAuthorizationCode: async (code, codeVerifier, redirectURI) => {\n\t\t\treturn validateAuthorizationCode({\n\t\t\t\tcode,\n\t\t\t\tcodeVerifier,\n\t\t\t\tredirectURI:\n\t\t\t\t\tredirectURI || getRedirectURI(\"spotify\", options.redirectURI),\n\t\t\t\toptions,\n\t\t\t\ttokenEndpoint: \"https://accounts.spotify.com/api/token\",\n\t\t\t});\n\t\t},\n\t\tasync getUserInfo(token) {\n\t\t\tconst { data: profile, error } = await betterFetch<SpotifyProfile>(\n\t\t\t\t\"https://api.spotify.com/v1/me\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer ${token.accessToken()}`,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (error) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tuser: {\n\t\t\t\t\tid: profile.id,\n\t\t\t\t\tname: profile.display_name,\n\t\t\t\t\temail: profile.email,\n\t\t\t\t\timage: profile.images[0]?.url,\n\t\t\t\t\temailVerified: false,\n\t\t\t\t},\n\t\t\t\tdata: profile,\n\t\t\t};\n\t\t},\n\t} satisfies OAuthProvider<SpotifyProfile>;\n};\n","import { betterFetch } from \"@better-fetch/fetch\";\nimport { Twitch } from \"arctic\";\nimport type { OAuthProvider } from \".\";\nimport { getRedirectURI, validateAuthorizationCode } from \"./utils\";\n\nexport interface TwitchProfile {\n\t/**\n\t * The sub of the user\n\t */\n\tsub: string;\n\t/**\n\t * The preferred username of the user\n\t */\n\tpreferred_username: string;\n\t/**\n\t * The email of the user\n\t */\n\temail: string;\n\t/**\n\t * The picture of the user\n\t */\n\tpicture: string;\n}\n\nexport interface TwitchOptions {\n\tclientId: string;\n\tclientSecret: string;\n\tredirectURI?: string;\n}\n\nexport const twitch = (options: TwitchOptions) => {\n\tconst twitchArctic = new Twitch(\n\t\toptions.clientId,\n\t\toptions.clientSecret,\n\t\tgetRedirectURI(\"twitch\", options.redirectURI),\n\t);\n\treturn {\n\t\tid: \"twitch\",\n\t\tname: \"Twitch\",\n\t\tcreateAuthorizationURL({ state, scopes }) {\n\t\t\tconst _scopes = scopes || [\"activity:write\", \"read\"];\n\t\t\treturn twitchArctic.createAuthorizationURL(state, _scopes);\n\t\t},\n\t\tvalidateAuthorizationCode: async (code, codeVerifier, redirectURI) => {\n\t\t\treturn validateAuthorizationCode({\n\t\t\t\tcode,\n\t\t\t\tcodeVerifier,\n\t\t\t\tredirectURI:\n\t\t\t\t\tredirectURI || getRedirectURI(\"twitch\", options.redirectURI),\n\t\t\t\toptions,\n\t\t\t\ttokenEndpoint: \"https://id.twitch.tv/oauth2/token\",\n\t\t\t});\n\t\t},\n\t\tasync getUserInfo(token) {\n\t\t\tconst { data: profile, error } = await betterFetch<TwitchProfile>(\n\t\t\t\t\"https://api.twitch.tv/helix/users\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer ${token.accessToken()}`,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (error) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tuser: {\n\t\t\t\t\tid: profile.sub,\n\t\t\t\t\tname: profile.preferred_username,\n\t\t\t\t\temail: profile.email,\n\t\t\t\t\timage: profile.picture,\n\t\t\t\t\temailVerified: false,\n\t\t\t\t},\n\t\t\t\tdata: profile,\n\t\t\t};\n\t\t},\n\t} satisfies OAuthProvider<TwitchProfile>;\n};\n","import { betterFetch } from \"@better-fetch/fetch\";\nimport { Twitter } from \"arctic\";\nimport type { OAuthProvider } from \".\";\nimport { getRedirectURI, validateAuthorizationCode } from \"./utils\";\nimport { BetterAuthError } from \"../error/better-auth-error\";\n\nexport interface TwitterProfile {\n\tdata: {\n\t\t/**\n\t\t * Unique identifier of this user. This is returned as a string in order to avoid complications with languages and tools\n\t\t * that cannot handle large integers.\n\t\t */\n\t\tid: string;\n\t\t/** The friendly name of this user, as shown on their profile. */\n\t\tname: string;\n\t\t/** @note Email is currently unsupported by Twitter. */\n\t\temail?: string;\n\t\t/** The Twitter handle (screen name) of this user. */\n\t\tusername: string;\n\t\t/**\n\t\t * The location specified in the user's profile, if the user provided one.\n\t\t * As this is a freeform value, it may not indicate a valid location, but it may be fuzzily evaluated when performing searches with location queries.\n\t\t *\n\t\t * To return this field, add `user.fields=location` in the authorization request's query parameter.\n\t\t */\n\t\tlocation?: string;\n\t\t/**\n\t\t * This object and its children fields contain details about text that has a special meaning in the user's description.\n\t\t *\n\t\t *To return this field, add `user.fields=entities` in the authorization request's query parameter.\n\t\t */\n\t\tentities?: {\n\t\t\t/** Contains details about the user's profile website. */\n\t\t\turl: {\n\t\t\t\t/** Contains details about the user's profile website. */\n\t\t\t\turls: Array<{\n\t\t\t\t\t/** The start position (zero-based) of the recognized user's profile website. All start indices are inclusive. */\n\t\t\t\t\tstart: number;\n\t\t\t\t\t/** The end position (zero-based) of the recognized user's profile website. This end index is exclusive. */\n\t\t\t\t\tend: number;\n\t\t\t\t\t/** The URL in the format entered by the user. */\n\t\t\t\t\turl: string;\n\t\t\t\t\t/** The fully resolved URL. */\n\t\t\t\t\texpanded_url: string;\n\t\t\t\t\t/** The URL as displayed in the user's profile. */\n\t\t\t\t\tdisplay_url: string;\n\t\t\t\t}>;\n\t\t\t};\n\t\t\t/** Contains details about URLs, Hashtags, Cashtags, or mentions located within a user's description. */\n\t\t\tdescription: {\n\t\t\t\thashtags: Array<{\n\t\t\t\t\tstart: number;\n\t\t\t\t\tend: number;\n\t\t\t\t\ttag: string;\n\t\t\t\t}>;\n\t\t\t};\n\t\t};\n\t\t/**\n\t\t * Indicate if this user is a verified Twitter user.\n\t\t *\n\t\t * To return this field, add `user.fields=verified` in the authorization request's query parameter.\n\t\t */\n\t\tverified?: boolean;\n\t\t/**\n\t\t * The text of this user's profile description (also known as bio), if the user provided one.\n\t\t *\n\t\t * To return this field, add `user.fields=description` in the authorization request's query parameter.\n\t\t */\n\t\tdescription?: string;\n\t\t/**\n\t\t * The URL specified in the user's profile, if present.\n\t\t *\n\t\t * To return this field, add `user.fields=url` in the authorization request's query parameter.\n\t\t */\n\t\turl?: string;\n\t\t/** The URL to the profile image for this user, as shown on the user's profile. */\n\t\tprofile_image_url?: string;\n\t\tprotected?: boolean;\n\t\t/**\n\t\t * Unique identifier of this user's pinned Tweet.\n\t\t *\n\t\t * You can obtain the expanded object in `includes.tweets` by adding `expansions=pinned_tweet_id` in the authorization request's query parameter.\n\t\t */\n\t\tpinned_tweet_id?: string;\n\t\tcreated_at?: string;\n\t};\n\tincludes?: {\n\t\ttweets?: Array<{\n\t\t\tid: string;\n\t\t\ttext: string;\n\t\t}>;\n\t};\n\t[claims: string]: unknown;\n}\n\nexport interface TwitterOption {\n\tclientId: string;\n\tclientSecret: string;\n\tredirectURI?: string;\n}\n\nexport const twitter = (options: TwitterOption) => {\n\tconst twitterArctic = new Twitter(\n\t\toptions.clientId,\n\t\toptions.clientSecret,\n\t\tgetRedirectURI(\"twitter\", options.redirectURI),\n\t);\n\treturn {\n\t\tid: \"twitter\",\n\t\tname: \"Twitter\",\n\t\tcreateAuthorizationURL(data) {\n\t\t\tconst _scopes = data.scopes || [\"account_info.read\"];\n\t\t\treturn twitterArctic.createAuthorizationURL(\n\t\t\t\tdata.state,\n\t\t\t\tdata.codeVerifier,\n\t\t\t\t_scopes,\n\t\t\t);\n\t\t},\n\t\tvalidateAuthorizationCode: async (code, codeVerifier, redirectURI) => {\n\t\t\treturn validateAuthorizationCode({\n\t\t\t\tcode,\n\t\t\t\tcodeVerifier,\n\t\t\t\tredirectURI:\n\t\t\t\t\tredirectURI || getRedirectURI(\"twitch\", options.redirectURI),\n\t\t\t\toptions,\n\t\t\t\ttokenEndpoint: \"https://id.twitch.tv/oauth2/token\",\n\t\t\t});\n\t\t},\n\t\tasync getUserInfo(token) {\n\t\t\tconst { data: profile, error } = await betterFetch<TwitterProfile>(\n\t\t\t\t\"https://api.x.com/2/users/me?user.fields=profile_image_url\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer ${token.accessToken()}`,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (error) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tif (!profile.data.email) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tuser: {\n\t\t\t\t\tid: profile.data.id,\n\t\t\t\t\tname: profile.data.name,\n\t\t\t\t\temail: profile.data.email,\n\t\t\t\t\timage: profile.data.profile_image_url,\n\t\t\t\t\temailVerified: profile.data.verified || false,\n\t\t\t\t},\n\t\t\t\tdata: profile,\n\t\t\t};\n\t\t},\n\t} satisfies OAuthProvider<TwitterProfile>;\n};\n","import { apple } from \"./apple\";\nimport { discord } from \"./discord\";\nimport { facebook } from \"./facebook\";\nimport { github } from \"./github\";\nimport { google } from \"./google\";\nimport { spotify } from \"./spotify\";\nimport { twitch } from \"./twitch\";\nimport { twitter } from \"./twitter\";\n\nexport const oAuthProviders = {\n\tapple,\n\tdiscord,\n\tfacebook,\n\tgithub,\n\tgoogle,\n\tspotify,\n\ttwitch,\n\ttwitter,\n};\n\nexport const oAuthProviderList = Object.keys(oAuthProviders) as [\n\t\"github\",\n\t...(keyof typeof oAuthProviders)[],\n];\n\nexport * from \"./github\";\nexport * from \"./google\";\nexport * from \"./apple\";\nexport * from \"./discord\";\nexport * from \"./spotify\";\nexport * from \"./twitch\";\nexport * from \"./facebook\";\nexport * from \"./twitter\";\nexport * from \"../types/provider\";\n","import { generateState as generateStateOAuth } from \"oslo/oauth2\";\nimport { z } from \"zod\";\n\nexport function generateState(\n\tcallbackURL?: string,\n\tcurrentURL?: string,\n\tdontRememberMe?: boolean,\n) {\n\tconst code = generateStateOAuth();\n\tconst state = JSON.stringify({\n\t\tcode,\n\t\tcallbackURL,\n\t\tcurrentURL,\n\t\tdontRememberMe,\n\t});\n\treturn { state, code };\n}\n\nexport function parseState(state: string) {\n\tconst data = z\n\t\t.object({\n\t\t\tcode: z.string(),\n\t\t\tcallbackURL: z.string().optional(),\n\t\t\tcurrentURL: z.string().optional(),\n\t\t\tdontRememberMe: z.boolean().optional(),\n\t\t})\n\t\t.safeParse(JSON.parse(state));\n\treturn data;\n}\n","export const getDate = (span: number, isSeconds = false) => {\n\tconst date = new Date();\n\treturn new Date(date.getTime() + (isSeconds ? span * 1000 : span));\n};\n","import type { Context, CookieOptions } from \"better-call\";\nimport { TimeSpan } from \"oslo\";\nimport type { BetterAuthOptions } from \"../types/options\";\nimport type { GenericEndpointContext } from \"../types/context\";\n\nexport function getCookies(options: BetterAuthOptions) {\n\tconst secure =\n\t\t!!options.advanced?.useSecureCookies ||\n\t\t(process.env.NODE_ENV !== \"development\" && process.env.NODE_ENV !== \"test\");\n\tconst secureCookiePrefix = secure ? \"__Secure-\" : \"\";\n\tconst cookiePrefix = \"better-auth\";\n\tconst sessionMaxAge = new TimeSpan(7, \"d\").seconds();\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: \"lax\",\n\t\t\t\tpath: \"/\",\n\t\t\t\tsecure: !!secureCookiePrefix,\n\t\t\t\tmaxAge: sessionMaxAge,\n\t\t\t} satisfies CookieOptions,\n\t\t},\n\t\tcsrfToken: {\n\t\t\tname: `${secureCookiePrefix ? \"__Host-\" : \"\"}${cookiePrefix}.csrf_token`,\n\t\t\toptions: {\n\t\t\t\thttpOnly: true,\n\t\t\t\tsameSite: \"lax\",\n\t\t\t\tpath: \"/\",\n\t\t\t\tsecure: !!secureCookiePrefix,\n\t\t\t\tmaxAge: 60 * 60 * 24 * 7,\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: \"lax\",\n\t\t\t\tpath: \"/\",\n\t\t\t\tsecure: !!secureCookiePrefix,\n\t\t\t\tmaxAge: 60 * 15, // 15 minutes in seconds\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: \"lax\",\n\t\t\t\tpath: \"/\",\n\t\t\t\tsecure: !!secureCookiePrefix,\n\t\t\t\tmaxAge: 60 * 15, // 15 minutes in seconds\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: \"lax\",\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} 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: \"lax\",\n\t\t\t\tpath: \"/\",\n\t\t\t\tsecure: !!secureCookiePrefix,\n\t\t\t\tmaxAge: 60 * 15, // 15 minutes in seconds\n\t\t\t} as CookieOptions,\n\t\t},\n\t};\n}\n\nexport function createCookieGetter(options: BetterAuthOptions) {\n\tconst secure =\n\t\t!!options.advanced?.useSecureCookies ||\n\t\tprocess.env.NODE_ENV === \"production\";\n\tconst secureCookiePrefix = secure ? \"__Secure-\" : \"\";\n\tconst cookiePrefix = \"better-auth\";\n\tfunction getCookie(cookieName: string, options?: CookieOptions) {\n\t\treturn {\n\t\t\tname:\n\t\t\t\tprocess.env.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...options,\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 ? undefined : options.maxAge;\n\tawait ctx.setSignedCookie(\n\t\tctx.context.authCookies.sessionToken.name,\n\t\tsessionToken,\n\t\tctx.context.secret,\n\t\toptions,\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\t// biome-ignore lint/complexity/noForEach: <explanation>\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\t// biome-ignore lint/complexity/noForEach: <explanation>\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}\n","import { APIError } from \"better-call\";\nimport { createAuthMiddleware } from \"../call\";\nimport { getSessionFromCtx } from \"../routes\";\n\nexport const sessionMiddleware = createAuthMiddleware(async (ctx) => {\n\tconst session = await getSessionFromCtx(ctx);\n\tif (!session?.session) {\n\t\tthrow new APIError(\"UNAUTHORIZED\");\n\t}\n\treturn {\n\t\tsession,\n\t};\n});\n","import type { Context } from \"better-call\";\nimport { createAuthEndpoint } from \"../call\";\nimport { getDate } from \"../../utils/date\";\nimport { deleteSessionCookie, setSessionCookie } from \"../../utils/cookies\";\nimport { sessionMiddleware } from \"../middlewares/session\";\nimport type { Session } from \"../../adapters/schema\";\nimport { z } from \"zod\";\n\nexport const getSession = createAuthEndpoint(\n\t\"/session\",\n\t{\n\t\tmethod: \"GET\",\n\t\trequireHeaders: true,\n\t},\n\tasync (ctx) => {\n\t\ttry {\n\t\t\tconst sessionCookieToken = await ctx.getSignedCookie(\n\t\t\t\tctx.context.authCookies.sessionToken.name,\n\t\t\t\tctx.context.secret,\n\t\t\t);\n\n\t\t\tif (!sessionCookieToken) {\n\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\tstatus: 401,\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst session =\n\t\t\t\tawait ctx.context.internalAdapter.findSession(sessionCookieToken);\n\n\t\t\tif (!session || session.session.expiresAt < new Date()) {\n\t\t\t\tdeleteSessionCookie(ctx);\n\t\t\t\tif (session) {\n\t\t\t\t\t/**\n\t\t\t\t\t * if session expired clean up the session\n\t\t\t\t\t */\n\t\t\t\t\tawait ctx.context.internalAdapter.deleteSession(session.session.id);\n\t\t\t\t}\n\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\tstatus: 401,\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst dontRememberMe = await ctx.getSignedCookie(\n\t\t\t\tctx.context.authCookies.dontRememberToken.name,\n\t\t\t\tctx.context.secret,\n\t\t\t);\n\t\t\t/**\n\t\t\t * We don't need to update the session if the user doesn't want to be remembered\n\t\t\t */\n\t\t\tif (dontRememberMe) {\n\t\t\t\treturn ctx.json(session);\n\t\t\t}\n\t\t\tconst expiresIn = ctx.context.session.expiresIn;\n\t\t\tconst updateAge = ctx.context.session.updateAge;\n\t\t\t/**\n\t\t\t * Calculate last updated date to throttle write updates to database\n\t\t\t * Formula: ({expiry date} - sessionMaxAge) + sessionUpdateAge\n\t\t\t *\n\t\t\t * e.g. ({expiry date} - 30 days) + 1 hour\n\t\t\t *\n\t\t\t * inspired by: https://github.com/nextauthjs/next-auth/blob/main/packages/core/src/lib/\n\t\t\t * actions/session.ts\n\t\t\t */\n\t\t\tconst sessionIsDueToBeUpdatedDate =\n\t\t\t\tsession.session.expiresAt.valueOf() -\n\t\t\t\texpiresIn * 1000 +\n\t\t\t\tupdateAge * 1000;\n\t\t\tconst shouldBeUpdated = sessionIsDueToBeUpdatedDate <= Date.now();\n\n\t\t\tif (shouldBeUpdated) {\n\t\t\t\tconst updatedSession = await ctx.context.internalAdapter.updateSession(\n\t\t\t\t\tsession.session.id,\n\t\t\t\t\t{\n\t\t\t\t\t\texpiresAt: getDate(ctx.context.session.expiresIn, true),\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (!updatedSession) {\n\t\t\t\t\t/**\n\t\t\t\t\t * Handle case where session update fails (e.g., concurrent deletion)\n\t\t\t\t\t */\n\t\t\t\t\tdeleteSessionCookie(ctx);\n\t\t\t\t\treturn ctx.json(null, { status: 401 });\n\t\t\t\t}\n\t\t\t\tconst maxAge = (updatedSession.expiresAt.valueOf() - Date.now()) / 1000;\n\t\t\t\tawait setSessionCookie(ctx, updatedSession.id, false, {\n\t\t\t\t\tmaxAge,\n\t\t\t\t});\n\t\t\t\treturn ctx.json({\n\t\t\t\t\tsession: updatedSession,\n\t\t\t\t\tuser: session.user,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn ctx.json(session);\n\t\t} catch (error) {\n\t\t\tctx.context.logger.error(error);\n\t\t\treturn ctx.json(null, { status: 500 });\n\t\t}\n\t},\n);\n\nexport const getSessionFromCtx = async (ctx: Context<any, any>) => {\n\tconst session = await getSession({\n\t\t...ctx,\n\t\t//@ts-expect-error: By default since this request context comes from a router it'll have a `router` flag which force it to be a request object\n\t\t_flag: undefined,\n\t});\n\treturn session;\n};\n\n/**\n * user active sessions list\n */\nexport const listSessions = createAuthEndpoint(\n\t\"/user/list-sessions\",\n\t{\n\t\tmethod: \"GET\",\n\t\tuse: [sessionMiddleware],\n\t\trequireHeaders: true,\n\t},\n\tasync (ctx) => {\n\t\tconst sessions = await ctx.context.adapter.findMany<Session>({\n\t\t\tmodel: ctx.context.tables.session.tableName,\n\t\t\twhere: [\n\t\t\t\t{\n\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\tvalue: ctx.context.session.user.id,\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t\tconst activeSessions = sessions.filter((session) => {\n\t\t\treturn session.expiresAt > new Date();\n\t\t});\n\t\treturn ctx.json(activeSessions);\n\t},\n);\n\n/**\n * revoke a single session\n */\nexport const revokeSession = createAuthEndpoint(\n\t\"/user/revoke-session\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\tid: z.string(),\n\t\t}),\n\t\tuse: [sessionMiddleware],\n\t\trequireHeaders: true,\n\t},\n\tasync (ctx) => {\n\t\tconst id = ctx.body.id;\n\t\tawait ctx.context.internalAdapter.deleteSession(id);\n\t\treturn ctx.json({\n\t\t\tstatus: true,\n\t\t});\n\t},\n);\n/**\n * revoke all user sessions\n */\nexport const revokeSessions = createAuthEndpoint(\n\t\"/user/revoke-sessions\",\n\t{\n\t\tmethod: \"POST\",\n\t\tuse: [sessionMiddleware],\n\t\trequireHeaders: true,\n\t},\n\tasync (ctx) => {\n\t\tawait ctx.context.internalAdapter.deleteSessions(\n\t\t\tctx.context.session.user.id,\n\t\t);\n\t\treturn ctx.json({\n\t\t\tstatus: true,\n\t\t});\n\t},\n);\n","import { APIError } from \"better-call\";\nimport { generateCodeVerifier } from \"oslo/oauth2\";\nimport { z } from \"zod\";\nimport { oAuthProviderList } from \"../../social-providers\";\nimport { generateState } from \"../../utils/state\";\nimport { createAuthEndpoint } from \"../call\";\nimport { getSessionFromCtx } from \"./session\";\nimport { setSessionCookie } from \"../../utils/cookies\";\n\nexport const signInOAuth = createAuthEndpoint(\n\t\"/sign-in/social\",\n\t{\n\t\tmethod: \"POST\",\n\t\trequireHeaders: true,\n\t\tquery: z\n\t\t\t.object({\n\t\t\t\t/**\n\t\t\t\t * Redirect to the current URL after the\n\t\t\t\t * user has signed in.\n\t\t\t\t */\n\t\t\t\tcurrentURL: z.string().optional(),\n\t\t\t})\n\t\t\t.optional(),\n\t\tbody: z.object({\n\t\t\t/**\n\t\t\t * Callback URL to redirect to after the user has signed in.\n\t\t\t */\n\t\t\tcallbackURL: z.string().optional(),\n\t\t\t/**\n\t\t\t * OAuth2 provider to use`\n\t\t\t */\n\t\t\tprovider: z.enum(oAuthProviderList),\n\t\t\t/**\n\t\t\t * If this is true the session will only be valid for the current browser session\n\t\t\t */\n\t\t\tdontRememberMe: z.boolean().default(false).optional(),\n\t\t}),\n\t},\n\tasync (c) => {\n\t\tconst provider = c.context.options.socialProvider?.find(\n\t\t\t(p) => p.id === c.body.provider,\n\t\t);\n\t\tif (!provider) {\n\t\t\tc.context.logger.error(\n\t\t\t\t\"Provider not found. Make sure to add the provider to your auth config\",\n\t\t\t\t{\n\t\t\t\t\tprovider: c.body.provider,\n\t\t\t\t},\n\t\t\t);\n\t\t\tthrow new APIError(\"NOT_FOUND\", {\n\t\t\t\tmessage: \"Provider not found\",\n\t\t\t});\n\t\t}\n\t\tconst cookie = c.context.authCookies;\n\t\tconst currentURL = c.query?.currentURL\n\t\t\t? new URL(c.query?.currentURL)\n\t\t\t: null;\n\t\tconst callbackURL = c.body.callbackURL?.startsWith(\"http\")\n\t\t\t? c.body.callbackURL\n\t\t\t: `${currentURL?.origin}${c.body.callbackURL || \"\"}`;\n\t\tconst state = generateState(\n\t\t\tcallbackURL || currentURL?.origin || c.context.baseURL,\n\t\t\tc.query?.currentURL,\n\t\t);\n\t\ttry {\n\t\t\tawait c.setSignedCookie(\n\t\t\t\tcookie.state.name,\n\t\t\t\tstate.code,\n\t\t\t\tc.context.secret,\n\t\t\t\tcookie.state.options,\n\t\t\t);\n\t\t\tconst codeVerifier = generateCodeVerifier();\n\t\t\tawait c.setSignedCookie(\n\t\t\t\tcookie.pkCodeVerifier.name,\n\t\t\t\tcodeVerifier,\n\t\t\t\tc.context.secret,\n\t\t\t\tcookie.pkCodeVerifier.options,\n\t\t\t);\n\t\t\tconst url = provider.createAuthorizationURL({\n\t\t\t\tstate: state.state,\n\t\t\t\tcodeVerifier,\n\t\t\t});\n\t\t\turl.searchParams.set(\n\t\t\t\t\"redirect_uri\",\n\t\t\t\t`${c.context.baseURL}/callback/${c.body.provider}`,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\turl: url.toString(),\n\t\t\t\tstate: state.state,\n\t\t\t\tcodeVerifier,\n\t\t\t\tredirect: true,\n\t\t\t};\n\t\t} catch (e) {\n\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\");\n\t\t}\n\t},\n);\n\nexport const signInEmail = createAuthEndpoint(\n\t\"/sign-in/email\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\temail: z.string().email(),\n\t\t\tpassword: z.string(),\n\t\t\tcallbackURL: z.string().optional(),\n\t\t\t/**\n\t\t\t * If this is true the session will only be valid for the current browser session\n\t\t\t * @default false\n\t\t\t */\n\t\t\tdontRememberMe: z.boolean().default(false).optional(),\n\t\t}),\n\t},\n\tasync (ctx) => {\n\t\tif (!ctx.context.options?.emailAndPassword?.enabled) {\n\t\t\tctx.context.logger.error(\"Email and password is not enabled\");\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Email and password is not enabled\",\n\t\t\t});\n\t\t}\n\t\tconst currentSession = await getSessionFromCtx(ctx);\n\t\tif (currentSession) {\n\t\t\t/**\n\t\t\t * Delete the current session if it exists\n\t\t\t */\n\t\t\tawait ctx.context.internalAdapter.deleteSession(\n\t\t\t\tcurrentSession.session.id,\n\t\t\t);\n\t\t}\n\t\tconst { email, password } = ctx.body;\n\t\tconst checkEmail = z.string().email().safeParse(email);\n\t\tif (!checkEmail.success) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Invalid email\",\n\t\t\t});\n\t\t}\n\t\tconst user = await ctx.context.internalAdapter.findUserByEmail(email);\n\t\tif (!user) {\n\t\t\tawait ctx.context.password.hash(password);\n\t\t\tctx.context.logger.error(\"User not found\", { email });\n\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\tmessage: \"Invalid email or password\",\n\t\t\t});\n\t\t}\n\t\tconst credentialAccount = user.accounts.find(\n\t\t\t(a) => a.providerId === \"credential\",\n\t\t);\n\t\tif (!credentialAccount) {\n\t\t\tctx.context.logger.error(\"Credential account not found\", { email });\n\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\tmessage: \"Invalid email or password\",\n\t\t\t});\n\t\t}\n\t\tconst currentPassword = credentialAccount?.password;\n\t\tif (!currentPassword) {\n\t\t\tctx.context.logger.error(\"Password not found\", { email });\n\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\tmessage: \"Unexpected error\",\n\t\t\t});\n\t\t}\n\t\tconst validPassword = await ctx.context.password.verify(\n\t\t\tcurrentPassword,\n\t\t\tpassword,\n\t\t);\n\t\tif (!validPassword) {\n\t\t\tctx.context.logger.error(\"Invalid password\");\n\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\tmessage: \"Invalid email or password\",\n\t\t\t});\n\t\t}\n\t\tconst session = await ctx.context.internalAdapter.createSession(\n\t\t\tuser.user.id,\n\t\t\tctx.headers,\n\t\t\tctx.body.dontRememberMe,\n\t\t);\n\t\tawait setSessionCookie(ctx, session.id, ctx.body.dontRememberMe);\n\t\treturn ctx.json({\n\t\t\tuser: user.user,\n\t\t\tsession,\n\t\t\tredirect: !!ctx.body.callbackURL,\n\t\t\turl: ctx.body.callbackURL,\n\t\t});\n\t},\n);\n","import { z } from \"zod\";\nimport type { FieldAttribute } from \"../db\";\nimport type { BetterAuthOptions } from \"../types\";\n\nexport const accountSchema = z.object({\n\tid: z.string(),\n\tproviderId: z.string(),\n\taccountId: z.string(),\n\tuserId: z.string(),\n\taccessToken: z.string().nullable().optional(),\n\trefreshToken: z.string().nullable().optional(),\n\tidToken: z.string().nullable().optional(),\n\taccessTokenExpiresAt: z.date().nullable().optional(),\n\trefreshTokenExpiresAt: z.date().nullable().optional(),\n\t/**\n\t * Password is only stored in the credential provider\n\t */\n\tpassword: z.string().optional().nullable(),\n});\n\nexport const userSchema = z.object({\n\tid: z.string(),\n\temail: z.string().transform((val) => val.toLowerCase()),\n\temailVerified: z.boolean().default(false),\n\tname: z.string(),\n\timage: z.string().optional(),\n\tcreatedAt: z.date().default(new Date()),\n\tupdatedAt: z.date().default(new Date()),\n});\n\nexport const sessionSchema = z.object({\n\tid: z.string(),\n\tuserId: z.string(),\n\texpiresAt: z.date(),\n\tipAddress: z.string().optional(),\n\tuserAgent: z.string().optional(),\n});\n\nexport type User = z.infer<typeof userSchema>;\nexport type Account = z.infer<typeof accountSchema>;\nexport type Session = z.infer<typeof sessionSchema>;\nexport interface MigrationTable {\n\tname: string;\n\ttimestamp: string;\n}\n\nexport function parseData<T extends Record<string, any>>(\n\tdata: T,\n\tschema: {\n\t\tfields: Record<string, FieldAttribute>;\n\t},\n) {\n\tconst fields = schema.fields;\n\tconst parsedData: Record<string, any> = {};\n\tfor (const key in data) {\n\t\tconst field = fields[key];\n\t\tif (!field) {\n\t\t\tparsedData[key] = data[key];\n\t\t\tcontinue;\n\t\t}\n\t\tif (field.returned === false) {\n\t\t\tcontinue;\n\t\t}\n\t\tparsedData[key] = data[key];\n\t}\n\treturn parsedData as T;\n}\n\nexport function getAllFields(options: BetterAuthOptions, table: string) {\n\tlet schema: Record<string, FieldAttribute> = {};\n\tfor (const plugin of options.plugins || []) {\n\t\tif (plugin.schema && plugin.schema[table]) {\n\t\t\tschema = {\n\t\t\t\t...schema,\n\t\t\t\t...plugin.schema[table].fields,\n\t\t\t};\n\t\t}\n\t}\n\treturn schema;\n}\n\nexport function parseUser(options: BetterAuthOptions, user: User) {\n\tconst schema = getAllFields(options, \"user\");\n\treturn parseData(user, { fields: schema });\n}\n\nexport function parseAccount(options: BetterAuthOptions, account: Account) {\n\tconst schema = getAllFields(options, \"account\");\n\treturn parseData(account, { fields: schema });\n}\n\nexport function parseSession(options: BetterAuthOptions, session: Session) {\n\tconst schema = getAllFields(options, \"session\");\n\treturn parseData(session, { fields: schema });\n}\n","import { alphabet, generateRandomString } from \"oslo/crypto\";\nexport const generateId = () => {\n\treturn generateRandomString(36, alphabet(\"a-z\", \"0-9\"));\n};\n","export const HIDE_METADATA = {\n\tisAction: false as const,\n};\n","import type { OAuth2Tokens } from \"arctic\";\n\nexport function getAccountTokens(tokens: OAuth2Tokens) {\n\tconst accessToken = tokens.accessToken();\n\tlet refreshToken = undefined;\n\n\ttry {\n\t\trefreshToken = tokens.refreshToken();\n\t} catch {}\n\tlet accessTokenExpiresAt = undefined;\n\tlet refreshTokenExpiresAt = undefined;\n\ttry {\n\t\taccessTokenExpiresAt = tokens.accessTokenExpiresAt();\n\t} catch {}\n\ttry {\n\t\trefreshTokenExpiresAt = tokens.refreshTokenExpiresAt();\n\t} catch {}\n\treturn {\n\t\taccessToken,\n\t\trefreshToken,\n\t\taccessTokenExpiresAt,\n\t\trefreshTokenExpiresAt,\n\t};\n}\n","import { APIError } from \"better-call\";\nimport { z } from \"zod\";\nimport { userSchema } from \"../../adapters/schema\";\nimport { generateId } from \"../../utils/id\";\nimport { parseState } from \"../../utils/state\";\nimport { createAuthEndpoint } from \"../call\";\nimport { HIDE_METADATA } from \"../../utils/hide-metadata\";\nimport { getAccountTokens } from \"../../utils/getAccount\";\nimport { setSessionCookie } from \"../../utils/cookies\";\nimport type { OAuth2Tokens } from \"arctic\";\n\nexport const callbackOAuth = createAuthEndpoint(\n\t\"/callback/:id\",\n\t{\n\t\tmethod: \"GET\",\n\t\tquery: z.object({\n\t\t\tstate: z.string(),\n\t\t\tcode: z.string(),\n\t\t}),\n\t\tmetadata: HIDE_METADATA,\n\t},\n\tasync (c) => {\n\t\tconst provider = c.context.options.socialProvider?.find(\n\t\t\t(p) => p.id === c.params.id,\n\t\t);\n\t\tif (!provider) {\n\t\t\tc.context.logger.error(\n\t\t\t\t\"Oauth provider with id\",\n\t\t\t\tc.params.id,\n\t\t\t\t\"not found\",\n\t\t\t);\n\t\t\tthrow c.redirect(\n\t\t\t\t`${c.context.baseURL}/error?error=oauth_provider_not_found`,\n\t\t\t);\n\t\t}\n\t\tconst codeVerifier = await c.getSignedCookie(\n\t\t\tc.context.authCookies.pkCodeVerifier.name,\n\t\t\tc.context.secret,\n\t\t);\n\t\tlet tokens: OAuth2Tokens;\n\t\ttry {\n\t\t\tconsole.log({\n\t\t\t\tdata: c.query.code,\n\t\t\t\tcodeVerifier,\n\t\t\t});\n\t\t\ttokens = await provider.validateAuthorizationCode(\n\t\t\t\tc.query.code,\n\t\t\t\tcodeVerifier,\n\t\t\t\t`${c.context.baseURL}/callback/${provider.id}`,\n\t\t\t);\n\t\t} catch (e) {\n\t\t\tc.context.logger.error(e);\n\t\t\tthrow c.redirect(\n\t\t\t\t`${c.context.baseURL}/error?error=oauth_code_verification_failed`,\n\t\t\t);\n\t\t}\n\n\t\tconst user = await provider.getUserInfo(tokens).then((res) => res?.user);\n\t\tconst id = generateId();\n\t\tconst data = userSchema.safeParse({\n\t\t\t...user,\n\t\t\tid,\n\t\t});\n\t\tconst parsedState = parseState(c.query.state);\n\t\tif (!parsedState.success) {\n\t\t\tc.context.logger.error(\"Unable to parse state\");\n\t\t\tthrow c.redirect(\n\t\t\t\t`${c.context.baseURL}/error?error=invalid_state_parameter`,\n\t\t\t);\n\t\t}\n\t\tconst { callbackURL, currentURL, dontRememberMe } = parsedState.data;\n\t\tif (!user || data.success === false) {\n\t\t\tthrow c.redirect(\n\t\t\t\t`${c.context.baseURL}/error?error=oauth_validation_failed`,\n\t\t\t);\n\t\t}\n\t\tif (!callbackURL) {\n\t\t\tthrow c.redirect(\n\t\t\t\t`${c.context.baseURL}/error?error=oauth_callback_url_not_found`,\n\t\t\t);\n\t\t}\n\t\t//find user in db\n\t\tconst dbUser = await c.context.internalAdapter.findUserByEmail(user.email);\n\t\tconst userId = dbUser?.user.id;\n\t\tif (dbUser) {\n\t\t\t//check if user has already linked this provider\n\t\t\tconst hasBeenLinked = dbUser.accounts.find(\n\t\t\t\t(a) => a.providerId === provider.id,\n\t\t\t);\n\t\t\tif (!hasBeenLinked && !user.emailVerified) {\n\t\t\t\tc.context.logger.error(\"User already exists\");\n\t\t\t\tconst url = new URL(currentURL || callbackURL);\n\t\t\t\turl.searchParams.set(\"error\", \"user_already_exists\");\n\t\t\t\tthrow c.redirect(url.toString());\n\t\t\t}\n\n\t\t\tif (!hasBeenLinked && user.emailVerified) {\n\t\t\t\tawait c.context.internalAdapter.linkAccount({\n\t\t\t\t\tproviderId: provider.id,\n\t\t\t\t\taccountId: user.id,\n\t\t\t\t\tid: `${provider.id}:${user.id}`,\n\t\t\t\t\tuserId: dbUser.user.id,\n\t\t\t\t\t...getAccountTokens(tokens),\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tawait c.context.internalAdapter.createOAuthUser(data.data, {\n\t\t\t\t\t...getAccountTokens(tokens),\n\t\t\t\t\tid: `${provider.id}:${user.id}`,\n\t\t\t\t\tproviderId: provider.id,\n\t\t\t\t\taccountId: user.id,\n\t\t\t\t\tuserId: id,\n\t\t\t\t});\n\t\t\t} catch (e) {\n\t\t\t\tconst url = new URL(currentURL || callbackURL);\n\t\t\t\turl.searchParams.set(\"error\", \"unable_to_create_user\");\n\t\t\t\tc.setHeader(\"Location\", url.toString());\n\t\t\t\tthrow c.redirect(url.toString());\n\t\t\t}\n\t\t}\n\t\t//this should never happen\n\t\tif (!userId && !id)\n\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\tmessage: \"Unable to create user\",\n\t\t\t});\n\t\t//create session\n\t\tconst session = await c.context.internalAdapter.createSession(\n\t\t\tuserId || id,\n\t\t\tc.request,\n\t\t\tdontRememberMe,\n\t\t);\n\t\ttry {\n\t\t\tawait setSessionCookie(c, session.id, dontRememberMe);\n\t\t} catch (e) {\n\t\t\tc.context.logger.error(\"Unable to set session cookie\", e);\n\t\t\tconst url = new URL(currentURL || callbackURL);\n\t\t\turl.searchParams.set(\"error\", \"unable_to_create_session\");\n\t\t\tthrow c.redirect(url.toString());\n\t\t}\n\t\tthrow c.redirect(callbackURL);\n\t},\n);\n","import { z } from \"zod\";\nimport { createAuthEndpoint } from \"../call\";\nimport { deleteSessionCookie } from \"../../utils/cookies\";\n\nexport const signOut = createAuthEndpoint(\n\t\"/sign-out\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z\n\t\t\t.object({\n\t\t\t\tcallbackURL: z.string().optional(),\n\t\t\t})\n\t\t\t.optional(),\n\t},\n\tasync (ctx) => {\n\t\tconst sessionCookieToken = await ctx.getSignedCookie(\n\t\t\tctx.context.authCookies.sessionToken.name,\n\t\t\tctx.context.secret,\n\t\t);\n\t\tif (!sessionCookieToken) {\n\t\t\treturn ctx.json(null);\n\t\t}\n\t\tawait ctx.context.internalAdapter.deleteSession(sessionCookieToken);\n\t\tdeleteSessionCookie(ctx);\n\t\treturn ctx.json(null, {\n\t\t\tbody: {\n\t\t\t\tredirect: !!ctx.body?.callbackURL,\n\t\t\t\turl: ctx.body?.callbackURL,\n\t\t\t},\n\t\t});\n\t},\n);\n","import { TimeSpan } from \"oslo\";\nimport { createJWT } from \"oslo/jwt\";\nimport { validateJWT } from \"oslo/jwt\";\nimport { z } from \"zod\";\nimport { createAuthEndpoint } from \"../call\";\n\nexport const forgetPassword = createAuthEndpoint(\n\t\"/forget-password\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\t/**\n\t\t\t * The email address of the user to send a password reset email to.\n\t\t\t */\n\t\t\temail: z.string().email(),\n\t\t}),\n\t},\n\tasync (ctx) => {\n\t\tif (!ctx.context.options.emailAndPassword?.sendResetPasswordToken) {\n\t\t\tctx.context.logger.error(\n\t\t\t\t\"Reset password isn't enabled.Please pass an emailAndPassword.sendResetPasswordToken function to your auth config!\",\n\t\t\t);\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tstatusText: \"RESET_PASSWORD_EMAIL_NOT_SENT\",\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Reset password isn't enabled\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst { email } = ctx.body;\n\t\tconst user = await ctx.context.internalAdapter.findUserByEmail(email);\n\t\tif (!user) {\n\t\t\treturn ctx.json(\n\t\t\t\t{\n\t\t\t\t\terror: \"User not found\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tstatus: 400,\n\t\t\t\t\tstatusText: \"USER_NOT_FOUND\",\n\t\t\t\t\tbody: {\n\t\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t\tconst token = await createJWT(\n\t\t\t\"HS256\",\n\t\t\tBuffer.from(ctx.context.secret),\n\t\t\t{\n\t\t\t\temail: user.user.email,\n\t\t\t},\n\t\t\t{\n\t\t\t\texpiresIn: new TimeSpan(1, \"h\"),\n\t\t\t\tissuer: \"better-auth\",\n\t\t\t\tsubject: \"forget-password\",\n\t\t\t\taudiences: [user.user.email],\n\t\t\t\tincludeIssuedTimestamp: true,\n\t\t\t},\n\t\t);\n\t\tawait ctx.context.options.emailAndPassword.sendResetPasswordToken(\n\t\t\ttoken,\n\t\t\tuser.user,\n\t\t);\n\t\treturn ctx.json({\n\t\t\tstatus: true,\n\t\t});\n\t},\n);\n\nexport const resetPassword = createAuthEndpoint(\n\t\"/reset-password\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\ttoken: z.string(),\n\t\t\tnewPassword: z.string(),\n\t\t\tcallbackURL: z.string().optional(),\n\t\t}),\n\t},\n\tasync (ctx) => {\n\t\tconst { token, newPassword } = ctx.body;\n\t\ttry {\n\t\t\tconst jwt = await validateJWT(\n\t\t\t\t\"HS256\",\n\t\t\t\tBuffer.from(ctx.context.secret),\n\t\t\t\ttoken,\n\t\t\t);\n\t\t\tconst email = z\n\t\t\t\t.string()\n\t\t\t\t.email()\n\t\t\t\t.parse((jwt.payload as { email: string }).email);\n\t\t\tconst user = await ctx.context.internalAdapter.findUserByEmail(email);\n\t\t\tif (!user) {\n\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\tstatus: 400,\n\t\t\t\t\tstatusText: \"USER_NOT_FOUND\",\n\t\t\t\t\tbody: {\n\t\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (\n\t\t\t\tnewPassword.length <\n\t\t\t\t\t(ctx.context.options.emailAndPassword?.minPasswordLength || 8) ||\n\t\t\t\tnewPassword.length >\n\t\t\t\t\t(ctx.context.options.emailAndPassword?.maxPasswordLength || 32)\n\t\t\t) {\n\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\tstatus: 400,\n\t\t\t\t\tstatusText: \"INVALID_PASSWORD_LENGTH\",\n\t\t\t\t\tbody: {\n\t\t\t\t\t\tmessage: \"Password length must be between 8 and 32\",\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst hashedPassword = await ctx.context.password.hash(newPassword);\n\t\t\tconst updatedUser = await ctx.context.internalAdapter.updatePassword(\n\t\t\t\tuser.user.id,\n\t\t\t\thashedPassword,\n\t\t\t);\n\t\t\tif (!updatedUser) {\n\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\tstatus: 500,\n\t\t\t\t\tstatusText: \"INTERNAL_SERVER_ERROR\",\n\t\t\t\t\tbody: {\n\t\t\t\t\t\tmessage: \"Internal server error\",\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn ctx.json({\n\t\t\t\tstatus: true,\n\t\t\t\turl: ctx.body.callbackURL,\n\t\t\t\tredirect: !!ctx.body.callbackURL,\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tstatusText: \"INVALID_TOKEN\",\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Invalid token\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t},\n);\n","import { TimeSpan } from \"oslo\";\nimport { createJWT, validateJWT, type JWT } from \"oslo/jwt\";\nimport { z } from \"zod\";\nimport { createAuthEndpoint } from \"../call\";\n\nexport async function createEmailVerificationToken(\n\tsecret: string,\n\temail: string,\n) {\n\tconst token = await createJWT(\n\t\t\"HS256\",\n\t\tBuffer.from(secret),\n\t\t{\n\t\t\temail: email.toLowerCase(),\n\t\t},\n\t\t{\n\t\t\texpiresIn: new TimeSpan(1, \"h\"),\n\t\t\tissuer: \"better-auth\",\n\t\t\tsubject: \"verify-email\",\n\t\t\taudiences: [email],\n\t\t\tincludeIssuedTimestamp: true,\n\t\t},\n\t);\n\treturn token;\n}\n\nexport const sendVerificationEmail = createAuthEndpoint(\n\t\"/send-verification-email\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\temail: z.string().email(),\n\t\t\tcallbackURL: z.string().optional(),\n\t\t}),\n\t},\n\tasync (ctx) => {\n\t\tif (!ctx.context.options.emailAndPassword?.sendVerificationEmail) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tstatusText: \"VERIFICATION_EMAIL_NOT_SENT\",\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Verification email isn't enabled\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst { email } = ctx.body;\n\t\tconst token = await createEmailVerificationToken(ctx.context.secret, email);\n\t\tconst url = `${ctx.context.baseURL}/verify-email?token=${token}?callbackURL=${ctx.body.callbackURL}`;\n\t\tawait ctx.context.options.emailAndPassword.sendVerificationEmail(\n\t\t\temail,\n\t\t\turl,\n\t\t\ttoken,\n\t\t);\n\t\treturn ctx.json({\n\t\t\tstatus: true,\n\t\t});\n\t},\n);\n\nexport const verifyEmail = createAuthEndpoint(\n\t\"/verify-email\",\n\t{\n\t\tmethod: \"GET\",\n\t\tquery: z.object({\n\t\t\ttoken: z.string(),\n\t\t\tcallbackURL: z.string().optional(),\n\t\t}),\n\t},\n\tasync (ctx) => {\n\t\tconst { token } = ctx.query;\n\t\tlet jwt: JWT;\n\t\ttry {\n\t\t\tjwt = await validateJWT(\"HS256\", Buffer.from(ctx.context.secret), token);\n\t\t} catch (e) {\n\t\t\tctx.context.logger.error(\"Failed to verify email\", e);\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tstatusText: \"INVALID_TOKEN\",\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Invalid token\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tconst schema = z.object({\n\t\t\temail: z.string().email(),\n\t\t});\n\t\tconst parsed = schema.parse(jwt.payload);\n\t\tconst user = await ctx.context.internalAdapter.findUserByEmail(\n\t\t\tparsed.email,\n\t\t);\n\t\tif (!user) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tstatusText: \"USER_NOT_FOUND\",\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst account = user.accounts.find((a) => a.providerId === \"credential\");\n\t\tif (!account) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tstatusText: \"ACCOUNT_NOT_FOUND\",\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Account not found\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tawait ctx.context.internalAdapter.updateUserByEmail(parsed.email, {\n\t\t\temailVerified: true,\n\t\t});\n\t\tif (ctx.query.callbackURL) {\n\t\t\tthrow ctx.redirect(ctx.query.callbackURL);\n\t\t}\n\t\treturn ctx.json({\n\t\t\tstatus: true,\n\t\t});\n\t},\n);\n","import { alphabet, generateRandomString } from \"oslo/crypto\";\nimport { hs256 } from \"../../crypto\";\nimport { createAuthEndpoint } from \"../call\";\nimport { HIDE_METADATA } from \"../../utils/hide-metadata\";\n\nexport const getCSRFToken = createAuthEndpoint(\n\t\"/csrf\",\n\t{\n\t\tmethod: \"GET\",\n\t\tmetadata: HIDE_METADATA,\n\t},\n\tasync (ctx) => {\n\t\tconst csrfToken = await ctx.getSignedCookie(\n\t\t\tctx.context.authCookies.csrfToken.name,\n\t\t\tctx.context.secret,\n\t\t);\n\n\t\tif (csrfToken) {\n\t\t\treturn {\n\t\t\t\tcsrfToken,\n\t\t\t};\n\t\t}\n\n\t\tconst token = generateRandomString(32, alphabet(\"a-z\", \"0-9\", \"A-Z\"));\n\t\tconst hash = await hs256(ctx.context.secret, token);\n\t\tconst cookie = `${token}!${hash}`;\n\t\tawait ctx.setSignedCookie(\n\t\t\tctx.context.authCookies.csrfToken.name,\n\t\t\tcookie,\n\t\t\tctx.context.secret,\n\t\t\tctx.context.authCookies.csrfToken.options,\n\t\t);\n\t\treturn {\n\t\t\tcsrfToken: token,\n\t\t};\n\t},\n);\n","import { HIDE_METADATA } from \"../../utils/hide-metadata\";\nimport { createAuthEndpoint } from \"../call\";\n\nexport const ok = createAuthEndpoint(\n\t\"/ok\",\n\t{\n\t\tmethod: \"GET\",\n\t\tmetadata: HIDE_METADATA,\n\t},\n\tasync (ctx) => {\n\t\treturn ctx.json({\n\t\t\tok: true,\n\t\t});\n\t},\n);\n","import { alphabet, generateRandomString } from \"oslo/crypto\";\nimport { z } from \"zod\";\nimport { createAuthEndpoint } from \"../call\";\nimport { createEmailVerificationToken } from \"./verify-email\";\n\nexport const signUpEmail = createAuthEndpoint(\n\t\"/sign-up/email\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\tname: z.string(),\n\t\t\temail: z.string(),\n\t\t\tpassword: z.string(),\n\t\t\timage: z.string().optional(),\n\t\t\tcallbackURL: z.string().optional(),\n\t\t}),\n\t},\n\tasync (ctx) => {\n\t\tif (!ctx.context.options.emailAndPassword?.enabled) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Email and password is not enabled\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst { name, email, password, image } = ctx.body;\n\t\tconst isValidEmail = z.string().email().safeParse(email);\n\t\tif (!isValidEmail.success) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Invalid email address\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst minPasswordLength =\n\t\t\tctx.context.options?.emailAndPassword?.minPasswordLength || 8;\n\t\tif (password.length < minPasswordLength) {\n\t\t\tctx.context.logger.error(\"Password is too short\");\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: { message: \"Password is too short\" },\n\t\t\t});\n\t\t}\n\t\tconst dbUser = await ctx.context.internalAdapter.findUserByEmail(email);\n\t\t/**\n\t\t * hash first to avoid timing attacks\n\t\t */\n\t\tconst hash = await ctx.context.password.hash(password);\n\t\tif (dbUser?.user) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"User already exists\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst createdUser = await ctx.context.internalAdapter.createUser({\n\t\t\tid: generateRandomString(32, alphabet(\"a-z\", \"0-9\", \"A-Z\")),\n\t\t\temail: email.toLowerCase(),\n\t\t\tname,\n\t\t\timage,\n\t\t\temailVerified: false,\n\t\t\tcreatedAt: new Date(),\n\t\t\tupdatedAt: new Date(),\n\t\t});\n\t\t/**\n\t\t * Link the account to the user\n\t\t */\n\t\tawait ctx.context.internalAdapter.linkAccount({\n\t\t\tid: generateRandomString(32, alphabet(\"a-z\", \"0-9\", \"A-Z\")),\n\t\t\tuserId: createdUser.id,\n\t\t\tproviderId: \"credential\",\n\t\t\taccountId: createdUser.id,\n\t\t\tpassword: hash,\n\t\t});\n\t\tconst session = await ctx.context.internalAdapter.createSession(\n\t\t\tcreatedUser.id,\n\t\t\tctx.request,\n\t\t);\n\t\tawait ctx.setSignedCookie(\n\t\t\tctx.context.authCookies.sessionToken.name,\n\t\t\tsession.id,\n\t\t\tctx.context.secret,\n\t\t\tctx.context.authCookies.sessionToken.options,\n\t\t);\n\t\tif (ctx.context.options.emailAndPassword.sendEmailVerificationOnSignUp) {\n\t\t\tconst token = await createEmailVerificationToken(\n\t\t\t\tctx.context.secret,\n\t\t\t\tcreatedUser.email,\n\t\t\t);\n\t\t\tconst url = `${ctx.context.baseURL}/verify-email?token=${token}?callbackURL=${ctx.body.callbackURL}`;\n\t\t\tawait ctx.context.options.emailAndPassword.sendVerificationEmail?.(\n\t\t\t\tcreatedUser.email,\n\t\t\t\turl,\n\t\t\t\ttoken,\n\t\t\t);\n\t\t}\n\t\treturn ctx.json(\n\t\t\t{\n\t\t\t\tuser: createdUser,\n\t\t\t\tsession,\n\t\t\t},\n\t\t\t{\n\t\t\t\tbody: ctx.body.callbackURL\n\t\t\t\t\t? {\n\t\t\t\t\t\t\turl: ctx.body.callbackURL,\n\t\t\t\t\t\t\tredirect: true,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tuser: createdUser,\n\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t},\n\t\t\t},\n\t\t);\n\t},\n);\n","import { HIDE_METADATA } from \"../../utils/hide-metadata\";\nimport { createAuthEndpoint } from \"../call\";\n\nconst html = (errorCode: string = \"Unknown\") => `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Authentication Error</title>\n <style>\n :root {\n --bg-color: #f8f9fa;\n --text-color: #212529;\n --accent-color: #000000;\n --error-color: #dc3545;\n --border-color: #e9ecef;\n }\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n background-color: var(--bg-color);\n color: var(--text-color);\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100vh;\n margin: 0;\n line-height: 1.5;\n }\n .error-container {\n background-color: #ffffff;\n border-radius: 12px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);\n padding: 2.5rem;\n text-align: center;\n max-width: 90%;\n width: 400px;\n }\n h1 {\n color: var(--error-color);\n font-size: 1.75rem;\n margin-bottom: 1rem;\n font-weight: 600;\n }\n p {\n margin-bottom: 1.5rem;\n color: #495057;\n }\n .btn {\n background-color: var(--accent-color);\n color: #ffffff;\n text-decoration: none;\n padding: 0.75rem 1.5rem;\n border-radius: 6px;\n transition: all 0.3s ease;\n display: inline-block;\n font-weight: 500;\n border: 2px solid var(--accent-color);\n }\n .btn:hover {\n background-color: #131721;\n }\n .error-code {\n font-size: 0.875rem;\n color: #6c757d;\n margin-top: 1.5rem;\n padding-top: 1.5rem;\n border-top: 1px solid var(--border-color);\n }\n .icon {\n font-size: 3rem;\n margin-bottom: 1rem;\n }\n </style>\n</head>\n<body>\n <div class=\"error-container\">\n <div class=\"icon\">⚠️</div>\n <h1>Better Auth Error</h1>\n <p>We encountered an issue while processing your request. Please try again or contact the application owner if the problem persists.</p>\n <a href=\"#\" id=\"returnLink\" class=\"btn\">Return to Application</a>\n <div class=\"error-code\">Error Code: <span id=\"errorCode\">${errorCode}</span></div>\n </div>\n</body>\n</html>`;\n\nexport const error = createAuthEndpoint(\n\t\"/error\",\n\t{\n\t\tmethod: \"GET\",\n\t\tmetadata: HIDE_METADATA,\n\t},\n\tasync (c) => {\n\t\tconst query =\n\t\t\tnew URL(c.request?.url || \"\").searchParams.get(\"error\") || \"Unknown\";\n\t\treturn new Response(html(query), {\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"text/html\",\n\t\t\t},\n\t\t});\n\t},\n);\n","import { z } from \"zod\";\nimport { createAuthEndpoint } from \"../call\";\nimport { sessionMiddleware } from \"../middlewares/session\";\nimport { alphabet, generateRandomString } from \"oslo/crypto\";\nimport { setSessionCookie } from \"../../utils/cookies\";\n\nexport const updateUser = createAuthEndpoint(\n\t\"/user/update\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\tname: z.string().optional(),\n\t\t\timage: z.string().optional(),\n\t\t}),\n\t\tuse: [sessionMiddleware],\n\t},\n\tasync (ctx) => {\n\t\tconst { name, image } = ctx.body;\n\t\tconst session = ctx.context.session;\n\t\tconst user = await ctx.context.internalAdapter.updateUserByEmail(\n\t\t\tsession.user.email,\n\t\t\t{\n\t\t\t\tname,\n\t\t\t\timage,\n\t\t\t},\n\t\t);\n\t\treturn ctx.json(user);\n\t},\n);\n\nexport const changePassword = createAuthEndpoint(\n\t\"/user/change-password\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\t/**\n\t\t\t * The new password to set\n\t\t\t */\n\t\t\tnewPassword: z.string(),\n\t\t\t/**\n\t\t\t * The current password of the user\n\t\t\t */\n\t\t\tcurrentPassword: z.string(),\n\t\t\t/**\n\t\t\t * revoke all sessions that are not the\n\t\t\t * current one logged in by the user\n\t\t\t */\n\t\t\trevokeOtherSessions: z.boolean().optional(),\n\t\t}),\n\t\tuse: [sessionMiddleware],\n\t},\n\tasync (ctx) => {\n\t\tconst { newPassword, currentPassword, revokeOtherSessions } = ctx.body;\n\t\tconst session = ctx.context.session;\n\t\tconst minPasswordLength =\n\t\t\tctx.context.options?.emailAndPassword?.minPasswordLength || 8;\n\t\tif (newPassword.length < minPasswordLength) {\n\t\t\tctx.context.logger.error(\"Password is too short\");\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: { message: \"Password is too short\" },\n\t\t\t});\n\t\t}\n\t\tconst accounts = await ctx.context.internalAdapter.findAccounts(\n\t\t\tsession.user.id,\n\t\t);\n\t\tconst account = accounts.find(\n\t\t\t(account) => account.providerId === \"credential\" && account.password,\n\t\t);\n\t\tconst passwordHash = await ctx.context.password.hash(newPassword);\n\t\tif (!account) {\n\t\t\tawait ctx.context.internalAdapter.linkAccount({\n\t\t\t\tid: generateRandomString(32, alphabet(\"a-z\", \"0-9\", \"A-Z\")),\n\t\t\t\tuserId: session.user.id,\n\t\t\t\tproviderId: \"credential\",\n\t\t\t\taccountId: session.user.id,\n\t\t\t\tpassword: passwordHash,\n\t\t\t});\n\t\t\treturn ctx.json(session.user);\n\t\t}\n\t\tif (account.password) {\n\t\t\tconst verify = await ctx.context.password.verify(\n\t\t\t\taccount.password,\n\t\t\t\tcurrentPassword,\n\t\t\t);\n\t\t\tif (!verify) {\n\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\tstatus: 400,\n\t\t\t\t\tbody: { message: \"Invalid password\" },\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tawait ctx.context.internalAdapter.updateAccount(account.id, {\n\t\t\tpassword: passwordHash,\n\t\t});\n\t\tif (revokeOtherSessions) {\n\t\t\tawait ctx.context.internalAdapter.deleteSessions(session.user.id);\n\t\t\tconst newSession = await ctx.context.internalAdapter.createSession(\n\t\t\t\tsession.user.id,\n\t\t\t\tctx.headers,\n\t\t\t);\n\t\t\t// set the new session cookie\n\t\t\tawait setSessionCookie(ctx, newSession.id);\n\t\t}\n\t\treturn ctx.json(session.user);\n\t},\n);\n","import {\n\tAPIError,\n\ttype Context,\n\ttype Endpoint,\n\tcreateRouter,\n} from \"better-call\";\nimport type { AuthContext } from \"../init\";\nimport type { BetterAuthOptions, InferSession, InferUser } from \"../types\";\nimport type { Prettify } from \"../types/helper\";\nimport { csrfMiddleware } from \"./middlewares/csrf\";\nimport {\n\tcallbackOAuth,\n\tforgetPassword,\n\tgetSession,\n\tlistSessions,\n\tresetPassword,\n\trevokeSession,\n\trevokeSessions,\n\tsendVerificationEmail,\n\tsignInEmail,\n\tsignInOAuth,\n\tsignOut,\n\tverifyEmail,\n} from \"./routes\";\nimport { getCSRFToken } from \"./routes/csrf\";\nimport { ok } from \"./routes/ok\";\nimport { signUpEmail } from \"./routes/sign-up\";\nimport { error } from \"./routes/error\";\nimport { logger } from \"../utils/logger\";\nimport { changePassword, updateUser } from \"./routes/update-user\";\n\nexport function getEndpoints<\n\tC extends AuthContext,\n\tOption extends BetterAuthOptions,\n>(ctx: C, options: Option) {\n\tconst pluginEndpoints = ctx.options.plugins?.reduce(\n\t\t(acc, plugin) => {\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t...plugin.endpoints,\n\t\t\t};\n\t\t},\n\t\t{} as Record<string, any>,\n\t);\n\n\tconst middlewares =\n\t\tctx.options.plugins\n\t\t\t?.map((plugin) =>\n\t\t\t\tplugin.middlewares?.map((m) => {\n\t\t\t\t\tconst middleware = (async (context: any) => {\n\t\t\t\t\t\treturn m.middleware({\n\t\t\t\t\t\t\t...context,\n\t\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\t\t...ctx,\n\t\t\t\t\t\t\t\t...context.context,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}) as Endpoint;\n\t\t\t\t\tmiddleware.path = m.path;\n\t\t\t\t\tmiddleware.options = m.middleware.options;\n\t\t\t\t\tmiddleware.headers = m.middleware.headers;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpath: m.path,\n\t\t\t\t\t\tmiddleware,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.filter((plugin) => plugin !== undefined)\n\t\t\t.flat() || [];\n\n\t/**\n\t * Helper function to type the session output\n\t * TODO: find a better way to do this\n\t */\n\tasync function typedSession(\n\t\tctx: Context<\n\t\t\t\"/session\",\n\t\t\t{\n\t\t\t\tmethod: \"GET\";\n\t\t\t\trequireHeaders: true;\n\t\t\t}\n\t\t>,\n\t) {\n\t\tconst handler = await getSession(ctx);\n\t\treturn handler as {\n\t\t\tsession: Prettify<InferSession<Option>>;\n\t\t\tuser: Prettify<InferUser<Option>>;\n\t\t} | null;\n\t}\n\ttypedSession.path = getSession.path;\n\ttypedSession.method = getSession.method;\n\ttypedSession.options = getSession.options;\n\ttypedSession.headers = getSession.headers;\n\n\t/**\n\t * Helper function to type the list sessions output\n\t * TODO: find a better way to do this\n\t */\n\tasync function typeListSessions(\n\t\tctx: Context<\n\t\t\t\"/user/sessions\",\n\t\t\t{\n\t\t\t\tmethod: \"GET\";\n\t\t\t\trequireHeaders: true;\n\t\t\t}\n\t\t>,\n\t) {\n\t\tconst handler = await listSessions(ctx);\n\t\treturn handler as unknown as Prettify<InferSession<Option>>[];\n\t}\n\ttypeListSessions.path = listSessions.path;\n\ttypeListSessions.method = listSessions.method;\n\ttypeListSessions.options = listSessions.options;\n\ttypeListSessions.headers = listSessions.headers;\n\n\tconst baseEndpoints = {\n\t\tsignInOAuth,\n\t\tcallbackOAuth,\n\t\tgetCSRFToken,\n\t\tgetSession: typedSession,\n\t\tsignOut,\n\t\tsignUpEmail,\n\t\tsignInEmail,\n\t\tforgetPassword,\n\t\tresetPassword,\n\t\tverifyEmail,\n\t\tsendVerificationEmail,\n\t\tchangePassword,\n\t\tupdateUser,\n\t\tlistSessions: typeListSessions,\n\t\trevokeSession,\n\t\trevokeSessions,\n\t};\n\tconst endpoints = {\n\t\t...baseEndpoints,\n\t\t...pluginEndpoints,\n\t\tok,\n\t\terror,\n\t};\n\tlet api: Record<string, any> = {};\n\tfor (const [key, value] of Object.entries(endpoints)) {\n\t\tapi[key] = async (context: any) => {\n\t\t\tfor (const plugin of ctx.options.plugins || []) {\n\t\t\t\tif (plugin.hooks?.before) {\n\t\t\t\t\tfor (const hook of plugin.hooks.before) {\n\t\t\t\t\t\tconst match = hook.matcher({\n\t\t\t\t\t\t\t...context,\n\t\t\t\t\t\t\t...value,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\tconst hookRes = await hook.handler(context);\n\t\t\t\t\t\t\tif (hookRes && \"context\" in hookRes) {\n\t\t\t\t\t\t\t\tcontext = {\n\t\t\t\t\t\t\t\t\t...context,\n\t\t\t\t\t\t\t\t\t...hookRes.context,\n\t\t\t\t\t\t\t\t\t...value,\n\t\t\t\t\t\t\t\t};\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}\n\t\t\t/**\n\t\t\t * TODO: move this to respond a json response\n\t\t\t * instead of response object.\n\t\t\t */\n\t\t\t//@ts-ignore\n\t\t\tconst endpointRes = await value({\n\t\t\t\t...context,\n\t\t\t\tcontext: {\n\t\t\t\t\t...ctx,\n\t\t\t\t\t...context.context,\n\t\t\t\t},\n\t\t\t});\n\t\t\tlet response = endpointRes;\n\t\t\tfor (const plugin of ctx.options.plugins || []) {\n\t\t\t\tif (plugin.hooks?.after) {\n\t\t\t\t\tfor (const hook of plugin.hooks.after) {\n\t\t\t\t\t\tconst match = hook.matcher(context);\n\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\tconst obj = Object.assign(context, {\n\t\t\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\t\t\t...ctx,\n\t\t\t\t\t\t\t\t\treturned: response,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconst hookRes = await hook.handler(obj);\n\t\t\t\t\t\t\tif (hookRes && \"response\" in hookRes) {\n\t\t\t\t\t\t\t\tresponse = hookRes.response as any;\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}\n\t\t\treturn response;\n\t\t};\n\t\tapi[key].path = value.path;\n\t\tapi[key].method = value.method;\n\t\tapi[key].options = value.options;\n\t\tapi[key].headers = value.headers;\n\t}\n\treturn {\n\t\tapi: api as typeof endpoints,\n\t\tmiddlewares,\n\t};\n}\n\nexport const router = <C extends AuthContext, Option extends BetterAuthOptions>(\n\tctx: C,\n\toptions: Option,\n) => {\n\tconst { api, middlewares } = getEndpoints(ctx, options);\n\tconst basePath = new URL(ctx.baseURL).pathname;\n\n\treturn createRouter(api as Omit<typeof api, \"error\" | \"ok\" | \"welcome\">, {\n\t\textraContext: ctx,\n\t\tbasePath,\n\t\trouterMiddleware: [\n\t\t\t{\n\t\t\t\tpath: \"/**\",\n\t\t\t\tmiddleware: csrfMiddleware,\n\t\t\t},\n\t\t\t...middlewares,\n\t\t],\n\t\tonError(e) {\n\t\t\tif (options.disableLog !== true) {\n\t\t\t\tlogger.warn(e);\n\t\t\t}\n\t\t},\n\t});\n};\n","import type { FieldAttribute } from \"../db\";\nimport type { BetterAuthOptions } from \"../types\";\n\nexport type BetterAuthDbSchema = Record<\n\tstring,\n\t{\n\t\ttableName: string;\n\t\tfields: Record<string, FieldAttribute>;\n\t\tdisableMigrations?: boolean;\n\t\torder?: number;\n\t}\n>;\n\nexport const getAuthTables = (options: BetterAuthOptions) => {\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: 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\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},\n\t\t\t\temail: {\n\t\t\t\t\ttype: \"string\",\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},\n\t\t\t\timage: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\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},\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},\n\t\t\t\t...pluginSchema?.user?.fields,\n\t\t\t},\n\t\t\torder: 0,\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},\n\t\t\t\tipAddress: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\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},\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: \"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},\n\t\t\t\t...pluginSchema?.session?.fields,\n\t\t\t},\n\t\t\torder: 1,\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},\n\t\t\t\tproviderId: {\n\t\t\t\t\ttype: \"string\",\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: \"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},\n\t\t\t\taccessToken: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\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},\n\t\t\t\tidToken: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\taccessTokenExpiresAt: {\n\t\t\t\t\ttype: \"date\",\n\t\t\t\t\trequired: false,\n\t\t\t\t},\n\t\t\t\trefreshTokenExpiresAt: {\n\t\t\t\t\ttype: \"date\",\n\t\t\t\t\trequired: false,\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},\n\t\t\t\t...pluginSchema?.account?.fields,\n\t\t\t},\n\t\t\torder: 2,\n\t\t},\n\t\t...pluginSchema,\n\t} satisfies BetterAuthDbSchema;\n};\n","import Database from \"better-sqlite3\";\nimport { Kysely } from \"kysely\";\nimport {\n\ttype Dialect,\n\tMysqlDialect,\n\tPostgresDialect,\n\tSqliteDialect,\n} from \"kysely\";\nimport { createPool } from \"mysql2\";\nimport postgres from \"postgres\";\nimport type { FieldAttribute } from \"../db\";\nimport type { BetterAuthOptions } from \"../types\";\nimport type { Adapter, Where } from \"../types/adapter\";\nimport { PostgresJSDialect } from \"kysely-postgres-js\";\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\tconst and = w\n\t\t?.filter((w) => w.connector === \"AND\" || !w.connector)\n\t\t.reduce(\n\t\t\t(acc, w) =>\n\t\t\t\t({\n\t\t\t\t\t...acc,\n\t\t\t\t\t[w.field]: w.value,\n\t\t\t\t}) as any,\n\t\t\t{},\n\t\t);\n\tconst or = w\n\t\t?.filter((w) => w.connector === \"OR\")\n\t\t.reduce(\n\t\t\t(acc, w) =>\n\t\t\t\t({\n\t\t\t\t\t...acc,\n\t\t\t\t\t[w.field]: w.value,\n\t\t\t\t}) as any,\n\t\t\t{},\n\t\t);\n\treturn {\n\t\tand: Object.keys(and).length ? and : null,\n\t\tor: Object.keys(or).length ? 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\tif (\n\t\t\tval[key] === 0 &&\n\t\t\tfields[key]?.type === \"boolean\" &&\n\t\t\ttransform?.boolean\n\t\t) {\n\t\t\tval[key] = false;\n\t\t}\n\t\tif (\n\t\t\tval[key] === 1 &&\n\t\t\tfields[key]?.type === \"boolean\" &&\n\t\t\ttransform?.boolean\n\t\t) {\n\t\t\tval[key] = true;\n\t\t}\n\t\tif (fields[key]?.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}\n\nexport const kyselyAdapter = (\n\tdb: Kysely<any>,\n\tconfig?: KyselyAdapterConfig,\n): Adapter => {\n\treturn {\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\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 (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or));\n\t\t\t}\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and));\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 } = 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));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or));\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\tlet query = db.updateTable(model).set(val);\n\t\t\tif (and) {\n\t\t\t\tquery = query.where((eb) => eb.and(and));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or));\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\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));\n\t\t\t}\n\t\t\tif (or) {\n\t\t\t\tquery = query.where((eb) => eb.or(or));\n\t\t\t}\n\n\t\t\tawait query.execute();\n\t\t},\n\t};\n};\n\nexport const getDialect = (config: BetterAuthOptions) => {\n\tif (!config.database) {\n\t\treturn null;\n\t}\n\tif (\"createDriver\" in config.database) {\n\t\treturn config.database;\n\t}\n\tlet dialect: Dialect | null = null;\n\tif (\"provider\" in config.database) {\n\t\tconst provider = config.database.provider;\n\t\tconst connectionString = config.database?.url?.trim();\n\t\tif (provider === \"postgres\") {\n\t\t\tconst pg = postgres(connectionString, {\n\t\t\t\tprepare: false,\n\t\t\t});\n\t\t\tdialect = new PostgresJSDialect({\n\t\t\t\tpostgres: pg,\n\t\t\t});\n\t\t}\n\t\tif (provider === \"mysql\") {\n\t\t\tconst params = new URL(connectionString);\n\t\t\tconst pool = createPool({\n\t\t\t\thost: params.hostname,\n\t\t\t\tuser: params.username,\n\t\t\t\tpassword: params.password,\n\t\t\t\tdatabase: params.pathname.split(\"/\")[1],\n\t\t\t\tport: Number(params.port),\n\t\t\t});\n\t\t\tdialect = new MysqlDialect({ pool });\n\t\t}\n\n\t\tif (provider === \"sqlite\") {\n\t\t\tconst db = new Database(connectionString);\n\t\t\tdialect = new SqliteDialect({\n\t\t\t\tdatabase: db,\n\t\t\t});\n\t\t}\n\t}\n\treturn dialect;\n};\n\nexport const createKyselyAdapter = (config: BetterAuthOptions) => {\n\tconst dialect = getDialect(config);\n\tif (!dialect) {\n\t\treturn null;\n\t}\n\tconst db = new Kysely<any>({\n\t\tdialect,\n\t});\n\treturn db;\n};\n\nexport const getDatabaseType = (config: BetterAuthOptions) => {\n\tif (\"provider\" in config.database) {\n\t\treturn config.database.provider;\n\t}\n\tif (\"dialect\" in config.database) {\n\t\tif (config.database.dialect instanceof PostgresDialect) {\n\t\t\treturn \"postgres\";\n\t\t}\n\t\tif (config.database.dialect instanceof MysqlDialect) {\n\t\t\treturn \"mysql\";\n\t\t}\n\t\tif (config.database.dialect instanceof SqliteDialect) {\n\t\t\treturn \"sqlite\";\n\t\t}\n\t}\n\treturn \"sqlite\";\n};\n","import type { FieldAttribute } from \"../db\";\nimport { BetterAuthError } from \"../error/better-auth-error\";\nimport type { BetterAuthOptions } from \"../types\";\nimport type { Adapter } from \"../types/adapter\";\nimport { getAuthTables } from \"./get-tables\";\nimport { createKyselyAdapter, getDatabaseType, kyselyAdapter } from \"./kysely\";\n\nexport function getAdapter(options: BetterAuthOptions): Adapter {\n\tif (!options.database) {\n\t\tthrow new BetterAuthError(\"Database configuration is required\");\n\t}\n\tconst db = createKyselyAdapter(options);\n\tif (!db) {\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(db, {\n\t\ttransform: {\n\t\t\tschema,\n\t\t\tdate: true,\n\t\t\tboolean: getDatabaseType(options) === \"sqlite\",\n\t\t},\n\t});\n}\n","import { scrypt } from \"node:crypto\";\nimport { decodeHex, encodeHex } from \"oslo/encoding\";\nimport { constantTimeEqual } from \"oslo/crypto\";\n\nconst config = {\n\tN: 16384,\n\tr: 16,\n\tp: 1,\n\tdkLen: 64,\n};\n\nasync function generateKey(\n\tpassword: string,\n\tsalt: string,\n): Promise<ArrayBuffer> {\n\treturn await new Promise<ArrayBuffer>((resolve, reject) => {\n\t\tscrypt(\n\t\t\tpassword.normalize(\"NFKC\"),\n\t\t\tsalt!,\n\t\t\tconfig.dkLen,\n\t\t\t{\n\t\t\t\tN: config.N,\n\t\t\t\tp: config.p,\n\t\t\t\tr: config.r,\n\t\t\t\t// errors when 128 * N * r > `maxmem` (approximately)\n\t\t\t\tmaxmem: 128 * config.N * config.r * 2,\n\t\t\t},\n\t\t\t(err, buff) => {\n\t\t\t\tif (err) return reject(err);\n\t\t\t\t// @ts-ignore\n\t\t\t\treturn resolve(buff);\n\t\t\t},\n\t\t);\n\t});\n}\n\nexport const hashPassword = async (password: string) => {\n\tconst salt = encodeHex(crypto.getRandomValues(new Uint8Array(16)));\n\tconst key = await generateKey(password, salt);\n\treturn `${salt}:${encodeHex(key)}`;\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","import { alphabet, generateRandomString } from \"oslo/crypto\";\nimport type { BetterAuthOptions } from \"../types\";\nimport type { Adapter } from \"../types/adapter\";\nimport { getDate } from \"../utils/date\";\nimport { getAuthTables } from \"./get-tables\";\nimport type { Account, Session, User } from \"./schema\";\nimport type { Kysely } from \"kysely\";\n\nexport const createInternalAdapter = (\n\tadapter: Adapter,\n\tdb: Kysely<any>,\n\toptions: BetterAuthOptions,\n) => {\n\tconst sessionExpiration = options.session?.expiresIn || 60 * 60 * 24 * 7; // 7 days\n\tconst tables = getAuthTables(options);\n\treturn {\n\t\tcreateOAuthUser: async (user: User, account: Account) => {\n\t\t\ttry {\n\t\t\t\tconst createdUser = await adapter.create({\n\t\t\t\t\tmodel: tables.user.tableName,\n\t\t\t\t\tdata: user,\n\t\t\t\t});\n\t\t\t\tconst createdAccount = await adapter.create({\n\t\t\t\t\tmodel: tables.account.tableName,\n\t\t\t\t\tdata: 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 (user: User) => {\n\t\t\tconst createdUser = await adapter.create<User>({\n\t\t\t\tmodel: tables.user.tableName,\n\t\t\t\tdata: user,\n\t\t\t});\n\t\t\treturn createdUser;\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) => {\n\t\t\tconst headers = request instanceof Request ? request.headers : request;\n\t\t\tconst data: Session = {\n\t\t\t\tid: generateRandomString(32, alphabet(\"a-z\", \"0-9\", \"A-Z\")),\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(1000 * 60 * 60 * 24) // 1 day\n\t\t\t\t\t: getDate(sessionExpiration, true),\n\t\t\t\tipAddress: headers?.get(\"x-forwarded-for\") || \"\",\n\t\t\t\tuserAgent: headers?.get(\"user-agent\") || \"\",\n\t\t\t};\n\t\t\tconst session = adapter.create<Session>({\n\t\t\t\tmodel: tables.session.tableName,\n\t\t\t\tdata,\n\t\t\t});\n\t\t\treturn session;\n\t\t},\n\t\tfindSession: async (sessionId: string) => {\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\t\t\tif (!session) {\n\t\t\t\treturn null;\n\t\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: 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,\n\t\t\t\tuser,\n\t\t\t};\n\t\t},\n\t\tupdateSession: async (sessionId: string, session: Partial<Session>) => {\n\t\t\tconst updatedSession = await adapter.update<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: sessionId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tupdate: session,\n\t\t\t});\n\t\t\treturn updatedSession;\n\t\t},\n\t\tdeleteSession: async (id: string) => {\n\t\t\tconst session = await 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\treturn session;\n\t\t},\n\t\t/**\n\t\t * @requires\n\t\t */\n\t\tdeleteSessions: async (userId: string) => {\n\t\t\tconst sessions = await db\n\t\t\t\t.deleteFrom(tables.session.tableName)\n\t\t\t\t.where(\"userId\", \"=\", userId)\n\t\t\t\t.execute();\n\t\t\treturn sessions;\n\t\t},\n\t\tfindUserByEmail: async (email: 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\tvalue: email.toLowerCase(),\n\t\t\t\t\t\tfield: \"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\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\tvalue: user.id,\n\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tuser,\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: Account) => {\n\t\t\tconst _account = await adapter.create<Account>({\n\t\t\t\tmodel: tables.account.tableName,\n\t\t\t\tdata: account,\n\t\t\t});\n\t\t\treturn _account;\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 adapter.update<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,\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tupdate: data,\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 adapter.update<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\tvalue: userId,\n\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"providerId\",\n\t\t\t\t\t\tvalue: \"credential\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tupdate: {\n\t\t\t\t\tpassword,\n\t\t\t\t},\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: \"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;\n\t\t},\n\t\tupdateAccount: async (accountId: string, data: Partial<Account>) => {\n\t\t\tconst account = await adapter.update<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: \"id\",\n\t\t\t\t\t\tvalue: accountId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tupdate: data,\n\t\t\t});\n\t\t\treturn account;\n\t\t},\n\t};\n};\n\nexport type InternalAdapter = ReturnType<typeof createInternalAdapter>;\n","export const DEFAULT_SECRET = \"better-auth-secret-123456789\";\n","import { getAuthTables } from \"./adapters/get-tables\";\nimport { createKyselyAdapter } from \"./adapters/kysely\";\nimport { getAdapter } from \"./adapters/utils\";\nimport { hashPassword, verifyPassword } from \"./crypto/password\";\nimport { createInternalAdapter } from \"./db\";\nimport type { BetterAuthOptions } from \"./types\";\nimport { getBaseURL } from \"./utils/base-url\";\nimport { DEFAULT_SECRET } from \"./utils/constants\";\nimport {\n\ttype BetterAuthCookies,\n\tcreateCookieGetter,\n\tgetCookies,\n} from \"./utils/cookies\";\nimport { createLogger } from \"./utils/logger\";\n\nexport const init = (options: BetterAuthOptions) => {\n\tconst adapter = getAdapter(options);\n\tconst db = createKyselyAdapter(options);\n\tif (!db) {\n\t\tthrow new Error(\"No database adapter found\");\n\t}\n\tconst baseURL = getBaseURL(options.baseURL, options.basePath);\n\n\tconst secret =\n\t\toptions.secret ||\n\t\tprocess.env.BETTER_AUTH_SECRET ||\n\t\tprocess.env.AUTH_SECRET ||\n\t\tDEFAULT_SECRET;\n\n\tconst cookies = getCookies(options);\n\tconst tables = getAuthTables(options);\n\treturn {\n\t\tappName: options.appName || \"Better Auth\",\n\t\toptions: {\n\t\t\t...options,\n\t\t\tbaseURL: baseURL ? new URL(baseURL).origin : \"\",\n\t\t\tbasePath: options.basePath || \"/api/auth\",\n\t\t},\n\t\ttables,\n\t\tbaseURL: baseURL || \"\",\n\t\tsession: {\n\t\t\tupdateAge: options.session?.updateAge || 24 * 60 * 60, // 24 hours\n\t\t\texpiresIn: options.session?.expiresIn || 60 * 60 * 24 * 7, // 7 days\n\t\t},\n\t\tsecret,\n\t\tauthCookies: cookies,\n\t\tlogger: createLogger({\n\t\t\tdisabled: options.disableLog,\n\t\t}),\n\t\tdb,\n\t\tpassword: {\n\t\t\thash: options.emailAndPassword?.password?.hash || hashPassword,\n\t\t\tverify: options.emailAndPassword?.password?.verify || verifyPassword,\n\t\t},\n\t\tadapter: adapter,\n\t\tinternalAdapter: createInternalAdapter(adapter, db, options),\n\t\tcreateAuthCookie: createCookieGetter(options),\n\t};\n};\n\nexport type AuthContext = {\n\toptions: BetterAuthOptions;\n\tappName: string;\n\tbaseURL: string;\n\tauthCookies: BetterAuthCookies;\n\tlogger: ReturnType<typeof createLogger>;\n\tdb: ReturnType<typeof createKyselyAdapter>;\n\tadapter: ReturnType<typeof getAdapter>;\n\tinternalAdapter: ReturnType<typeof createInternalAdapter>;\n\tcreateAuthCookie: ReturnType<typeof createCookieGetter>;\n\tsecret: string;\n\tsession: {\n\t\tupdateAge: number;\n\t\texpiresIn: number;\n\t};\n\tpassword: {\n\t\thash: (password: string) => Promise<string>;\n\t\tverify: (hash: string, password: string) => Promise<boolean>;\n\t};\n\ttables: ReturnType<typeof getAuthTables>;\n};\n","import type { Endpoint, Prettify } from \"better-call\";\nimport { getEndpoints, router } from \"./api\";\nimport { init } from \"./init\";\nimport type { BetterAuthOptions } from \"./types/options\";\nimport type { InferSession, InferUser } from \"./types\";\n\ntype InferAPI<API> = Omit<\n\tAPI,\n\tAPI extends { [key in infer K]: Endpoint }\n\t\t? K extends string\n\t\t\t? API[K][\"options\"][\"metadata\"] extends { isAction: false }\n\t\t\t\t? K\n\t\t\t\t: never\n\t\t\t: never\n\t\t: never\n>;\n\nexport const betterAuth = <O extends BetterAuthOptions>(options: O) => {\n\tconst authContext = init(options);\n\tconst { api } = getEndpoints(authContext, options);\n\ttype API = typeof api;\n\treturn {\n\t\thandler: async (request: Request) => {\n\t\t\tconst basePath = authContext.options.basePath;\n\t\t\tconst url = new URL(request.url);\n\t\t\tif (!authContext.options.baseURL) {\n\t\t\t\tconst baseURL = `${url.origin}/api/auth`;\n\t\t\t\tauthContext.options.baseURL = baseURL;\n\t\t\t\tauthContext.baseURL = baseURL;\n\t\t\t}\n\t\t\tif (!authContext.options.baseURL) {\n\t\t\t\treturn new Response(\"Base URL not set\", { status: 400 });\n\t\t\t}\n\t\t\tif (url.pathname === basePath || url.pathname === `${basePath}/`) {\n\t\t\t\treturn new Response(\"Welcome to BetterAuth\", { status: 200 });\n\t\t\t}\n\t\t\tconst { handler } = router(authContext, options);\n\t\t\treturn handler(request);\n\t\t},\n\t\tapi: api as InferAPI<typeof api>,\n\t\toptions: authContext.options as O,\n\t\t$infer: {} as {\n\t\t\tsession: {\n\t\t\t\tsession: Prettify<InferSession<O>>;\n\t\t\t\tuser: Prettify<InferUser<O>>;\n\t\t\t};\n\t\t},\n\t};\n};\n\nexport type Auth = {\n\thandler: (request: Request) => Promise<Response>;\n\tapi: InferAPI<ReturnType<typeof router>[\"endpoints\"]>;\n\toptions: BetterAuthOptions;\n};\n"]}
package/dist/next-js.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { A as Auth } from './index-Bzhxi8vQ.js';
1
+ import { A as Auth } from './index-DR55Ilth.js';
2
2
  import { NextResponse } from 'next/server';
3
3
  import './internal-adapter-D-6pvxDj.js';
4
4
  import 'kysely';
package/dist/react.d.ts CHANGED
@@ -2,14 +2,14 @@ import * as _better_fetch_fetch from '@better-fetch/fetch';
2
2
  import { B as BetterAuthPlugin, F as FieldAttribute, I as InferFieldOutput } from './internal-adapter-D-6pvxDj.js';
3
3
  import { U as UnionToIntersection } from './helper-D8dhRz72.js';
4
4
  import { useStore } from '@nanostores/react';
5
- import { C as ClientOptions, I as InferClientAPI, a as InferActions, A as AuthClientPlugin, b as IsSignal } from './types-DtaLn_7o.js';
5
+ import { C as ClientOptions, I as InferClientAPI, a as InferActions, A as AuthClientPlugin, b as IsSignal } from './types-Bbz_v64N.js';
6
6
  import 'kysely';
7
7
  import './index-CcxejJTH.js';
8
8
  import 'arctic';
9
9
  import 'zod';
10
10
  import 'better-call';
11
11
  import 'nanostores';
12
- import './index-Bzhxi8vQ.js';
12
+ import './index-DR55Ilth.js';
13
13
 
14
14
  type InferResolvedHooks<O extends ClientOptions> = O["plugins"] extends Array<infer Plugin> ? Plugin extends AuthClientPlugin ? Plugin["getAtoms"] extends (fetch: any) => infer Atoms ? Atoms extends Record<string, any> ? {
15
15
  [key in keyof Atoms as IsSignal<key> extends true ? never : key extends string ? `use${Capitalize<key>}` : never]: () => ReturnType<Atoms[key]["get"]>;
@@ -1,4 +1,4 @@
1
- import { A as Auth } from './index-Bzhxi8vQ.js';
1
+ import { A as Auth } from './index-DR55Ilth.js';
2
2
  import './internal-adapter-D-6pvxDj.js';
3
3
  import 'kysely';
4
4
  import './index-CcxejJTH.js';
package/dist/solid.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as _better_fetch_fetch from '@better-fetch/fetch';
2
2
  import { B as BetterAuthPlugin, F as FieldAttribute, I as InferFieldOutput } from './internal-adapter-D-6pvxDj.js';
3
3
  import { U as UnionToIntersection } from './helper-D8dhRz72.js';
4
- import { C as ClientOptions, I as InferClientAPI, a as InferActions, A as AuthClientPlugin, b as IsSignal } from './types-DtaLn_7o.js';
4
+ import { C as ClientOptions, I as InferClientAPI, a as InferActions, A as AuthClientPlugin, b as IsSignal } from './types-Bbz_v64N.js';
5
5
  import { Accessor } from 'solid-js';
6
6
  import 'kysely';
7
7
  import './index-CcxejJTH.js';
@@ -9,7 +9,7 @@ import 'arctic';
9
9
  import 'zod';
10
10
  import 'better-call';
11
11
  import 'nanostores';
12
- import './index-Bzhxi8vQ.js';
12
+ import './index-DR55Ilth.js';
13
13
 
14
14
  type InferResolvedHooks<O extends ClientOptions> = O["plugins"] extends Array<infer Plugin> ? Plugin extends AuthClientPlugin ? Plugin["getAtoms"] extends (fetch: any) => infer Atoms ? Atoms extends Record<string, any> ? {
15
15
  [key in keyof Atoms as IsSignal<key> extends true ? never : key extends string ? `use${Capitalize<key>}` : never]: () => Accessor<ReturnType<Atoms[key]["get"]>>;
@@ -1,4 +1,4 @@
1
- import { A as Auth } from './index-Bzhxi8vQ.js';
1
+ import { A as Auth } from './index-DR55Ilth.js';
2
2
  import { a as BetterAuthOptions } from './internal-adapter-D-6pvxDj.js';
3
3
  import './helper-D8dhRz72.js';
4
4
  import './index-CcxejJTH.js';
package/dist/svelte.d.ts CHANGED
@@ -2,13 +2,13 @@ import * as nanostores from 'nanostores';
2
2
  import * as _better_fetch_fetch from '@better-fetch/fetch';
3
3
  import { B as BetterAuthPlugin, F as FieldAttribute, I as InferFieldOutput } from './internal-adapter-D-6pvxDj.js';
4
4
  import { U as UnionToIntersection } from './helper-D8dhRz72.js';
5
- import { C as ClientOptions, I as InferClientAPI, a as InferActions, A as AuthClientPlugin, b as IsSignal } from './types-DtaLn_7o.js';
5
+ import { C as ClientOptions, I as InferClientAPI, a as InferActions, A as AuthClientPlugin, b as IsSignal } from './types-Bbz_v64N.js';
6
6
  import 'kysely';
7
7
  import './index-CcxejJTH.js';
8
8
  import 'arctic';
9
9
  import 'zod';
10
10
  import 'better-call';
11
- import './index-Bzhxi8vQ.js';
11
+ import './index-DR55Ilth.js';
12
12
 
13
13
  type InferResolvedHooks<O extends ClientOptions> = O["plugins"] extends Array<infer Plugin> ? Plugin extends AuthClientPlugin ? Plugin["getAtoms"] extends (fetch: any) => infer Atoms ? Atoms extends Record<string, any> ? {
14
14
  [key in keyof Atoms as IsSignal<key> extends true ? never : key extends string ? `use${Capitalize<key>}` : never]: Atoms[key];
@@ -2,7 +2,7 @@ import { BetterFetchResponse, BetterFetchOption, BetterFetch, BetterFetchPlugin
2
2
  import { B as BetterAuthPlugin } from './internal-adapter-D-6pvxDj.js';
3
3
  import { Atom } from 'nanostores';
4
4
  import { U as UnionToIntersection, H as HasRequiredKeys, P as Prettify, L as LiteralString } from './helper-D8dhRz72.js';
5
- import { A as Auth, I as InferSession, a as InferUser } from './index-Bzhxi8vQ.js';
5
+ import { A as Auth, I as InferSession, a as InferUser } from './index-DR55Ilth.js';
6
6
  import { Endpoint, Context } from 'better-call';
7
7
 
8
8
  type CamelCase<S extends string> = S extends `${infer P1}-${infer P2}${infer P3}` ? `${Lowercase<P1>}${Uppercase<P2>}${CamelCase<P3>}` : Lowercase<S>;
package/dist/types.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { a as BetterAuthOptions } from './internal-adapter-D-6pvxDj.js';
2
- export { I as InferSession, a as InferUser } from './index-Bzhxi8vQ.js';
2
+ export { I as InferSession, a as InferUser } from './index-DR55Ilth.js';
3
3
  import 'kysely';
4
4
  import './index-CcxejJTH.js';
5
5
  import 'arctic';
package/dist/vue.d.ts CHANGED
@@ -2,14 +2,14 @@ import * as _better_fetch_fetch from '@better-fetch/fetch';
2
2
  import { B as BetterAuthPlugin, F as FieldAttribute, I as InferFieldOutput } from './internal-adapter-D-6pvxDj.js';
3
3
  import { U as UnionToIntersection } from './helper-D8dhRz72.js';
4
4
  import { Ref, DeepReadonly } from 'vue';
5
- import { C as ClientOptions, I as InferClientAPI, a as InferActions, A as AuthClientPlugin, b as IsSignal } from './types-DtaLn_7o.js';
5
+ import { C as ClientOptions, I as InferClientAPI, a as InferActions, A as AuthClientPlugin, b as IsSignal } from './types-Bbz_v64N.js';
6
6
  import 'kysely';
7
7
  import './index-CcxejJTH.js';
8
8
  import 'arctic';
9
9
  import 'zod';
10
10
  import 'better-call';
11
11
  import 'nanostores';
12
- import './index-Bzhxi8vQ.js';
12
+ import './index-DR55Ilth.js';
13
13
 
14
14
  type InferResolvedHooks<O extends ClientOptions> = O["plugins"] extends Array<infer Plugin> ? Plugin extends AuthClientPlugin ? Plugin["getAtoms"] extends (fetch: any) => infer Atoms ? Atoms extends Record<string, any> ? {
15
15
  [key in keyof Atoms as IsSignal<key> extends true ? never : key extends string ? `use${Capitalize<key>}` : never]: () => DeepReadonly<Ref<ReturnType<Atoms[key]["get"]>>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "better-auth",
3
- "version": "0.0.9-beta.13",
3
+ "version": "0.0.9-beta.14",
4
4
  "description": "Framework-agnostic, batteries included authentication library for typescript",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",