better-auth 0.0.2-beta.7 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access.d.ts +4 -0
- package/dist/access.js +126 -0
- package/dist/access.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +553 -0
- package/dist/cli.js.map +1 -0
- package/dist/client/plugins.d.ts +2436 -0
- package/dist/client/plugins.js +411 -0
- package/dist/client/plugins.js.map +1 -0
- package/dist/client-A2Mt04KQ.d.ts +3503 -0
- package/dist/client.d.ts +1433 -0
- package/dist/client.js +693 -0
- package/dist/client.js.map +1 -0
- package/dist/helper-B5_2Vzba.d.ts +14 -0
- package/dist/index-Dg4eEXZW.d.ts +24 -0
- package/dist/index-W5nXvJ-p.d.ts +1498 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.js +2195 -1191
- package/dist/index.js.map +1 -1
- package/dist/next-js.d.ts +14 -0
- package/dist/next-js.js +14 -0
- package/dist/next-js.js.map +1 -0
- package/dist/plugins.d.ts +892 -49
- package/dist/plugins.js +3951 -253
- package/dist/plugins.js.map +1 -1
- package/dist/preact.d.ts +8 -0
- package/dist/preact.js +294 -0
- package/dist/preact.js.map +1 -0
- package/dist/react.d.ts +14 -0
- package/dist/react.js +314 -0
- package/dist/react.js.map +1 -0
- package/dist/schema-BOszzrbQ.d.ts +792 -0
- package/dist/social.d.ts +4 -0
- package/dist/social.js +509 -0
- package/dist/social.js.map +1 -0
- package/dist/solid-start.d.ts +18 -0
- package/dist/solid-start.js +14 -0
- package/dist/solid-start.js.map +1 -0
- package/dist/solid.d.ts +2790 -0
- package/dist/solid.js +306 -0
- package/dist/solid.js.map +1 -0
- package/dist/statement-COylZd3J.d.ts +81 -0
- package/dist/svelte-kit.d.ts +10 -7
- package/dist/svelte-kit.js +12 -17
- package/dist/svelte-kit.js.map +1 -1
- package/dist/svelte.d.ts +2791 -0
- package/dist/svelte.js +304 -0
- package/dist/svelte.js.map +1 -0
- package/dist/type-DbMyI3b5.d.ts +5724 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/vue.d.ts +14 -0
- package/dist/vue.js +311 -0
- package/dist/vue.js.map +1 -0
- package/package.json +80 -54
- package/LICENSE +0 -21
- package/dist/actions.d.ts +0 -33
- package/dist/actions.js +0 -1373
- package/dist/actions.js.map +0 -1
- package/dist/adapters/drizzle-adapter.d.ts +0 -10
- package/dist/adapters/drizzle-adapter.js +0 -1095
- package/dist/adapters/drizzle-adapter.js.map +0 -1
- package/dist/adapters/memory.d.ts +0 -8
- package/dist/adapters/memory.js +0 -136
- package/dist/adapters/memory.js.map +0 -1
- package/dist/adapters/mongodb-adapter.d.ts +0 -9
- package/dist/adapters/mongodb-adapter.js +0 -97
- package/dist/adapters/mongodb-adapter.js.map +0 -1
- package/dist/adapters/prisma-adapter.d.ts +0 -7
- package/dist/adapters/prisma-adapter.js +0 -144
- package/dist/adapters/prisma-adapter.js.map +0 -1
- package/dist/adapters/redis-adapter.d.ts +0 -7
- package/dist/adapters/redis-adapter.js +0 -65
- package/dist/adapters/redis-adapter.js.map +0 -1
- package/dist/adapters.d.ts +0 -3
- package/dist/adapters.js +0 -206
- package/dist/adapters.js.map +0 -1
- package/dist/h3.d.ts +0 -10
- package/dist/h3.js +0 -326
- package/dist/h3.js.map +0 -1
- package/dist/hono.d.ts +0 -10
- package/dist/hono.js +0 -25
- package/dist/hono.js.map +0 -1
- package/dist/index-UcTu1vUg.d.ts +0 -107
- package/dist/next.d.ts +0 -17
- package/dist/next.js +0 -26
- package/dist/next.js.map +0 -1
- package/dist/options-CH15FEBw.d.ts +0 -1562
- package/dist/providers.d.ts +0 -3
- package/dist/providers.js +0 -653
- package/dist/providers.js.map +0 -1
- package/dist/routes/session.d.ts +0 -39
- package/dist/routes/session.js +0 -128
- package/dist/routes/session.js.map +0 -1
- package/dist/types-DAxaMWCy.d.ts +0 -136
package/dist/actions.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/crypto/random.ts","../src/utils/time.ts","../src/adapters/internal-adapter.ts","../src/adapters/utils.ts","../src/cookies/index.ts","../src/cookies/cookies.ts","../src/crypto/hmac.ts","../src/plugins/csrf-check.ts","../src/plugins/utils.ts","../../shared/src/error.ts","../src/routes/callback.ts","../src/oauth2/signin.ts","../src/crypto/sha.ts","../src/oauth2/utils.ts","../src/oauth2/tokens.ts","../src/providers/utils.ts","../src/routes/session.ts","../src/routes/signin.ts","../src/routes/signout.ts","../src/routes/signup.ts","../src/utils/request.ts","../src/utils/secret.ts","../src/auth.ts","../src/actions/index.ts"],"sourcesContent":["export function generateRandomString(size: number) {\n\tconst i2hex = (i: number) => `0${i.toString(16)}`.slice(-2);\n\tconst r = (a: string, i: number): string => a + i2hex(i);\n\tconst bytes = crypto.getRandomValues(new Uint8Array(size));\n\treturn Array.from(bytes).reduce(r, \"\");\n}\n","type TimeSpan<\n\tT extends number = number,\n\tP extends string = \"w\" | \"d\" | \"hr\" | \"m\" | \"s\",\n> = `${T}${P}`;\n\nexport const timeSpan = (span: TimeSpan) => {\n\tconst [time, unit] = span;\n\tconst timeInMs = Number.parseInt(time as string) * 1000;\n\tswitch (unit) {\n\t\tcase \"s\":\n\t\t\treturn timeInMs;\n\t\tcase \"m\":\n\t\t\treturn timeInMs * 60;\n\t\tcase \"hr\":\n\t\t\treturn timeInMs * 60 * 60;\n\t\tcase \"d\":\n\t\t\treturn timeInMs * 60 * 60 * 24;\n\t\tcase \"w\":\n\t\t\treturn timeInMs * 60 * 60 * 24 * 7;\n\t\tdefault:\n\t\t\treturn 0;\n\t}\n};\n\nexport const getDate = (span: TimeSpan | number) => {\n\tconst sec = typeof span === \"number\" ? span : timeSpan(span);\n\tconst date = new Date();\n\treturn new Date(date.getTime() + sec);\n};\n","import { generateRandomString } from \"../crypto/random\";\nimport type { Context } from \"../routes/types\";\nimport { getDate } from \"../utils/time\";\nimport type { Account, Adapter, Session, User } from \"./types\";\n\nexport const createInternalAdapter = (db: Adapter) => {\n\treturn {\n\t\tcreateSession: async (userId: string, context: Context) => {\n\t\t\tif (context.sessionAdapter) {\n\t\t\t\treturn context.sessionAdapter.create({\n\t\t\t\t\tuserId,\n\t\t\t\t\texpiresAt: new Date(Date.now() + context.session.expiresIn),\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst session = await db.create<Session>({\n\t\t\t\tmodel: context.session.modelName,\n\t\t\t\tdata: {\n\t\t\t\t\tid: generateRandomString(32),\n\t\t\t\t\tuserId,\n\t\t\t\t\texpiresAt:\n\t\t\t\t\t\tdb.config?.dateFormat === \"number\"\n\t\t\t\t\t\t\t? Date.now() + context.session.expiresIn\n\t\t\t\t\t\t\t: new Date(Date.now() + context.session.expiresIn),\n\t\t\t\t},\n\t\t\t\tselect: context.session.selectFields,\n\t\t\t});\n\t\t\treturn session;\n\t\t},\n\t\tupdateSession: async (session: Session, context: Context) => {\n\t\t\tconst updateDate =\n\t\t\t\tcontext.session.updateAge === 0\n\t\t\t\t\t? 0\n\t\t\t\t\t: getDate(context.session.updateAge).valueOf();\n\t\t\tconst maxAge = getDate(context.session.expiresIn);\n\t\t\tconst shouldBeUpdated =\n\t\t\t\tsession.expiresAt.valueOf() - maxAge.valueOf() + updateDate <=\n\t\t\t\tDate.now();\n\t\t\tif (shouldBeUpdated) {\n\t\t\t\tif (context.sessionAdapter) {\n\t\t\t\t\treturn context.sessionAdapter.update({\n\t\t\t\t\t\tid: session.id,\n\t\t\t\t\t\tuserId: session.userId,\n\t\t\t\t\t\texpiresAt: new Date(Date.now() + context.session.expiresIn),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tconst updatedSession = await db.update<Session>({\n\t\t\t\t\tmodel: context.session.modelName,\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\tvalue: session.id,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tupdate: {\n\t\t\t\t\t\texpiresAt:\n\t\t\t\t\t\t\tdb.config?.dateFormat === \"number\"\n\t\t\t\t\t\t\t\t? Date.now() + context.session.expiresIn\n\t\t\t\t\t\t\t\t: new Date(Date.now() + context.session.expiresIn),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn updatedSession;\n\t\t\t}\n\t\t\treturn session;\n\t\t},\n\t\tdeleteSession: async (id: string, context: Context) => {\n\t\t\tconst session = await db.delete<Session>({\n\t\t\t\tmodel: context.session.modelName,\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\tcreateUser: async (\n\t\t\tdata: {\n\t\t\t\tuser: Record<string, any>;\n\t\t\t\taccount: {\n\t\t\t\t\tproviderId: string;\n\t\t\t\t\taccountId: string;\n\t\t\t\t\t[key: string]: any;\n\t\t\t\t};\n\t\t\t},\n\t\t\tcontext: Context,\n\t\t) => {\n\t\t\tconst user = await db.create<User>({\n\t\t\t\tmodel: context.user.modelName,\n\t\t\t\tdata: {\n\t\t\t\t\tid: generateRandomString(32),\n\t\t\t\t\t...data.user,\n\t\t\t\t},\n\t\t\t\tselect: context.user.selectFields,\n\t\t\t});\n\t\t\tconst account = await db.create<Account>({\n\t\t\t\tmodel: context.account.modelName,\n\t\t\t\tdata: {\n\t\t\t\t\t...data.account,\n\t\t\t\t\tuserId: user.id,\n\t\t\t\t\tproviderId: data.account.providerId.toString(),\n\t\t\t\t\taccountId: data.account.accountId.toString(),\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn { user, account };\n\t\t},\n\t\tupdateUserByEmail: async (\n\t\t\temail: string,\n\t\t\tdata: Record<string, any>,\n\t\t\tcontext: Context,\n\t\t) => {\n\t\t\tconst user = await db.update<User>({\n\t\t\t\tmodel: context.user.modelName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: 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\tfindUserByEmail: async (email: string, context: Context) => {\n\t\t\tconst user = await db.findOne<User | null>({\n\t\t\t\tmodel: context.user.modelName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: email,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tselect: context.user.selectFields,\n\t\t\t});\n\t\t\treturn user;\n\t\t},\n\t\tfindSession: async (id: string, context: Context) => {\n\t\t\tif (context.sessionAdapter) {\n\t\t\t\treturn context.sessionAdapter.findOne({\n\t\t\t\t\tuserId: id,\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst session = await db.findOne<Session | null>({\n\t\t\t\tmodel: context.session.modelName,\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\tselect: context.session.selectFields,\n\t\t\t});\n\t\t\treturn session;\n\t\t},\n\t\tfindUserById: async (id: string, context: Context) => {\n\t\t\tconst user = await db.findOne<User | null>({\n\t\t\t\tmodel: context.user.modelName,\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\tselect: context.user.selectFields,\n\t\t\t});\n\t\t\treturn user;\n\t\t},\n\t\tfindAccount: async (\n\t\t\tinput: { providerId: string; accountId: string },\n\t\t\tcontext: Context,\n\t\t) => {\n\t\t\tconst account = await db.findOne<Account | null>({\n\t\t\t\tmodel: context.account.modelName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"providerId\",\n\t\t\t\t\t\tvalue: input.providerId.toString(),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"accountId\",\n\t\t\t\t\t\tvalue: input.accountId.toString(),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tselect: context.account.selectFields,\n\t\t\t});\n\t\t\treturn account;\n\t\t},\n\t\tlinkAccount: async (\n\t\t\tinput: {\n\t\t\t\tuserId: string;\n\t\t\t\tproviderId: string;\n\t\t\t\taccountId: string;\n\t\t\t},\n\t\t\tcontext: Context,\n\t\t) => {\n\t\t\tconst { userId, providerId, accountId } = input;\n\t\t\tconst account = await db.create<Account>({\n\t\t\t\tmodel: context.account.modelName,\n\t\t\t\tdata: {\n\t\t\t\t\tuserId,\n\t\t\t\t\tproviderId: providerId.toString(),\n\t\t\t\t\taccountId: accountId.toString(),\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn account;\n\t\t},\n\t};\n};\n\nexport type InternalAdapter = ReturnType<typeof createInternalAdapter>;\n","import { z } from \"zod\";\nimport type { Context } from \"../routes/types\";\nimport type { FieldAttributes, InternalFieldAttributes } from \"./types\";\n\nexport function toInternalFields(fields: Record<string, any>) {\n\tconst internalFields: Record<string, InternalFieldAttributes> = {};\n\tfor (const field in fields) {\n\t\tconst { type, required, returned, hashValue, transform } = fields[\n\t\t\tfield\n\t\t] as FieldAttributes;\n\t\tinternalFields[field] = {\n\t\t\trequired: required ?? false,\n\t\t\treturned: returned ?? true,\n\t\t\thashValue: hashValue ?? false,\n\t\t\tvalidator: z[type]().transform(transform || ((x) => x)),\n\t\t};\n\t}\n\treturn internalFields;\n}\n\nexport function getSelectFields(\n\tfields: {\n\t\t[key: string]: FieldAttributes;\n\t},\n\ttable: \"session\" | \"user\" | \"account\",\n) {\n\tconst select = Object.keys(fields).filter((column) => {\n\t\treturn fields[column]?.returned !== false;\n\t});\n\tconst defaultSelect = {\n\t\tsession: [\"id\", \"userId\", \"expiresAt\"],\n\t\tuser: [\"id\", \"email\", \"emailVerified\"],\n\t\taccount: [\"providerId\", \"accountId\", \"userId\"],\n\t};\n\treturn [...defaultSelect[table], ...select];\n}\n\nexport const parseUser = (data: Record<string, any>, context: Context) => {\n\tconst user = Object.keys(data)\n\t\t.map((key) => {\n\t\t\tconst parsed = context.user.fields[key]?.validator.safeParse(data?.[key]);\n\t\t\treturn { key, value: parsed?.success ? parsed.data : data?.[key] };\n\t\t})\n\t\t.reduce(\n\t\t\t(acc, { key, value }) => {\n\t\t\t\tacc[key] = value;\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{} as Record<string, any>,\n\t\t);\n\treturn user;\n};\n","import type { Context } from \"../routes/types\";\nimport type { CookieSerializeOptions } from \"./types\";\n\nexport function serialize(\n\tname: string,\n\tvalue: string,\n\tattributes: CookieSerializeOptions,\n) {\n\tconst keyValueEntries: Array<[string, string] | [string]> = [];\n\tkeyValueEntries.push([encodeURIComponent(name), encodeURIComponent(value)]);\n\tif (attributes?.domain !== undefined) {\n\t\tkeyValueEntries.push([\"Domain\", attributes.domain]);\n\t}\n\tif (attributes?.expires !== undefined) {\n\t\tkeyValueEntries.push([\"Expires\", attributes.expires.toUTCString()]);\n\t}\n\tif (attributes?.httpOnly) {\n\t\tkeyValueEntries.push([\"HttpOnly\"]);\n\t}\n\tif (attributes?.maxAge !== undefined) {\n\t\tkeyValueEntries.push([\"Max-Age\", attributes.maxAge.toString()]);\n\t}\n\tif (attributes?.path !== undefined) {\n\t\tkeyValueEntries.push([\"Path\", attributes.path]);\n\t}\n\tif (attributes?.sameSite === \"lax\") {\n\t\tkeyValueEntries.push([\"SameSite\", \"Lax\"]);\n\t}\n\tif (attributes?.sameSite === \"none\") {\n\t\tkeyValueEntries.push([\"SameSite\", \"None\"]);\n\t}\n\tif (attributes?.sameSite === \"strict\") {\n\t\tkeyValueEntries.push([\"SameSite\", \"Strict\"]);\n\t}\n\tif (attributes?.secure) {\n\t\tkeyValueEntries.push([\"Secure\"]);\n\t}\n\treturn keyValueEntries.map((pair) => pair.join(\"=\")).join(\"; \");\n}\n\nexport function parse(header: string): Map<string, string> {\n\tconst cookies = new Map<string, string>();\n\tconst items = header.split(\"; \");\n\tfor (const item of items) {\n\t\tconst pair = item.split(\"=\");\n\t\tconst rawKey = pair[0];\n\t\tconst rawValue = pair[1] ?? \"\";\n\t\tif (!rawKey) continue;\n\t\tcookies.set(decodeURIComponent(rawKey), decodeURIComponent(rawValue));\n\t}\n\treturn cookies;\n}\n\nexport const cookieManager = (header: Headers): CookieManager => {\n\treturn {\n\t\tset(name: string, value: string, options = {}) {\n\t\t\tconst cookieStr = serialize(name, value, options);\n\t\t\theader.append(\"set-cookie\", cookieStr);\n\t\t},\n\t\tget(name: string) {\n\t\t\tconst cookie = header.get(\"cookie\");\n\t\t\tif (!cookie) return null;\n\t\t\tconst cookies = parse(cookie);\n\t\t\tconst value = cookies.get(name);\n\t\t\treturn value;\n\t\t},\n\t};\n};\n\nexport type CookieManager = {\n\tset: (name: string, value: string, options?: CookieSerializeOptions) => void;\n\tget: (name: string) => string | null | undefined;\n};\n\nexport function setSessionCookie(context: Context, sessionId: string) {\n\tcontext.request.cookies.set(\n\t\tcontext.cookies.sessionToken.name,\n\t\tsessionId,\n\t\tcontext.cookies.sessionToken.options,\n\t);\n}\n\nexport function deleteSessionCooke(context: Context) {\n\tcontext.request.cookies.set(context.cookies.sessionToken.name, \"\", {\n\t\t...context.cookies.sessionToken.options,\n\t\tmaxAge: 0,\n\t});\n}\n","import type { BetterAuthOptions } from \"../options\";\nimport { timeSpan } from \"../utils/time\";\nimport type { CookieSerializeOptions } from \"./types\";\n\nexport function getCookies(options: BetterAuthOptions) {\n\tconst secure = !!options.advanced?.useSecureCookies;\n\tconst secureCookiePrefix = secure ? \"__Secure-\" : \"\";\n\tconst cookiePrefix = \"better-auth\";\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,\n\t\t\t\tmaxAge: options.session?.expiresIn || timeSpan(\"7d\"),\n\t\t\t\t...options.advanced?.sessionCookie,\n\t\t\t} satisfies CookieSerializeOptions,\n\t\t},\n\t\tcsrfToken: {\n\t\t\tname: `${secureCookiePrefix}${cookiePrefix}.csrf_token`,\n\t\t\toptions: {\n\t\t\t\thttpOnly: true,\n\t\t\t\tsameSite: \"lax\",\n\t\t\t\tpath: \"/\",\n\t\t\t\tsecure,\n\t\t\t} satisfies CookieSerializeOptions,\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,\n\t\t\t\tmaxAge: 60 * 15, // 15 minutes in seconds\n\t\t\t} satisfies CookieSerializeOptions,\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,\n\t\t\t\tmaxAge: 60 * 15, // 15 minutes in seconds\n\t\t\t} as CookieSerializeOptions,\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,\n\t\t\t\tmaxAge: 60 * 15, // 15 minutes in seconds\n\t\t\t} as CookieSerializeOptions,\n\t\t},\n\t};\n}\n\nexport type BetterAuthCookies = ReturnType<typeof getCookies>;\n","export async function hmac(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","import { hmac } from \"../crypto/hmac\";\nimport type { BetterAuthPlugin } from \"./types\";\n\nimport { generateRandomString } from \"../crypto/random\";\nimport type { Context, InternalResponse } from \"../routes/types\";\n\nconst csrfHandler = async (context: Context) => {\n\tconst csrfToken = context.request.cookies.get(context.cookies.csrfToken.name);\n\tif (csrfToken) {\n\t\treturn {\n\t\t\tstatus: 200,\n\t\t\tbody: {\n\t\t\t\tcsrfToken,\n\t\t\t},\n\t\t};\n\t}\n\tconst token = generateRandomString(32);\n\tconst hash = await hmac(context.secret, token);\n\tconst cookie = `${token}!${hash}`;\n\tcontext.request.cookies.set(\n\t\tcontext.cookies.csrfToken.name,\n\t\tcookie,\n\t\tcontext.cookies.csrfToken.options,\n\t);\n\treturn {\n\t\tstatus: 200,\n\t\tbody: {\n\t\t\tcsrfToken: cookie,\n\t\t},\n\t} satisfies InternalResponse;\n};\n\nexport const CSRFCheckPlugin = (): BetterAuthPlugin => {\n\treturn {\n\t\tid: \"csrf\",\n\t\tname: \"CSRF Check\",\n\t\tversion: \"1.0.0\",\n\t\thooks: {\n\t\t\tmatcher: (context) => !context.disableCSRF,\n\t\t\tbefore: async (context) => {\n\t\t\t\tconst csrfToken = context.request.body.csrfToken;\n\t\t\t\tconst csrfCookie = context.request.cookies.get(\n\t\t\t\t\tcontext.cookies.csrfToken.name,\n\t\t\t\t);\n\t\t\t\tconst [token, hash] = csrfCookie?.split(\"!\") || [null, null];\n\t\t\t\tif (\n\t\t\t\t\t!csrfToken ||\n\t\t\t\t\t!csrfCookie ||\n\t\t\t\t\t!token ||\n\t\t\t\t\t!hash ||\n\t\t\t\t\tcsrfCookie !== csrfToken\n\t\t\t\t) {\n\t\t\t\t\tcontext.request.cookies.set(context.cookies.csrfToken.name, \"\", {\n\t\t\t\t\t\t...context.cookies.csrfToken.options,\n\t\t\t\t\t\tmaxAge: 0,\n\t\t\t\t\t});\n\t\t\t\t\treturn {\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tstatus: 403,\n\t\t\t\t\t\t\tstatusText: \"Invalid CSRF Token\",\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst expectedHash = await hmac(context.secret, token);\n\n\t\t\t\tif (hash !== expectedHash) {\n\t\t\t\t\tcontext.request.cookies.set(context.cookies.csrfToken.name, \"\", {\n\t\t\t\t\t\t...context.cookies.csrfToken.options,\n\t\t\t\t\t\tmaxAge: 0,\n\t\t\t\t\t});\n\t\t\t\t\treturn {\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tstatus: 403,\n\t\t\t\t\t\t\tstatusText: \"Invalid CSRF Token\",\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t},\n\t\t},\n\t\thandler: csrfHandler,\n\t};\n};\n","import type { BetterAuthOptions } from \"../options\";\nimport type {\n\tContext,\n\tGenericHandler,\n\tHandlerHooks,\n\tInternalResponse,\n} from \"../routes/types\";\nimport { CSRFCheckPlugin } from \"./csrf-check\";\nimport type {\n\tAfterHookHandler,\n\tBeforeHookHandler,\n\tBetterAuthPlugin,\n} from \"./types\";\n\nexport const getPlugins = (options: BetterAuthOptions) => {\n\tconst plugins: {\n\t\tpost: BetterAuthPlugin[];\n\t\tpre: BetterAuthPlugin[];\n\t\tunordered: BetterAuthPlugin[];\n\t} = {\n\t\tpost: [],\n\t\tpre: [],\n\t\tunordered: [],\n\t};\n\tfor (const plugin of options.plugins || []) {\n\t\tplugins[plugin.order || \"unordered\"].push(plugin);\n\t}\n\tconst internalPlugins = [CSRFCheckPlugin()];\n\treturn [\n\t\t...plugins.pre,\n\t\t...plugins.unordered,\n\t\t...internalPlugins,\n\t\t...plugins.post,\n\t];\n};\n\nexport const usePlugins = (context: Context, ignorePlugins?: string[]) => {\n\tconst plugins = context.plugins.filter(\n\t\t(pl) => pl.hooks && !ignorePlugins?.includes(pl.id),\n\t);\n\tconst hooks = plugins.map((plugin) => {\n\t\treturn plugin.hooks as HandlerHooks;\n\t});\n\tconst before: BeforeHookHandler[] = [];\n\tconst after: AfterHookHandler[] = [];\n\tfor (const hook of hooks) {\n\t\tif (hook.matcher(context)) {\n\t\t\thook.before && before.push(hook.before);\n\t\t\thook.after && after.push(hook.after);\n\t\t}\n\t}\n\treturn {\n\t\tbefore: async (context: Context) => {\n\t\t\tlet ctx: Context | undefined = context;\n\t\t\tlet response: InternalResponse | undefined;\n\t\t\tfor (const hook of before) {\n\t\t\t\tconst res = await hook(ctx);\n\t\t\t\tif (res?.context) {\n\t\t\t\t\tctx = res.context;\n\t\t\t\t}\n\t\t\t\tif (res?.response) {\n\t\t\t\t\tresponse = res.response;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tcontext: ctx,\n\t\t\t\tresponse,\n\t\t\t};\n\t\t},\n\t\tafter: async (context: Context, fnResponse: InternalResponse) => {\n\t\t\tlet ctx: Context | undefined = context;\n\t\t\tlet response: InternalResponse | undefined;\n\t\t\tfor (const hook of after) {\n\t\t\t\tconst res = await hook(ctx, fnResponse);\n\t\t\t\tif (res?.context) {\n\t\t\t\t\tctx = res.context;\n\t\t\t\t}\n\t\t\t\tif (res?.response) {\n\t\t\t\t\tresponse = res.response;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tcontext: ctx,\n\t\t\t\tresponse,\n\t\t\t};\n\t\t},\n\t};\n};\n\nexport const withPlugins = <T extends GenericHandler<any, any, any>>(\n\tfn: T,\n\t/**\n\t * A list of plugins id to ignore.\n\t */\n\tignorePlugins?: string[],\n) => {\n\treturn async (ctx: Parameters<T>[\"0\"]) => {\n\t\tconst { before, after } = usePlugins(ctx, ignorePlugins);\n\t\tconst { context, response } = await before(ctx);\n\t\tif (response) {\n\t\t\treturn response;\n\t\t}\n\t\tconst res = await fn(context);\n\t\tconst { response: afterResponse } = await after(context, res);\n\t\tif (afterResponse) {\n\t\t\treturn afterResponse;\n\t\t}\n\t\treturn res as ReturnType<T>;\n\t};\n};\n","export type BetterAuthErrorResponse = {\n\tmessage: string;\n\tdetails: string;\n\tcode: number;\n};\n\nexport class BetterAuthError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(`${message}`);\n\t\tthis.name = this.constructor.name;\n\t\tObject.setPrototypeOf(this, new.target.prototype);\n\t\tError.captureStackTrace(this, this.constructor);\n\t}\n}\n\nexport class MissingSecret extends BetterAuthError {\n\tconstructor() {\n\t\tsuper(\"Missing Secret: A secret is required in a production environment.\");\n\t}\n}\n\nexport class InvalidURL extends BetterAuthError {\n\tconstructor(message?: string) {\n\t\tsuper(\n\t\t\tmessage ||\n\t\t\t\t\"Please make sure your config includes valid base URL and base PATH.\",\n\t\t);\n\t}\n}\n\nexport class InvalidRequest extends BetterAuthError {\n\tconstructor() {\n\t\tsuper(\"Post requests must include a valid JSON parsable body.\");\n\t}\n}\n\nexport class ProviderMissing extends BetterAuthError {\n\tconstructor(id: string) {\n\t\tsuper(`Provider ${id} is missing on your configuration.`);\n\t}\n}\n\nexport class ProviderError extends BetterAuthError {}\n\nexport class CallbackError extends BetterAuthError {}\n\nexport class BaseURLMissing extends BetterAuthError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"base url is required. Please provide a base url in your config or pass it as an environment variable.\",\n\t\t);\n\t}\n}\n","import { ProviderError } from \"@better-auth/shared/error\";\nimport { z } from \"zod\";\nimport type { User } from \"../adapters/types\";\nimport { parseUser } from \"../adapters/utils\";\nimport { setSessionCookie } from \"../cookies\";\nimport { getState } from \"../oauth2/signin\";\nimport { getTokens } from \"../oauth2/tokens\";\nimport { withPlugins } from \"../plugins/utils\";\nimport { getProvider } from \"../providers/utils\";\nimport type { Context, InternalResponse } from \"./types\";\n\nconst callbackQuerySchema = z.object({\n\tcode: z.string(),\n\tstate: z.string(),\n\tprovider: z.string(),\n});\n\nexport type CallbackContext = Context<{}, z.infer<typeof callbackQuerySchema>>;\nexport const callback = async (context: CallbackContext) => {\n\tconst parsedQuery = callbackQuerySchema.safeParse(context.request.query);\n\tif (!parsedQuery.success) {\n\t\tconst error = context.request.url.searchParams.get(\"error\");\n\t\tconst errorDesc = context.request.url.searchParams.get(\"error_description\");\n\t\tconst state = context.request.url.searchParams.get(\"state\");\n\t\tif (!state) {\n\t\t\tthrow new ProviderError(\n\t\t\t\t`state is not returned from ${context.request.url.searchParams.get(\n\t\t\t\t\t\"provider\",\n\t\t\t\t)}`,\n\t\t\t);\n\t\t}\n\t\tconst { currentURL } = getState(state);\n\t\treturn {\n\t\t\tstatus: 302,\n\t\t\theaders: {\n\t\t\t\tLocation: `${currentURL}?error=${error}&error_description=${errorDesc}`,\n\t\t\t},\n\t\t} satisfies InternalResponse;\n\t}\n\n\tconst provider = getProvider(context, parsedQuery.data.provider);\n\tif (provider?.type === \"oauth\" || provider?.type === \"oidc\") {\n\t\tconst storedState = context.request.cookies.get(context.cookies.state.name);\n\t\tconst state = parsedQuery.data.state;\n\t\tconst { currentURL } = getState(state);\n\t\tif (storedState !== state) {\n\t\t\treturn {\n\t\t\t\tstatus: 302,\n\t\t\t\theaders: {\n\t\t\t\t\tLocation: `${currentURL}?error=invalid_state`,\n\t\t\t\t},\n\t\t\t} satisfies InternalResponse;\n\t\t}\n\t\tconst tokens = await getTokens(context, provider);\n\t\tif (tokens.error) {\n\t\t\treturn {\n\t\t\t\tstatus: 302,\n\t\t\t\theaders: {\n\t\t\t\t\tLocation: `${currentURL}?error=${tokens.error}`,\n\t\t\t\t},\n\t\t\t} satisfies InternalResponse;\n\t\t}\n\t\tif (provider.type === \"oauth\" || provider.type === \"oidc\") {\n\t\t\tconst profile = await provider.getUserInfo(tokens as any);\n\n\t\t\tconst {\n\t\t\t\tcallbackURL,\n\t\t\t\tcurrentURL,\n\t\t\t\tsignUp: { data, autoCreateSession, onlySignUp },\n\t\t\t} = getState(state);\n\t\t\tlet userAccount = await context.adapter.findAccount(\n\t\t\t\t{\n\t\t\t\t\tproviderId: provider.id,\n\t\t\t\t\taccountId: profile.id,\n\t\t\t\t},\n\t\t\t\tcontext,\n\t\t\t);\n\n\t\t\t/**\n\t\t\t * If the provider is oidc we should check the nonce\n\t\t\t */\n\t\t\tif (provider.type === \"oidc\") {\n\t\t\t\tif (profile.nonce) {\n\t\t\t\t\tconst nonce = context.request.cookies.get(context.cookies.nonce.name);\n\t\t\t\t\tif (profile.nonce !== nonce) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstatus: 302,\n\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\tLocation: `${currentURL}?error=invalid_nonce`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} satisfies InternalResponse;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * If the request is only to signup a new user we should return error if the user exist\n\t\t\t */\n\t\t\tif (onlySignUp && userAccount) {\n\t\t\t\treturn {\n\t\t\t\t\tstatus: 302,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tLocation: `${currentURL}?error=user_already_exist`,\n\t\t\t\t\t},\n\t\t\t\t} satisfies InternalResponse;\n\t\t\t}\n\t\t\tlet userData: Record<string, any> | null = null;\n\t\t\tif (!userAccount) {\n\t\t\t\t/**\n\t\t\t\t * If account linking is on we first try to link the user\n\t\t\t\t */\n\t\t\t\tif (provider.params.linkAccounts) {\n\t\t\t\t\tconst shouldLink = provider.params.linkAccounts.enabler\n\t\t\t\t\t\t? await provider.params.linkAccounts.enabler(profile)\n\t\t\t\t\t\t: true;\n\t\t\t\t\tif (shouldLink) {\n\t\t\t\t\t\tconst { field, key } = provider.params.linkAccounts;\n\t\t\t\t\t\tconst user = await context._db.findOne<User>({\n\t\t\t\t\t\t\tmodel: context.user.modelName,\n\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfield,\n\t\t\t\t\t\t\t\t\tvalue: profile[key as keyof typeof profile],\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\tif (user) {\n\t\t\t\t\t\t\tuserAccount = await context.adapter.linkAccount(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tuserId: user.id,\n\t\t\t\t\t\t\t\t\tproviderId: provider.id,\n\t\t\t\t\t\t\t\t\taccountId: profile.id,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tuserData = user;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * If the request is only to signin we should return error\n\t\t\t\t */\n\t\t\t\tif (!userData && !data) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: 302,\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tLocation: `${callbackURL}?error=user_not_found`,\n\t\t\t\t\t\t},\n\t\t\t\t\t} satisfies InternalResponse;\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * If the user wasn't linked we'll create a new user with the signup data\n\t\t\t\t */\n\t\t\t\tif (!userData) {\n\t\t\t\t\tlet signUpData: Record<string, any> = {};\n\t\t\t\t\tfor (const key in data) {\n\t\t\t\t\t\tif (typeof data[key] === \"string\") {\n\t\t\t\t\t\t\tconst constructedKey = (data[key] as string).split(\".\");\n\t\t\t\t\t\t\tlet value: any = profile;\n\t\t\t\t\t\t\tfor (const k of constructedKey) {\n\t\t\t\t\t\t\t\tvalue = value[k as keyof typeof value];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsignUpData[key] = value;\n\t\t\t\t\t\t} else if (\"value\" in data[key]) {\n\t\t\t\t\t\t\tsignUpData[key] = data[key].value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t/**\n\t\t\t\t\t * Parse the user data\n\t\t\t\t\t */\n\t\t\t\t\tsignUpData = parseUser(signUpData, context);\n\n\t\t\t\t\tconst accountData: {\n\t\t\t\t\t\tproviderId: string;\n\t\t\t\t\t\taccountId: string;\n\t\t\t\t\t\t[key: string]: any;\n\t\t\t\t\t} = {\n\t\t\t\t\t\tproviderId: provider.id,\n\t\t\t\t\t\taccountId: profile.id,\n\t\t\t\t\t};\n\n\t\t\t\t\tfor (const key in context.account.additionalFields) {\n\t\t\t\t\t\taccountData[key] =\n\t\t\t\t\t\t\ttokens[\n\t\t\t\t\t\t\t\tcontext.account.additionalFields[key] as keyof typeof tokens\n\t\t\t\t\t\t\t];\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst { user, account } = await context.adapter.createUser(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tuser: signUpData,\n\t\t\t\t\t\t\t\taccount: accountData,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tcontext,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tuserAccount = account;\n\t\t\t\t\t\tuserData = user;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstatus: 302,\n\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\tLocation: `${currentURL}?error=user_already_exist`,\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\n\t\t\tif (!userData) {\n\t\t\t\tuserData = await context.adapter.findUserById(\n\t\t\t\t\tuserAccount?.userId as string,\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t}\n\t\t\t/**\n\t\t\t * This is to handler if the user specified not creating sessions on signup\n\t\t\t */\n\t\t\tif (autoCreateSession) {\n\t\t\t\tconst session = await context.adapter.createSession(\n\t\t\t\t\tuserData?.id as string,\n\t\t\t\t\tcontext,\n\t\t\t\t);\n\t\t\t\tsetSessionCookie(context, session.id);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstatus: 302,\n\t\t\t\theaders: {\n\t\t\t\t\tLocation: callbackURL,\n\t\t\t\t},\n\t\t\t} satisfies InternalResponse;\n\t\t}\n\t\treturn {\n\t\t\tstatus: 200,\n\t\t} satisfies InternalResponse;\n\t}\n\tthrow new ProviderError(\"Invalid provider type\");\n};\n\nexport const callbackHandler = withPlugins(callback, [\"csrf\"]);\n","import { ProviderError } from \"@better-auth/shared/error\";\nimport { base64url } from \"jose\";\nimport { generateRandomString } from \"../crypto/random\";\nimport { sha256 } from \"../crypto/sha\";\nimport type { OAuthProvider, OIDCProvider } from \"../providers/types\";\nimport type { SignInContext } from \"../routes/signin\";\nimport { discoveryRequest } from \"./utils\";\n\nexport async function signInOAuth(\n\tcontext: SignInContext,\n\tprovider: OAuthProvider | OIDCProvider,\n\t{\n\t\tonlySignUp,\n\t\tautoCreateSession,\n\t}: {\n\t\tautoCreateSession: boolean;\n\t\t/**\n\t\t * If onlySignUp is true, it will only sign up the\n\t\t * user. If the user exists, it will throw an error\n\t\t * on the callback.\n\t\t */\n\t\tonlySignUp: boolean;\n\t} = {\n\t\tautoCreateSession: true,\n\t\tonlySignUp: false,\n\t},\n) {\n\tif (!provider.params.clientId) {\n\t\tthrow new ProviderError(\"clientId is required\");\n\t}\n\tconst scopes = Array.from(new Set(provider?.scopes ?? []));\n\tconst { currentURL, callbackURL, data } = context.request.body;\n\tconst state = generateState(\n\t\tcurrentURL,\n\t\tcallbackURL,\n\t\tdata,\n\t\tautoCreateSession,\n\t\tonlySignUp,\n\t);\n\tlet url = provider.params.authorizationEndpoint;\n\tif (!url) {\n\t\tconst discovery = await discoveryRequest(context, provider);\n\t\tif (!discovery.authorization_endpoint)\n\t\t\tthrow new ProviderError(\"Missing authorization endpoint\");\n\t\turl = discovery.authorization_endpoint as string;\n\t}\n\tconst authorizationUrl = new URL(url);\n\tauthorizationUrl.searchParams.set(\"response_type\", \"code\");\n\tauthorizationUrl.searchParams.set(\"client_id\", provider.params.clientId);\n\tauthorizationUrl.searchParams.set(\"state\", state);\n\tauthorizationUrl.searchParams.set(\"scope\", scopes.join(\" \"));\n\tauthorizationUrl.searchParams.set(\n\t\t\"redirect_uri\",\n\t\tprovider.params.redirectURL ||\n\t\t\t`${context.request.url.toString()}/callback/${\n\t\t\t\tcontext.request.body.provider\n\t\t\t}`,\n\t);\n\n\tif (provider.type === \"oidc\") {\n\t\t/**\n\t\t * If the provider is an OIDC provider, we need to add the nonce parameter\n\t\t * to the authorization URL. The nonce parameter is a string value used to\n\t\t * associate a client session with an ID Token, and to mitigate replay attacks.\n\t\t */\n\t\tif (provider.nonce) {\n\t\t\tconst nonce = generateRandomString(24);\n\t\t\tauthorizationUrl.searchParams.set(\"nonce\", nonce);\n\t\t\tcontext.request.cookies.set(\n\t\t\t\tcontext.cookies.nonce.name,\n\t\t\t\tnonce,\n\t\t\t\tcontext.cookies.nonce.options,\n\t\t\t);\n\t\t}\n\t}\n\tprovider.params.responseMode &&\n\t\tauthorizationUrl.searchParams.set(\n\t\t\t\"response_mode\",\n\t\t\tprovider.params.responseMode,\n\t\t);\n\n\tif (provider.params.extra) {\n\t\tconst extra = Object.entries(provider.params.extra);\n\t\tfor (const [key, value] of extra) {\n\t\t\tauthorizationUrl.searchParams.set(key, value);\n\t\t}\n\t}\n\tconst codeVerifier = provider.pkCodeVerifier\n\t\t? generateCodeVerifier()\n\t\t: undefined;\n\tif (provider.pkCodeVerifier && codeVerifier) {\n\t\tconst codeChallengeMethod = provider?.codeChallengeMethod ?? \"S256\";\n\t\tif (codeChallengeMethod === \"S256\") {\n\t\t\tconst codeChallengeBuffer = await sha256(\n\t\t\t\tnew TextEncoder().encode(codeVerifier),\n\t\t\t);\n\t\t\tconst codeChallenge = base64url.encode(\n\t\t\t\tnew Uint8Array(codeChallengeBuffer),\n\t\t\t);\n\t\t\tauthorizationUrl.searchParams.set(\"code_challenge\", codeChallenge);\n\t\t\tauthorizationUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n\t\t} else {\n\t\t\tauthorizationUrl.searchParams.set(\"code_challenge\", codeVerifier);\n\t\t\tauthorizationUrl.searchParams.set(\"code_challenge_method\", \"plain\");\n\t\t}\n\t}\n\tcontext.request.cookies.set(\n\t\tcontext.cookies.state.name,\n\t\tstate,\n\t\tcontext.cookies.state.options,\n\t);\n\tif (codeVerifier) {\n\t\tcontext.request.cookies.set(\n\t\t\tcontext.cookies.pkCodeVerifier.name,\n\t\t\tcodeVerifier,\n\t\t\tcontext.cookies.pkCodeVerifier.options,\n\t\t);\n\t}\n\treturn authorizationUrl.toString();\n}\n\nexport function generateCodeVerifier(): string {\n\tconst randomValues = new Uint8Array(32);\n\tcrypto.getRandomValues(randomValues);\n\treturn base64url.encode(randomValues);\n}\n\n/**\n * The callbackURL is the URL that the provider will\n * redirect to after the user. If not provided, it will\n * redirect to the current URL. If any error occurs, if error\n * page isn't specified on the config, it will redirect to\n * the current URL with the error query parameter.\n */\nexport function generateState(\n\tcurrentURL: string,\n\tcallbackURL?: string,\n\tsignUp?: Record<string, any>,\n\tautoCreateSession?: boolean,\n\tonlySignUp?: boolean,\n): string {\n\tlet state = generateRandomString(24);\n\tstate += `!${currentURL}`;\n\tstate += `!${callbackURL || currentURL}`;\n\tstate += `!${JSON.stringify({\n\t\tdata: signUp,\n\t\tautoCreateSession,\n\t\tonlySignUp,\n\t})}`;\n\treturn state;\n}\n\nexport function getState(state: string): {\n\thash: string;\n\tcurrentURL: string;\n\tcallbackURL: string;\n\tsignUp: {\n\t\tdata: Record<string, any>;\n\t\tautoCreateSession: boolean | undefined;\n\t\tonlySignUp: boolean | undefined;\n\t};\n} {\n\tconst [hash, currentURL, callbackURL, signUpString] = state.split(\"!\");\n\tif (!hash || !currentURL || !callbackURL) {\n\t\tthrow new ProviderError(\"Invalid state\");\n\t}\n\tconst signUp = signUpString ? JSON.parse(signUpString) : undefined;\n\treturn {\n\t\thash,\n\t\tcurrentURL,\n\t\tcallbackURL,\n\t\tsignUp: {\n\t\t\tdata: signUp?.data,\n\t\t\tautoCreateSession: signUp?.autoCreateSession,\n\t\t\tonlySignUp: signUp?.onlySignUp,\n\t\t},\n\t};\n}\n","export async function sha256(data: ArrayBuffer): Promise<ArrayBuffer> {\n\treturn await crypto.subtle.digest(\"SHA-256\", data);\n}\n","import type { OAuthProvider, OIDCProvider } from \"../providers\";\nimport type { CallbackContext } from \"../routes/callback\";\nimport type { SignInContext } from \"../routes/signin\";\n\nexport async function discoveryRequest(\n\tcontext: SignInContext | CallbackContext,\n\tprovider: OAuthProvider | OIDCProvider,\n): Promise<{\n\tauthorization_endpoint?: string;\n\ttoken_endpoint?: string;\n\tuserinfo_endpoint?: string;\n}> {\n\tconst issuerIdentifier = new URL(provider.issuer as string);\n\tif (!(issuerIdentifier instanceof URL)) {\n\t\tthrow new TypeError('\"issuerIdentifier\" must be an instance of URL');\n\t}\n\tif (\n\t\tissuerIdentifier.protocol !== \"https:\" &&\n\t\tissuerIdentifier.protocol !== \"http:\"\n\t) {\n\t\tthrow new TypeError('\"issuer.protocol\" must be \"https:\" or \"http:\"');\n\t}\n\n\tconst url = new URL(issuerIdentifier.href);\n\n\tswitch (provider.type) {\n\t\tcase undefined:\n\t\tcase \"oidc\":\n\t\t\turl.pathname = `${url.pathname}/.well-known/openid-configuration`.replace(\n\t\t\t\t\"//\",\n\t\t\t\t\"/\",\n\t\t\t);\n\t\t\tbreak;\n\t\tcase \"oauth\":\n\t\t\tif (url.pathname === \"/\") {\n\t\t\t\turl.pathname = \".well-known/oauth-authorization-server\";\n\t\t\t} else {\n\t\t\t\turl.pathname =\n\t\t\t\t\t`.well-known/oauth-authorization-server/${url.pathname}`.replace(\n\t\t\t\t\t\t\"//\",\n\t\t\t\t\t\t\"/\",\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new TypeError(`\"provider.type\" must be \"oidc\" or \"oauth\"`);\n\t}\n\n\tconst headers = new Headers(context.request.headers);\n\theaders.set(\"accept\", \"application/json\");\n\n\treturn fetch(url.href, {\n\t\theaders: Object.fromEntries(headers.entries()),\n\t\tmethod: \"GET\",\n\t\tredirect: \"manual\",\n\t}).then((res) => {\n\t\tif (!res.ok) {\n\t\t\tthrow new Error(`HTTP error! status: ${res.status}`);\n\t\t}\n\t\treturn res.json();\n\t});\n}\n","import { base64url } from \"jose\";\nimport type { OAuthProvider, OIDCProvider } from \"../providers\";\nimport type { CallbackContext } from \"../routes/callback\";\nimport { discoveryRequest } from \"./utils\";\n\nexport async function getTokens(\n\tcontext: CallbackContext,\n\tprovider: OIDCProvider | OAuthProvider,\n) {\n\tconst redirectURL =\n\t\tprovider.params.redirectURL ||\n\t\t`${context.baseURL}${context.basePath}/callback/${provider.id}`;\n\tconst headers = new Headers();\n\theaders.set(\"Content-Type\", \"application/x-www-form-urlencoded\");\n\theaders.set(\"Accept\", \"application/json\");\n\theaders.set(\"User-Agent\", \"better-auth\");\n\tconst encodedCredentials = base64url.encode(\n\t\t`${provider.params.clientId}:${provider.params.clientSecret}`,\n\t);\n\theaders.set(\"Authorization\", `Basic ${encodedCredentials}`);\n\tconst body = new URLSearchParams();\n\tbody.set(\"grant_type\", \"authorization_code\");\n\tbody.set(\"code\", context.request.query.code);\n\tbody.set(\"redirect_uri\", redirectURL);\n\tif (provider.pkCodeVerifier) {\n\t\tconst codeVerifier = context.request.cookies.get(\n\t\t\tcontext.cookies.pkCodeVerifier.name,\n\t\t);\n\t\t//TODO: maybe it should throw if it's not available\n\t\tcodeVerifier && body.set(\"code_verifier\", codeVerifier);\n\t}\n\tbody.set(\"client_id\", provider.params.clientId);\n\tbody.set(\"client_secret\", provider.params.clientSecret);\n\tlet url = provider.params.tokenEndpoint;\n\tif (!url) {\n\t\tconst discovery = await discoveryRequest(context, provider);\n\t\tif (!discovery.token_endpoint) {\n\t\t\tthrow new Error(\"Missing token endpoint\");\n\t\t}\n\t\turl = discovery.token_endpoint;\n\t}\n\tconst response = await fetch(url, {\n\t\tmethod: \"POST\",\n\t\tbody,\n\t\theaders,\n\t});\n\tconst data: TokenResponse | TokenErrorResponse = await response.json();\n\treturn data;\n}\n\nexport interface TokenResponse {\n\taccess_token: string;\n\ttoken_type?: string;\n\texpires_in?: number;\n\trefresh_token?: string;\n\tscope?: string;\n\terror: undefined;\n}\n\nexport interface TokenErrorResponse {\n\terror: string;\n\terror_description?: string;\n}\n","import type { Context } from \"../routes/types\";\nimport type { Provider } from \"./types\";\n\nexport const getProvider = (\n\tcontext: Context,\n\tproviderId: string,\n): Provider | undefined => {\n\tconst providers = context.providers;\n\tconst provider = providers.find((provider) => provider.id === providerId);\n\treturn provider;\n};\n","import { deleteSessionCooke } from \"../cookies\";\nimport { withPlugins } from \"../plugins/utils\";\nimport type { Context, InternalResponse } from \"./types\";\n\nexport type SessionContext = Context;\n\nexport type SessionResponse = Omit<\n\tAwaited<ReturnType<typeof session>> extends infer B\n\t\t? B extends { status: 200; body: infer Body }\n\t\t\t? Body\n\t\t\t: never\n\t\t: never,\n\t\"error\"\n>;\n\nexport const session = async (context: SessionContext) => {\n\tconst session = await getServerSession(context);\n\tif (!session) {\n\t\treturn {\n\t\t\tstatus: 401,\n\t\t\tstatusText: \"Unauthorize\",\n\t\t} satisfies InternalResponse;\n\t}\n\treturn {\n\t\tstatus: 200 as const,\n\t\tbody: session,\n\t} satisfies InternalResponse;\n};\n\nexport const getServerSession = async (context: Context) => {\n\tconst sessionFromCookie = context.request.cookies.get(\n\t\tcontext.cookies.sessionToken.name,\n\t);\n\tif (!sessionFromCookie) {\n\t\treturn null;\n\t}\n\tconst session = await context.adapter.findSession(sessionFromCookie, context);\n\tif (!session || session.expiresAt < new Date()) {\n\t\tsession && (await context.adapter.deleteSession(session.id, context));\n\t\tdeleteSessionCooke(context);\n\t\treturn null;\n\t}\n\tconst user = await context.adapter.findUserById(session.userId, context);\n\tif (!user) {\n\t\treturn null;\n\t}\n\tconst updatedSession = await context.adapter.updateSession(session, context);\n\tcontext.request.cookies.set(context.cookies.sessionToken.name, session.id, {\n\t\t...context.cookies.sessionToken.options,\n\t\tmaxAge: updatedSession.expiresAt.valueOf() - Date.now(),\n\t});\n\tsessionFromCookie;\n\treturn {\n\t\tuser,\n\t\texpiresAt: session.expiresAt,\n\t};\n};\n\nexport const sessionHandler = withPlugins(session);\n","import { ProviderError, ProviderMissing } from \"@better-auth/shared/error\";\nimport { z } from \"zod\";\nimport { parseUser } from \"../adapters/utils\";\nimport { setSessionCookie } from \"../cookies\";\nimport { signInOAuth } from \"../oauth2/signin\";\nimport { withPlugins } from \"../plugins/utils\";\nimport { getProvider } from \"../providers/utils\";\nimport type { Context, InternalResponse } from \"./types\";\n\nexport const bodySchema = z.object({\n\tprovider: z.string(),\n\tdata: z.record(z.string(), z.any()).optional(),\n\tcallbackURL: z.string().optional(),\n\tcurrentURL: z.string(),\n});\n\nexport type SignInContext = Context<z.infer<typeof bodySchema>>;\n\nexport type SignInHooks = {\n\tbefore?: (ctx: SignInContext) => Promise<Context<any>>;\n\tafter?: (ctx: SignInContext) => Promise<InternalResponse<any> | undefined>;\n};\n\nexport const signIn = async (context: SignInContext) => {\n\tconst data = bodySchema.parse(context.request.body);\n\tconst provider = getProvider(context, data.provider);\n\tif (!provider) {\n\t\tthrow new ProviderMissing(data.provider);\n\t}\n\tif (provider.type === \"oauth\" || provider.type === \"oidc\") {\n\t\tconst url = await signInOAuth(context, provider);\n\t\treturn {\n\t\t\tstatus: 200,\n\t\t\tbody: {\n\t\t\t\turl,\n\t\t\t\tredirect: true,\n\t\t\t},\n\t\t};\n\t}\n\tif (provider.type === \"custom\") {\n\t\tif (!provider.signIn) {\n\t\t\tthrow new ProviderError(\"Sign in method not implemented\");\n\t\t}\n\t\tconst response = await provider.signIn(context);\n\t\treturn response;\n\t}\n\tthrow new ProviderError(\"Invalid provider type\");\n};\n\nexport const signInHandler = withPlugins(signIn);\n","import { deleteSessionCooke } from \"../cookies\";\nimport { withPlugins } from \"../plugins/utils\";\nimport type { Context } from \"./types\";\n\nexport type SignOutContext = Context;\n\nexport const signOut = async (context: SignOutContext) => {\n\tconst session = context.request.cookies.get(\n\t\tcontext.cookies.sessionToken.name,\n\t);\n\tdeleteSessionCooke(context);\n\tif (session) {\n\t\ttry {\n\t\t\tawait context.adapter.deleteSession(session, context);\n\t\t} catch (e) {}\n\t}\n\treturn {\n\t\tstatus: 200,\n\t};\n};\n\nexport const signOutHandler = withPlugins(signOut);\n","import { ProviderError, ProviderMissing } from \"@better-auth/shared/error\";\nimport { z } from \"zod\";\nimport { parseUser } from \"../adapters/utils\";\nimport { signInOAuth } from \"../oauth2/signin\";\nimport { withPlugins } from \"../plugins/utils\";\nimport { getProvider } from \"../providers/utils\";\nimport type { Context } from \"./types\";\n\nconst signUpSchema = z.object({\n\tdata: z.record(z.string(), z.any()).optional(),\n\tprovider: z.string(),\n\tcurrentURL: z.string(),\n\tcallbackURL: z.string().optional(),\n\tautoCreateSession: z.boolean().optional(),\n});\n\nexport type SignUpContext = Context<z.infer<typeof signUpSchema>>;\n\nexport const signUp = async (context: SignUpContext) => {\n\tconst data = signUpSchema.parse(context.request.body);\n\n\tconst provider = getProvider(context, data.provider);\n\tif (!provider) {\n\t\tthrow new ProviderMissing(data.provider);\n\t}\n\tif (provider?.type === \"oauth\" || provider?.type === \"oidc\") {\n\t\t// @ts-expect-error - sign up should be added to the request body\n\t\tcontext.request.body.signUp = context.request.body.data;\n\t\tconst url = await signInOAuth(context, provider, {\n\t\t\tautoCreateSession: data.autoCreateSession ?? true,\n\t\t\tonlySignUp: true,\n\t\t});\n\t\treturn {\n\t\t\tstatus: 200,\n\t\t\tbody: {\n\t\t\t\turl,\n\t\t\t\tredirect: true,\n\t\t\t},\n\t\t};\n\t}\n\n\tif (!provider.signUp) {\n\t\tthrow new ProviderError(\"Sign up method not implemented\");\n\t}\n\n\treturn await provider.signUp(context);\n};\n\nexport const signUpHandler = withPlugins(signUp);\n","import { type IncomingHttpHeaders, IncomingMessage } from \"node:http\";\nimport { InvalidRequest, InvalidURL } from \"@better-auth/shared/error\";\nimport { z } from \"zod\";\nimport type { BetterAuthOptions } from \"../options\";\n\nexport async function getBody<T>(request: IncomingMessage | Request) {\n\ttry {\n\t\tif (request instanceof Request) return await request.json();\n\t\treturn new Promise<T>((resolve) => {\n\t\t\tconst bodyParts: any[] = [];\n\t\t\tlet body: string;\n\t\t\trequest\n\t\t\t\t.on(\"data\", (chunk) => {\n\t\t\t\t\tbodyParts.push(chunk);\n\t\t\t\t})\n\t\t\t\t.on(\"end\", () => {\n\t\t\t\t\tbody = Buffer.concat(bodyParts).toString();\n\t\t\t\t\tresolve(JSON.parse(body));\n\t\t\t\t});\n\t\t});\n\t} catch {\n\t\tthrow new InvalidRequest();\n\t}\n}\n\nexport const toRequestHeader = (\n\tincomingHeaders: IncomingHttpHeaders | Headers,\n): Headers => {\n\tif (incomingHeaders instanceof Headers) return incomingHeaders;\n\tconst headers = new Headers();\n\tfor (const [key, value] of Object.entries(incomingHeaders)) {\n\t\tif (Array.isArray(value)) {\n\t\t\tfor (const val of value) {\n\t\t\t\theaders.append(key, val);\n\t\t\t}\n\t\t} else if (value) {\n\t\t\theaders.append(key, value);\n\t\t}\n\t}\n\treturn headers;\n};\nfunction getUrl(request: IncomingMessage | Request) {\n\tconst url =\n\t\trequest instanceof IncomingMessage\n\t\t\t? `${request.headers.host}${(request as any).originalUrl}`\n\t\t\t: request.url;\n\treturn new URL(url);\n}\n\nexport function isValidHttpMethod(method?: string) {\n\tif (method?.toUpperCase() !== \"POST\" && method?.toUpperCase() !== \"GET\") {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nexport type InternalURL = {\n\torigin: string;\n\thost: string;\n\tpath: string;\n\tbase: string;\n\ttoString: () => string;\n};\nexport function parseUrl(\n\trequest: IncomingMessage | Request,\n\toptions: BetterAuthOptions,\n) {\n\tlet requestStringURL =\n\t\trequest instanceof IncomingMessage\n\t\t\t? `${request.headers.host}${request.url}`\n\t\t\t: request.url;\n\tif (!requestStringURL.startsWith(\"http\")) {\n\t\tif (requestStringURL.startsWith(\"localhost\")) {\n\t\t\trequestStringURL = `http://${requestStringURL}`;\n\t\t} else {\n\t\t\trequestStringURL = `https://${requestStringURL}`;\n\t\t}\n\t}\n\tconst requestURL = new URL(requestStringURL);\n\tconst baseURL = requestURL.origin;\n\tconst basePath = options.basePath || \"/api/auth\";\n\tlet urlString = `${baseURL}${basePath}`;\n\tif (!urlString.startsWith(\"http\")) {\n\t\turlString = `https://${urlString}`;\n\t}\n\tconst isValidURL = z.string().url().safeParse(urlString);\n\tlet action = requestURL.pathname.split(basePath)[1] || \"\";\n\t//replace the first / in the action\n\taction = action.replace(\"/\", \"\");\n\tif (isValidURL.error) {\n\t\tthrow new InvalidURL();\n\t}\n\t/**\n\t * If the action is a callback, we need to extract the\n\t * provider form the URL.\n\t */\n\tif (action.startsWith(\"callback\")) {\n\t\tconst provider = action.split(\"/\")[1];\n\t\tif (!provider) throw new InvalidURL(\"Provider is missing in the URL.\");\n\t\taction = \"callback\";\n\t\trequestURL.searchParams.set(\"provider\", provider);\n\t}\n\tconst url = new URL(urlString);\n\trequestURL.searchParams.forEach((value, key) => {\n\t\turl.searchParams.set(key, value);\n\t});\n\treturn {\n\t\turl,\n\t\taction,\n\t};\n}\n\nexport function isAuthPath(url: string, options: BetterAuthOptions) {\n\tconst _url = new URL(url);\n\tconst baseURL = new URL(options.baseURL || _url.origin);\n\tconst basePath = options.basePath || \"/api/auth\";\n\tif (_url.origin !== baseURL.origin) return false;\n\tif (!_url.pathname.startsWith(basePath)) return false;\n\treturn true;\n}\n","import { MissingSecret } from \"@better-auth/shared/error\";\n\nexport const DEFAULT_SECRET = \"better-auth-secret-key-123456789\";\nexport const getSecret = (secret?: string) => {\n\tsecret = secret || process.env.BETTER_AUTH_SECRET || process.env.AUTH_SECRET;\n\tif (process.env.NODE_ENV === \"production\" && !secret) {\n\t\tthrow new MissingSecret();\n\t}\n\treturn secret || DEFAULT_SECRET;\n};\n","import type { IncomingMessage } from \"node:http\";\nimport { getActions } from \"./actions\";\nimport { createInternalAdapter } from \"./adapters\";\nimport { getSelectFields, toInternalFields } from \"./adapters/utils\";\nimport { type CookieManager, cookieManager } from \"./cookies\";\nimport { getCookies } from \"./cookies/cookies\";\nimport type { BetterAuthOptions } from \"./options\";\nimport type { BetterAuthPlugin } from \"./plugins\";\nimport { getPlugins } from \"./plugins/utils\";\nimport { router } from \"./routes\";\nimport type { Context, InternalResponse } from \"./routes/types\";\nimport {\n\tgetBody,\n\tisValidHttpMethod,\n\tparseUrl,\n\ttoRequestHeader,\n} from \"./utils/request\";\nimport { getSecret } from \"./utils/secret\";\nimport { timeSpan } from \"./utils/time\";\nimport type { UnionToIntersection } from \"./utils/types\";\n\nexport interface HandlerOptions<R = any> {\n\tcookieManager?: CookieManager;\n\ttoResponse?: (res: InternalResponse, context: Context) => R;\n}\n\nexport const betterAuth = <O extends BetterAuthOptions>(options: O) => {\n\tconst defaultActions = getActions(options);\n\ttype Actions = O[\"plugins\"] extends Array<BetterAuthPlugin>\n\t\t? UnionToIntersection<\n\t\t\t\tReturnType<\n\t\t\t\t\tO[\"plugins\"][number] extends { getActions: Function }\n\t\t\t\t\t\t? O[\"plugins\"][number][\"getActions\"]\n\t\t\t\t\t\t: never\n\t\t\t\t>\n\t\t\t>\n\t\t: {};\n\tconst auth = {\n\t\t/**\n\t\t * The handler for the better auth routes.\n\t\t */\n\t\thandler: async <R = Response>(\n\t\t\trequest: Request | IncomingMessage,\n\t\t\topts?: HandlerOptions<R>,\n\t\t): Promise<R> => {\n\t\t\tconst context = await toContext(options, request, opts);\n\t\t\tif (!isValidHttpMethod(request.method)) {\n\t\t\t\treturn toResponse({ status: 200 }, context, opts);\n\t\t\t}\n\t\t\tconst response = await router(context);\n\t\t\treturn toResponse(response, context, opts);\n\t\t},\n\t\tcaller: {\n\t\t\t...defaultActions,\n\t\t\t...options.plugins?.map((plugin) => plugin.getActions?.(options)),\n\t\t} as typeof defaultActions & Actions,\n\t\toptions,\n\t};\n\n\treturn auth;\n};\n\nexport const toContext = async (\n\toptions: BetterAuthOptions,\n\trequest: Request | IncomingMessage,\n\thandlerOptions?: HandlerOptions,\n): Promise<Context> => {\n\tconst basePath = options.basePath || \"/api/auth\";\n\tconst headers = toRequestHeader(request.headers);\n\tconst { url, action } = parseUrl(request, options);\n\tconst body =\n\t\trequest.method?.toUpperCase() === \"POST\" ? await getBody(request) : null;\n\treturn {\n\t\tbaseURL: url.origin,\n\t\tbasePath,\n\t\trequest: {\n\t\t\tmethod: request.method as string,\n\t\t\turl,\n\t\t\tquery: Object.fromEntries(url.searchParams),\n\t\t\taction,\n\t\t\tbody,\n\t\t\theaders: headers,\n\t\t\tcookies: handlerOptions?.cookieManager || cookieManager(headers),\n\t\t},\n\t\t_db: options.adapter,\n\t\tproviders: options.providers,\n\t\tsecret: getSecret(options.secret),\n\t\tadapter: createInternalAdapter(options.adapter),\n\t\tplugins: getPlugins(options),\n\t\tcookies: getCookies(options),\n\t\tdisableCSRF: options.advanced?.skipCSRFCheck || false,\n\t\tsession: {\n\t\t\tmodelName: options.session?.modelName || \"session\",\n\t\t\tupdateAge:\n\t\t\t\toptions.session?.updateAge === undefined\n\t\t\t\t\t? timeSpan(\"1d\")\n\t\t\t\t\t: options.session.updateAge,\n\t\t\texpiresIn: options.session?.expiresIn || timeSpan(\"1w\"),\n\t\t\tadditionalFields: options.session?.additionalFields\n\t\t\t\t? toInternalFields(options.session.additionalFields)\n\t\t\t\t: {},\n\t\t\tselectFields: getSelectFields(\n\t\t\t\toptions.session?.additionalFields || {},\n\t\t\t\t\"session\",\n\t\t\t),\n\t\t},\n\t\tuser: {\n\t\t\tmodelName: options.user?.modelName || \"user\",\n\t\t\tfields: options.user?.fields ? toInternalFields(options.user.fields) : {},\n\t\t\tselectFields: getSelectFields(options.user?.fields || {}, \"user\"),\n\t\t},\n\t\taccount: {\n\t\t\tmodelName: options.account?.modelName || \"account\",\n\t\t\tadditionalFields: options.account?.additionalFields || {},\n\t\t\tselectFields: [\n\t\t\t\t...Object.keys(options.account?.additionalFields || {}),\n\t\t\t\t\"userId\",\n\t\t\t\t\"providerId\",\n\t\t\t\t\"accountId\",\n\t\t\t],\n\t\t},\n\t\tsessionAdapter: options.sessionAdapter,\n\t};\n};\n\nexport const toResponse = (\n\tres: InternalResponse,\n\tcontext: Context,\n\thandlerOptions?: HandlerOptions,\n) => {\n\tif (handlerOptions?.toResponse) {\n\t\treturn handlerOptions.toResponse(res, context);\n\t}\n\tcontext.request.headers.set(\"content-type\", \"application/json\");\n\tconst response = new Response(res.body ? JSON.stringify(res.body) : null, {\n\t\theaders: {\n\t\t\t...context.request.headers,\n\t\t\t\"Set-Cookie\": context.request.headers.get(\"Set-Cookie\") ?? \"\",\n\t\t\t...res.headers,\n\t\t},\n\t\tstatus: res.status,\n\t\tstatusText: res.statusText,\n\t});\n\treturn response;\n};\n\nexport type BetterAuthHandler = ReturnType<typeof betterAuth>[\"handler\"];\nexport type BetterAuth = ReturnType<typeof betterAuth>;\n","import { type HandlerOptions, toContext, toResponse } from \"..\";\nimport type { BetterAuthOptions } from \"../options\";\nimport { getServerSession } from \"../routes/session\";\nimport { signInHandler } from \"../routes/signin\";\nimport { signOutHandler } from \"../routes/signout\";\nimport type { InferProviderSignin, InferSession } from \"./types\";\n\nconst wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport function getActions<O extends BetterAuthOptions>(\n\toptions: O,\n\thandlerOptions?: HandlerOptions,\n) {\n\tconst actions = {\n\t\t/**\n\t\t * Sign in with a provider. This action will return response object. If\n\t\t * it's oauth, it will redirect to the provider. If it's custom, it\n\t\t * will return the response object and it'll set the cookies.\n\t\t *\n\t\t * ► In most cases you should just be using\n\t\t * client sdk for sign in instead unless you\n\t\t * have a good reason to use this.\n\t\t */\n\t\tsignIn: async <\n\t\t\tT extends InferProviderSignin<O[\"providers\"]>,\n\t\t\tK extends keyof T,\n\t\t>(\n\t\t\trequest: Request | Headers,\n\t\t\tinput: {\n\t\t\t\tprovider: K;\n\t\t\t\tdata?: T[K][\"input\"];\n\t\t\t},\n\t\t) => {\n\t\t\tconst url =\n\t\t\t\trequest instanceof Headers\n\t\t\t\t\t? (request.get(\"referer\") as string)\n\t\t\t\t\t: request.url;\n\t\t\tconst req = new Request(url, {\n\t\t\t\tbody: JSON.stringify(input),\n\t\t\t\tmethod: \"POST\",\n\t\t\t});\n\t\t\tconst context = await toContext(options, req);\n\t\t\tcontext.disableCSRF = true;\n\t\t\tcontext.request.body = {\n\t\t\t\tcurrentURL: url,\n\t\t\t\tprovider: input.provider,\n\t\t\t};\n\t\t\tconst response = await signInHandler(context);\n\t\t\tif (response.body.redirect) {\n\t\t\t\treturn toResponse(\n\t\t\t\t\t{\n\t\t\t\t\t\tstatus: 302,\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\tLocation: response.body.url,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tcontext,\n\t\t\t\t) as Response;\n\t\t\t}\n\t\t\treturn toResponse(response, context, handlerOptions) as Response;\n\t\t},\n\t\t/**\n\t\t * Get the current logged in user session.\n\t\t */\n\t\tgetSession: async (request: Request | Headers) => {\n\t\t\t/**\n\t\t\t * If the request is a Headers object, we'll get the referer or origin from the headers.\n\t\t\t * If we fail to get the referer or origin, we'll default to \"http://localhost\".\n\t\t\t */\n\t\t\tconst url =\n\t\t\t\trequest instanceof Headers\n\t\t\t\t\t? (request.get(\"referer\") as string) ||\n\t\t\t\t\t\t(request.get(\"x-forwarded-host\") as string) ||\n\t\t\t\t\t\t\"http://localhost\"\n\t\t\t\t\t: request.url;\n\t\t\tconst req =\n\t\t\t\trequest instanceof Request\n\t\t\t\t\t? request\n\t\t\t\t\t: new Request(url, {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: JSON.stringify({}),\n\t\t\t\t\t\t\theaders: request,\n\t\t\t\t\t\t});\n\t\t\tconst context = await toContext(options, req);\n\t\t\tcontext.disableCSRF = true;\n\t\t\tconst response = await getServerSession(context);\n\t\t\treturn response as InferSession<O>;\n\t\t},\n\t\t/**\n\t\t * Signout the current user.\n\t\t * Delete the session and clear the cookies.\n\t\t */\n\t\tsignOut: async (request: Request | Headers): Promise<Response> => {\n\t\t\tconst url =\n\t\t\t\trequest instanceof Headers\n\t\t\t\t\t? (request.get(\"referer\") as string)\n\t\t\t\t\t: request.url;\n\t\t\tconst req =\n\t\t\t\trequest instanceof Request\n\t\t\t\t\t? request\n\t\t\t\t\t: new Request(url, {\n\t\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\t\tbody: JSON.stringify({}),\n\t\t\t\t\t\t\theaders: request,\n\t\t\t\t\t\t});\n\t\t\tconst context = await toContext(options, req);\n\t\t\tcontext.disableCSRF = true;\n\t\t\tconst response = await signOutHandler(context);\n\t\t\treturn toResponse(response, context, handlerOptions);\n\t\t},\n\t};\n\treturn actions;\n}\n\nexport * from \"./types\";\n"],"mappings":"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","names":["session","context","z","signUp","base64url","base64url","provider","z","currentURL","session","session","z","z","session","z","z","z","z"]}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { A as Adapter } from '../types-DAxaMWCy.js';
|
|
2
|
-
import 'zod';
|
|
3
|
-
|
|
4
|
-
interface DrizzleAdapterOptions<T extends Record<string, any> = Record<string, any>> {
|
|
5
|
-
db: T;
|
|
6
|
-
schema: Record<string, any>;
|
|
7
|
-
}
|
|
8
|
-
declare const drizzleAdapter: ({ db, schema, }: DrizzleAdapterOptions) => Adapter;
|
|
9
|
-
|
|
10
|
-
export { type DrizzleAdapterOptions, drizzleAdapter };
|