better-auth 1.5.5 → 1.5.6
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/api/index.d.mts +6 -10
- package/dist/api/index.mjs +19 -4
- package/dist/api/index.mjs.map +1 -1
- package/dist/api/middlewares/origin-check.mjs +17 -8
- package/dist/api/middlewares/origin-check.mjs.map +1 -1
- package/dist/api/routes/account.d.mts +1 -1
- package/dist/api/routes/email-verification.d.mts +0 -1
- package/dist/api/routes/session.d.mts +0 -1
- package/dist/api/routes/sign-in.d.mts +2 -2
- package/dist/api/routes/sign-up.d.mts +0 -1
- package/dist/api/routes/update-session.d.mts +0 -1
- package/dist/api/routes/update-user.d.mts +0 -1
- package/dist/api/to-auth-endpoints.mjs +49 -12
- package/dist/api/to-auth-endpoints.mjs.map +1 -1
- package/dist/auth/full.d.mts +0 -1
- package/dist/auth/minimal.d.mts +0 -1
- package/dist/client/index.d.mts +0 -2
- package/dist/client/path-to-object.d.mts +3 -1
- package/dist/client/session-refresh.d.mts +0 -1
- package/dist/client/session-refresh.mjs +12 -4
- package/dist/client/session-refresh.mjs.map +1 -1
- package/dist/client/types.d.mts +0 -1
- package/dist/context/create-context.mjs +4 -1
- package/dist/context/create-context.mjs.map +1 -1
- package/dist/context/helpers.mjs +10 -4
- package/dist/context/helpers.mjs.map +1 -1
- package/dist/cookies/index.d.mts +0 -1
- package/dist/cookies/session-store.d.mts +0 -2
- package/dist/db/index.d.mts +2 -2
- package/dist/db/internal-adapter.d.mts +2 -1
- package/dist/db/internal-adapter.mjs +1 -1
- package/dist/db/internal-adapter.mjs.map +1 -1
- package/dist/db/schema.d.mts +0 -1
- package/dist/db/with-hooks.d.mts +6 -2
- package/dist/db/with-hooks.mjs +72 -31
- package/dist/db/with-hooks.mjs.map +1 -1
- package/dist/index.d.mts +0 -2
- package/dist/integrations/node.d.mts +0 -1
- package/dist/oauth2/link-account.d.mts +0 -1
- package/dist/plugins/admin/access/statement.d.mts +0 -2
- package/dist/plugins/admin/admin.d.mts +0 -1
- package/dist/plugins/admin/client.d.mts +0 -2
- package/dist/plugins/admin/types.d.mts +0 -2
- package/dist/plugins/anonymous/types.d.mts +0 -1
- package/dist/plugins/email-otp/index.mjs +2 -1
- package/dist/plugins/email-otp/index.mjs.map +1 -1
- package/dist/plugins/email-otp/otp-token.mjs +31 -2
- package/dist/plugins/email-otp/otp-token.mjs.map +1 -1
- package/dist/plugins/email-otp/routes.mjs +60 -59
- package/dist/plugins/email-otp/routes.mjs.map +1 -1
- package/dist/plugins/email-otp/types.d.mts +12 -0
- package/dist/plugins/email-otp/utils.mjs +4 -1
- package/dist/plugins/email-otp/utils.mjs.map +1 -1
- package/dist/plugins/generic-oauth/client.d.mts +0 -1
- package/dist/plugins/generic-oauth/index.d.mts +0 -1
- package/dist/plugins/index.d.mts +0 -3
- package/dist/plugins/jwt/types.d.mts +0 -1
- package/dist/plugins/magic-link/index.d.mts +2 -0
- package/dist/plugins/magic-link/index.mjs +5 -3
- package/dist/plugins/magic-link/index.mjs.map +1 -1
- package/dist/plugins/mcp/index.d.mts +0 -1
- package/dist/plugins/oidc-provider/index.d.mts +0 -1
- package/dist/plugins/oidc-provider/types.d.mts +0 -1
- package/dist/plugins/one-time-token/index.d.mts +0 -1
- package/dist/plugins/organization/access/statement.d.mts +0 -2
- package/dist/plugins/organization/adapter.d.mts +0 -2
- package/dist/plugins/organization/adapter.mjs +2 -2
- package/dist/plugins/organization/adapter.mjs.map +1 -1
- package/dist/plugins/organization/client.d.mts +0 -5
- package/dist/plugins/organization/organization.d.mts +0 -2
- package/dist/plugins/organization/permission.d.mts +0 -1
- package/dist/plugins/organization/routes/crud-access-control.d.mts +0 -2
- package/dist/plugins/organization/routes/crud-invites.d.mts +0 -3
- package/dist/plugins/organization/routes/crud-members.d.mts +0 -3
- package/dist/plugins/organization/routes/crud-org.d.mts +0 -3
- package/dist/plugins/organization/routes/crud-team.d.mts +2 -3
- package/dist/plugins/organization/routes/crud-team.mjs +18 -14
- package/dist/plugins/organization/routes/crud-team.mjs.map +1 -1
- package/dist/plugins/organization/schema.d.mts +0 -1
- package/dist/plugins/organization/types.d.mts +0 -2
- package/dist/plugins/phone-number/types.d.mts +0 -1
- package/dist/plugins/siwe/index.d.mts +0 -1
- package/dist/plugins/test-utils/types.d.mts +0 -2
- package/dist/plugins/two-factor/client.d.mts +7 -0
- package/dist/plugins/two-factor/client.mjs +5 -1
- package/dist/plugins/two-factor/client.mjs.map +1 -1
- package/dist/plugins/two-factor/types.d.mts +0 -1
- package/dist/test-utils/test-instance.d.mts +18 -22
- package/dist/types/index.d.mts +0 -1
- package/package.json +13 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal-adapter.mjs","names":[],"sources":["../../src/db/internal-adapter.ts"],"sourcesContent":["import type {\n\tAuthContext,\n\tBetterAuthOptions,\n\tInternalAdapter,\n} from \"@better-auth/core\";\nimport {\n\tgetCurrentAdapter,\n\tgetCurrentAuthContext,\n\trunWithTransaction,\n} from \"@better-auth/core/context\";\nimport type { DBAdapter, Where } from \"@better-auth/core/db/adapter\";\nimport type { InternalLogger } from \"@better-auth/core/env\";\nimport { generateId } from \"@better-auth/core/utils/id\";\nimport { safeJSONParse } from \"@better-auth/core/utils/json\";\nimport type { Account, Session, User, Verification } from \"../types\";\nimport { getDate } from \"../utils/date\";\nimport { getIp } from \"../utils/get-request-ip\";\nimport {\n\tgetSessionDefaultFields,\n\tparseSessionOutput,\n\tparseUserOutput,\n} from \"./schema\";\nimport {\n\tgetStorageOption,\n\tprocessIdentifier,\n} from \"./verification-token-storage\";\nimport { getWithHooks } from \"./with-hooks\";\n\nfunction getTTLSeconds(expiresAt: Date | number, now = Date.now()): number {\n\tconst expiresMs =\n\t\ttypeof expiresAt === \"number\" ? expiresAt : expiresAt.getTime();\n\treturn Math.max(Math.floor((expiresMs - now) / 1000), 0);\n}\n\nexport const createInternalAdapter = (\n\tadapter: DBAdapter<BetterAuthOptions>,\n\tctx: {\n\t\toptions: Omit<BetterAuthOptions, \"logger\">;\n\t\tlogger: InternalLogger;\n\t\thooks: Exclude<BetterAuthOptions[\"databaseHooks\"], undefined>[];\n\t\tgenerateId: AuthContext[\"generateId\"];\n\t},\n): InternalAdapter => {\n\tconst logger = ctx.logger;\n\tconst options = ctx.options;\n\tconst secondaryStorage = options.secondaryStorage;\n\tconst sessionExpiration = options.session?.expiresIn || 60 * 60 * 24 * 7; // 7 days\n\tconst {\n\t\tcreateWithHooks,\n\t\tupdateWithHooks,\n\t\tupdateManyWithHooks,\n\t\tdeleteWithHooks,\n\t\tdeleteManyWithHooks,\n\t} = getWithHooks(adapter, ctx);\n\n\tasync function refreshUserSessions(user: User) {\n\t\tif (!secondaryStorage) return;\n\n\t\tconst listRaw = await secondaryStorage.get(`active-sessions-${user.id}`);\n\t\tif (!listRaw) return;\n\n\t\tconst now = Date.now();\n\t\tconst list =\n\t\t\tsafeJSONParse<{ token: string; expiresAt: number }[]>(listRaw) || [];\n\t\tconst validSessions = list.filter((s) => s.expiresAt > now);\n\n\t\tawait Promise.all(\n\t\t\tvalidSessions.map(async ({ token }) => {\n\t\t\t\tconst cached = await secondaryStorage.get(token);\n\t\t\t\tif (!cached) return;\n\t\t\t\tconst parsed = safeJSONParse<{ session: Session; user: User }>(cached);\n\t\t\t\tif (!parsed) return;\n\n\t\t\t\tconst sessionTTL = getTTLSeconds(parsed.session.expiresAt, now);\n\n\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\ttoken,\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\tsession: parsed.session,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t}),\n\t\t\t\t\tMath.floor(sessionTTL),\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n\n\treturn {\n\t\tcreateOAuthUser: async (\n\t\t\tuser: Omit<User, \"id\" | \"createdAt\" | \"updatedAt\">,\n\t\t\taccount: Omit<Account, \"userId\" | \"id\" | \"createdAt\" | \"updatedAt\"> &\n\t\t\t\tPartial<Account>,\n\t\t) => {\n\t\t\treturn runWithTransaction(adapter, async () => {\n\t\t\t\tconst createdUser = await createWithHooks(\n\t\t\t\t\t{\n\t\t\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t\t...user,\n\t\t\t\t\t},\n\t\t\t\t\t\"user\",\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tconst createdAccount = await createWithHooks(\n\t\t\t\t\t{\n\t\t\t\t\t\t...account,\n\t\t\t\t\t\tuserId: createdUser!.id,\n\t\t\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t},\n\t\t\t\t\t\"account\",\n\t\t\t\t\tundefined,\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});\n\t\t},\n\t\tcreateUser: async <T>(\n\t\t\tuser: Omit<User, \"id\" | \"createdAt\" | \"updatedAt\" | \"emailVerified\"> &\n\t\t\t\tPartial<User> &\n\t\t\t\tRecord<string, any>,\n\t\t) => {\n\t\t\tconst createdUser = await createWithHooks(\n\t\t\t\t{\n\t\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t...user,\n\t\t\t\t\temail: user.email?.toLowerCase(),\n\t\t\t\t},\n\t\t\t\t\"user\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\treturn createdUser as T & User;\n\t\t},\n\t\tcreateAccount: async <T extends Record<string, any>>(\n\t\t\taccount: Omit<Account, \"id\" | \"createdAt\" | \"updatedAt\"> &\n\t\t\t\tPartial<Account> &\n\t\t\t\tT,\n\t\t) => {\n\t\t\tconst createdAccount = await createWithHooks(\n\t\t\t\t{\n\t\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t...account,\n\t\t\t\t},\n\t\t\t\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\treturn createdAccount as T & Account;\n\t\t},\n\t\tlistSessions: async (\n\t\t\tuserId: string,\n\t\t\toptions?: { onlyActiveSessions?: boolean | undefined } | undefined,\n\t\t) => {\n\t\t\tif (secondaryStorage) {\n\t\t\t\tconst currentList = await secondaryStorage.get(\n\t\t\t\t\t`active-sessions-${userId}`,\n\t\t\t\t);\n\t\t\t\tif (!currentList) return [];\n\n\t\t\t\tconst list: { token: string; expiresAt: number }[] =\n\t\t\t\t\tsafeJSONParse(currentList) || [];\n\t\t\t\tconst now = Date.now();\n\n\t\t\t\tconst seenTokens = new Set<string>();\n\t\t\t\tconst sessions: Session[] = [];\n\n\t\t\t\tfor (const { token, expiresAt } of list) {\n\t\t\t\t\tif (expiresAt <= now || seenTokens.has(token)) continue;\n\t\t\t\t\tseenTokens.add(token);\n\n\t\t\t\t\tconst data = await secondaryStorage.get(token);\n\t\t\t\t\tif (!data) continue;\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst parsed = (\n\t\t\t\t\t\t\ttypeof data === \"string\" ? JSON.parse(data) : data\n\t\t\t\t\t\t) as {\n\t\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\t\tuser: User;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (!parsed?.session) continue;\n\n\t\t\t\t\t\tsessions.push(\n\t\t\t\t\t\t\tparseSessionOutput(ctx.options, {\n\t\t\t\t\t\t\t\t...parsed.session,\n\t\t\t\t\t\t\t\texpiresAt: new Date(parsed.session.expiresAt),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn sessions;\n\t\t\t}\n\n\t\t\tconst sessions = await (\n\t\t\t\tawait getCurrentAdapter(adapter)\n\t\t\t).findMany<Session>({\n\t\t\t\tmodel: \"session\",\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\t...(options?.onlyActiveSessions\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfield: \"expiresAt\",\n\t\t\t\t\t\t\t\t\tvalue: new Date(),\n\t\t\t\t\t\t\t\t\toperator: \"gt\",\n\t\t\t\t\t\t\t\t} satisfies Where,\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: []),\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn sessions;\n\t\t},\n\t\tlistUsers: async (\n\t\t\tlimit?: number | undefined,\n\t\t\toffset?: number | undefined,\n\t\t\tsortBy?:\n\t\t\t\t| {\n\t\t\t\t\t\tfield: string;\n\t\t\t\t\t\tdirection: \"asc\" | \"desc\";\n\t\t\t\t }\n\t\t\t\t| undefined,\n\t\t\twhere?: Where[] | undefined,\n\t\t) => {\n\t\t\tconst users = await (await getCurrentAdapter(adapter)).findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\tsortBy,\n\t\t\t\twhere,\n\t\t\t});\n\t\t\treturn users;\n\t\t},\n\t\tcountTotalUsers: async (where?: Where[] | undefined) => {\n\t\t\tconst total = await (await getCurrentAdapter(adapter)).count({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere,\n\t\t\t});\n\t\t\tif (typeof total === \"string\") {\n\t\t\t\treturn parseInt(total);\n\t\t\t}\n\t\t\treturn total;\n\t\t},\n\t\tdeleteUser: async (userId: string) => {\n\t\t\tif (!secondaryStorage || options.session?.storeSessionInDatabase) {\n\t\t\t\tawait deleteManyWithHooks(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t\"session\",\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait deleteManyWithHooks(\n\t\t\t\t[\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\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tawait deleteWithHooks(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"user\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t},\n\t\tcreateSession: async (\n\t\t\tuserId: string,\n\t\t\tdontRememberMe?: boolean | undefined,\n\t\t\toverride?: (Partial<Session> & Record<string, any>) | undefined,\n\t\t\toverrideAll?: boolean | undefined,\n\t\t) => {\n\t\t\tconst headers: Headers | undefined = await (async () => {\n\t\t\t\tconst ctx = await getCurrentAuthContext().catch(() => null);\n\t\t\t\treturn ctx?.headers || ctx?.request?.headers;\n\t\t\t})();\n\t\t\tconst storeInDb = options.session?.storeSessionInDatabase;\n\t\t\tconst {\n\t\t\t\t// always ignore override id - new sessions must have new ids\n\t\t\t\tid: _,\n\t\t\t\t...rest\n\t\t\t} = override || {};\n\n\t\t\t// we're parsing default values for session additional fields\n\t\t\tconst defaultAdditionalFields = getSessionDefaultFields(options);\n\t\t\tconst data = {\n\t\t\t\tipAddress: headers ? getIp(headers, options) || \"\" : \"\",\n\t\t\t\tuserAgent: headers?.get(\"user-agent\") || \"\",\n\t\t\t\t...rest,\n\t\t\t\t/**\n\t\t\t\t * If the user doesn't want to be remembered\n\t\t\t\t * set the session to expire in 1 day.\n\t\t\t\t * The cookie will be set to expire at the end of the session\n\t\t\t\t */\n\t\t\t\texpiresAt: dontRememberMe\n\t\t\t\t\t? getDate(60 * 60 * 24, \"sec\") // 1 day\n\t\t\t\t\t: getDate(sessionExpiration, \"sec\"),\n\t\t\t\tuserId,\n\t\t\t\ttoken: generateId(32),\n\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t...defaultAdditionalFields,\n\t\t\t\t...(overrideAll ? rest : {}),\n\t\t\t} satisfies Partial<Session>;\n\t\t\tconst res = await createWithHooks(\n\t\t\t\tdata,\n\t\t\t\t\"session\",\n\t\t\t\tsecondaryStorage\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tfn: async (sessionData) => {\n\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t * store the session token for the user\n\t\t\t\t\t\t\t\t * so we can retrieve it later for listing sessions\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\tconst currentList = await secondaryStorage.get(\n\t\t\t\t\t\t\t\t\t`active-sessions-${userId}`,\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tlet list: { token: string; expiresAt: number }[] = [];\n\t\t\t\t\t\t\t\tconst now = Date.now();\n\n\t\t\t\t\t\t\t\tif (currentList) {\n\t\t\t\t\t\t\t\t\tlist = safeJSONParse(currentList) || [];\n\t\t\t\t\t\t\t\t\tlist = list.filter(\n\t\t\t\t\t\t\t\t\t\t(session) =>\n\t\t\t\t\t\t\t\t\t\t\tsession.expiresAt > now && session.token !== data.token,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst sorted = [\n\t\t\t\t\t\t\t\t\t...list,\n\t\t\t\t\t\t\t\t\t{ token: data.token, expiresAt: data.expiresAt.getTime() },\n\t\t\t\t\t\t\t\t].sort((a, b) => a.expiresAt - b.expiresAt);\n\t\t\t\t\t\t\t\tconst furthestSessionExp =\n\t\t\t\t\t\t\t\t\tsorted.at(-1)?.expiresAt ?? data.expiresAt.getTime();\n\t\t\t\t\t\t\t\tconst furthestSessionTTL = getTTLSeconds(\n\t\t\t\t\t\t\t\t\tfurthestSessionExp,\n\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (furthestSessionTTL > 0) {\n\t\t\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t\t\t`active-sessions-${userId}`,\n\t\t\t\t\t\t\t\t\t\tJSON.stringify(sorted),\n\t\t\t\t\t\t\t\t\t\tfurthestSessionTTL,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst user = await (\n\t\t\t\t\t\t\t\t\tawait getCurrentAdapter(adapter)\n\t\t\t\t\t\t\t\t).findOne<User>({\n\t\t\t\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tconst sessionTTL = getTTLSeconds(data.expiresAt, now);\n\t\t\t\t\t\t\t\tif (sessionTTL > 0) {\n\t\t\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t\t\tdata.token,\n\t\t\t\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\t\t\t\tsession: sessionData,\n\t\t\t\t\t\t\t\t\t\t\tuser,\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\tsessionTTL,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn sessionData;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\texecuteMainFn: storeInDb,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t);\n\t\t\treturn res as Session;\n\t\t},\n\t\tfindSession: async (\n\t\t\ttoken: string,\n\t\t): Promise<{\n\t\t\tsession: Session & Record<string, any>;\n\t\t\tuser: User & Record<string, any>;\n\t\t} | null> => {\n\t\t\tif (secondaryStorage) {\n\t\t\t\tconst sessionStringified = await secondaryStorage.get(token);\n\t\t\t\tif (!sessionStringified && !options.session?.storeSessionInDatabase) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tif (sessionStringified) {\n\t\t\t\t\tconst s = safeJSONParse<{\n\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\tuser: User;\n\t\t\t\t\t}>(sessionStringified);\n\t\t\t\t\tif (!s) return null;\n\t\t\t\t\tconst parsedSession = parseSessionOutput(ctx.options, {\n\t\t\t\t\t\t...s.session,\n\t\t\t\t\t\texpiresAt: new Date(s.session.expiresAt),\n\t\t\t\t\t\tcreatedAt: new Date(s.session.createdAt),\n\t\t\t\t\t\tupdatedAt: new Date(s.session.updatedAt),\n\t\t\t\t\t});\n\t\t\t\t\tconst parsedUser = parseUserOutput(ctx.options, {\n\t\t\t\t\t\t...s.user,\n\t\t\t\t\t\tcreatedAt: new Date(s.user.createdAt),\n\t\t\t\t\t\tupdatedAt: new Date(s.user.updatedAt),\n\t\t\t\t\t});\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsession: parsedSession,\n\t\t\t\t\t\tuser: parsedUser,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst currentAdapter = await getCurrentAdapter(adapter);\n\t\t\tconst result = await currentAdapter.findOne<\n\t\t\t\tSession & { user: User | null }\n\t\t\t>({\n\t\t\t\tmodel: \"session\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue: token,\n\t\t\t\t\t\tfield: \"token\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tjoin: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (!result) return null;\n\n\t\t\tconst { user, ...session } = result;\n\t\t\tif (!user) return null;\n\t\t\tconst parsedSession = parseSessionOutput(ctx.options, session);\n\t\t\tconst parsedUser = parseUserOutput(ctx.options, user);\n\t\t\treturn {\n\t\t\t\tsession: parsedSession,\n\t\t\t\tuser: parsedUser,\n\t\t\t};\n\t\t},\n\t\tfindSessions: async (\n\t\t\tsessionTokens: string[],\n\t\t\toptions?:\n\t\t\t\t| {\n\t\t\t\t\t\tonlyActiveSessions?: boolean | undefined;\n\t\t\t\t }\n\t\t\t\t| undefined,\n\t\t) => {\n\t\t\tif (secondaryStorage) {\n\t\t\t\tconst sessions: {\n\t\t\t\t\tsession: Session;\n\t\t\t\t\tuser: User;\n\t\t\t\t}[] = [];\n\t\t\t\tfor (const sessionToken of sessionTokens) {\n\t\t\t\t\tconst sessionStringified = await secondaryStorage.get(sessionToken);\n\t\t\t\t\tif (sessionStringified) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst s = (\n\t\t\t\t\t\t\t\ttypeof sessionStringified === \"string\"\n\t\t\t\t\t\t\t\t\t? JSON.parse(sessionStringified)\n\t\t\t\t\t\t\t\t\t: sessionStringified\n\t\t\t\t\t\t\t) as {\n\t\t\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\t\t\tuser: User;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tif (!s) return [];\n\t\t\t\t\t\t\tconst expiresAt = new Date(s.session.expiresAt);\n\t\t\t\t\t\t\tif (options?.onlyActiveSessions && expiresAt <= new Date()) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst session = {\n\t\t\t\t\t\t\t\tsession: {\n\t\t\t\t\t\t\t\t\t...s.session,\n\t\t\t\t\t\t\t\t\texpiresAt: new Date(s.session.expiresAt),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\t\t\t...s.user,\n\t\t\t\t\t\t\t\t\tcreatedAt: new Date(s.user.createdAt),\n\t\t\t\t\t\t\t\t\tupdatedAt: new Date(s.user.updatedAt),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} as {\n\t\t\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\t\t\tuser: User;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsessions.push(session);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Skip invalid/corrupt session data\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn sessions;\n\t\t\t}\n\n\t\t\tconst sessions = await (await getCurrentAdapter(adapter)).findMany<\n\t\t\t\tSession & { user: User | null }\n\t\t\t>({\n\t\t\t\tmodel: \"session\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"token\",\n\t\t\t\t\t\tvalue: sessionTokens,\n\t\t\t\t\t\toperator: \"in\",\n\t\t\t\t\t},\n\t\t\t\t\t...(options?.onlyActiveSessions\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfield: \"expiresAt\",\n\t\t\t\t\t\t\t\t\tvalue: new Date(),\n\t\t\t\t\t\t\t\t\toperator: \"gt\",\n\t\t\t\t\t\t\t\t} satisfies Where,\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: []),\n\t\t\t\t],\n\t\t\t\tjoin: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!sessions.length) return [];\n\t\t\tif (sessions.some((session) => !session.user)) return [];\n\n\t\t\treturn sessions.map((_session) => {\n\t\t\t\tconst { user, ...session } = _session;\n\t\t\t\treturn {\n\t\t\t\t\tsession,\n\t\t\t\t\tuser: user!,\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\tupdateSession: async (\n\t\t\tsessionToken: string,\n\t\t\tsession: Partial<Session> & Record<string, any>,\n\t\t) => {\n\t\t\tconst updatedSession = await updateWithHooks<Session>(\n\t\t\t\tsession,\n\t\t\t\t[{ field: \"token\", value: sessionToken }],\n\t\t\t\t\"session\",\n\t\t\t\tsecondaryStorage\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tasync fn(data) {\n\t\t\t\t\t\t\t\tconst currentSession = await secondaryStorage.get(sessionToken);\n\t\t\t\t\t\t\t\tif (!currentSession) {\n\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst parsedSession = safeJSONParse<{\n\t\t\t\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\t\t\t\tuser: User;\n\t\t\t\t\t\t\t\t}>(currentSession);\n\t\t\t\t\t\t\t\tif (!parsedSession) return null;\n\n\t\t\t\t\t\t\t\tconst mergedSession = {\n\t\t\t\t\t\t\t\t\t...parsedSession.session,\n\t\t\t\t\t\t\t\t\t...data,\n\t\t\t\t\t\t\t\t\texpiresAt: new Date(\n\t\t\t\t\t\t\t\t\t\tdata.expiresAt ?? parsedSession.session.expiresAt,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tcreatedAt: new Date(parsedSession.session.createdAt),\n\t\t\t\t\t\t\t\t\tupdatedAt: new Date(\n\t\t\t\t\t\t\t\t\t\tdata.updatedAt ?? parsedSession.session.updatedAt,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tconst updatedSession = parseSessionOutput(\n\t\t\t\t\t\t\t\t\tctx.options,\n\t\t\t\t\t\t\t\t\tmergedSession,\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tconst now = Date.now();\n\t\t\t\t\t\t\t\tconst expiresMs = new Date(updatedSession.expiresAt).getTime();\n\t\t\t\t\t\t\t\tconst sessionTTL = getTTLSeconds(expiresMs, now);\n\n\t\t\t\t\t\t\t\tif (sessionTTL > 0) {\n\t\t\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t\t\tsessionToken,\n\t\t\t\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\t\t\t\tsession: updatedSession,\n\t\t\t\t\t\t\t\t\t\t\tuser: parsedSession.user,\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\tsessionTTL,\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\tconst listKey = `active-sessions-${updatedSession.userId}`;\n\t\t\t\t\t\t\t\t\tconst listRaw = await secondaryStorage.get(listKey);\n\t\t\t\t\t\t\t\t\tconst list: { token: string; expiresAt: number }[] = listRaw\n\t\t\t\t\t\t\t\t\t\t? safeJSONParse(listRaw) || []\n\t\t\t\t\t\t\t\t\t\t: [];\n\n\t\t\t\t\t\t\t\t\tconst filtered = list\n\t\t\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t\t\t(s) => s.token !== sessionToken && s.expiresAt > now,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t.concat([{ token: sessionToken, expiresAt: expiresMs }]);\n\n\t\t\t\t\t\t\t\t\tconst sorted = filtered.sort(\n\t\t\t\t\t\t\t\t\t\t(a, b) => a.expiresAt - b.expiresAt,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tconst furthestSessionExp = sorted.at(-1)?.expiresAt;\n\n\t\t\t\t\t\t\t\t\tif (furthestSessionExp && furthestSessionExp > now) {\n\t\t\t\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t\t\t\tlistKey,\n\t\t\t\t\t\t\t\t\t\t\tJSON.stringify(sorted),\n\t\t\t\t\t\t\t\t\t\t\tgetTTLSeconds(furthestSessionExp, now),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tawait secondaryStorage.delete(listKey);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn updatedSession;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\texecuteMainFn: options.session?.storeSessionInDatabase,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t);\n\t\t\treturn updatedSession;\n\t\t},\n\t\tdeleteSession: async (token: string) => {\n\t\t\tif (secondaryStorage) {\n\t\t\t\t// remove the session from the active sessions list\n\t\t\t\tconst data = await secondaryStorage.get(token);\n\t\t\t\tif (data) {\n\t\t\t\t\tconst { session } =\n\t\t\t\t\t\tsafeJSONParse<{\n\t\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\t\tuser: User;\n\t\t\t\t\t\t}>(data) ?? {};\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\tlogger.error(\"Session not found in secondary storage\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst userId = session.userId;\n\n\t\t\t\t\tconst currentList = await secondaryStorage.get(\n\t\t\t\t\t\t`active-sessions-${userId}`,\n\t\t\t\t\t);\n\t\t\t\t\tif (currentList) {\n\t\t\t\t\t\tconst list: { token: string; expiresAt: number }[] =\n\t\t\t\t\t\t\tsafeJSONParse(currentList) || [];\n\t\t\t\t\t\tconst now = Date.now();\n\n\t\t\t\t\t\tconst filtered = list.filter(\n\t\t\t\t\t\t\t(session) => session.expiresAt > now && session.token !== token,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst sorted = filtered.sort((a, b) => a.expiresAt - b.expiresAt);\n\t\t\t\t\t\tconst furthestSessionExp = sorted.at(-1)?.expiresAt;\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tfiltered.length > 0 &&\n\t\t\t\t\t\t\tfurthestSessionExp &&\n\t\t\t\t\t\t\tfurthestSessionExp > Date.now()\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t`active-sessions-${userId}`,\n\t\t\t\t\t\t\t\tJSON.stringify(filtered),\n\t\t\t\t\t\t\t\tgetTTLSeconds(furthestSessionExp, now),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tawait secondaryStorage.delete(`active-sessions-${userId}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.error(\"Active sessions list not found in secondary storage\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tawait secondaryStorage.delete(token);\n\n\t\t\t\tif (\n\t\t\t\t\t!options.session?.storeSessionInDatabase ||\n\t\t\t\t\tctx.options.session?.preserveSessionInDatabase\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait deleteWithHooks(\n\t\t\t\t[{ field: \"token\", value: token }],\n\t\t\t\t\"session\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t},\n\t\tdeleteAccounts: async (userId: string) => {\n\t\t\tawait deleteManyWithHooks(\n\t\t\t\t[\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\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t},\n\t\tdeleteAccount: async (accountId: string) => {\n\t\t\tawait deleteWithHooks(\n\t\t\t\t[{ field: \"id\", value: accountId }],\n\t\t\t\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t},\n\t\tdeleteSessions: async (userIdOrSessionTokens: string | string[]) => {\n\t\t\tif (secondaryStorage) {\n\t\t\t\tif (typeof userIdOrSessionTokens === \"string\") {\n\t\t\t\t\tconst activeSession = await secondaryStorage.get(\n\t\t\t\t\t\t`active-sessions-${userIdOrSessionTokens}`,\n\t\t\t\t\t);\n\t\t\t\t\tconst sessions = activeSession\n\t\t\t\t\t\t? safeJSONParse<{ token: string }[]>(activeSession)\n\t\t\t\t\t\t: [];\n\t\t\t\t\tif (!sessions) return;\n\t\t\t\t\tfor (const session of sessions) {\n\t\t\t\t\t\tawait secondaryStorage.delete(session.token);\n\t\t\t\t\t}\n\t\t\t\t\tawait secondaryStorage.delete(\n\t\t\t\t\t\t`active-sessions-${userIdOrSessionTokens}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tfor (const sessionToken of userIdOrSessionTokens) {\n\t\t\t\t\t\tconst session = await secondaryStorage.get(sessionToken);\n\t\t\t\t\t\tif (session) {\n\t\t\t\t\t\t\tawait secondaryStorage.delete(sessionToken);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t!options.session?.storeSessionInDatabase ||\n\t\t\t\t\tctx.options.session?.preserveSessionInDatabase\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait deleteManyWithHooks(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: Array.isArray(userIdOrSessionTokens) ? \"token\" : \"userId\",\n\t\t\t\t\t\tvalue: userIdOrSessionTokens,\n\t\t\t\t\t\toperator: Array.isArray(userIdOrSessionTokens) ? \"in\" : undefined,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"session\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t},\n\t\tfindOAuthUser: async (\n\t\t\temail: string,\n\t\t\taccountId: string,\n\t\t\tproviderId: string,\n\t\t) => {\n\t\t\t// we need to find account first to avoid missing user if the email changed with the provider for the same account\n\t\t\tconst account = await (await getCurrentAdapter(adapter)).findOne<\n\t\t\t\tAccount & { user: User | null }\n\t\t\t>({\n\t\t\t\tmodel: \"account\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue: accountId,\n\t\t\t\t\t\tfield: \"accountId\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue: providerId,\n\t\t\t\t\t\tfield: \"providerId\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tjoin: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (account) {\n\t\t\t\tif (account.user) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tuser: account.user,\n\t\t\t\t\t\tlinkedAccount: account,\n\t\t\t\t\t\taccounts: [account],\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tconst user = await (await getCurrentAdapter(adapter)).findOne<User>({\n\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvalue: email.toLowerCase(),\n\t\t\t\t\t\t\t\tfield: \"email\",\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\tif (user) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tuser,\n\t\t\t\t\t\t\tlinkedAccount: account,\n\t\t\t\t\t\t\taccounts: [account],\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst user = await (await getCurrentAdapter(adapter)).findOne<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvalue: email.toLowerCase(),\n\t\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\tif (user) {\n\t\t\t\t\tconst accounts = await (\n\t\t\t\t\t\tawait getCurrentAdapter(adapter)\n\t\t\t\t\t).findMany<Account>({\n\t\t\t\t\t\tmodel: \"account\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t\treturn {\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tlinkedAccount: null,\n\t\t\t\t\t\taccounts: accounts || [],\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tfindUserByEmail: async (\n\t\t\temail: string,\n\t\t\toptions?: { includeAccounts: boolean } | undefined,\n\t\t) => {\n\t\t\tconst currentAdapter = await getCurrentAdapter(adapter);\n\t\t\tconst result = await currentAdapter.findOne<\n\t\t\t\tUser & { account: Account[] | undefined }\n\t\t\t>({\n\t\t\t\tmodel: \"user\",\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\tjoin: {\n\t\t\t\t\t...(options?.includeAccounts ? { account: true } : {}),\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (!result) return null;\n\t\t\tconst { account: accounts, ...user } = result;\n\t\t\treturn {\n\t\t\t\tuser,\n\t\t\t\taccounts: accounts ?? [],\n\t\t\t};\n\t\t},\n\t\tfindUserById: async (userId: string) => {\n\t\t\tif (!userId) return null;\n\t\t\tconst user = await (await getCurrentAdapter(adapter)).findOne<User>({\n\t\t\t\tmodel: \"user\",\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 (\n\t\t\taccount: Omit<Account, \"id\" | \"createdAt\" | \"updatedAt\"> &\n\t\t\t\tPartial<Account>,\n\t\t) => {\n\t\t\tconst _account = await createWithHooks(\n\t\t\t\t{\n\t\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t...account,\n\t\t\t\t},\n\t\t\t\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\treturn _account;\n\t\t},\n\t\tupdateUser: async (\n\t\t\tuserId: string,\n\t\t\tdata: Partial<User> & Record<string, any>,\n\t\t) => {\n\t\t\tconst user = await updateWithHooks<User>(\n\t\t\t\tdata,\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"user\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tawait refreshUserSessions(user);\n\t\t\treturn user;\n\t\t},\n\t\tupdateUserByEmail: async (\n\t\t\temail: string,\n\t\t\tdata: Partial<User & Record<string, any>>,\n\t\t) => {\n\t\t\tconst user = await updateWithHooks<User>(\n\t\t\t\tdata,\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: email.toLowerCase(),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"user\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tawait refreshUserSessions(user);\n\t\t\treturn user;\n\t\t},\n\t\tupdatePassword: async (userId: string, password: string) => {\n\t\t\tawait updateManyWithHooks(\n\t\t\t\t{\n\t\t\t\t\tpassword,\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"providerId\",\n\t\t\t\t\t\tvalue: \"credential\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t},\n\t\tfindAccounts: async (userId: string) => {\n\t\t\tconst accounts = await (\n\t\t\t\tawait getCurrentAdapter(adapter)\n\t\t\t).findMany<Account>({\n\t\t\t\tmodel: \"account\",\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\tfindAccount: async (accountId: string) => {\n\t\t\tconst account = await (await getCurrentAdapter(adapter)).findOne<Account>(\n\t\t\t\t{\n\t\t\t\t\tmodel: \"account\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"accountId\",\n\t\t\t\t\t\t\tvalue: accountId,\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 account;\n\t\t},\n\t\tfindAccountByProviderId: async (accountId: string, providerId: string) => {\n\t\t\tconst account = await (await getCurrentAdapter(adapter)).findOne<Account>(\n\t\t\t\t{\n\t\t\t\t\tmodel: \"account\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"accountId\",\n\t\t\t\t\t\t\tvalue: accountId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"providerId\",\n\t\t\t\t\t\t\tvalue: providerId,\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 account;\n\t\t},\n\t\tfindAccountByUserId: async (userId: string) => {\n\t\t\tconst account = await (\n\t\t\t\tawait getCurrentAdapter(adapter)\n\t\t\t).findMany<Account>({\n\t\t\t\tmodel: \"account\",\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 account;\n\t\t},\n\t\tupdateAccount: async (id: string, data: Partial<Account>) => {\n\t\t\tconst account = await updateWithHooks<Account>(\n\t\t\t\tdata,\n\t\t\t\t[{ field: \"id\", value: id }],\n\t\t\t\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\treturn account;\n\t\t},\n\t\tcreateVerificationValue: async (\n\t\t\tdata: Omit<Verification, \"createdAt\" | \"id\" | \"updatedAt\"> &\n\t\t\t\tPartial<Verification>,\n\t\t) => {\n\t\t\tconst storageOption = getStorageOption(\n\t\t\t\tdata.identifier,\n\t\t\t\toptions.verification?.storeIdentifier,\n\t\t\t);\n\t\t\tconst storedIdentifier = await processIdentifier(\n\t\t\t\tdata.identifier,\n\t\t\t\tstorageOption,\n\t\t\t);\n\n\t\t\tconst verification = await createWithHooks(\n\t\t\t\t{\n\t\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t...data,\n\t\t\t\t\tidentifier: storedIdentifier,\n\t\t\t\t},\n\t\t\t\t\"verification\",\n\t\t\t\tsecondaryStorage\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tasync fn(verificationData) {\n\t\t\t\t\t\t\t\tconst ttl = getTTLSeconds(verificationData.expiresAt);\n\t\t\t\t\t\t\t\tif (ttl > 0) {\n\t\t\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t\t\t`verification:${storedIdentifier}`,\n\t\t\t\t\t\t\t\t\t\tJSON.stringify(verificationData),\n\t\t\t\t\t\t\t\t\t\tttl,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn verificationData;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\texecuteMainFn: options.verification?.storeInDatabase,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t);\n\t\t\treturn verification as Verification;\n\t\t},\n\t\tfindVerificationValue: async (identifier: string) => {\n\t\t\tconst storageOption = getStorageOption(\n\t\t\t\tidentifier,\n\t\t\t\toptions.verification?.storeIdentifier,\n\t\t\t);\n\t\t\tconst storedIdentifier = await processIdentifier(\n\t\t\t\tidentifier,\n\t\t\t\tstorageOption,\n\t\t\t);\n\n\t\t\tif (secondaryStorage) {\n\t\t\t\tconst cached = await secondaryStorage.get(\n\t\t\t\t\t`verification:${storedIdentifier}`,\n\t\t\t\t);\n\t\t\t\tif (cached) {\n\t\t\t\t\tconst parsed = safeJSONParse<Verification>(cached);\n\t\t\t\t\tif (parsed) {\n\t\t\t\t\t\treturn parsed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (storageOption && storageOption !== \"plain\") {\n\t\t\t\t\tconst plainCached = await secondaryStorage.get(\n\t\t\t\t\t\t`verification:${identifier}`,\n\t\t\t\t\t);\n\t\t\t\t\tif (plainCached) {\n\t\t\t\t\t\tconst parsed = safeJSONParse<Verification>(plainCached);\n\t\t\t\t\t\tif (parsed) {\n\t\t\t\t\t\t\treturn parsed;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!options.verification?.storeInDatabase) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst currentAdapter = await getCurrentAdapter(adapter);\n\n\t\t\tasync function findByIdentifier(id: string) {\n\t\t\t\treturn currentAdapter.findMany<Verification>({\n\t\t\t\t\tmodel: \"verification\",\n\t\t\t\t\twhere: [{ field: \"identifier\", value: id }],\n\t\t\t\t\tsortBy: { field: \"createdAt\", direction: \"desc\" },\n\t\t\t\t\tlimit: 1,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet verification = await findByIdentifier(storedIdentifier);\n\n\t\t\tif (!verification.length && storageOption && storageOption !== \"plain\") {\n\t\t\t\tverification = await findByIdentifier(identifier);\n\t\t\t}\n\n\t\t\tif (!options.verification?.disableCleanup) {\n\t\t\t\tawait deleteManyWithHooks(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"expiresAt\",\n\t\t\t\t\t\t\tvalue: new Date(),\n\t\t\t\t\t\t\toperator: \"lt\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t\"verification\",\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn (verification[0] as Verification) || null;\n\t\t},\n\t\tdeleteVerificationByIdentifier: async (identifier: string) => {\n\t\t\tconst storageOption = getStorageOption(\n\t\t\t\tidentifier,\n\t\t\t\toptions.verification?.storeIdentifier,\n\t\t\t);\n\t\t\tconst storedIdentifier = await processIdentifier(\n\t\t\t\tidentifier,\n\t\t\t\tstorageOption,\n\t\t\t);\n\n\t\t\tif (secondaryStorage) {\n\t\t\t\tawait secondaryStorage.delete(`verification:${storedIdentifier}`);\n\t\t\t}\n\n\t\t\tif (!secondaryStorage || options.verification?.storeInDatabase) {\n\t\t\t\tawait deleteWithHooks(\n\t\t\t\t\t[{ field: \"identifier\", value: storedIdentifier }],\n\t\t\t\t\t\"verification\",\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tupdateVerificationByIdentifier: async (\n\t\t\tidentifier: string,\n\t\t\tdata: Partial<Verification>,\n\t\t) => {\n\t\t\tconst storageOption = getStorageOption(\n\t\t\t\tidentifier,\n\t\t\t\toptions.verification?.storeIdentifier,\n\t\t\t);\n\t\t\tconst storedIdentifier = await processIdentifier(\n\t\t\t\tidentifier,\n\t\t\t\tstorageOption,\n\t\t\t);\n\n\t\t\tif (secondaryStorage) {\n\t\t\t\tconst cached = await secondaryStorage.get(\n\t\t\t\t\t`verification:${storedIdentifier}`,\n\t\t\t\t);\n\t\t\t\tif (cached) {\n\t\t\t\t\tconst parsed = safeJSONParse<Verification>(cached);\n\t\t\t\t\tif (parsed) {\n\t\t\t\t\t\tconst updated = { ...parsed, ...data };\n\t\t\t\t\t\tconst expiresAt = updated.expiresAt ?? parsed.expiresAt;\n\t\t\t\t\t\tconst ttl = getTTLSeconds(\n\t\t\t\t\t\t\texpiresAt instanceof Date ? expiresAt : new Date(expiresAt),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (ttl > 0) {\n\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t`verification:${storedIdentifier}`,\n\t\t\t\t\t\t\t\tJSON.stringify(updated),\n\t\t\t\t\t\t\t\tttl,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!options.verification?.storeInDatabase) {\n\t\t\t\t\t\t\treturn updated;\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 (!secondaryStorage || options.verification?.storeInDatabase) {\n\t\t\t\tconst verification = await updateWithHooks<Verification>(\n\t\t\t\t\tdata,\n\t\t\t\t\t[{ field: \"identifier\", value: storedIdentifier }],\n\t\t\t\t\t\"verification\",\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\treturn verification;\n\t\t\t}\n\t\t\treturn data as Verification;\n\t\t},\n\t};\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"internal-adapter.mjs","names":[],"sources":["../../src/db/internal-adapter.ts"],"sourcesContent":["import type {\n\tAuthContext,\n\tBetterAuthOptions,\n\tInternalAdapter,\n} from \"@better-auth/core\";\nimport {\n\tgetCurrentAdapter,\n\tgetCurrentAuthContext,\n\trunWithTransaction,\n} from \"@better-auth/core/context\";\nimport type { DBAdapter, Where } from \"@better-auth/core/db/adapter\";\nimport type { InternalLogger } from \"@better-auth/core/env\";\nimport { generateId } from \"@better-auth/core/utils/id\";\nimport { safeJSONParse } from \"@better-auth/core/utils/json\";\nimport type { Account, Session, User, Verification } from \"../types\";\nimport { getDate } from \"../utils/date\";\nimport { getIp } from \"../utils/get-request-ip\";\nimport {\n\tgetSessionDefaultFields,\n\tparseSessionOutput,\n\tparseUserOutput,\n} from \"./schema\";\nimport {\n\tgetStorageOption,\n\tprocessIdentifier,\n} from \"./verification-token-storage\";\nimport type { DatabaseHooksEntry } from \"./with-hooks\";\nimport { getWithHooks } from \"./with-hooks\";\n\nfunction getTTLSeconds(expiresAt: Date | number, now = Date.now()): number {\n\tconst expiresMs =\n\t\ttypeof expiresAt === \"number\" ? expiresAt : expiresAt.getTime();\n\treturn Math.max(Math.floor((expiresMs - now) / 1000), 0);\n}\n\nexport const createInternalAdapter = (\n\tadapter: DBAdapter<BetterAuthOptions>,\n\tctx: {\n\t\toptions: Omit<BetterAuthOptions, \"logger\">;\n\t\tlogger: InternalLogger;\n\t\thooks: DatabaseHooksEntry[];\n\t\tgenerateId: AuthContext[\"generateId\"];\n\t},\n): InternalAdapter => {\n\tconst logger = ctx.logger;\n\tconst options = ctx.options;\n\tconst secondaryStorage = options.secondaryStorage;\n\tconst sessionExpiration = options.session?.expiresIn || 60 * 60 * 24 * 7; // 7 days\n\tconst {\n\t\tcreateWithHooks,\n\t\tupdateWithHooks,\n\t\tupdateManyWithHooks,\n\t\tdeleteWithHooks,\n\t\tdeleteManyWithHooks,\n\t} = getWithHooks(adapter, ctx);\n\n\tasync function refreshUserSessions(user: User) {\n\t\tif (!secondaryStorage) return;\n\n\t\tconst listRaw = await secondaryStorage.get(`active-sessions-${user.id}`);\n\t\tif (!listRaw) return;\n\n\t\tconst now = Date.now();\n\t\tconst list =\n\t\t\tsafeJSONParse<{ token: string; expiresAt: number }[]>(listRaw) || [];\n\t\tconst validSessions = list.filter((s) => s.expiresAt > now);\n\n\t\tawait Promise.all(\n\t\t\tvalidSessions.map(async ({ token }) => {\n\t\t\t\tconst cached = await secondaryStorage.get(token);\n\t\t\t\tif (!cached) return;\n\t\t\t\tconst parsed = safeJSONParse<{ session: Session; user: User }>(cached);\n\t\t\t\tif (!parsed) return;\n\n\t\t\t\tconst sessionTTL = getTTLSeconds(parsed.session.expiresAt, now);\n\n\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\ttoken,\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\tsession: parsed.session,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t}),\n\t\t\t\t\tMath.floor(sessionTTL),\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n\n\treturn {\n\t\tcreateOAuthUser: async (\n\t\t\tuser: Omit<User, \"id\" | \"createdAt\" | \"updatedAt\">,\n\t\t\taccount: Omit<Account, \"userId\" | \"id\" | \"createdAt\" | \"updatedAt\"> &\n\t\t\t\tPartial<Account>,\n\t\t) => {\n\t\t\treturn runWithTransaction(adapter, async () => {\n\t\t\t\tconst createdUser = await createWithHooks(\n\t\t\t\t\t{\n\t\t\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t\t...user,\n\t\t\t\t\t},\n\t\t\t\t\t\"user\",\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tconst createdAccount = await createWithHooks(\n\t\t\t\t\t{\n\t\t\t\t\t\t...account,\n\t\t\t\t\t\tuserId: createdUser!.id,\n\t\t\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t},\n\t\t\t\t\t\"account\",\n\t\t\t\t\tundefined,\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});\n\t\t},\n\t\tcreateUser: async <T>(\n\t\t\tuser: Omit<User, \"id\" | \"createdAt\" | \"updatedAt\" | \"emailVerified\"> &\n\t\t\t\tPartial<User> &\n\t\t\t\tRecord<string, any>,\n\t\t) => {\n\t\t\tconst createdUser = await createWithHooks(\n\t\t\t\t{\n\t\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t...user,\n\t\t\t\t\temail: user.email?.toLowerCase(),\n\t\t\t\t},\n\t\t\t\t\"user\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\treturn createdUser as T & User;\n\t\t},\n\t\tcreateAccount: async <T extends Record<string, any>>(\n\t\t\taccount: Omit<Account, \"id\" | \"createdAt\" | \"updatedAt\"> &\n\t\t\t\tPartial<Account> &\n\t\t\t\tT,\n\t\t) => {\n\t\t\tconst createdAccount = await createWithHooks(\n\t\t\t\t{\n\t\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t...account,\n\t\t\t\t},\n\t\t\t\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\treturn createdAccount as T & Account;\n\t\t},\n\t\tlistSessions: async (\n\t\t\tuserId: string,\n\t\t\toptions?: { onlyActiveSessions?: boolean | undefined } | undefined,\n\t\t) => {\n\t\t\tif (secondaryStorage) {\n\t\t\t\tconst currentList = await secondaryStorage.get(\n\t\t\t\t\t`active-sessions-${userId}`,\n\t\t\t\t);\n\t\t\t\tif (!currentList) return [];\n\n\t\t\t\tconst list: { token: string; expiresAt: number }[] =\n\t\t\t\t\tsafeJSONParse(currentList) || [];\n\t\t\t\tconst now = Date.now();\n\n\t\t\t\tconst seenTokens = new Set<string>();\n\t\t\t\tconst sessions: Session[] = [];\n\n\t\t\t\tfor (const { token, expiresAt } of list) {\n\t\t\t\t\tif (expiresAt <= now || seenTokens.has(token)) continue;\n\t\t\t\t\tseenTokens.add(token);\n\n\t\t\t\t\tconst data = await secondaryStorage.get(token);\n\t\t\t\t\tif (!data) continue;\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst parsed = (\n\t\t\t\t\t\t\ttypeof data === \"string\" ? JSON.parse(data) : data\n\t\t\t\t\t\t) as {\n\t\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\t\tuser: User;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (!parsed?.session) continue;\n\n\t\t\t\t\t\tsessions.push(\n\t\t\t\t\t\t\tparseSessionOutput(ctx.options, {\n\t\t\t\t\t\t\t\t...parsed.session,\n\t\t\t\t\t\t\t\texpiresAt: new Date(parsed.session.expiresAt),\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn sessions;\n\t\t\t}\n\n\t\t\tconst sessions = await (\n\t\t\t\tawait getCurrentAdapter(adapter)\n\t\t\t).findMany<Session>({\n\t\t\t\tmodel: \"session\",\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\t...(options?.onlyActiveSessions\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfield: \"expiresAt\",\n\t\t\t\t\t\t\t\t\tvalue: new Date(),\n\t\t\t\t\t\t\t\t\toperator: \"gt\",\n\t\t\t\t\t\t\t\t} satisfies Where,\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: []),\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn sessions;\n\t\t},\n\t\tlistUsers: async (\n\t\t\tlimit?: number | undefined,\n\t\t\toffset?: number | undefined,\n\t\t\tsortBy?:\n\t\t\t\t| {\n\t\t\t\t\t\tfield: string;\n\t\t\t\t\t\tdirection: \"asc\" | \"desc\";\n\t\t\t\t }\n\t\t\t\t| undefined,\n\t\t\twhere?: Where[] | undefined,\n\t\t) => {\n\t\t\tconst users = await (await getCurrentAdapter(adapter)).findMany<User>({\n\t\t\t\tmodel: \"user\",\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\tsortBy,\n\t\t\t\twhere,\n\t\t\t});\n\t\t\treturn users;\n\t\t},\n\t\tcountTotalUsers: async (where?: Where[] | undefined) => {\n\t\t\tconst total = await (await getCurrentAdapter(adapter)).count({\n\t\t\t\tmodel: \"user\",\n\t\t\t\twhere,\n\t\t\t});\n\t\t\tif (typeof total === \"string\") {\n\t\t\t\treturn parseInt(total);\n\t\t\t}\n\t\t\treturn total;\n\t\t},\n\t\tdeleteUser: async (userId: string) => {\n\t\t\tif (!secondaryStorage || options.session?.storeSessionInDatabase) {\n\t\t\t\tawait deleteManyWithHooks(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t\"session\",\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait deleteManyWithHooks(\n\t\t\t\t[\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\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tawait deleteWithHooks(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"user\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t},\n\t\tcreateSession: async (\n\t\t\tuserId: string,\n\t\t\tdontRememberMe?: boolean | undefined,\n\t\t\toverride?: (Partial<Session> & Record<string, any>) | undefined,\n\t\t\toverrideAll?: boolean | undefined,\n\t\t) => {\n\t\t\tconst headers: Headers | undefined = await (async () => {\n\t\t\t\tconst ctx = await getCurrentAuthContext().catch(() => null);\n\t\t\t\treturn ctx?.headers || ctx?.request?.headers;\n\t\t\t})();\n\t\t\tconst storeInDb = options.session?.storeSessionInDatabase;\n\t\t\tconst {\n\t\t\t\t// always ignore override id - new sessions must have new ids\n\t\t\t\tid: _,\n\t\t\t\t...rest\n\t\t\t} = override || {};\n\n\t\t\t// we're parsing default values for session additional fields\n\t\t\tconst defaultAdditionalFields = getSessionDefaultFields(options);\n\t\t\tconst data = {\n\t\t\t\tipAddress: headers ? getIp(headers, options) || \"\" : \"\",\n\t\t\t\tuserAgent: headers?.get(\"user-agent\") || \"\",\n\t\t\t\t...rest,\n\t\t\t\t/**\n\t\t\t\t * If the user doesn't want to be remembered\n\t\t\t\t * set the session to expire in 1 day.\n\t\t\t\t * The cookie will be set to expire at the end of the session\n\t\t\t\t */\n\t\t\t\texpiresAt: dontRememberMe\n\t\t\t\t\t? getDate(60 * 60 * 24, \"sec\") // 1 day\n\t\t\t\t\t: getDate(sessionExpiration, \"sec\"),\n\t\t\t\tuserId,\n\t\t\t\ttoken: generateId(32),\n\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t...defaultAdditionalFields,\n\t\t\t\t...(overrideAll ? rest : {}),\n\t\t\t} satisfies Partial<Session>;\n\t\t\tconst res = await createWithHooks(\n\t\t\t\tdata,\n\t\t\t\t\"session\",\n\t\t\t\tsecondaryStorage\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tfn: async (sessionData) => {\n\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t * store the session token for the user\n\t\t\t\t\t\t\t\t * so we can retrieve it later for listing sessions\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\tconst currentList = await secondaryStorage.get(\n\t\t\t\t\t\t\t\t\t`active-sessions-${userId}`,\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tlet list: { token: string; expiresAt: number }[] = [];\n\t\t\t\t\t\t\t\tconst now = Date.now();\n\n\t\t\t\t\t\t\t\tif (currentList) {\n\t\t\t\t\t\t\t\t\tlist = safeJSONParse(currentList) || [];\n\t\t\t\t\t\t\t\t\tlist = list.filter(\n\t\t\t\t\t\t\t\t\t\t(session) =>\n\t\t\t\t\t\t\t\t\t\t\tsession.expiresAt > now && session.token !== data.token,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst sorted = [\n\t\t\t\t\t\t\t\t\t...list,\n\t\t\t\t\t\t\t\t\t{ token: data.token, expiresAt: data.expiresAt.getTime() },\n\t\t\t\t\t\t\t\t].sort((a, b) => a.expiresAt - b.expiresAt);\n\t\t\t\t\t\t\t\tconst furthestSessionExp =\n\t\t\t\t\t\t\t\t\tsorted.at(-1)?.expiresAt ?? data.expiresAt.getTime();\n\t\t\t\t\t\t\t\tconst furthestSessionTTL = getTTLSeconds(\n\t\t\t\t\t\t\t\t\tfurthestSessionExp,\n\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tif (furthestSessionTTL > 0) {\n\t\t\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t\t\t`active-sessions-${userId}`,\n\t\t\t\t\t\t\t\t\t\tJSON.stringify(sorted),\n\t\t\t\t\t\t\t\t\t\tfurthestSessionTTL,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst user = await (\n\t\t\t\t\t\t\t\t\tawait getCurrentAdapter(adapter)\n\t\t\t\t\t\t\t\t).findOne<User>({\n\t\t\t\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tconst sessionTTL = getTTLSeconds(data.expiresAt, now);\n\t\t\t\t\t\t\t\tif (sessionTTL > 0) {\n\t\t\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t\t\tdata.token,\n\t\t\t\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\t\t\t\tsession: sessionData,\n\t\t\t\t\t\t\t\t\t\t\tuser,\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\tsessionTTL,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn sessionData;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\texecuteMainFn: storeInDb,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t);\n\t\t\treturn res as Session;\n\t\t},\n\t\tfindSession: async (\n\t\t\ttoken: string,\n\t\t): Promise<{\n\t\t\tsession: Session & Record<string, any>;\n\t\t\tuser: User & Record<string, any>;\n\t\t} | null> => {\n\t\t\tif (secondaryStorage) {\n\t\t\t\tconst sessionStringified = await secondaryStorage.get(token);\n\t\t\t\t// When preserveSessionInDatabase is enabled, revoked sessions\n\t\t\t\t// remain in the database for audit purposes. Skip the database\n\t\t\t\t// fallback to prevent those revoked sessions from being restored.\n\t\t\t\tif (\n\t\t\t\t\t!sessionStringified &&\n\t\t\t\t\t(!options.session?.storeSessionInDatabase ||\n\t\t\t\t\t\tctx.options.session?.preserveSessionInDatabase)\n\t\t\t\t) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tif (sessionStringified) {\n\t\t\t\t\tconst s = safeJSONParse<{\n\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\tuser: User;\n\t\t\t\t\t}>(sessionStringified);\n\t\t\t\t\tif (!s) return null;\n\t\t\t\t\tconst parsedSession = parseSessionOutput(ctx.options, {\n\t\t\t\t\t\t...s.session,\n\t\t\t\t\t\texpiresAt: new Date(s.session.expiresAt),\n\t\t\t\t\t\tcreatedAt: new Date(s.session.createdAt),\n\t\t\t\t\t\tupdatedAt: new Date(s.session.updatedAt),\n\t\t\t\t\t});\n\t\t\t\t\tconst parsedUser = parseUserOutput(ctx.options, {\n\t\t\t\t\t\t...s.user,\n\t\t\t\t\t\tcreatedAt: new Date(s.user.createdAt),\n\t\t\t\t\t\tupdatedAt: new Date(s.user.updatedAt),\n\t\t\t\t\t});\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsession: parsedSession,\n\t\t\t\t\t\tuser: parsedUser,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst currentAdapter = await getCurrentAdapter(adapter);\n\t\t\tconst result = await currentAdapter.findOne<\n\t\t\t\tSession & { user: User | null }\n\t\t\t>({\n\t\t\t\tmodel: \"session\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue: token,\n\t\t\t\t\t\tfield: \"token\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tjoin: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (!result) return null;\n\n\t\t\tconst { user, ...session } = result;\n\t\t\tif (!user) return null;\n\t\t\tconst parsedSession = parseSessionOutput(ctx.options, session);\n\t\t\tconst parsedUser = parseUserOutput(ctx.options, user);\n\t\t\treturn {\n\t\t\t\tsession: parsedSession,\n\t\t\t\tuser: parsedUser,\n\t\t\t};\n\t\t},\n\t\tfindSessions: async (\n\t\t\tsessionTokens: string[],\n\t\t\toptions?:\n\t\t\t\t| {\n\t\t\t\t\t\tonlyActiveSessions?: boolean | undefined;\n\t\t\t\t }\n\t\t\t\t| undefined,\n\t\t) => {\n\t\t\tif (secondaryStorage) {\n\t\t\t\tconst sessions: {\n\t\t\t\t\tsession: Session;\n\t\t\t\t\tuser: User;\n\t\t\t\t}[] = [];\n\t\t\t\tfor (const sessionToken of sessionTokens) {\n\t\t\t\t\tconst sessionStringified = await secondaryStorage.get(sessionToken);\n\t\t\t\t\tif (sessionStringified) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst s = (\n\t\t\t\t\t\t\t\ttypeof sessionStringified === \"string\"\n\t\t\t\t\t\t\t\t\t? JSON.parse(sessionStringified)\n\t\t\t\t\t\t\t\t\t: sessionStringified\n\t\t\t\t\t\t\t) as {\n\t\t\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\t\t\tuser: User;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tif (!s) return [];\n\t\t\t\t\t\t\tconst expiresAt = new Date(s.session.expiresAt);\n\t\t\t\t\t\t\tif (options?.onlyActiveSessions && expiresAt <= new Date()) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst session = {\n\t\t\t\t\t\t\t\tsession: {\n\t\t\t\t\t\t\t\t\t...s.session,\n\t\t\t\t\t\t\t\t\texpiresAt: new Date(s.session.expiresAt),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\t\t\t...s.user,\n\t\t\t\t\t\t\t\t\tcreatedAt: new Date(s.user.createdAt),\n\t\t\t\t\t\t\t\t\tupdatedAt: new Date(s.user.updatedAt),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t} as {\n\t\t\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\t\t\tuser: User;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tsessions.push(session);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Skip invalid/corrupt session data\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn sessions;\n\t\t\t}\n\n\t\t\tconst sessions = await (await getCurrentAdapter(adapter)).findMany<\n\t\t\t\tSession & { user: User | null }\n\t\t\t>({\n\t\t\t\tmodel: \"session\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"token\",\n\t\t\t\t\t\tvalue: sessionTokens,\n\t\t\t\t\t\toperator: \"in\",\n\t\t\t\t\t},\n\t\t\t\t\t...(options?.onlyActiveSessions\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfield: \"expiresAt\",\n\t\t\t\t\t\t\t\t\tvalue: new Date(),\n\t\t\t\t\t\t\t\t\toperator: \"gt\",\n\t\t\t\t\t\t\t\t} satisfies Where,\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: []),\n\t\t\t\t],\n\t\t\t\tjoin: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!sessions.length) return [];\n\t\t\tif (sessions.some((session) => !session.user)) return [];\n\n\t\t\treturn sessions.map((_session) => {\n\t\t\t\tconst { user, ...session } = _session;\n\t\t\t\treturn {\n\t\t\t\t\tsession,\n\t\t\t\t\tuser: user!,\n\t\t\t\t};\n\t\t\t});\n\t\t},\n\t\tupdateSession: async (\n\t\t\tsessionToken: string,\n\t\t\tsession: Partial<Session> & Record<string, any>,\n\t\t) => {\n\t\t\tconst updatedSession = await updateWithHooks<Session>(\n\t\t\t\tsession,\n\t\t\t\t[{ field: \"token\", value: sessionToken }],\n\t\t\t\t\"session\",\n\t\t\t\tsecondaryStorage\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tasync fn(data) {\n\t\t\t\t\t\t\t\tconst currentSession = await secondaryStorage.get(sessionToken);\n\t\t\t\t\t\t\t\tif (!currentSession) {\n\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst parsedSession = safeJSONParse<{\n\t\t\t\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\t\t\t\tuser: User;\n\t\t\t\t\t\t\t\t}>(currentSession);\n\t\t\t\t\t\t\t\tif (!parsedSession) return null;\n\n\t\t\t\t\t\t\t\tconst mergedSession = {\n\t\t\t\t\t\t\t\t\t...parsedSession.session,\n\t\t\t\t\t\t\t\t\t...data,\n\t\t\t\t\t\t\t\t\texpiresAt: new Date(\n\t\t\t\t\t\t\t\t\t\tdata.expiresAt ?? parsedSession.session.expiresAt,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tcreatedAt: new Date(parsedSession.session.createdAt),\n\t\t\t\t\t\t\t\t\tupdatedAt: new Date(\n\t\t\t\t\t\t\t\t\t\tdata.updatedAt ?? parsedSession.session.updatedAt,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tconst updatedSession = parseSessionOutput(\n\t\t\t\t\t\t\t\t\tctx.options,\n\t\t\t\t\t\t\t\t\tmergedSession,\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tconst now = Date.now();\n\t\t\t\t\t\t\t\tconst expiresMs = new Date(updatedSession.expiresAt).getTime();\n\t\t\t\t\t\t\t\tconst sessionTTL = getTTLSeconds(expiresMs, now);\n\n\t\t\t\t\t\t\t\tif (sessionTTL > 0) {\n\t\t\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t\t\tsessionToken,\n\t\t\t\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\t\t\t\tsession: updatedSession,\n\t\t\t\t\t\t\t\t\t\t\tuser: parsedSession.user,\n\t\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\t\tsessionTTL,\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\tconst listKey = `active-sessions-${updatedSession.userId}`;\n\t\t\t\t\t\t\t\t\tconst listRaw = await secondaryStorage.get(listKey);\n\t\t\t\t\t\t\t\t\tconst list: { token: string; expiresAt: number }[] = listRaw\n\t\t\t\t\t\t\t\t\t\t? safeJSONParse(listRaw) || []\n\t\t\t\t\t\t\t\t\t\t: [];\n\n\t\t\t\t\t\t\t\t\tconst filtered = list\n\t\t\t\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t\t\t\t(s) => s.token !== sessionToken && s.expiresAt > now,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t.concat([{ token: sessionToken, expiresAt: expiresMs }]);\n\n\t\t\t\t\t\t\t\t\tconst sorted = filtered.sort(\n\t\t\t\t\t\t\t\t\t\t(a, b) => a.expiresAt - b.expiresAt,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tconst furthestSessionExp = sorted.at(-1)?.expiresAt;\n\n\t\t\t\t\t\t\t\t\tif (furthestSessionExp && furthestSessionExp > now) {\n\t\t\t\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t\t\t\tlistKey,\n\t\t\t\t\t\t\t\t\t\t\tJSON.stringify(sorted),\n\t\t\t\t\t\t\t\t\t\t\tgetTTLSeconds(furthestSessionExp, now),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tawait secondaryStorage.delete(listKey);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn updatedSession;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\texecuteMainFn: options.session?.storeSessionInDatabase,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t);\n\t\t\treturn updatedSession;\n\t\t},\n\t\tdeleteSession: async (token: string) => {\n\t\t\tif (secondaryStorage) {\n\t\t\t\t// remove the session from the active sessions list\n\t\t\t\tconst data = await secondaryStorage.get(token);\n\t\t\t\tif (data) {\n\t\t\t\t\tconst { session } =\n\t\t\t\t\t\tsafeJSONParse<{\n\t\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\t\tuser: User;\n\t\t\t\t\t\t}>(data) ?? {};\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\tlogger.error(\"Session not found in secondary storage\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst userId = session.userId;\n\n\t\t\t\t\tconst currentList = await secondaryStorage.get(\n\t\t\t\t\t\t`active-sessions-${userId}`,\n\t\t\t\t\t);\n\t\t\t\t\tif (currentList) {\n\t\t\t\t\t\tconst list: { token: string; expiresAt: number }[] =\n\t\t\t\t\t\t\tsafeJSONParse(currentList) || [];\n\t\t\t\t\t\tconst now = Date.now();\n\n\t\t\t\t\t\tconst filtered = list.filter(\n\t\t\t\t\t\t\t(session) => session.expiresAt > now && session.token !== token,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst sorted = filtered.sort((a, b) => a.expiresAt - b.expiresAt);\n\t\t\t\t\t\tconst furthestSessionExp = sorted.at(-1)?.expiresAt;\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tfiltered.length > 0 &&\n\t\t\t\t\t\t\tfurthestSessionExp &&\n\t\t\t\t\t\t\tfurthestSessionExp > Date.now()\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t`active-sessions-${userId}`,\n\t\t\t\t\t\t\t\tJSON.stringify(filtered),\n\t\t\t\t\t\t\t\tgetTTLSeconds(furthestSessionExp, now),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tawait secondaryStorage.delete(`active-sessions-${userId}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger.error(\"Active sessions list not found in secondary storage\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tawait secondaryStorage.delete(token);\n\n\t\t\t\tif (\n\t\t\t\t\t!options.session?.storeSessionInDatabase ||\n\t\t\t\t\tctx.options.session?.preserveSessionInDatabase\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait deleteWithHooks(\n\t\t\t\t[{ field: \"token\", value: token }],\n\t\t\t\t\"session\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t},\n\t\tdeleteAccounts: async (userId: string) => {\n\t\t\tawait deleteManyWithHooks(\n\t\t\t\t[\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\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t},\n\t\tdeleteAccount: async (accountId: string) => {\n\t\t\tawait deleteWithHooks(\n\t\t\t\t[{ field: \"id\", value: accountId }],\n\t\t\t\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t},\n\t\tdeleteSessions: async (userIdOrSessionTokens: string | string[]) => {\n\t\t\tif (secondaryStorage) {\n\t\t\t\tif (typeof userIdOrSessionTokens === \"string\") {\n\t\t\t\t\tconst activeSession = await secondaryStorage.get(\n\t\t\t\t\t\t`active-sessions-${userIdOrSessionTokens}`,\n\t\t\t\t\t);\n\t\t\t\t\tconst sessions = activeSession\n\t\t\t\t\t\t? safeJSONParse<{ token: string }[]>(activeSession)\n\t\t\t\t\t\t: [];\n\t\t\t\t\tif (!sessions) return;\n\t\t\t\t\tfor (const session of sessions) {\n\t\t\t\t\t\tawait secondaryStorage.delete(session.token);\n\t\t\t\t\t}\n\t\t\t\t\tawait secondaryStorage.delete(\n\t\t\t\t\t\t`active-sessions-${userIdOrSessionTokens}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tfor (const sessionToken of userIdOrSessionTokens) {\n\t\t\t\t\t\tconst session = await secondaryStorage.get(sessionToken);\n\t\t\t\t\t\tif (session) {\n\t\t\t\t\t\t\tawait secondaryStorage.delete(sessionToken);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t!options.session?.storeSessionInDatabase ||\n\t\t\t\t\tctx.options.session?.preserveSessionInDatabase\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait deleteManyWithHooks(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: Array.isArray(userIdOrSessionTokens) ? \"token\" : \"userId\",\n\t\t\t\t\t\tvalue: userIdOrSessionTokens,\n\t\t\t\t\t\toperator: Array.isArray(userIdOrSessionTokens) ? \"in\" : undefined,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"session\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t},\n\t\tfindOAuthUser: async (\n\t\t\temail: string,\n\t\t\taccountId: string,\n\t\t\tproviderId: string,\n\t\t) => {\n\t\t\t// we need to find account first to avoid missing user if the email changed with the provider for the same account\n\t\t\tconst account = await (await getCurrentAdapter(adapter)).findOne<\n\t\t\t\tAccount & { user: User | null }\n\t\t\t>({\n\t\t\t\tmodel: \"account\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue: accountId,\n\t\t\t\t\t\tfield: \"accountId\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue: providerId,\n\t\t\t\t\t\tfield: \"providerId\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tjoin: {\n\t\t\t\t\tuser: true,\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (account) {\n\t\t\t\tif (account.user) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tuser: account.user,\n\t\t\t\t\t\tlinkedAccount: account,\n\t\t\t\t\t\taccounts: [account],\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tconst user = await (await getCurrentAdapter(adapter)).findOne<User>({\n\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvalue: email.toLowerCase(),\n\t\t\t\t\t\t\t\tfield: \"email\",\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\tif (user) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tuser,\n\t\t\t\t\t\t\tlinkedAccount: account,\n\t\t\t\t\t\t\taccounts: [account],\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst user = await (await getCurrentAdapter(adapter)).findOne<User>({\n\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvalue: email.toLowerCase(),\n\t\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\tif (user) {\n\t\t\t\t\tconst accounts = await (\n\t\t\t\t\t\tawait getCurrentAdapter(adapter)\n\t\t\t\t\t).findMany<Account>({\n\t\t\t\t\t\tmodel: \"account\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t\treturn {\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tlinkedAccount: null,\n\t\t\t\t\t\taccounts: accounts || [],\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tfindUserByEmail: async (\n\t\t\temail: string,\n\t\t\toptions?: { includeAccounts: boolean } | undefined,\n\t\t) => {\n\t\t\tconst currentAdapter = await getCurrentAdapter(adapter);\n\t\t\tconst result = await currentAdapter.findOne<\n\t\t\t\tUser & { account: Account[] | undefined }\n\t\t\t>({\n\t\t\t\tmodel: \"user\",\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\tjoin: {\n\t\t\t\t\t...(options?.includeAccounts ? { account: true } : {}),\n\t\t\t\t},\n\t\t\t});\n\t\t\tif (!result) return null;\n\t\t\tconst { account: accounts, ...user } = result;\n\t\t\treturn {\n\t\t\t\tuser,\n\t\t\t\taccounts: accounts ?? [],\n\t\t\t};\n\t\t},\n\t\tfindUserById: async (userId: string) => {\n\t\t\tif (!userId) return null;\n\t\t\tconst user = await (await getCurrentAdapter(adapter)).findOne<User>({\n\t\t\t\tmodel: \"user\",\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 (\n\t\t\taccount: Omit<Account, \"id\" | \"createdAt\" | \"updatedAt\"> &\n\t\t\t\tPartial<Account>,\n\t\t) => {\n\t\t\tconst _account = await createWithHooks(\n\t\t\t\t{\n\t\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t...account,\n\t\t\t\t},\n\t\t\t\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\treturn _account;\n\t\t},\n\t\tupdateUser: async (\n\t\t\tuserId: string,\n\t\t\tdata: Partial<User> & Record<string, any>,\n\t\t) => {\n\t\t\tconst user = await updateWithHooks<User>(\n\t\t\t\tdata,\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"user\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tawait refreshUserSessions(user);\n\t\t\treturn user;\n\t\t},\n\t\tupdateUserByEmail: async (\n\t\t\temail: string,\n\t\t\tdata: Partial<User & Record<string, any>>,\n\t\t) => {\n\t\t\tconst user = await updateWithHooks<User>(\n\t\t\t\tdata,\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: email.toLowerCase(),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"user\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\tawait refreshUserSessions(user);\n\t\t\treturn user;\n\t\t},\n\t\tupdatePassword: async (userId: string, password: string) => {\n\t\t\tawait updateManyWithHooks(\n\t\t\t\t{\n\t\t\t\t\tpassword,\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"providerId\",\n\t\t\t\t\t\tvalue: \"credential\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t},\n\t\tfindAccounts: async (userId: string) => {\n\t\t\tconst accounts = await (\n\t\t\t\tawait getCurrentAdapter(adapter)\n\t\t\t).findMany<Account>({\n\t\t\t\tmodel: \"account\",\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\tfindAccount: async (accountId: string) => {\n\t\t\tconst account = await (await getCurrentAdapter(adapter)).findOne<Account>(\n\t\t\t\t{\n\t\t\t\t\tmodel: \"account\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"accountId\",\n\t\t\t\t\t\t\tvalue: accountId,\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 account;\n\t\t},\n\t\tfindAccountByProviderId: async (accountId: string, providerId: string) => {\n\t\t\tconst account = await (await getCurrentAdapter(adapter)).findOne<Account>(\n\t\t\t\t{\n\t\t\t\t\tmodel: \"account\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"accountId\",\n\t\t\t\t\t\t\tvalue: accountId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"providerId\",\n\t\t\t\t\t\t\tvalue: providerId,\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 account;\n\t\t},\n\t\tfindAccountByUserId: async (userId: string) => {\n\t\t\tconst account = await (\n\t\t\t\tawait getCurrentAdapter(adapter)\n\t\t\t).findMany<Account>({\n\t\t\t\tmodel: \"account\",\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 account;\n\t\t},\n\t\tupdateAccount: async (id: string, data: Partial<Account>) => {\n\t\t\tconst account = await updateWithHooks<Account>(\n\t\t\t\tdata,\n\t\t\t\t[{ field: \"id\", value: id }],\n\t\t\t\t\"account\",\n\t\t\t\tundefined,\n\t\t\t);\n\t\t\treturn account;\n\t\t},\n\t\tcreateVerificationValue: async (\n\t\t\tdata: Omit<Verification, \"createdAt\" | \"id\" | \"updatedAt\"> &\n\t\t\t\tPartial<Verification>,\n\t\t) => {\n\t\t\tconst storageOption = getStorageOption(\n\t\t\t\tdata.identifier,\n\t\t\t\toptions.verification?.storeIdentifier,\n\t\t\t);\n\t\t\tconst storedIdentifier = await processIdentifier(\n\t\t\t\tdata.identifier,\n\t\t\t\tstorageOption,\n\t\t\t);\n\n\t\t\tconst verification = await createWithHooks(\n\t\t\t\t{\n\t\t\t\t\t// todo: we should remove auto setting createdAt and updatedAt in the next major release, since the db generators already handle that\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\tupdatedAt: new Date(),\n\t\t\t\t\t...data,\n\t\t\t\t\tidentifier: storedIdentifier,\n\t\t\t\t},\n\t\t\t\t\"verification\",\n\t\t\t\tsecondaryStorage\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tasync fn(verificationData) {\n\t\t\t\t\t\t\t\tconst ttl = getTTLSeconds(verificationData.expiresAt);\n\t\t\t\t\t\t\t\tif (ttl > 0) {\n\t\t\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t\t\t`verification:${storedIdentifier}`,\n\t\t\t\t\t\t\t\t\t\tJSON.stringify(verificationData),\n\t\t\t\t\t\t\t\t\t\tttl,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn verificationData;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\texecuteMainFn: options.verification?.storeInDatabase,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t);\n\t\t\treturn verification as Verification;\n\t\t},\n\t\tfindVerificationValue: async (identifier: string) => {\n\t\t\tconst storageOption = getStorageOption(\n\t\t\t\tidentifier,\n\t\t\t\toptions.verification?.storeIdentifier,\n\t\t\t);\n\t\t\tconst storedIdentifier = await processIdentifier(\n\t\t\t\tidentifier,\n\t\t\t\tstorageOption,\n\t\t\t);\n\n\t\t\tif (secondaryStorage) {\n\t\t\t\tconst cached = await secondaryStorage.get(\n\t\t\t\t\t`verification:${storedIdentifier}`,\n\t\t\t\t);\n\t\t\t\tif (cached) {\n\t\t\t\t\tconst parsed = safeJSONParse<Verification>(cached);\n\t\t\t\t\tif (parsed) {\n\t\t\t\t\t\treturn parsed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (storageOption && storageOption !== \"plain\") {\n\t\t\t\t\tconst plainCached = await secondaryStorage.get(\n\t\t\t\t\t\t`verification:${identifier}`,\n\t\t\t\t\t);\n\t\t\t\t\tif (plainCached) {\n\t\t\t\t\t\tconst parsed = safeJSONParse<Verification>(plainCached);\n\t\t\t\t\t\tif (parsed) {\n\t\t\t\t\t\t\treturn parsed;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!options.verification?.storeInDatabase) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst currentAdapter = await getCurrentAdapter(adapter);\n\n\t\t\tasync function findByIdentifier(id: string) {\n\t\t\t\treturn currentAdapter.findMany<Verification>({\n\t\t\t\t\tmodel: \"verification\",\n\t\t\t\t\twhere: [{ field: \"identifier\", value: id }],\n\t\t\t\t\tsortBy: { field: \"createdAt\", direction: \"desc\" },\n\t\t\t\t\tlimit: 1,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet verification = await findByIdentifier(storedIdentifier);\n\n\t\t\tif (!verification.length && storageOption && storageOption !== \"plain\") {\n\t\t\t\tverification = await findByIdentifier(identifier);\n\t\t\t}\n\n\t\t\tif (!options.verification?.disableCleanup) {\n\t\t\t\tawait deleteManyWithHooks(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"expiresAt\",\n\t\t\t\t\t\t\tvalue: new Date(),\n\t\t\t\t\t\t\toperator: \"lt\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t\"verification\",\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn (verification[0] as Verification) || null;\n\t\t},\n\t\tdeleteVerificationByIdentifier: async (identifier: string) => {\n\t\t\tconst storageOption = getStorageOption(\n\t\t\t\tidentifier,\n\t\t\t\toptions.verification?.storeIdentifier,\n\t\t\t);\n\t\t\tconst storedIdentifier = await processIdentifier(\n\t\t\t\tidentifier,\n\t\t\t\tstorageOption,\n\t\t\t);\n\n\t\t\tif (secondaryStorage) {\n\t\t\t\tawait secondaryStorage.delete(`verification:${storedIdentifier}`);\n\t\t\t}\n\n\t\t\tif (!secondaryStorage || options.verification?.storeInDatabase) {\n\t\t\t\tawait deleteWithHooks(\n\t\t\t\t\t[{ field: \"identifier\", value: storedIdentifier }],\n\t\t\t\t\t\"verification\",\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tupdateVerificationByIdentifier: async (\n\t\t\tidentifier: string,\n\t\t\tdata: Partial<Verification>,\n\t\t) => {\n\t\t\tconst storageOption = getStorageOption(\n\t\t\t\tidentifier,\n\t\t\t\toptions.verification?.storeIdentifier,\n\t\t\t);\n\t\t\tconst storedIdentifier = await processIdentifier(\n\t\t\t\tidentifier,\n\t\t\t\tstorageOption,\n\t\t\t);\n\n\t\t\tif (secondaryStorage) {\n\t\t\t\tconst cached = await secondaryStorage.get(\n\t\t\t\t\t`verification:${storedIdentifier}`,\n\t\t\t\t);\n\t\t\t\tif (cached) {\n\t\t\t\t\tconst parsed = safeJSONParse<Verification>(cached);\n\t\t\t\t\tif (parsed) {\n\t\t\t\t\t\tconst updated = { ...parsed, ...data };\n\t\t\t\t\t\tconst expiresAt = updated.expiresAt ?? parsed.expiresAt;\n\t\t\t\t\t\tconst ttl = getTTLSeconds(\n\t\t\t\t\t\t\texpiresAt instanceof Date ? expiresAt : new Date(expiresAt),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (ttl > 0) {\n\t\t\t\t\t\t\tawait secondaryStorage.set(\n\t\t\t\t\t\t\t\t`verification:${storedIdentifier}`,\n\t\t\t\t\t\t\t\tJSON.stringify(updated),\n\t\t\t\t\t\t\t\tttl,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!options.verification?.storeInDatabase) {\n\t\t\t\t\t\t\treturn updated;\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 (!secondaryStorage || options.verification?.storeInDatabase) {\n\t\t\t\tconst verification = await updateWithHooks<Verification>(\n\t\t\t\t\tdata,\n\t\t\t\t\t[{ field: \"identifier\", value: storedIdentifier }],\n\t\t\t\t\t\"verification\",\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\treturn verification;\n\t\t\t}\n\t\t\treturn data as Verification;\n\t\t},\n\t};\n};\n"],"mappings":"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"}
|
package/dist/db/schema.d.mts
CHANGED
package/dist/db/with-hooks.d.mts
CHANGED
|
@@ -3,9 +3,13 @@ import { BaseModelNames } from "@better-auth/core/db";
|
|
|
3
3
|
import { DBAdapter, Where } from "@better-auth/core/db/adapter";
|
|
4
4
|
|
|
5
5
|
//#region src/db/with-hooks.d.ts
|
|
6
|
+
type DatabaseHooksEntry = {
|
|
7
|
+
source: string;
|
|
8
|
+
hooks: Exclude<BetterAuthOptions["databaseHooks"], undefined>;
|
|
9
|
+
};
|
|
6
10
|
declare function getWithHooks(adapter: DBAdapter<BetterAuthOptions>, ctx: {
|
|
7
11
|
options: BetterAuthOptions;
|
|
8
|
-
hooks:
|
|
12
|
+
hooks: DatabaseHooksEntry[];
|
|
9
13
|
}): {
|
|
10
14
|
createWithHooks: <T extends Record<string, any>>(data: T, model: BaseModelNames, customCreateFn?: {
|
|
11
15
|
fn: (data: Record<string, any>) => void | Promise<any>;
|
|
@@ -29,5 +33,5 @@ declare function getWithHooks(adapter: DBAdapter<BetterAuthOptions>, ctx: {
|
|
|
29
33
|
} | undefined) => Promise<any>;
|
|
30
34
|
};
|
|
31
35
|
//#endregion
|
|
32
|
-
export { getWithHooks };
|
|
36
|
+
export { DatabaseHooksEntry, getWithHooks };
|
|
33
37
|
//# sourceMappingURL=with-hooks.d.mts.map
|
package/dist/db/with-hooks.mjs
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
import { getCurrentAdapter, getCurrentAuthContext, queueAfterTransactionHook } from "@better-auth/core/context";
|
|
2
|
+
import { ATTR_CONTEXT, ATTR_DB_COLLECTION_NAME, ATTR_HOOK_TYPE, withSpan } from "@better-auth/core/instrumentation";
|
|
2
3
|
|
|
3
4
|
//#region src/db/with-hooks.ts
|
|
4
5
|
function getWithHooks(adapter, ctx) {
|
|
5
|
-
const
|
|
6
|
+
const hooksEntries = ctx.hooks;
|
|
6
7
|
async function createWithHooks(data, model, customCreateFn) {
|
|
7
8
|
const context = await getCurrentAuthContext().catch(() => null);
|
|
8
9
|
let actualData = data;
|
|
9
|
-
for (const
|
|
10
|
-
const toRun =
|
|
10
|
+
for (const { source, hooks } of hooksEntries) {
|
|
11
|
+
const toRun = hooks[model]?.create?.before;
|
|
11
12
|
if (toRun) {
|
|
12
|
-
const result = await
|
|
13
|
+
const result = await withSpan(`db create.before ${model}`, {
|
|
14
|
+
[ATTR_HOOK_TYPE]: "create.before",
|
|
15
|
+
[ATTR_DB_COLLECTION_NAME]: model,
|
|
16
|
+
[ATTR_CONTEXT]: source
|
|
17
|
+
}, () => toRun(actualData, context));
|
|
13
18
|
if (result === false) return null;
|
|
14
19
|
if (typeof result === "object" && "data" in result) actualData = {
|
|
15
20
|
...actualData,
|
|
@@ -24,10 +29,14 @@ function getWithHooks(adapter, ctx) {
|
|
|
24
29
|
forceAllowId: true
|
|
25
30
|
});
|
|
26
31
|
if (customCreateFn?.fn) created = await customCreateFn.fn(created ?? actualData);
|
|
27
|
-
for (const
|
|
28
|
-
const toRun =
|
|
32
|
+
for (const { source, hooks } of hooksEntries) {
|
|
33
|
+
const toRun = hooks[model]?.create?.after;
|
|
29
34
|
if (toRun) await queueAfterTransactionHook(async () => {
|
|
30
|
-
await
|
|
35
|
+
await withSpan(`db create.after ${model}`, {
|
|
36
|
+
[ATTR_HOOK_TYPE]: "create.after",
|
|
37
|
+
[ATTR_DB_COLLECTION_NAME]: model,
|
|
38
|
+
[ATTR_CONTEXT]: source
|
|
39
|
+
}, () => toRun(created, context));
|
|
31
40
|
});
|
|
32
41
|
}
|
|
33
42
|
return created;
|
|
@@ -35,10 +44,14 @@ function getWithHooks(adapter, ctx) {
|
|
|
35
44
|
async function updateWithHooks(data, where, model, customUpdateFn) {
|
|
36
45
|
const context = await getCurrentAuthContext().catch(() => null);
|
|
37
46
|
let actualData = data;
|
|
38
|
-
for (const
|
|
39
|
-
const toRun =
|
|
47
|
+
for (const { source, hooks } of hooksEntries) {
|
|
48
|
+
const toRun = hooks[model]?.update?.before;
|
|
40
49
|
if (toRun) {
|
|
41
|
-
const result = await
|
|
50
|
+
const result = await withSpan(`db update.before ${model}`, {
|
|
51
|
+
[ATTR_HOOK_TYPE]: "update.before",
|
|
52
|
+
[ATTR_DB_COLLECTION_NAME]: model,
|
|
53
|
+
[ATTR_CONTEXT]: source
|
|
54
|
+
}, () => toRun(data, context));
|
|
42
55
|
if (result === false) return null;
|
|
43
56
|
if (typeof result === "object" && "data" in result) actualData = {
|
|
44
57
|
...actualData,
|
|
@@ -52,10 +65,14 @@ function getWithHooks(adapter, ctx) {
|
|
|
52
65
|
update: actualData,
|
|
53
66
|
where
|
|
54
67
|
}) : customUpdated;
|
|
55
|
-
for (const
|
|
56
|
-
const toRun =
|
|
68
|
+
for (const { source, hooks } of hooksEntries) {
|
|
69
|
+
const toRun = hooks[model]?.update?.after;
|
|
57
70
|
if (toRun) await queueAfterTransactionHook(async () => {
|
|
58
|
-
await
|
|
71
|
+
await withSpan(`db update.after ${model}`, {
|
|
72
|
+
[ATTR_HOOK_TYPE]: "update.after",
|
|
73
|
+
[ATTR_DB_COLLECTION_NAME]: model,
|
|
74
|
+
[ATTR_CONTEXT]: source
|
|
75
|
+
}, () => toRun(updated, context));
|
|
59
76
|
});
|
|
60
77
|
}
|
|
61
78
|
return updated;
|
|
@@ -63,10 +80,14 @@ function getWithHooks(adapter, ctx) {
|
|
|
63
80
|
async function updateManyWithHooks(data, where, model, customUpdateFn) {
|
|
64
81
|
const context = await getCurrentAuthContext().catch(() => null);
|
|
65
82
|
let actualData = data;
|
|
66
|
-
for (const
|
|
67
|
-
const toRun =
|
|
83
|
+
for (const { source, hooks } of hooksEntries) {
|
|
84
|
+
const toRun = hooks[model]?.update?.before;
|
|
68
85
|
if (toRun) {
|
|
69
|
-
const result = await
|
|
86
|
+
const result = await withSpan(`db updateMany.before ${model}`, {
|
|
87
|
+
[ATTR_HOOK_TYPE]: "updateMany.before",
|
|
88
|
+
[ATTR_DB_COLLECTION_NAME]: model,
|
|
89
|
+
[ATTR_CONTEXT]: source
|
|
90
|
+
}, () => toRun(data, context));
|
|
70
91
|
if (result === false) return null;
|
|
71
92
|
if (typeof result === "object" && "data" in result) actualData = {
|
|
72
93
|
...actualData,
|
|
@@ -80,10 +101,14 @@ function getWithHooks(adapter, ctx) {
|
|
|
80
101
|
update: actualData,
|
|
81
102
|
where
|
|
82
103
|
}) : customUpdated;
|
|
83
|
-
for (const
|
|
84
|
-
const toRun =
|
|
104
|
+
for (const { source, hooks } of hooksEntries) {
|
|
105
|
+
const toRun = hooks[model]?.update?.after;
|
|
85
106
|
if (toRun) await queueAfterTransactionHook(async () => {
|
|
86
|
-
await
|
|
107
|
+
await withSpan(`db updateMany.after ${model}`, {
|
|
108
|
+
[ATTR_HOOK_TYPE]: "updateMany.after",
|
|
109
|
+
[ATTR_DB_COLLECTION_NAME]: model,
|
|
110
|
+
[ATTR_CONTEXT]: source
|
|
111
|
+
}, () => toRun(updated, context));
|
|
87
112
|
});
|
|
88
113
|
}
|
|
89
114
|
return updated;
|
|
@@ -98,10 +123,14 @@ function getWithHooks(adapter, ctx) {
|
|
|
98
123
|
limit: 1
|
|
99
124
|
}))[0] || null;
|
|
100
125
|
} catch {}
|
|
101
|
-
if (entityToDelete) for (const
|
|
102
|
-
const toRun =
|
|
126
|
+
if (entityToDelete) for (const { source, hooks } of hooksEntries) {
|
|
127
|
+
const toRun = hooks[model]?.delete?.before;
|
|
103
128
|
if (toRun) {
|
|
104
|
-
if (await
|
|
129
|
+
if (await withSpan(`db delete.before ${model}`, {
|
|
130
|
+
[ATTR_HOOK_TYPE]: "delete.before",
|
|
131
|
+
[ATTR_DB_COLLECTION_NAME]: model,
|
|
132
|
+
[ATTR_CONTEXT]: source
|
|
133
|
+
}, () => toRun(entityToDelete, context)) === false) return null;
|
|
105
134
|
}
|
|
106
135
|
}
|
|
107
136
|
const customDeleted = customDeleteFn ? await customDeleteFn.fn(where) : null;
|
|
@@ -109,10 +138,14 @@ function getWithHooks(adapter, ctx) {
|
|
|
109
138
|
model,
|
|
110
139
|
where
|
|
111
140
|
}) : customDeleted;
|
|
112
|
-
if (entityToDelete) for (const
|
|
113
|
-
const toRun =
|
|
141
|
+
if (entityToDelete) for (const { source, hooks } of hooksEntries) {
|
|
142
|
+
const toRun = hooks[model]?.delete?.after;
|
|
114
143
|
if (toRun) await queueAfterTransactionHook(async () => {
|
|
115
|
-
await
|
|
144
|
+
await withSpan(`db delete.after ${model}`, {
|
|
145
|
+
[ATTR_HOOK_TYPE]: "delete.after",
|
|
146
|
+
[ATTR_DB_COLLECTION_NAME]: model,
|
|
147
|
+
[ATTR_CONTEXT]: source
|
|
148
|
+
}, () => toRun(entityToDelete, context));
|
|
116
149
|
});
|
|
117
150
|
}
|
|
118
151
|
return deleted;
|
|
@@ -126,10 +159,14 @@ function getWithHooks(adapter, ctx) {
|
|
|
126
159
|
where
|
|
127
160
|
});
|
|
128
161
|
} catch {}
|
|
129
|
-
for (const entity of entitiesToDelete) for (const
|
|
130
|
-
const toRun =
|
|
162
|
+
for (const entity of entitiesToDelete) for (const { source, hooks } of hooksEntries) {
|
|
163
|
+
const toRun = hooks[model]?.delete?.before;
|
|
131
164
|
if (toRun) {
|
|
132
|
-
if (await
|
|
165
|
+
if (await withSpan(`db delete.before ${model}`, {
|
|
166
|
+
[ATTR_HOOK_TYPE]: "delete.before",
|
|
167
|
+
[ATTR_DB_COLLECTION_NAME]: model,
|
|
168
|
+
[ATTR_CONTEXT]: source
|
|
169
|
+
}, () => toRun(entity, context)) === false) return null;
|
|
133
170
|
}
|
|
134
171
|
}
|
|
135
172
|
const customDeleted = customDeleteFn ? await customDeleteFn.fn(where) : null;
|
|
@@ -137,10 +174,14 @@ function getWithHooks(adapter, ctx) {
|
|
|
137
174
|
model,
|
|
138
175
|
where
|
|
139
176
|
}) : customDeleted;
|
|
140
|
-
for (const entity of entitiesToDelete) for (const
|
|
141
|
-
const toRun =
|
|
177
|
+
for (const entity of entitiesToDelete) for (const { source, hooks } of hooksEntries) {
|
|
178
|
+
const toRun = hooks[model]?.delete?.after;
|
|
142
179
|
if (toRun) await queueAfterTransactionHook(async () => {
|
|
143
|
-
await
|
|
180
|
+
await withSpan(`db delete.after ${model}`, {
|
|
181
|
+
[ATTR_HOOK_TYPE]: "delete.after",
|
|
182
|
+
[ATTR_DB_COLLECTION_NAME]: model,
|
|
183
|
+
[ATTR_CONTEXT]: source
|
|
184
|
+
}, () => toRun(entity, context));
|
|
144
185
|
});
|
|
145
186
|
}
|
|
146
187
|
return deleted;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-hooks.mjs","names":[],"sources":["../../src/db/with-hooks.ts"],"sourcesContent":["import type { BetterAuthOptions } from \"@better-auth/core\";\nimport {\n\tgetCurrentAdapter,\n\tgetCurrentAuthContext,\n\tqueueAfterTransactionHook,\n} from \"@better-auth/core/context\";\nimport type { BaseModelNames } from \"@better-auth/core/db\";\nimport type { DBAdapter, Where } from \"@better-auth/core/db/adapter\";\n\nexport function getWithHooks(\n\tadapter: DBAdapter<BetterAuthOptions>,\n\tctx: {\n\t\toptions: BetterAuthOptions;\n\t\thooks: Exclude<BetterAuthOptions[\"databaseHooks\"], undefined>[];\n\t},\n) {\n\tconst hooks = ctx.hooks;\n\tasync function createWithHooks<T extends Record<string, any>>(\n\t\tdata: T,\n\t\tmodel: BaseModelNames,\n\t\tcustomCreateFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (data: Record<string, any>) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet actualData = data;\n\t\tfor (const hook of hooks || []) {\n\t\t\tconst toRun = hook[model]?.create?.before;\n\t\t\tif (toRun) {\n\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\tconst result = await toRun(actualData as any, context);\n\t\t\t\tif (result === false) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst isObject = typeof result === \"object\" && \"data\" in result;\n\t\t\t\tif (isObject) {\n\t\t\t\t\tactualData = {\n\t\t\t\t\t\t...actualData,\n\t\t\t\t\t\t...result.data,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet created: any = null;\n\t\tif (!customCreateFn || customCreateFn.executeMainFn) {\n\t\t\tcreated = await (await getCurrentAdapter(adapter)).create<T>({\n\t\t\t\tmodel,\n\t\t\t\tdata: actualData as any,\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\t\t}\n\t\tif (customCreateFn?.fn) {\n\t\t\tcreated = await customCreateFn.fn(created ?? actualData);\n\t\t}\n\n\t\tfor (const hook of hooks || []) {\n\t\t\tconst toRun = hook[model]?.create?.after;\n\t\t\tif (toRun) {\n\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\tawait toRun(created as any, context);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn created;\n\t}\n\n\tasync function updateWithHooks<T extends Record<string, any>>(\n\t\tdata: any,\n\t\twhere: Where[],\n\t\tmodel: BaseModelNames,\n\t\tcustomUpdateFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (data: Record<string, any>) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet actualData = data;\n\n\t\tfor (const hook of hooks || []) {\n\t\t\tconst toRun = hook[model]?.update?.before;\n\t\t\tif (toRun) {\n\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\tconst result = await toRun(data as any, context);\n\t\t\t\tif (result === false) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst isObject = typeof result === \"object\" && \"data\" in result;\n\t\t\t\tif (isObject) {\n\t\t\t\t\tactualData = {\n\t\t\t\t\t\t...actualData,\n\t\t\t\t\t\t...result.data,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst customUpdated = customUpdateFn\n\t\t\t? await customUpdateFn.fn(actualData)\n\t\t\t: null;\n\n\t\tconst updated =\n\t\t\t!customUpdateFn || customUpdateFn.executeMainFn\n\t\t\t\t? await (await getCurrentAdapter(adapter)).update<T>({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tupdate: actualData,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t})\n\t\t\t\t: customUpdated;\n\n\t\tfor (const hook of hooks || []) {\n\t\t\tconst toRun = hook[model]?.update?.after;\n\t\t\tif (toRun) {\n\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\tawait toRun(updated as any, context);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn updated;\n\t}\n\n\tasync function updateManyWithHooks<_T extends Record<string, any>>(\n\t\tdata: any,\n\t\twhere: Where[],\n\t\tmodel: BaseModelNames,\n\t\tcustomUpdateFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (data: Record<string, any>) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet actualData = data;\n\n\t\tfor (const hook of hooks || []) {\n\t\t\tconst toRun = hook[model]?.update?.before;\n\t\t\tif (toRun) {\n\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\tconst result = await toRun(data as any, context);\n\t\t\t\tif (result === false) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst isObject = typeof result === \"object\" && \"data\" in result;\n\t\t\t\tif (isObject) {\n\t\t\t\t\tactualData = {\n\t\t\t\t\t\t...actualData,\n\t\t\t\t\t\t...result.data,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst customUpdated = customUpdateFn\n\t\t\t? await customUpdateFn.fn(actualData)\n\t\t\t: null;\n\n\t\tconst updated =\n\t\t\t!customUpdateFn || customUpdateFn.executeMainFn\n\t\t\t\t? await (await getCurrentAdapter(adapter)).updateMany({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tupdate: actualData,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t})\n\t\t\t\t: customUpdated;\n\n\t\tfor (const hook of hooks || []) {\n\t\t\tconst toRun = hook[model]?.update?.after;\n\t\t\tif (toRun) {\n\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\tawait toRun(updated as any, context);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn updated;\n\t}\n\n\tasync function deleteWithHooks<T extends Record<string, any>>(\n\t\twhere: Where[],\n\t\tmodel: BaseModelNames,\n\t\tcustomDeleteFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (where: Where[]) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet entityToDelete: T | null = null;\n\n\t\ttry {\n\t\t\tconst entities = await (await getCurrentAdapter(adapter)).findMany<T>({\n\t\t\t\tmodel,\n\t\t\t\twhere,\n\t\t\t\tlimit: 1,\n\t\t\t});\n\t\t\tentityToDelete = entities[0] || null;\n\t\t} catch {\n\t\t\t// If we can't find the entity, we'll still proceed with deletion\n\t\t}\n\n\t\tif (entityToDelete) {\n\t\t\tfor (const hook of hooks || []) {\n\t\t\t\tconst toRun = hook[model]?.delete?.before;\n\t\t\t\tif (toRun) {\n\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\tconst result = await toRun(entityToDelete as any, context);\n\t\t\t\t\tif (result === false) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst customDeleted = customDeleteFn\n\t\t\t? await customDeleteFn.fn(where)\n\t\t\t: null;\n\n\t\tconst shouldRunAdapterDelete =\n\t\t\t!customDeleteFn || customDeleteFn.executeMainFn;\n\t\tconst deleted =\n\t\t\tshouldRunAdapterDelete && entityToDelete\n\t\t\t\t? await (await getCurrentAdapter(adapter)).delete({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t})\n\t\t\t\t: customDeleted;\n\n\t\tif (entityToDelete) {\n\t\t\tfor (const hook of hooks || []) {\n\t\t\t\tconst toRun = hook[model]?.delete?.after;\n\t\t\t\tif (toRun) {\n\t\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\tawait toRun(entityToDelete as any, context);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn deleted;\n\t}\n\n\tasync function deleteManyWithHooks<T extends Record<string, any>>(\n\t\twhere: Where[],\n\t\tmodel: BaseModelNames,\n\t\tcustomDeleteFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (where: Where[]) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet entitiesToDelete: T[] = [];\n\n\t\ttry {\n\t\t\tentitiesToDelete = await (await getCurrentAdapter(adapter)).findMany<T>({\n\t\t\t\tmodel,\n\t\t\t\twhere,\n\t\t\t});\n\t\t} catch {\n\t\t\t// If we can't find the entities, we'll still proceed with deletion\n\t\t}\n\n\t\tfor (const entity of entitiesToDelete) {\n\t\t\tfor (const hook of hooks || []) {\n\t\t\t\tconst toRun = hook[model]?.delete?.before;\n\t\t\t\tif (toRun) {\n\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\tconst result = await toRun(entity as any, context);\n\t\t\t\t\tif (result === false) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst customDeleted = customDeleteFn\n\t\t\t? await customDeleteFn.fn(where)\n\t\t\t: null;\n\n\t\tconst deleted =\n\t\t\t!customDeleteFn || customDeleteFn.executeMainFn\n\t\t\t\t? await (await getCurrentAdapter(adapter)).deleteMany({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t})\n\t\t\t\t: customDeleted;\n\n\t\tfor (const entity of entitiesToDelete) {\n\t\t\tfor (const hook of hooks || []) {\n\t\t\t\tconst toRun = hook[model]?.delete?.after;\n\t\t\t\tif (toRun) {\n\t\t\t\t\t// Queue after hooks to run post-transaction\n\t\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\tawait toRun(entity as any, context);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn deleted;\n\t}\n\n\treturn {\n\t\tcreateWithHooks,\n\t\tupdateWithHooks,\n\t\tupdateManyWithHooks,\n\t\tdeleteWithHooks,\n\t\tdeleteManyWithHooks,\n\t};\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"with-hooks.mjs","names":[],"sources":["../../src/db/with-hooks.ts"],"sourcesContent":["import type { BetterAuthOptions } from \"@better-auth/core\";\nimport {\n\tgetCurrentAdapter,\n\tgetCurrentAuthContext,\n\tqueueAfterTransactionHook,\n} from \"@better-auth/core/context\";\nimport type { BaseModelNames } from \"@better-auth/core/db\";\nimport type { DBAdapter, Where } from \"@better-auth/core/db/adapter\";\nimport {\n\tATTR_CONTEXT,\n\tATTR_DB_COLLECTION_NAME,\n\tATTR_HOOK_TYPE,\n\twithSpan,\n} from \"@better-auth/core/instrumentation\";\n\nexport type DatabaseHooksEntry = {\n\tsource: string;\n\thooks: Exclude<BetterAuthOptions[\"databaseHooks\"], undefined>;\n};\n\nexport function getWithHooks(\n\tadapter: DBAdapter<BetterAuthOptions>,\n\tctx: {\n\t\toptions: BetterAuthOptions;\n\t\thooks: DatabaseHooksEntry[];\n\t},\n) {\n\tconst hooksEntries = ctx.hooks;\n\tasync function createWithHooks<T extends Record<string, any>>(\n\t\tdata: T,\n\t\tmodel: BaseModelNames,\n\t\tcustomCreateFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (data: Record<string, any>) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet actualData = data;\n\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\tconst toRun = hooks[model]?.create?.before;\n\t\t\tif (toRun) {\n\t\t\t\tconst result = await withSpan(\n\t\t\t\t\t`db create.before ${model}`,\n\t\t\t\t\t{\n\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"create.before\",\n\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t},\n\t\t\t\t\t() =>\n\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\ttoRun(actualData as any, context),\n\t\t\t\t);\n\t\t\t\tif (result === false) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst isObject = typeof result === \"object\" && \"data\" in result;\n\t\t\t\tif (isObject) {\n\t\t\t\t\tactualData = {\n\t\t\t\t\t\t...actualData,\n\t\t\t\t\t\t...result.data,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet created: any = null;\n\t\tif (!customCreateFn || customCreateFn.executeMainFn) {\n\t\t\tcreated = await (await getCurrentAdapter(adapter)).create<T>({\n\t\t\t\tmodel,\n\t\t\t\tdata: actualData as any,\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\t\t}\n\t\tif (customCreateFn?.fn) {\n\t\t\tcreated = await customCreateFn.fn(created ?? actualData);\n\t\t}\n\n\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\tconst toRun = hooks[model]?.create?.after;\n\t\t\tif (toRun) {\n\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\tawait withSpan(\n\t\t\t\t\t\t`db create.after ${model}`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"create.after\",\n\t\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\t\ttoRun(created as any, context),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn created;\n\t}\n\n\tasync function updateWithHooks<T extends Record<string, any>>(\n\t\tdata: any,\n\t\twhere: Where[],\n\t\tmodel: BaseModelNames,\n\t\tcustomUpdateFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (data: Record<string, any>) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet actualData = data;\n\n\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\tconst toRun = hooks[model]?.update?.before;\n\t\t\tif (toRun) {\n\t\t\t\tconst result = await withSpan(\n\t\t\t\t\t`db update.before ${model}`,\n\t\t\t\t\t{\n\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"update.before\",\n\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t},\n\t\t\t\t\t() =>\n\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\ttoRun(data as any, context),\n\t\t\t\t);\n\t\t\t\tif (result === false) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst isObject = typeof result === \"object\" && \"data\" in result;\n\t\t\t\tif (isObject) {\n\t\t\t\t\tactualData = {\n\t\t\t\t\t\t...actualData,\n\t\t\t\t\t\t...result.data,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst customUpdated = customUpdateFn\n\t\t\t? await customUpdateFn.fn(actualData)\n\t\t\t: null;\n\n\t\tconst updated =\n\t\t\t!customUpdateFn || customUpdateFn.executeMainFn\n\t\t\t\t? await (await getCurrentAdapter(adapter)).update<T>({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tupdate: actualData,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t})\n\t\t\t\t: customUpdated;\n\n\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\tconst toRun = hooks[model]?.update?.after;\n\t\t\tif (toRun) {\n\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\tawait withSpan(\n\t\t\t\t\t\t`db update.after ${model}`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"update.after\",\n\t\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\t\ttoRun(updated as any, context),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn updated;\n\t}\n\n\tasync function updateManyWithHooks<_T extends Record<string, any>>(\n\t\tdata: any,\n\t\twhere: Where[],\n\t\tmodel: BaseModelNames,\n\t\tcustomUpdateFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (data: Record<string, any>) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet actualData = data;\n\n\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\tconst toRun = hooks[model]?.update?.before;\n\t\t\tif (toRun) {\n\t\t\t\tconst result = await withSpan(\n\t\t\t\t\t`db updateMany.before ${model}`,\n\t\t\t\t\t{\n\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"updateMany.before\",\n\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t},\n\t\t\t\t\t() =>\n\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\ttoRun(data as any, context),\n\t\t\t\t);\n\t\t\t\tif (result === false) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst isObject = typeof result === \"object\" && \"data\" in result;\n\t\t\t\tif (isObject) {\n\t\t\t\t\tactualData = {\n\t\t\t\t\t\t...actualData,\n\t\t\t\t\t\t...result.data,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst customUpdated = customUpdateFn\n\t\t\t? await customUpdateFn.fn(actualData)\n\t\t\t: null;\n\n\t\tconst updated =\n\t\t\t!customUpdateFn || customUpdateFn.executeMainFn\n\t\t\t\t? await (await getCurrentAdapter(adapter)).updateMany({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tupdate: actualData,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t})\n\t\t\t\t: customUpdated;\n\n\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\tconst toRun = hooks[model]?.update?.after;\n\t\t\tif (toRun) {\n\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\tawait withSpan(\n\t\t\t\t\t\t`db updateMany.after ${model}`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"updateMany.after\",\n\t\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\t\ttoRun(updated as any, context),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn updated;\n\t}\n\n\tasync function deleteWithHooks<T extends Record<string, any>>(\n\t\twhere: Where[],\n\t\tmodel: BaseModelNames,\n\t\tcustomDeleteFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (where: Where[]) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet entityToDelete: T | null = null;\n\n\t\ttry {\n\t\t\tconst entities = await (await getCurrentAdapter(adapter)).findMany<T>({\n\t\t\t\tmodel,\n\t\t\t\twhere,\n\t\t\t\tlimit: 1,\n\t\t\t});\n\t\t\tentityToDelete = entities[0] || null;\n\t\t} catch {\n\t\t\t// If we can't find the entity, we'll still proceed with deletion\n\t\t}\n\n\t\tif (entityToDelete) {\n\t\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\t\tconst toRun = hooks[model]?.delete?.before;\n\t\t\t\tif (toRun) {\n\t\t\t\t\tconst result = await withSpan(\n\t\t\t\t\t\t`db delete.before ${model}`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"delete.before\",\n\t\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\t\ttoRun(entityToDelete as any, context),\n\t\t\t\t\t);\n\t\t\t\t\tif (result === false) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst customDeleted = customDeleteFn\n\t\t\t? await customDeleteFn.fn(where)\n\t\t\t: null;\n\n\t\tconst shouldRunAdapterDelete =\n\t\t\t!customDeleteFn || customDeleteFn.executeMainFn;\n\t\tconst deleted =\n\t\t\tshouldRunAdapterDelete && entityToDelete\n\t\t\t\t? await (await getCurrentAdapter(adapter)).delete({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t})\n\t\t\t\t: customDeleted;\n\n\t\tif (entityToDelete) {\n\t\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\t\tconst toRun = hooks[model]?.delete?.after;\n\t\t\t\tif (toRun) {\n\t\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\t\tawait withSpan(\n\t\t\t\t\t\t\t`db delete.after ${model}`,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"delete.after\",\n\t\t\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\t\t\ttoRun(entityToDelete as any, context),\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}\n\n\t\treturn deleted;\n\t}\n\n\tasync function deleteManyWithHooks<T extends Record<string, any>>(\n\t\twhere: Where[],\n\t\tmodel: BaseModelNames,\n\t\tcustomDeleteFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (where: Where[]) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet entitiesToDelete: T[] = [];\n\n\t\ttry {\n\t\t\tentitiesToDelete = await (await getCurrentAdapter(adapter)).findMany<T>({\n\t\t\t\tmodel,\n\t\t\t\twhere,\n\t\t\t});\n\t\t} catch {\n\t\t\t// If we can't find the entities, we'll still proceed with deletion\n\t\t}\n\n\t\tfor (const entity of entitiesToDelete) {\n\t\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\t\tconst toRun = hooks[model]?.delete?.before;\n\t\t\t\tif (toRun) {\n\t\t\t\t\tconst result = await withSpan(\n\t\t\t\t\t\t`db delete.before ${model}`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"delete.before\",\n\t\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\t\ttoRun(entity as any, context),\n\t\t\t\t\t);\n\t\t\t\t\tif (result === false) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst customDeleted = customDeleteFn\n\t\t\t? await customDeleteFn.fn(where)\n\t\t\t: null;\n\n\t\tconst deleted =\n\t\t\t!customDeleteFn || customDeleteFn.executeMainFn\n\t\t\t\t? await (await getCurrentAdapter(adapter)).deleteMany({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t})\n\t\t\t\t: customDeleted;\n\n\t\tfor (const entity of entitiesToDelete) {\n\t\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\t\tconst toRun = hooks[model]?.delete?.after;\n\t\t\t\tif (toRun) {\n\t\t\t\t\t// Queue after hooks to run post-transaction\n\t\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\t\tawait withSpan(\n\t\t\t\t\t\t\t`db delete.after ${model}`,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"delete.after\",\n\t\t\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\t\t\ttoRun(entity as any, context),\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}\n\n\t\treturn deleted;\n\t}\n\n\treturn {\n\t\tcreateWithHooks,\n\t\tupdateWithHooks,\n\t\tupdateManyWithHooks,\n\t\tdeleteWithHooks,\n\t\tdeleteManyWithHooks,\n\t};\n}\n"],"mappings":"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"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { __exportAll, __reExport } from "./_virtual/_rolldown/runtime.mjs";
|
|
2
1
|
import { HasRequiredKeys, Prettify, PrettifyDeep, RequiredKeysOf, StripEmptyObjects, UnionToIntersection } from "./types/helper.mjs";
|
|
3
2
|
import { BetterAuthClientOptions, BetterAuthClientPlugin, ClientAtomListener, ClientStore, InferActions, InferAdditionalFromClient, InferClientAPI, InferErrorCodes, InferSessionFromClient, InferUserFromClient, IsSignal, SessionQueryParams } from "./client/types.mjs";
|
|
4
3
|
import { DBAdapter, DBAdapterInstance, DBAdapterSchemaCreation, DBTransactionAdapter, JoinConfig, JoinOption, Where } from "./types/adapter.mjs";
|
|
@@ -12,7 +11,6 @@ import { generateState, parseState } from "./oauth2/state.mjs";
|
|
|
12
11
|
import { StateData, generateGenericState, parseGenericState } from "./state.mjs";
|
|
13
12
|
import { HIDE_METADATA } from "./utils/hide-metadata.mjs";
|
|
14
13
|
import { getBaseURL, getHost, getHostFromRequest, getOrigin, getProtocol, getProtocolFromRequest, isDynamicBaseURLConfig, matchesHostPattern, resolveBaseURL, resolveDynamicBaseURL } from "./utils/url.mjs";
|
|
15
|
-
import "./utils/index.mjs";
|
|
16
14
|
import { APIError } from "./api/index.mjs";
|
|
17
15
|
import { StandardSchemaV1 } from "@better-auth/core";
|
|
18
16
|
import { getCurrentAdapter } from "@better-auth/core/context";
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { Subset } from "../../access/types.mjs";
|
|
2
2
|
import { AuthorizeResponse } from "../../access/access.mjs";
|
|
3
|
-
import "../../index.mjs";
|
|
4
|
-
|
|
5
3
|
//#region src/plugins/admin/access/statement.d.ts
|
|
6
4
|
declare const defaultStatements: {
|
|
7
5
|
readonly user: readonly ["create", "list", "set-role", "ban", "impersonate", "impersonate-admins", "delete", "set-password", "get", "update"];
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { AccessControl, ArrayElement, Statements } from "../access/types.mjs";
|
|
2
2
|
import { AdminOptions, InferAdminRolesFromOption, SessionWithImpersonatedBy, UserWithRole } from "./types.mjs";
|
|
3
|
-
import "../index.mjs";
|
|
4
3
|
import * as _better_auth_core0 from "@better-auth/core";
|
|
5
4
|
import * as _better_auth_core_utils_error_codes0 from "@better-auth/core/utils/error-codes";
|
|
6
5
|
import * as better_call0 from "better-call";
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { AccessControl, ArrayElement, Role, Statements } from "../access/types.mjs";
|
|
2
|
-
import "../access/index.mjs";
|
|
3
2
|
import { AdminOptions, InferAdminRolesFromOption, SessionWithImpersonatedBy, UserWithRole } from "./types.mjs";
|
|
4
3
|
import { admin } from "./admin.mjs";
|
|
5
|
-
import "../index.mjs";
|
|
6
4
|
import { ADMIN_ERROR_CODES } from "./error-codes.mjs";
|
|
7
5
|
import * as _better_auth_core_utils_error_codes0 from "@better-auth/core/utils/error-codes";
|
|
8
6
|
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { Session, User } from "../../types/models.mjs";
|
|
2
2
|
import { InferOptionSchema } from "../../types/plugins.mjs";
|
|
3
|
-
import "../../types/index.mjs";
|
|
4
3
|
import { AccessControl, Role } from "../access/types.mjs";
|
|
5
|
-
import "../access/index.mjs";
|
|
6
4
|
import { AdminSchema } from "./schema.mjs";
|
|
7
5
|
|
|
8
6
|
//#region src/plugins/admin/types.d.ts
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Session, User } from "../../types/models.mjs";
|
|
2
2
|
import { InferOptionSchema } from "../../types/plugins.mjs";
|
|
3
|
-
import "../../types/index.mjs";
|
|
4
3
|
import { schema } from "./schema.mjs";
|
|
5
4
|
import { AuthContext, Awaitable, GenericEndpointContext } from "@better-auth/core";
|
|
6
5
|
import { EndpointContext } from "better-call";
|