better-auth 0.7.1-beta.3 → 0.7.1-beta.5
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/adapters/drizzle.cjs +1 -168
- package/dist/adapters/drizzle.d.cts +2 -2
- package/dist/adapters/drizzle.d.ts +2 -2
- package/dist/adapters/drizzle.js +1 -168
- package/dist/adapters/kysely.cjs +1 -9
- package/dist/adapters/kysely.d.cts +2 -2
- package/dist/adapters/kysely.d.ts +2 -2
- package/dist/adapters/kysely.js +1 -9
- package/dist/adapters/mongodb.cjs +1 -140
- package/dist/adapters/mongodb.d.cts +7092 -3
- package/dist/adapters/mongodb.d.ts +7092 -3
- package/dist/adapters/mongodb.js +1 -140
- package/dist/adapters/prisma.cjs +1 -132
- package/dist/adapters/prisma.d.cts +2 -2
- package/dist/adapters/prisma.d.ts +2 -2
- package/dist/adapters/prisma.js +1 -132
- package/dist/api.cjs +1 -81
- package/dist/api.d.cts +2 -2
- package/dist/api.d.ts +2 -2
- package/dist/api.js +1 -81
- package/dist/{auth-Clegl4dW.d.cts → auth-BYO4oVzl.d.cts} +16 -21
- package/dist/{auth-fiexy-Ap.d.ts → auth-Dhq27-3h.d.ts} +16 -21
- package/dist/chunk-3YGH2GCB.js +1 -0
- package/dist/{chunk-FV4R54EK.cjs → chunk-56BTYW2N.cjs} +1 -1
- package/dist/chunk-BHZNUXMD.js +3 -0
- package/dist/{chunk-3KYGESZG.js → chunk-BVYORMLZ.js} +1 -1
- package/dist/{chunk-4CXW2HSQ.cjs → chunk-EZ64AWBE.cjs} +1 -1
- package/dist/chunk-G6KW3IG2.cjs +1 -0
- package/dist/chunk-GR5EVNV5.cjs +3 -0
- package/dist/chunk-JXET6I3M.cjs +1 -0
- package/dist/{chunk-ECKSI3LF.js → chunk-LG3F6WBM.js} +1 -1
- package/dist/{chunk-4KD3N77Y.js → chunk-M26TYKA4.js} +4 -4
- package/dist/{chunk-RTFC3YX2.cjs → chunk-O4T6PURK.cjs} +4 -4
- package/dist/{chunk-CX4OQU4M.js → chunk-OCQXQI2B.js} +1 -1
- package/dist/{chunk-VCUBHXZJ.js → chunk-PIOOI3LE.js} +1 -1
- package/dist/chunk-PZNLZ2U5.js +1 -0
- package/dist/{chunk-UOTC7PMK.cjs → chunk-VRN7JXUC.cjs} +1 -1
- package/dist/{chunk-NA5JFN3P.cjs → chunk-XFBOWZRM.cjs} +1 -1
- package/dist/client/plugins.cjs +1 -210
- package/dist/client/plugins.d.cts +5 -5
- package/dist/client/plugins.d.ts +5 -5
- package/dist/client/plugins.js +1 -210
- package/dist/client.cjs +1 -15
- package/dist/client.d.cts +2 -2
- package/dist/client.d.ts +2 -2
- package/dist/client.js +1 -15
- package/dist/cookies.cjs +1 -19
- package/dist/cookies.d.cts +2 -2
- package/dist/cookies.d.ts +2 -2
- package/dist/cookies.js +1 -19
- package/dist/crypto.cjs +1 -35
- package/dist/crypto.js +1 -35
- package/dist/db.cjs +1 -32
- package/dist/db.d.cts +3 -3
- package/dist/db.d.ts +3 -3
- package/dist/db.js +1 -32
- package/dist/{index-BwRLAahA.d.ts → index-CoWW39cW.d.ts} +123 -12
- package/dist/{index-vi0Dko6t.d.cts → index-D2xgatRc.d.cts} +123 -12
- package/dist/index.cjs +1 -254
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1 -254
- package/dist/next-js.cjs +1 -14
- package/dist/next-js.js +1 -14
- package/dist/node.cjs +1 -23
- package/dist/node.d.cts +2 -2
- package/dist/node.d.ts +2 -2
- package/dist/node.js +1 -23
- package/dist/oauth2.cjs +1 -22
- package/dist/oauth2.d.cts +3 -3
- package/dist/oauth2.d.ts +3 -3
- package/dist/oauth2.js +1 -22
- package/dist/plugins.cjs +2 -4659
- package/dist/plugins.d.cts +5 -5
- package/dist/plugins.d.ts +5 -5
- package/dist/plugins.js +2 -4659
- package/dist/react.cjs +1 -51
- package/dist/react.d.cts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/react.js +1 -51
- package/dist/social.cjs +1 -39
- package/dist/social.js +1 -39
- package/dist/solid-start.cjs +1 -14
- package/dist/solid-start.d.cts +2 -2
- package/dist/solid-start.d.ts +2 -2
- package/dist/solid-start.js +1 -14
- package/dist/solid.cjs +1 -45
- package/dist/solid.d.cts +7 -3
- package/dist/solid.d.ts +7 -3
- package/dist/solid.js +1 -45
- package/dist/{state-C0fWhgUT.d.cts → state-B5cXxYBw.d.cts} +5 -2
- package/dist/{state-DdkSSZ5k.d.ts → state-DKkih1Nb.d.ts} +5 -2
- package/dist/svelte-kit.cjs +1 -38
- package/dist/svelte-kit.d.cts +2 -2
- package/dist/svelte-kit.d.ts +2 -2
- package/dist/svelte-kit.js +1 -38
- package/dist/svelte.cjs +1 -44
- package/dist/svelte.d.cts +2 -2
- package/dist/svelte.d.ts +2 -2
- package/dist/svelte.js +1 -44
- package/dist/types.cjs +1 -2
- package/dist/types.d.cts +3 -3
- package/dist/types.d.ts +3 -3
- package/dist/types.js +1 -2
- package/dist/vue.cjs +1 -66
- package/dist/vue.d.cts +1409 -5
- package/dist/vue.d.ts +1409 -5
- package/dist/vue.js +1 -66
- package/package.json +180 -72
- package/dist/adapters/drizzle.cjs.map +0 -1
- package/dist/adapters/drizzle.js.map +0 -1
- package/dist/adapters/kysely.cjs.map +0 -1
- package/dist/adapters/kysely.js.map +0 -1
- package/dist/adapters/mongodb.cjs.map +0 -1
- package/dist/adapters/mongodb.js.map +0 -1
- package/dist/adapters/prisma.cjs.map +0 -1
- package/dist/adapters/prisma.js.map +0 -1
- package/dist/api.cjs.map +0 -1
- package/dist/api.js.map +0 -1
- package/dist/chunk-3DABXBNB.js +0 -282
- package/dist/chunk-3DABXBNB.js.map +0 -1
- package/dist/chunk-4CQRLFDN.js +0 -47
- package/dist/chunk-4CQRLFDN.js.map +0 -1
- package/dist/chunk-4DCNB6OE.js +0 -3
- package/dist/chunk-4LSFAAZW.js +0 -1
- package/dist/chunk-4LSFAAZW.js.map +0 -1
- package/dist/chunk-4O5CM5CV.cjs +0 -47
- package/dist/chunk-4O5CM5CV.cjs.map +0 -1
- package/dist/chunk-4UOL2GR4.cjs +0 -23
- package/dist/chunk-4UOL2GR4.cjs.map +0 -1
- package/dist/chunk-5XCPVMZU.js +0 -276
- package/dist/chunk-5XCPVMZU.js.map +0 -1
- package/dist/chunk-6WF4N6YK.cjs +0 -2112
- package/dist/chunk-6WF4N6YK.cjs.map +0 -1
- package/dist/chunk-7QMWCIKA.cjs +0 -39
- package/dist/chunk-7QMWCIKA.cjs.map +0 -1
- package/dist/chunk-7S233WKF.cjs +0 -53
- package/dist/chunk-7S233WKF.cjs.map +0 -1
- package/dist/chunk-ACIPPPH7.js +0 -39
- package/dist/chunk-ACIPPPH7.js.map +0 -1
- package/dist/chunk-BCPAHBK6.cjs +0 -9
- package/dist/chunk-BCPAHBK6.cjs.map +0 -1
- package/dist/chunk-BL5VP5GZ.cjs +0 -60
- package/dist/chunk-BL5VP5GZ.cjs.map +0 -1
- package/dist/chunk-BMC4BVAH.js +0 -198
- package/dist/chunk-BMC4BVAH.js.map +0 -1
- package/dist/chunk-CXXEVYAT.cjs +0 -18
- package/dist/chunk-CXXEVYAT.cjs.map +0 -1
- package/dist/chunk-D5M6WJ2A.cjs +0 -751
- package/dist/chunk-D5M6WJ2A.cjs.map +0 -1
- package/dist/chunk-FFH4Z67Z.cjs +0 -45
- package/dist/chunk-FFH4Z67Z.cjs.map +0 -1
- package/dist/chunk-G4HNVD4Y.js +0 -151
- package/dist/chunk-G4HNVD4Y.js.map +0 -1
- package/dist/chunk-GXHB7XZT.cjs +0 -276
- package/dist/chunk-GXHB7XZT.cjs.map +0 -1
- package/dist/chunk-HJBRDRCG.cjs +0 -36
- package/dist/chunk-HJBRDRCG.cjs.map +0 -1
- package/dist/chunk-HQJTAUZE.cjs +0 -1
- package/dist/chunk-KLAIMH5Z.js +0 -9
- package/dist/chunk-KLAIMH5Z.js.map +0 -1
- package/dist/chunk-KY7ED5I7.cjs +0 -3
- package/dist/chunk-LXL7WUAT.js +0 -1
- package/dist/chunk-M3DA5GU5.js +0 -60
- package/dist/chunk-M3DA5GU5.js.map +0 -1
- package/dist/chunk-MKM4WBWC.cjs +0 -331
- package/dist/chunk-MKM4WBWC.cjs.map +0 -1
- package/dist/chunk-MTZRVGEF.cjs +0 -151
- package/dist/chunk-MTZRVGEF.cjs.map +0 -1
- package/dist/chunk-O63RY6PO.js +0 -53
- package/dist/chunk-O63RY6PO.js.map +0 -1
- package/dist/chunk-OHAZSKMN.js +0 -36
- package/dist/chunk-OHAZSKMN.js.map +0 -1
- package/dist/chunk-OSCVTNMU.js +0 -42
- package/dist/chunk-OSCVTNMU.js.map +0 -1
- package/dist/chunk-QG6ADTFG.js +0 -45
- package/dist/chunk-QG6ADTFG.js.map +0 -1
- package/dist/chunk-QHREMIUB.js +0 -23
- package/dist/chunk-QHREMIUB.js.map +0 -1
- package/dist/chunk-R3AZFFUZ.cjs +0 -42
- package/dist/chunk-R3AZFFUZ.cjs.map +0 -1
- package/dist/chunk-R6WU2STT.js +0 -751
- package/dist/chunk-R6WU2STT.js.map +0 -1
- package/dist/chunk-RWLFIPR5.js +0 -122
- package/dist/chunk-RWLFIPR5.js.map +0 -1
- package/dist/chunk-S2A33E6V.cjs +0 -282
- package/dist/chunk-S2A33E6V.cjs.map +0 -1
- package/dist/chunk-S3PFIC72.cjs +0 -122
- package/dist/chunk-S3PFIC72.cjs.map +0 -1
- package/dist/chunk-SNTVJM3F.js +0 -1141
- package/dist/chunk-SNTVJM3F.js.map +0 -1
- package/dist/chunk-SULZDCPX.cjs +0 -1141
- package/dist/chunk-SULZDCPX.cjs.map +0 -1
- package/dist/chunk-TCHOIK53.cjs +0 -1
- package/dist/chunk-TCHOIK53.cjs.map +0 -1
- package/dist/chunk-WANG2DRW.js +0 -2112
- package/dist/chunk-WANG2DRW.js.map +0 -1
- package/dist/chunk-Y64UTTIO.js +0 -18
- package/dist/chunk-Y64UTTIO.js.map +0 -1
- package/dist/chunk-YVZFJF7J.cjs +0 -198
- package/dist/chunk-YVZFJF7J.cjs.map +0 -1
- package/dist/chunk-YWR7GY7E.js +0 -331
- package/dist/chunk-YWR7GY7E.js.map +0 -1
- package/dist/client/plugins.cjs.map +0 -1
- package/dist/client/plugins.js.map +0 -1
- package/dist/client.cjs.map +0 -1
- package/dist/client.js.map +0 -1
- package/dist/cookies.cjs.map +0 -1
- package/dist/cookies.js.map +0 -1
- package/dist/crypto.cjs.map +0 -1
- package/dist/crypto.js.map +0 -1
- package/dist/db.cjs.map +0 -1
- package/dist/db.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/next-js.cjs.map +0 -1
- package/dist/next-js.js.map +0 -1
- package/dist/node.cjs.map +0 -1
- package/dist/node.js.map +0 -1
- package/dist/oauth2.cjs.map +0 -1
- package/dist/oauth2.js.map +0 -1
- package/dist/plugins.cjs.map +0 -1
- package/dist/plugins.js.map +0 -1
- package/dist/react.cjs.map +0 -1
- package/dist/react.js.map +0 -1
- package/dist/social.cjs.map +0 -1
- package/dist/social.js.map +0 -1
- package/dist/solid-start.cjs.map +0 -1
- package/dist/solid-start.js.map +0 -1
- package/dist/solid.cjs.map +0 -1
- package/dist/solid.js.map +0 -1
- package/dist/svelte-kit.cjs.map +0 -1
- package/dist/svelte-kit.js.map +0 -1
- package/dist/svelte.cjs.map +0 -1
- package/dist/svelte.js.map +0 -1
- package/dist/types.cjs.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/vue.cjs.map +0 -1
- package/dist/vue.js.map +0 -1
package/dist/plugins.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/organization/organization.ts","../src/utils/shim.ts","../src/plugins/organization/adapter.ts","../src/plugins/organization/call.ts","../src/plugins/organization/routes/crud-invites.ts","../src/plugins/organization/schema.ts","../src/plugins/organization/routes/crud-members.ts","../src/plugins/organization/routes/crud-org.ts","../src/plugins/two-factor/index.ts","../src/plugins/two-factor/backup-codes/index.ts","../src/plugins/two-factor/verify-middleware.ts","../src/plugins/two-factor/constant.ts","../src/plugins/two-factor/otp/index.ts","../src/plugins/two-factor/totp/index.ts","../src/plugins/passkey/index.ts","../src/plugins/username/index.ts","../src/plugins/bearer/index.ts","../src/plugins/magic-link/index.ts","../src/plugins/phone-number/index.ts","../src/plugins/anonymous/index.ts","../src/plugins/admin/index.ts","../src/plugins/generic-oauth/index.ts","../src/plugins/jwt/schema.ts","../src/plugins/jwt/adapter.ts","../src/plugins/jwt/index.ts","../src/plugins/multi-session/index.ts","../src/plugins/email-otp/index.ts"],"sourcesContent":["import { APIError } from \"better-call\";\nimport {\n\ttype ZodArray,\n\ttype ZodLiteral,\n\ttype ZodObject,\n\ttype ZodOptional,\n\tz,\n} from \"zod\";\nimport type { User } from \"../../db/schema\";\nimport { createAuthEndpoint } from \"../../api/call\";\nimport { getSessionFromCtx } from \"../../api/routes\";\nimport type { AuthContext } from \"../../init\";\nimport type { BetterAuthPlugin } from \"../../types/plugins\";\nimport { shimContext } from \"../../utils/shim\";\nimport {\n\ttype AccessControl,\n\ttype Role,\n\tdefaultRoles,\n\ttype defaultStatements,\n} from \"../access\";\nimport { getOrgAdapter } from \"./adapter\";\nimport { orgSessionMiddleware } from \"./call\";\nimport {\n\tacceptInvitation,\n\tcancelInvitation,\n\tcreateInvitation,\n\tgetInvitation,\n\trejectInvitation,\n} from \"./routes/crud-invites\";\nimport { removeMember, updateMemberRole } from \"./routes/crud-members\";\nimport {\n\tcreateOrganization,\n\tdeleteOrganization,\n\tgetFullOrganization,\n\tlistOrganization,\n\tsetActiveOrganization,\n\tupdateOrganization,\n} from \"./routes/crud-org\";\nimport type { Invitation, Member, Organization } from \"./schema\";\nimport type { Prettify } from \"../../types/helper\";\n\nexport interface OrganizationOptions {\n\t/**\n\t * Configure whether new users are able to create new organizations.\n\t * You can also pass a function that returns a boolean.\n\t *\n\t * \t@example\n\t * ```ts\n\t * allowUserToCreateOrganization: async (user) => {\n\t * \t\tconst plan = await getUserPlan(user);\n\t * return plan.name === \"pro\";\n\t * }\n\t * ```\n\t * @default true\n\t */\n\tallowUserToCreateOrganization?:\n\t\t| boolean\n\t\t| ((user: User) => Promise<boolean> | boolean);\n\t/**\n\t * The maximum number of organizations a user can create.\n\t *\n\t * You can also pass a function that returns a boolean\n\t */\n\torganizationLimit?: number | ((user: User) => Promise<boolean> | boolean);\n\t/**\n\t * The role that is assigned to the creator of the organization.\n\t *\n\t * @default \"admin\"\n\t */\n\tcreatorRole?: \"admin\" | \"owner\";\n\t/**\n\t * The number of memberships a user can have in an organization.\n\t *\n\t * @default \"unlimited\"\n\t */\n\tmembershipLimit?: number;\n\t/**\n\t * Configure the roles and permissions for the organization plugin.\n\t *\n\t */\n\tac?: AccessControl;\n\t/**\n\t * Custom permissions for roles.\n\t */\n\troles?: {\n\t\t[key in \"admin\" | \"member\" | \"owner\"]?: Role<any>;\n\t};\n\t/**\n\t * The expiration time for the invitation link.\n\t *\n\t * @default 48 hours\n\t */\n\tinvitationExpiresIn?: number;\n\t/**\n\t * Send an email with the\n\t * invitation link to the user.\n\t *\n\t * Note: Better Auth doesn't\n\t * generate invitation URLs.\n\t * You'll need to construct the\n\t * URL using the invitation ID\n\t * and pass it to the\n\t * acceptInvitation endpoint for\n\t * the user to accept the\n\t * invitation.\n\t *\n\t * @example\n\t * ```ts\n\t * sendInvitationEmail: async (data) => {\n\t * \tconst url = `https://yourapp.com/organization/\n\t * accept-invitation?id=${data.id}`;\n\t * \tawait sendEmail(data.email, \"Invitation to join\n\t * organization\", `Click the link to join the\n\t * organization: ${url}`);\n\t * }\n\t * ```\n\t */\n\tsendInvitationEmail?: (\n\t\tdata: {\n\t\t\t/**\n\t\t\t * the invitation id\n\t\t\t */\n\t\t\tid: string;\n\t\t\t/**\n\t\t\t * the role of the user\n\t\t\t */\n\t\t\trole: \"admin\" | \"owner\" | \"member\";\n\t\t\t/**\n\t\t\t * the email of the user\n\t\t\t */\n\t\t\temail: string;\n\t\t\t/**\n\t\t\t * the organization the user is invited to\n\t\t\t */\n\t\t\torganization: Organization;\n\t\t\t/**\n\t\t\t * the member who is inviting the user\n\t\t\t */\n\t\t\tinviter: Member & {\n\t\t\t\tuser: User;\n\t\t\t};\n\t\t},\n\t\t/**\n\t\t * The request object\n\t\t */\n\t\trequest?: Request,\n\t) => Promise<void>;\n}\n/**\n * Organization plugin for Better Auth. Organization allows you to create teams, members,\n * and manage access control for your users.\n *\n * @example\n * ```ts\n * const auth = createAuth({\n * \tplugins: [\n * \t\torganization({\n * \t\t\tallowUserToCreateOrganization: true,\n * \t\t}),\n * \t],\n * });\n * ```\n */\nexport const organization = <O extends OrganizationOptions>(options?: O) => {\n\tconst endpoints = {\n\t\tcreateOrganization,\n\t\tupdateOrganization,\n\t\tdeleteOrganization,\n\t\tsetActiveOrganization,\n\t\tgetFullOrganization,\n\t\tlistOrganization,\n\t\tcreateInvitation,\n\t\tcancelInvitation,\n\t\tacceptInvitation,\n\t\tgetInvitation,\n\t\trejectInvitation,\n\t\tremoveMember,\n\t\tupdateMemberRole,\n\t};\n\n\tconst roles = {\n\t\t...defaultRoles,\n\t\t...options?.roles,\n\t};\n\n\tconst api = shimContext(endpoints, {\n\t\torgOptions: options || {},\n\t\troles,\n\t\tgetSession: async (context: AuthContext) => {\n\t\t\t//@ts-expect-error\n\t\t\treturn await getSessionFromCtx(context);\n\t\t},\n\t});\n\n\ttype DefaultStatements = typeof defaultStatements;\n\ttype Statements = O[\"ac\"] extends AccessControl<infer S>\n\t\t? S extends Record<string, any>\n\t\t\t? S & DefaultStatements\n\t\t\t: DefaultStatements\n\t\t: DefaultStatements;\n\treturn {\n\t\tid: \"organization\",\n\t\tendpoints: {\n\t\t\t...api,\n\t\t\thasPermission: createAuthEndpoint(\n\t\t\t\t\"/organization/has-permission\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\trequireHeaders: true,\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tpermission: z.record(z.string(), z.array(z.string())),\n\t\t\t\t\t}) as unknown as ZodObject<{\n\t\t\t\t\t\tpermission: ZodObject<{\n\t\t\t\t\t\t\t[key in keyof Statements]: ZodOptional<\n\t\t\t\t\t\t\t\t//@ts-expect-error TODO: fix this\n\t\t\t\t\t\t\t\tZodArray<ZodLiteral<Statements[key][number]>>\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\tuse: [orgSessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tif (!ctx.context.session.session.activeOrganizationId) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"No active organization\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst adapter = getOrgAdapter(ctx.context);\n\t\t\t\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\t\t\t\tuserId: ctx.context.session.user.id,\n\t\t\t\t\t\torganizationId:\n\t\t\t\t\t\t\tctx.context.session.session.activeOrganizationId || \"\",\n\t\t\t\t\t});\n\t\t\t\t\tif (!member) {\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"You are not a member of this organization\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst role = roles[member.role];\n\t\t\t\t\tconst result = role.authorize(ctx.body.permission as any);\n\t\t\t\t\tif (result.error) {\n\t\t\t\t\t\treturn ctx.json(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\terror: result.error,\n\t\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstatus: 403,\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 ctx.json({\n\t\t\t\t\t\terror: null,\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t},\n\t\tschema: {\n\t\t\tsession: {\n\t\t\t\tfields: {\n\t\t\t\t\tactiveOrganizationId: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\torganization: {\n\t\t\t\tfields: {\n\t\t\t\t\tname: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t},\n\t\t\t\t\tslug: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tunique: true,\n\t\t\t\t\t},\n\t\t\t\t\tlogo: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t},\n\t\t\t\t\tcreatedAt: {\n\t\t\t\t\t\ttype: \"date\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t},\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tmember: {\n\t\t\t\tfields: {\n\t\t\t\t\torganizationId: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\treferences: {\n\t\t\t\t\t\t\tmodel: \"organization\",\n\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tuserId: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t},\n\t\t\t\t\temail: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t},\n\t\t\t\t\trole: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\tdefaultValue: \"member\",\n\t\t\t\t\t},\n\t\t\t\t\tcreatedAt: {\n\t\t\t\t\t\ttype: \"date\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tinvitation: {\n\t\t\t\tfields: {\n\t\t\t\t\torganizationId: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\treferences: {\n\t\t\t\t\t\t\tmodel: \"organization\",\n\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\temail: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t},\n\t\t\t\t\trole: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t},\n\t\t\t\t\tstatus: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\tdefaultValue: \"pending\",\n\t\t\t\t\t},\n\t\t\t\t\texpiresAt: {\n\t\t\t\t\t\ttype: \"date\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t},\n\t\t\t\t\tinviterId: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\treferences: {\n\t\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t$Infer: {\n\t\t\tOrganization: {} as Organization,\n\t\t\tInvitation: {} as Invitation,\n\t\t\tMember: {} as Member,\n\t\t\tActiveOrganization: {} as Prettify<\n\t\t\t\tOrganization & {\n\t\t\t\t\tmembers: Prettify<\n\t\t\t\t\t\tMember & {\n\t\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\t\tid: string;\n\t\t\t\t\t\t\t\tname: string;\n\t\t\t\t\t\t\t\temail: string;\n\t\t\t\t\t\t\t\timage: string;\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\tinvitations: Invitation[];\n\t\t\t\t}\n\t\t\t>,\n\t\t},\n\t} satisfies BetterAuthPlugin;\n};\n","import type { AuthContext } from \"../init\";\n\nexport const shimContext = <T extends Record<string, any>>(\n\toriginalObject: T,\n\tnewContext: Record<string, any>,\n) => {\n\tconst shimmedObj: Record<string, any> = {};\n\tfor (const [key, value] of Object.entries(originalObject)) {\n\t\tshimmedObj[key] = (ctx: Record<string, any>) => {\n\t\t\treturn value({\n\t\t\t\t...ctx,\n\t\t\t\tcontext: {\n\t\t\t\t\t...newContext,\n\t\t\t\t\t...ctx.context,\n\t\t\t\t},\n\t\t\t});\n\t\t};\n\t\tshimmedObj[key].path = value.path;\n\t\tshimmedObj[key].method = value.method;\n\t\tshimmedObj[key].options = value.options;\n\t\tshimmedObj[key].headers = value.headers;\n\t}\n\treturn shimmedObj as T;\n};\n\nexport const shimEndpoint = (ctx: AuthContext, value: any) => {\n\treturn async (context: any) => {\n\t\tfor (const plugin of ctx.options.plugins || []) {\n\t\t\tif (plugin.hooks?.before) {\n\t\t\t\tfor (const hook of plugin.hooks.before) {\n\t\t\t\t\tconst match = hook.matcher({\n\t\t\t\t\t\t...context,\n\t\t\t\t\t\t...value,\n\t\t\t\t\t});\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tconst hookRes = await hook.handler(context);\n\t\t\t\t\t\tif (hookRes && \"context\" in hookRes) {\n\t\t\t\t\t\t\tcontext = {\n\t\t\t\t\t\t\t\t...context,\n\t\t\t\t\t\t\t\t...hookRes.context,\n\t\t\t\t\t\t\t\t...value,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t//@ts-ignore\n\t\tconst endpointRes = value({\n\t\t\t...context,\n\t\t\tcontext: {\n\t\t\t\t...ctx,\n\t\t\t\t...context.context,\n\t\t\t},\n\t\t});\n\t\tlet response = endpointRes;\n\t\tfor (const plugin of ctx.options.plugins || []) {\n\t\t\tif (plugin.hooks?.after) {\n\t\t\t\tfor (const hook of plugin.hooks.after) {\n\t\t\t\t\tconst match = hook.matcher(context);\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\tconst obj = Object.assign(context, {\n\t\t\t\t\t\t\treturned: endpointRes,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst hookRes = await hook.handler(obj);\n\t\t\t\t\t\tif (hookRes && \"response\" in hookRes) {\n\t\t\t\t\t\t\tresponse = hookRes.response as any;\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\t\treturn response;\n\t};\n};\n","import type { Kysely } from \"kysely\";\nimport type { Session, User } from \"../../db/schema\";\nimport { getDate } from \"../../utils/date\";\nimport { generateId } from \"../../utils/id\";\nimport type { OrganizationOptions } from \"./organization\";\nimport type { Invitation, Member, Organization } from \"./schema\";\nimport { BetterAuthError } from \"../../error\";\nimport type { AuthContext } from \"../../types\";\n\nexport const getOrgAdapter = (\n\tcontext: AuthContext,\n\toptions?: OrganizationOptions,\n) => {\n\tconst adapter = context.adapter;\n\treturn {\n\t\tfindOrganizationBySlug: async (slug: string) => {\n\t\t\tconst organization = await adapter.findOne<Organization>({\n\t\t\t\tmodel: \"organization\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"slug\",\n\t\t\t\t\t\tvalue: slug,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn organization;\n\t\t},\n\t\tcreateOrganization: async (data: {\n\t\t\torganization: Organization;\n\t\t\tuser: User;\n\t\t}) => {\n\t\t\tconst organization = await adapter.create<Organization>({\n\t\t\t\tmodel: \"organization\",\n\t\t\t\tdata: {\n\t\t\t\t\t...data.organization,\n\t\t\t\t\tmetadata: data.organization.metadata\n\t\t\t\t\t\t? JSON.stringify(data.organization.metadata)\n\t\t\t\t\t\t: undefined,\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst member = await adapter.create<Member>({\n\t\t\t\tmodel: \"member\",\n\t\t\t\tdata: {\n\t\t\t\t\tid: generateId(),\n\t\t\t\t\torganizationId: organization.id,\n\t\t\t\t\tuserId: data.user.id,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\temail: data.user.email,\n\t\t\t\t\trole: options?.creatorRole || \"owner\",\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn {\n\t\t\t\t...organization,\n\t\t\t\tmetadata: organization.metadata\n\t\t\t\t\t? JSON.parse(organization.metadata)\n\t\t\t\t\t: undefined,\n\t\t\t\tmembers: [\n\t\t\t\t\t{\n\t\t\t\t\t\t...member,\n\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\tid: data.user.id,\n\t\t\t\t\t\t\tname: data.user.name,\n\t\t\t\t\t\t\temail: data.user.email,\n\t\t\t\t\t\t\timage: data.user.image,\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\t\tfindMemberByEmail: async (data: {\n\t\t\temail: string;\n\t\t\torganizationId: string;\n\t\t}) => {\n\t\t\tconst member = await adapter.findOne<Member>({\n\t\t\t\tmodel: \"member\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: data.email,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"organizationId\",\n\t\t\t\t\t\tvalue: data.organizationId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tif (!member) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst user = await adapter.findOne<User>({\n\t\t\t\tmodel: context.tables.user.tableName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: member.userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tif (!user) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...member,\n\t\t\t\tuser: {\n\t\t\t\t\tid: user.id,\n\t\t\t\t\tname: user.name,\n\t\t\t\t\temail: user.email,\n\t\t\t\t\timage: user.image,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\tfindMemberByOrgId: async (data: {\n\t\t\tuserId: string;\n\t\t\torganizationId: string;\n\t\t}) => {\n\t\t\tconst [member, user] = await Promise.all([\n\t\t\t\tawait adapter.findOne<Member>({\n\t\t\t\t\tmodel: \"member\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\t\tvalue: data.userId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"organizationId\",\n\t\t\t\t\t\t\tvalue: data.organizationId,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t}),\n\t\t\t\tawait adapter.findOne<User>({\n\t\t\t\t\tmodel: context.tables.user.tableName,\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\tvalue: data.userId,\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\tif (!user || !member) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...member,\n\t\t\t\tuser: {\n\t\t\t\t\tid: user.id,\n\t\t\t\t\tname: user.name,\n\t\t\t\t\temail: user.email,\n\t\t\t\t\timage: user.image,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\tfindMemberById: async (memberId: string) => {\n\t\t\tconst member = await adapter.findOne<Member>({\n\t\t\t\tmodel: \"member\",\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: memberId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tif (!member) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst user = await adapter.findOne<User>({\n\t\t\t\tmodel: context.tables.user.tableName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: member.userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tif (!user) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...member,\n\t\t\t\tuser: {\n\t\t\t\t\tid: user.id,\n\t\t\t\t\tname: user.name,\n\t\t\t\t\temail: user.email,\n\t\t\t\t\timage: user.image,\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\tcreateMember: async (data: Member) => {\n\t\t\tconst member = await adapter.create<Member>({\n\t\t\t\tmodel: \"member\",\n\t\t\t\tdata: data,\n\t\t\t});\n\t\t\treturn member;\n\t\t},\n\t\tupdateMember: async (memberId: string, role: string) => {\n\t\t\tconst member = await adapter.update<Member>({\n\t\t\t\tmodel: \"member\",\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: memberId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tupdate: {\n\t\t\t\t\trole,\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn member;\n\t\t},\n\t\tdeleteMember: async (memberId: string) => {\n\t\t\tconst member = await adapter.delete<Member>({\n\t\t\t\tmodel: \"member\",\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: memberId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn member;\n\t\t},\n\t\tupdateOrganization: async (orgId: string, data: Partial<Organization>) => {\n\t\t\tconst organization = await adapter.update<Organization>({\n\t\t\t\tmodel: \"organization\",\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: orgId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tupdate: data,\n\t\t\t});\n\t\t\treturn organization;\n\t\t},\n\t\tdeleteOrganization: async (orgId: string) => {\n\t\t\tawait adapter.delete({\n\t\t\t\tmodel: \"member\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"organizationId\",\n\t\t\t\t\t\tvalue: orgId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tawait adapter.delete({\n\t\t\t\tmodel: \"invitation\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"organizationId\",\n\t\t\t\t\t\tvalue: orgId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tawait adapter.delete<Organization>({\n\t\t\t\tmodel: \"organization\",\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: orgId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn orgId;\n\t\t},\n\t\tsetActiveOrganization: async (sessionId: string, orgId: string | null) => {\n\t\t\tconst session = await adapter.update<Session>({\n\t\t\t\tmodel: context.tables.session.tableName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: sessionId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tupdate: {\n\t\t\t\t\tactiveOrganizationId: orgId,\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn session;\n\t\t},\n\t\tfindOrganizationById: async (orgId: string) => {\n\t\t\tconst organization = await adapter.findOne<Organization>({\n\t\t\t\tmodel: \"organization\",\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: orgId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn organization;\n\t\t},\n\t\t/**\n\t\t * @requires db\n\t\t */\n\t\tfindFullOrganization: async (orgId: string, db?: Kysely<any>) => {\n\t\t\tconst [org, invitations, members] = await Promise.all([\n\t\t\t\tadapter.findOne<Organization>({\n\t\t\t\t\tmodel: \"organization\",\n\t\t\t\t\twhere: [{ field: \"id\", value: orgId }],\n\t\t\t\t}),\n\t\t\t\tadapter.findMany<Invitation>({\n\t\t\t\t\tmodel: \"invitation\",\n\t\t\t\t\twhere: [{ field: \"organizationId\", value: orgId }],\n\t\t\t\t}),\n\t\t\t\tadapter.findMany<Member>({\n\t\t\t\t\tmodel: \"member\",\n\t\t\t\t\twhere: [{ field: \"organizationId\", value: orgId }],\n\t\t\t\t}),\n\t\t\t]);\n\n\t\t\tif (!org) return null;\n\n\t\t\tconst userIds = members.map((member) => member.userId);\n\t\t\tconst users = await adapter.findMany<User>({\n\t\t\t\tmodel: context.tables.user.tableName,\n\t\t\t\twhere: [{ field: \"id\", value: userIds, operator: \"in\" }],\n\t\t\t});\n\n\t\t\tconst userMap = new Map(users.map((user) => [user.id, user]));\n\n\t\t\tconst membersWithUsers = members.map((member) => {\n\t\t\t\tconst user = userMap.get(member.userId);\n\t\t\t\tif (!user) {\n\t\t\t\t\tthrow new BetterAuthError(\n\t\t\t\t\t\t\"Unexpected error: User not found for member\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...member,\n\t\t\t\t\tuser: {\n\t\t\t\t\t\tid: user.id,\n\t\t\t\t\t\tname: user.name,\n\t\t\t\t\t\temail: user.email,\n\t\t\t\t\t\timage: user.image,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\t...org,\n\t\t\t\tinvitations,\n\t\t\t\tmembers: membersWithUsers,\n\t\t\t};\n\t\t},\n\t\tlistOrganizations: async (userId: string) => {\n\t\t\tconst members = await adapter.findMany<Member>({\n\t\t\t\tmodel: \"member\",\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\n\t\t\tif (!members || members.length === 0) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst organizationIds = members.map((member) => member.organizationId);\n\n\t\t\tconst organizations = await adapter.findMany<Organization>({\n\t\t\t\tmodel: \"organization\",\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: organizationIds,\n\t\t\t\t\t\toperator: \"in\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\n\t\t\treturn organizations;\n\t\t},\n\t\tcreateInvitation: async ({\n\t\t\tinvitation,\n\t\t\tuser,\n\t\t}: {\n\t\t\tinvitation: {\n\t\t\t\temail: string;\n\t\t\t\trole: \"admin\" | \"member\" | \"owner\";\n\t\t\t\torganizationId: string;\n\t\t\t};\n\t\t\tuser: User;\n\t\t}) => {\n\t\t\tconst defaultExpiration = 1000 * 60 * 60 * 48;\n\t\t\tconst expiresAt = getDate(\n\t\t\t\toptions?.invitationExpiresIn || defaultExpiration,\n\t\t\t);\n\t\t\tconst invite = await adapter.create<Invitation>({\n\t\t\t\tmodel: \"invitation\",\n\t\t\t\tdata: {\n\t\t\t\t\tid: generateId(),\n\t\t\t\t\temail: invitation.email,\n\t\t\t\t\trole: invitation.role,\n\t\t\t\t\torganizationId: invitation.organizationId,\n\t\t\t\t\tstatus: \"pending\",\n\t\t\t\t\texpiresAt,\n\t\t\t\t\tinviterId: user.id,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\treturn invite;\n\t\t},\n\t\tfindInvitationById: async (id: string) => {\n\t\t\tconst invitation = await adapter.findOne<Invitation>({\n\t\t\t\tmodel: \"invitation\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\tvalue: id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn invitation;\n\t\t},\n\t\tfindPendingInvitation: async (data: {\n\t\t\temail: string;\n\t\t\torganizationId: string;\n\t\t}) => {\n\t\t\tconst invitation = await adapter.findMany<Invitation>({\n\t\t\t\tmodel: \"invitation\",\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"email\",\n\t\t\t\t\t\tvalue: data.email,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"organizationId\",\n\t\t\t\t\t\tvalue: data.organizationId,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"status\",\n\t\t\t\t\t\tvalue: \"pending\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\treturn invitation.filter(\n\t\t\t\t(invite) => new Date(invite.expiresAt) > new Date(),\n\t\t\t);\n\t\t},\n\t\tupdateInvitation: async (data: {\n\t\t\tinvitationId: string;\n\t\t\tstatus: \"accepted\" | \"canceled\" | \"rejected\";\n\t\t}) => {\n\t\t\tconst invitation = await adapter.update<Invitation>({\n\t\t\t\tmodel: \"invitation\",\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: data.invitationId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tupdate: {\n\t\t\t\t\tstatus: data.status,\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn invitation;\n\t\t},\n\t};\n};\n","import { type Context } from \"better-call\";\nimport type { Session, User } from \"../../db/schema\";\nimport { createAuthMiddleware } from \"../../api/call\";\nimport { sessionMiddleware } from \"../../api\";\nimport type { Role, defaultRoles } from \"../access\";\nimport type { OrganizationOptions } from \"./organization\";\n\nexport const orgMiddleware = createAuthMiddleware(async (ctx) => {\n\treturn {} as {\n\t\torgOptions: OrganizationOptions;\n\t\troles: typeof defaultRoles & {\n\t\t\t[key: string]: Role<{}>;\n\t\t};\n\t\tgetSession: (context: Context<any, any>) => Promise<{\n\t\t\tsession: Session & {\n\t\t\t\tactiveOrganizationId?: string;\n\t\t\t};\n\t\t\tuser: User;\n\t\t}>;\n\t};\n});\n\nexport const orgSessionMiddleware = createAuthMiddleware(\n\t{\n\t\tuse: [sessionMiddleware],\n\t},\n\tasync (ctx) => {\n\t\t//@ts-expect-error: fix this later on better-call repo. Session middleware will return session in the context.\n\t\tconst session = ctx.context.session as {\n\t\t\tsession: Session & {\n\t\t\t\tactiveOrganizationId?: string;\n\t\t\t};\n\t\t\tuser: User;\n\t\t};\n\t\treturn {\n\t\t\tsession,\n\t\t};\n\t},\n);\n","import { z } from \"zod\";\nimport { createAuthEndpoint } from \"../../../api/call\";\nimport { getSessionFromCtx } from \"../../../api/routes\";\nimport { generateId } from \"../../../utils/id\";\nimport { getOrgAdapter } from \"../adapter\";\nimport { orgMiddleware, orgSessionMiddleware } from \"../call\";\nimport { role } from \"../schema\";\nimport { logger } from \"../../../utils/logger\";\nimport { APIError } from \"better-call\";\n\nexport const createInvitation = createAuthEndpoint(\n\t\"/organization/invite-member\",\n\t{\n\t\tmethod: \"POST\",\n\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t\tbody: z.object({\n\t\t\temail: z.string(),\n\t\t\trole: role,\n\t\t\torganizationId: z.string().optional(),\n\t\t\tresend: z.boolean().optional(),\n\t\t}),\n\t},\n\tasync (ctx) => {\n\t\tif (!ctx.context.orgOptions.sendInvitationEmail) {\n\t\t\tlogger.warn(\n\t\t\t\t\"Invitation email is not enabled. Pass `sendInvitationEmail` to the plugin options to enable it.\",\n\t\t\t);\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Invitation email is not enabled\",\n\t\t\t});\n\t\t}\n\n\t\tconst session = ctx.context.session;\n\t\tconst orgId =\n\t\t\tctx.body.organizationId || session.session.activeOrganizationId;\n\t\tif (!orgId) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Organization not found\",\n\t\t\t});\n\t\t}\n\t\tconst adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);\n\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\tuserId: session.user.id,\n\t\t\torganizationId: orgId,\n\t\t});\n\t\tif (!member) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Member not found!\",\n\t\t\t});\n\t\t}\n\t\tconst role = ctx.context.roles[member.role];\n\t\tif (!role) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Role not found!\",\n\t\t\t});\n\t\t}\n\t\tconst canInvite = role.authorize({\n\t\t\tinvitation: [\"create\"],\n\t\t});\n\t\tif (canInvite.error) {\n\t\t\tthrow new APIError(\"FORBIDDEN\", {\n\t\t\t\tmessage: \"You are not allowed to invite members\",\n\t\t\t});\n\t\t}\n\t\tconst alreadyMember = await adapter.findMemberByEmail({\n\t\t\temail: ctx.body.email,\n\t\t\torganizationId: orgId,\n\t\t});\n\t\tif (alreadyMember) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"User is already a member of this organization\",\n\t\t\t});\n\t\t}\n\t\tconst alreadyInvited = await adapter.findPendingInvitation({\n\t\t\temail: ctx.body.email,\n\t\t\torganizationId: orgId,\n\t\t});\n\t\tif (alreadyInvited.length && !ctx.body.resend) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"User is already invited to this organization\",\n\t\t\t});\n\t\t}\n\t\tconst invitation = await adapter.createInvitation({\n\t\t\tinvitation: {\n\t\t\t\trole: ctx.body.role,\n\t\t\t\temail: ctx.body.email,\n\t\t\t\torganizationId: orgId,\n\t\t\t},\n\t\t\tuser: session.user,\n\t\t});\n\n\t\tconst organization = await adapter.findOrganizationById(orgId);\n\n\t\tif (!organization) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Organization not found\",\n\t\t\t});\n\t\t}\n\n\t\tawait ctx.context.orgOptions.sendInvitationEmail?.(\n\t\t\t{\n\t\t\t\tid: invitation.id,\n\t\t\t\trole: invitation.role,\n\t\t\t\temail: invitation.email,\n\t\t\t\torganization: organization,\n\t\t\t\tinviter: {\n\t\t\t\t\t...member,\n\t\t\t\t\tuser: session.user,\n\t\t\t\t},\n\t\t\t},\n\t\t\tctx.request,\n\t\t);\n\t\treturn ctx.json(invitation);\n\t},\n);\n\nexport const acceptInvitation = createAuthEndpoint(\n\t\"/organization/accept-invitation\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\tinvitationId: z.string(),\n\t\t}),\n\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t},\n\tasync (ctx) => {\n\t\tconst session = ctx.context.session;\n\t\tconst adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);\n\t\tconst invitation = await adapter.findInvitationById(ctx.body.invitationId);\n\t\tif (\n\t\t\t!invitation ||\n\t\t\tinvitation.expiresAt < new Date() ||\n\t\t\tinvitation.status !== \"pending\"\n\t\t) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Invitation not found!\",\n\t\t\t});\n\t\t}\n\t\tif (invitation.email !== session.user.email) {\n\t\t\tthrow new APIError(\"FORBIDDEN\", {\n\t\t\t\tmessage: \"You are not the recipient of the invitation\",\n\t\t\t});\n\t\t}\n\t\tconst acceptedI = await adapter.updateInvitation({\n\t\t\tinvitationId: ctx.body.invitationId,\n\t\t\tstatus: \"accepted\",\n\t\t});\n\t\tconst member = await adapter.createMember({\n\t\t\tid: generateId(),\n\t\t\torganizationId: invitation.organizationId,\n\t\t\tuserId: session.user.id,\n\t\t\temail: invitation.email,\n\t\t\trole: invitation.role,\n\t\t\tcreatedAt: new Date(),\n\t\t});\n\t\tawait adapter.setActiveOrganization(\n\t\t\tsession.session.id,\n\t\t\tinvitation.organizationId,\n\t\t);\n\t\tif (!acceptedI) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Invitation not found!\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\treturn ctx.json({\n\t\t\tinvitation: acceptedI,\n\t\t\tmember,\n\t\t});\n\t},\n);\nexport const rejectInvitation = createAuthEndpoint(\n\t\"/organization/reject-invitation\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\tinvitationId: z.string(),\n\t\t}),\n\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t},\n\tasync (ctx) => {\n\t\tconst session = ctx.context.session;\n\t\tconst adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);\n\t\tconst invitation = await adapter.findInvitationById(ctx.body.invitationId);\n\t\tif (\n\t\t\t!invitation ||\n\t\t\tinvitation.expiresAt < new Date() ||\n\t\t\tinvitation.status !== \"pending\"\n\t\t) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Invitation not found!\",\n\t\t\t});\n\t\t}\n\t\tif (invitation.email !== session.user.email) {\n\t\t\tthrow new APIError(\"FORBIDDEN\", {\n\t\t\t\tmessage: \"You are not the recipient of the invitation\",\n\t\t\t});\n\t\t}\n\t\tconst rejectedI = await adapter.updateInvitation({\n\t\t\tinvitationId: ctx.body.invitationId,\n\t\t\tstatus: \"rejected\",\n\t\t});\n\t\treturn ctx.json({\n\t\t\tinvitation: rejectedI,\n\t\t\tmember: null,\n\t\t});\n\t},\n);\n\nexport const cancelInvitation = createAuthEndpoint(\n\t\"/organization/cancel-invitation\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\tinvitationId: z.string(),\n\t\t}),\n\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t},\n\tasync (ctx) => {\n\t\tconst session = ctx.context.session;\n\t\tconst adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);\n\t\tconst invitation = await adapter.findInvitationById(ctx.body.invitationId);\n\t\tif (!invitation) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Invitation not found!\",\n\t\t\t});\n\t\t}\n\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\tuserId: session.user.id,\n\t\t\torganizationId: invitation.organizationId,\n\t\t});\n\t\tif (!member) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Member not found!\",\n\t\t\t});\n\t\t}\n\t\tconst canCancel = ctx.context.roles[member.role].authorize({\n\t\t\tinvitation: [\"cancel\"],\n\t\t});\n\t\tif (canCancel.error) {\n\t\t\tthrow new APIError(\"FORBIDDEN\", {\n\t\t\t\tmessage: \"You are not allowed to cancel this invitation\",\n\t\t\t});\n\t\t}\n\t\tconst canceledI = await adapter.updateInvitation({\n\t\t\tinvitationId: ctx.body.invitationId,\n\t\t\tstatus: \"canceled\",\n\t\t});\n\t\treturn ctx.json(canceledI);\n\t},\n);\n\nexport const getInvitation = createAuthEndpoint(\n\t\"/organization/get-invitation\",\n\t{\n\t\tmethod: \"GET\",\n\t\tuse: [orgMiddleware],\n\t\trequireHeaders: true,\n\t\tquery: z.object({\n\t\t\tid: z.string(),\n\t\t}),\n\t},\n\tasync (ctx) => {\n\t\tconst session = await getSessionFromCtx(ctx);\n\t\tif (!session) {\n\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\tmessage: \"Not authenticated\",\n\t\t\t});\n\t\t}\n\t\tconst adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);\n\t\tconst invitation = await adapter.findInvitationById(ctx.query.id);\n\t\tif (\n\t\t\t!invitation ||\n\t\t\tinvitation.status !== \"pending\" ||\n\t\t\tinvitation.expiresAt < new Date()\n\t\t) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Invitation not found!\",\n\t\t\t});\n\t\t}\n\t\tif (invitation.email !== session.user.email) {\n\t\t\tthrow new APIError(\"FORBIDDEN\", {\n\t\t\t\tmessage: \"You are not the recipient of the invitation\",\n\t\t\t});\n\t\t}\n\t\tconst organization = await adapter.findOrganizationById(\n\t\t\tinvitation.organizationId,\n\t\t);\n\t\tif (!organization) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Organization not found\",\n\t\t\t});\n\t\t}\n\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\tuserId: invitation.inviterId,\n\t\t\torganizationId: invitation.organizationId,\n\t\t});\n\t\tif (!member) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Inviter is no longer a member of the organization\",\n\t\t\t});\n\t\t}\n\t\treturn ctx.json({\n\t\t\t...invitation,\n\t\t\torganizationName: organization.name,\n\t\t\torganizationSlug: organization.slug,\n\t\t\tinviterEmail: member.email,\n\t\t});\n\t},\n);\n","import { z } from \"zod\";\n\nexport const role = z.enum([\"admin\", \"member\", \"owner\"]);\nexport const invitationStatus = z\n\t.enum([\"pending\", \"accepted\", \"rejected\", \"canceled\"])\n\t.default(\"pending\");\nexport const organizationSchema = z.object({\n\tid: z.string(),\n\tname: z.string(),\n\tslug: z.string(),\n\tlogo: z.string().optional(),\n\tmetadata: z\n\t\t.record(z.string())\n\t\t.or(z.string().transform((v) => JSON.parse(v)))\n\t\t.optional(),\n\tcreatedAt: z.date(),\n});\n\nexport const memberSchema = z.object({\n\tid: z.string(),\n\temail: z.string(),\n\torganizationId: z.string(),\n\tuserId: z.string(),\n\trole,\n\tcreatedAt: z.date(),\n});\n\nexport const invitationSchema = z.object({\n\tid: z.string(),\n\torganizationId: z.string(),\n\temail: z.string(),\n\trole,\n\tstatus: invitationStatus,\n\t/**\n\t * The id of the user who invited the user.\n\t */\n\tinviterId: z.string(),\n\texpiresAt: z.date(),\n});\n\nexport type Organization = z.infer<typeof organizationSchema>;\nexport type Member = z.infer<typeof memberSchema>;\nexport type Invitation = z.infer<typeof invitationSchema>;\n","import { z } from \"zod\";\nimport { createAuthEndpoint } from \"../../../api/call\";\nimport { getOrgAdapter } from \"../adapter\";\nimport { orgMiddleware, orgSessionMiddleware } from \"../call\";\nimport type { Member } from \"../schema\";\nimport { APIError } from \"better-call\";\n\nexport const removeMember = createAuthEndpoint(\n\t\"/organization/remove-member\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\tmemberIdOrEmail: z.string(),\n\t\t\t/**\n\t\t\t * If not provided, the active organization will be used\n\t\t\t */\n\t\t\torganizationId: z.string().optional(),\n\t\t}),\n\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t},\n\tasync (ctx) => {\n\t\tconst session = ctx.context.session;\n\t\tconst orgId =\n\t\t\tctx.body.organizationId || session.session.activeOrganizationId;\n\t\tif (!orgId) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"No active organization found!\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);\n\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\tuserId: session.user.id,\n\t\t\torganizationId: orgId,\n\t\t});\n\t\tif (!member) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Member not found!\",\n\t\t\t});\n\t\t}\n\t\tconst role = ctx.context.roles[member.role];\n\t\tif (!role) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Role not found!\",\n\t\t\t});\n\t\t}\n\t\tconst isLeaving =\n\t\t\tsession.user.email === ctx.body.memberIdOrEmail ||\n\t\t\tmember.id === ctx.body.memberIdOrEmail;\n\t\tconst isOwnerLeaving =\n\t\t\tisLeaving &&\n\t\t\tmember.role === (ctx.context.orgOptions?.creatorRole || \"owner\");\n\t\tif (isOwnerLeaving) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"You cannot leave the organization as the owner\",\n\t\t\t});\n\t\t}\n\n\t\tconst canDeleteMember =\n\t\t\tisLeaving ||\n\t\t\trole.authorize({\n\t\t\t\tmember: [\"delete\"],\n\t\t\t}).success;\n\t\tif (!canDeleteMember) {\n\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\tmessage: \"You are not allowed to delete this member\",\n\t\t\t});\n\t\t}\n\t\tlet existing: Member | null = null;\n\t\tif (ctx.body.memberIdOrEmail.includes(\"@\")) {\n\t\t\texisting = await adapter.findMemberByEmail({\n\t\t\t\temail: ctx.body.memberIdOrEmail,\n\t\t\t\torganizationId: orgId,\n\t\t\t});\n\t\t} else {\n\t\t\texisting = await adapter.findMemberById(ctx.body.memberIdOrEmail);\n\t\t}\n\t\tif (existing?.organizationId !== orgId) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Member not found!\",\n\t\t\t});\n\t\t}\n\t\tawait adapter.deleteMember(existing.id);\n\t\tif (\n\t\t\tsession.user.id === existing.userId &&\n\t\t\tsession.session.activeOrganizationId === existing.organizationId\n\t\t) {\n\t\t\tawait adapter.setActiveOrganization(session.session.id, null);\n\t\t}\n\t\treturn ctx.json({\n\t\t\tmember: existing,\n\t\t});\n\t},\n);\n\nexport const updateMemberRole = createAuthEndpoint(\n\t\"/organization/update-member-role\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\trole: z.enum([\"admin\", \"member\", \"owner\"]),\n\t\t\tmemberId: z.string(),\n\t\t\t/**\n\t\t\t * If not provided, the active organization will be used\n\t\t\t */\n\t\t\torganizationId: z.string().optional(),\n\t\t}),\n\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t},\n\tasync (ctx) => {\n\t\tconst session = ctx.context.session;\n\t\tconst orgId =\n\t\t\tctx.body.organizationId || session.session.activeOrganizationId;\n\t\tif (!orgId) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"No active organization found!\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);\n\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\tuserId: session.user.id,\n\t\t\torganizationId: orgId,\n\t\t});\n\t\tif (!member) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Member not found!\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst role = ctx.context.roles[member.role];\n\t\tif (!role) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Role not found!\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\t/**\n\t\t * If the member is not an owner, they cannot update the role of another member\n\t\t * as an owner.\n\t\t */\n\t\tconst canUpdateMember =\n\t\t\trole.authorize({\n\t\t\t\tmember: [\"update\"],\n\t\t\t}).error ||\n\t\t\t(ctx.body.role === \"owner\" && member.role !== \"owner\");\n\t\tif (canUpdateMember) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"You are not allowed to update this member\",\n\t\t\t\t},\n\t\t\t\tstatus: 403,\n\t\t\t});\n\t\t}\n\n\t\tconst updatedMember = await adapter.updateMember(\n\t\t\tctx.body.memberId,\n\t\t\tctx.body.role,\n\t\t);\n\t\tif (!updatedMember) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Member not found!\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\treturn ctx.json(updatedMember);\n\t},\n);\n","import { z } from \"zod\";\nimport { createAuthEndpoint } from \"../../../api/call\";\nimport { generateId } from \"../../../utils/id\";\nimport { getOrgAdapter } from \"../adapter\";\nimport { orgMiddleware, orgSessionMiddleware } from \"../call\";\nimport { APIError } from \"better-call\";\n\nexport const createOrganization = createAuthEndpoint(\n\t\"/organization/create\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\tname: z.string(),\n\t\t\tslug: z.string(),\n\t\t\tuserId: z.string().optional(),\n\t\t\tlogo: z.string().optional(),\n\t\t\tmetadata: z.record(z.string()).optional(),\n\t\t}),\n\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t},\n\tasync (ctx) => {\n\t\tconst user = ctx.context.session.user;\n\t\tif (!user) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 401,\n\t\t\t});\n\t\t}\n\t\tconst options = ctx.context.orgOptions;\n\t\tconst canCreateOrg =\n\t\t\ttypeof options?.allowUserToCreateOrganization === \"function\"\n\t\t\t\t? await options.allowUserToCreateOrganization(user)\n\t\t\t\t: options?.allowUserToCreateOrganization === undefined\n\t\t\t\t\t? true\n\t\t\t\t\t: options.allowUserToCreateOrganization;\n\n\t\tif (!canCreateOrg) {\n\t\t\tthrow new APIError(\"FORBIDDEN\", {\n\t\t\t\tmessage: \"You are not allowed to create an organization\",\n\t\t\t});\n\t\t}\n\t\tconst adapter = getOrgAdapter(ctx.context, options);\n\n\t\tconst userOrganizations = await adapter.listOrganizations(user.id);\n\t\tconst hasReachedOrgLimit =\n\t\t\ttypeof options.organizationLimit === \"number\"\n\t\t\t\t? userOrganizations.length >= options.organizationLimit\n\t\t\t\t: typeof options.organizationLimit === \"function\"\n\t\t\t\t\t? await options.organizationLimit(user)\n\t\t\t\t\t: false;\n\n\t\tif (hasReachedOrgLimit) {\n\t\t\tthrow new APIError(\"FORBIDDEN\", {\n\t\t\t\tmessage: \"You have reached the organization limit\",\n\t\t\t});\n\t\t}\n\n\t\tconst existingOrganization = await adapter.findOrganizationBySlug(\n\t\t\tctx.body.slug,\n\t\t);\n\t\tif (existingOrganization) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Organization with this slug already exists\",\n\t\t\t});\n\t\t}\n\t\tconst organization = await adapter.createOrganization({\n\t\t\torganization: {\n\t\t\t\tid: generateId(),\n\t\t\t\tslug: ctx.body.slug,\n\t\t\t\tname: ctx.body.name,\n\t\t\t\tlogo: ctx.body.logo,\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tmetadata: ctx.body.metadata,\n\t\t\t},\n\t\t\tuser,\n\t\t});\n\t\treturn ctx.json(organization);\n\t},\n);\n\nexport const updateOrganization = createAuthEndpoint(\n\t\"/organization/update\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\tdata: z\n\t\t\t\t.object({\n\t\t\t\t\tname: z.string().optional(),\n\t\t\t\t\tslug: z.string().optional(),\n\t\t\t\t})\n\t\t\t\t.partial(),\n\t\t\torgId: z.string().optional(),\n\t\t}),\n\t\trequireHeaders: true,\n\t\tuse: [orgMiddleware],\n\t},\n\tasync (ctx) => {\n\t\tconst session = await ctx.context.getSession(ctx);\n\t\tif (!session) {\n\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\tmessage: \"User not found\",\n\t\t\t});\n\t\t}\n\t\tconst orgId = ctx.body.orgId || session.session.activeOrganizationId;\n\t\tif (!orgId) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Organization id not found!\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);\n\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\tuserId: session.user.id,\n\t\t\torganizationId: orgId,\n\t\t});\n\t\tif (!member) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"User is not a member of this organization!\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst role = ctx.context.roles[member.role];\n\t\tif (!role) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Role not found!\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst canUpdateOrg = role.authorize({\n\t\t\torganization: [\"update\"],\n\t\t});\n\t\tif (canUpdateOrg.error) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"You are not allowed to update this organization\",\n\t\t\t\t},\n\t\t\t\tstatus: 403,\n\t\t\t});\n\t\t}\n\t\tconst updatedOrg = await adapter.updateOrganization(orgId, ctx.body.data);\n\t\treturn ctx.json(updatedOrg);\n\t},\n);\n\nexport const deleteOrganization = createAuthEndpoint(\n\t\"/organization/delete\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\torgId: z.string(),\n\t\t}),\n\t\trequireHeaders: true,\n\t\tuse: [orgMiddleware],\n\t},\n\tasync (ctx) => {\n\t\tconst session = await ctx.context.getSession(ctx);\n\t\tif (!session) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 401,\n\t\t\t});\n\t\t}\n\t\tconst orgId = ctx.body.orgId;\n\t\tif (!orgId) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Organization id not found!\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);\n\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\tuserId: session.user.id,\n\t\t\torganizationId: orgId,\n\t\t});\n\t\tif (!member) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"User is not a member of this organization!\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst role = ctx.context.roles[member.role];\n\t\tif (!role) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t\tbody: {\n\t\t\t\t\tmessage: \"Role not found!\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t\tconst canDeleteOrg = role.authorize({\n\t\t\torganization: [\"delete\"],\n\t\t});\n\t\tif (canDeleteOrg.error) {\n\t\t\tthrow new APIError(\"FORBIDDEN\", {\n\t\t\t\tmessage: \"You are not allowed to delete this organization\",\n\t\t\t});\n\t\t}\n\t\tif (orgId === session.session.activeOrganizationId) {\n\t\t\t/**\n\t\t\t * If the organization is deleted, we set the active organization to null\n\t\t\t */\n\t\t\tawait adapter.setActiveOrganization(session.session.id, null);\n\t\t}\n\t\tawait adapter.deleteOrganization(orgId);\n\t\treturn ctx.json(orgId);\n\t},\n);\n\nexport const getFullOrganization = createAuthEndpoint(\n\t\"/organization/get-full\",\n\t{\n\t\tmethod: \"GET\",\n\t\tquery: z.object({\n\t\t\torgId: z.string().optional(),\n\t\t}),\n\t\trequireHeaders: true,\n\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t},\n\tasync (ctx) => {\n\t\tconst session = ctx.context.session;\n\t\tconst orgId = ctx.query.orgId || session.session.activeOrganizationId;\n\t\tif (!orgId) {\n\t\t\treturn ctx.json(null, {\n\t\t\t\tstatus: 400,\n\t\t\t});\n\t\t}\n\t\tconst adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);\n\t\tconst organization = await adapter.findFullOrganization(\n\t\t\torgId,\n\t\t\tctx.context.db || undefined,\n\t\t);\n\t\tif (!organization) {\n\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\tmessage: \"Organization not found\",\n\t\t\t});\n\t\t}\n\t\treturn ctx.json(organization);\n\t},\n);\n\nexport const setActiveOrganization = createAuthEndpoint(\n\t\"/organization/activate\",\n\t{\n\t\tmethod: \"POST\",\n\t\tbody: z.object({\n\t\t\torgId: z.string().nullable().optional(),\n\t\t}),\n\t\tuse: [orgSessionMiddleware, orgMiddleware],\n\t},\n\tasync (ctx) => {\n\t\tconst adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);\n\t\tconst session = ctx.context.session;\n\t\tlet orgId = ctx.body.orgId;\n\t\tif (orgId === null) {\n\t\t\tconst sessionOrgId = session.session.activeOrganizationId;\n\t\t\tif (!sessionOrgId) {\n\t\t\t\treturn ctx.json(null);\n\t\t\t}\n\t\t\tawait adapter.setActiveOrganization(session.session.id, null);\n\t\t\treturn ctx.json(null);\n\t\t}\n\t\tif (!orgId) {\n\t\t\tconst sessionOrgId = session.session.activeOrganizationId;\n\t\t\tif (!sessionOrgId) {\n\t\t\t\treturn ctx.json(null);\n\t\t\t}\n\t\t\torgId = sessionOrgId;\n\t\t}\n\t\tconst isMember = await adapter.findMemberByOrgId({\n\t\t\tuserId: session.user.id,\n\t\t\torganizationId: orgId,\n\t\t});\n\t\tif (!isMember) {\n\t\t\tawait adapter.setActiveOrganization(session.session.id, null);\n\t\t\tthrow new APIError(\"FORBIDDEN\", {\n\t\t\t\tmessage: \"You are not a member of this organization\",\n\t\t\t});\n\t\t}\n\t\tawait adapter.setActiveOrganization(session.session.id, orgId);\n\t\tconst organization = await adapter.findFullOrganization(\n\t\t\torgId,\n\t\t\tctx.context.db || undefined,\n\t\t);\n\t\treturn ctx.json(organization);\n\t},\n);\n\nexport const listOrganization = createAuthEndpoint(\n\t\"/organization/list\",\n\t{\n\t\tmethod: \"GET\",\n\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t},\n\tasync (ctx) => {\n\t\tconst adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);\n\t\tconst organizations = await adapter.listOrganizations(\n\t\t\tctx.context.session.user.id,\n\t\t);\n\t\treturn ctx.json(organizations);\n\t},\n);\n","import { alphabet, generateRandomString } from \"../../crypto/random\";\nimport { z } from \"zod\";\nimport { createAuthEndpoint, createAuthMiddleware } from \"../../api/call\";\nimport { sessionMiddleware } from \"../../api\";\nimport { hs256, symmetricEncrypt } from \"../../crypto\";\nimport type { BetterAuthPlugin } from \"../../types/plugins\";\nimport { backupCode2fa, generateBackupCodes } from \"./backup-codes\";\nimport { otp2fa } from \"./otp\";\nimport { totp2fa } from \"./totp\";\nimport type { TwoFactorOptions, UserWithTwoFactor } from \"./types\";\nimport type { Session } from \"../../db/schema\";\nimport { TWO_FACTOR_COOKIE_NAME, TRUST_DEVICE_COOKIE_NAME } from \"./constant\";\nimport { validatePassword } from \"../../utils/password\";\nimport { APIError } from \"better-call\";\nimport { createTOTPKeyURI } from \"oslo/otp\";\nimport { TimeSpan } from \"oslo\";\nimport { deleteSessionCookie, setSessionCookie } from \"../../cookies\";\n\nexport const twoFactor = (options?: TwoFactorOptions) => {\n\tconst opts = {\n\t\ttwoFactorTable: options?.twoFactorTable || (\"twoFactor\" as const),\n\t};\n\tconst totp = totp2fa(\n\t\t{\n\t\t\tissuer: options?.issuer || \"better-auth\",\n\t\t\t...options?.totpOptions,\n\t\t},\n\t\topts.twoFactorTable,\n\t);\n\tconst backupCode = backupCode2fa(\n\t\t{\n\t\t\t...options?.backupCodeOptions,\n\t\t},\n\t\topts.twoFactorTable,\n\t);\n\tconst otp = otp2fa(\n\t\t{\n\t\t\t...options?.otpOptions,\n\t\t},\n\t\topts.twoFactorTable,\n\t);\n\treturn {\n\t\tid: \"two-factor\",\n\t\tendpoints: {\n\t\t\t...totp.endpoints,\n\t\t\t...otp.endpoints,\n\t\t\t...backupCode.endpoints,\n\t\t\tenableTwoFactor: createAuthEndpoint(\n\t\t\t\t\"/two-factor/enable\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tpassword: z.string().min(8),\n\t\t\t\t\t}),\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst user = ctx.context.session.user as UserWithTwoFactor;\n\t\t\t\t\tconst { password } = ctx.body;\n\t\t\t\t\tconst isPasswordValid = await validatePassword(ctx, {\n\t\t\t\t\t\tpassword,\n\t\t\t\t\t\tuserId: user.id,\n\t\t\t\t\t});\n\t\t\t\t\tif (!isPasswordValid) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Invalid password\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst secret = generateRandomString(16, alphabet(\"a-z\", \"0-9\", \"-\"));\n\t\t\t\t\tconst encryptedSecret = await symmetricEncrypt({\n\t\t\t\t\t\tkey: ctx.context.secret,\n\t\t\t\t\t\tdata: secret,\n\t\t\t\t\t});\n\t\t\t\t\tconst backupCodes = await generateBackupCodes(\n\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t\toptions?.backupCodeOptions,\n\t\t\t\t\t);\n\t\t\t\t\tif (options?.skipVerificationOnEnable) {\n\t\t\t\t\t\tconst updatedUser = await ctx.context.internalAdapter.updateUser(\n\t\t\t\t\t\t\tuser.id,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\ttwoFactorEnabled: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst newSession = await ctx.context.internalAdapter.createSession(\n\t\t\t\t\t\t\tupdatedUser.id,\n\t\t\t\t\t\t);\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Update the session cookie with the new user data\n\t\t\t\t\t\t */\n\t\t\t\t\t\tawait setSessionCookie(ctx, {\n\t\t\t\t\t\t\tsession: newSession,\n\t\t\t\t\t\t\tuser,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t//delete existing two factor\n\t\t\t\t\tawait ctx.context.adapter.deleteMany({\n\t\t\t\t\t\tmodel: opts.twoFactorTable,\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\n\t\t\t\t\tawait ctx.context.adapter.create({\n\t\t\t\t\t\tmodel: opts.twoFactorTable,\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tid: ctx.context.uuid(),\n\t\t\t\t\t\t\tsecret: encryptedSecret,\n\t\t\t\t\t\t\tbackupCodes: backupCodes.encryptedBackupCodes,\n\t\t\t\t\t\t\tuserId: user.id,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\tconst totpURI = createTOTPKeyURI(\n\t\t\t\t\t\toptions?.issuer || \"BetterAuth\",\n\t\t\t\t\t\tuser.email,\n\t\t\t\t\t\tBuffer.from(secret),\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdigits: options?.totpOptions?.digits || 6,\n\t\t\t\t\t\t\tperiod: new TimeSpan(options?.totpOptions?.period || 30, \"s\"),\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\treturn ctx.json({ totpURI, backupCodes: backupCodes.backupCodes });\n\t\t\t\t},\n\t\t\t),\n\t\t\tdisableTwoFactor: createAuthEndpoint(\n\t\t\t\t\"/two-factor/disable\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tpassword: z.string().min(8),\n\t\t\t\t\t}),\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst user = ctx.context.session.user as UserWithTwoFactor;\n\t\t\t\t\tconst { password } = ctx.body;\n\t\t\t\t\tconst isPasswordValid = await validatePassword(ctx, {\n\t\t\t\t\t\tpassword,\n\t\t\t\t\t\tuserId: user.id,\n\t\t\t\t\t});\n\t\t\t\t\tif (!isPasswordValid) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Invalid password\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tawait ctx.context.internalAdapter.updateUser(user.id, {\n\t\t\t\t\t\ttwoFactorEnabled: false,\n\t\t\t\t\t});\n\t\t\t\t\tawait ctx.context.adapter.delete({\n\t\t\t\t\t\tmodel: opts.twoFactorTable,\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t\treturn ctx.json({ status: true });\n\t\t\t\t},\n\t\t\t),\n\t\t},\n\t\toptions: options,\n\t\thooks: {\n\t\t\tafter: [\n\t\t\t\t{\n\t\t\t\t\tmatcher(context) {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tcontext.path === \"/sign-in/email\" ||\n\t\t\t\t\t\t\tcontext.path === \"/sign-in/username\"\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\thandler: createAuthMiddleware(async (ctx) => {\n\t\t\t\t\t\tconst returned = ctx.context.returned;\n\t\t\t\t\t\tif (returned?.status !== 200) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst response = (await returned.clone().json()) as {\n\t\t\t\t\t\t\tuser: UserWithTwoFactor;\n\t\t\t\t\t\t\tsession: Session;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (!response.user.twoFactorEnabled) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Check for trust device cookie\n\t\t\t\t\t\tconst trustDeviceCookieName = ctx.context.createAuthCookie(\n\t\t\t\t\t\t\tTRUST_DEVICE_COOKIE_NAME,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tmaxAge: 30 * 24 * 60 * 60, // 30 days\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst trustDeviceCookie = await ctx.getSignedCookie(\n\t\t\t\t\t\t\ttrustDeviceCookieName.name,\n\t\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (trustDeviceCookie) {\n\t\t\t\t\t\t\tconst [token, sessionId] = trustDeviceCookie.split(\"!\");\n\t\t\t\t\t\t\tconst expectedToken = await hs256(\n\t\t\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t\t\t\t`${response.user.id}!${sessionId}`,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif (token === expectedToken) {\n\t\t\t\t\t\t\t\t// Trust device cookie is valid, refresh it and skip 2FA\n\t\t\t\t\t\t\t\tconst newToken = await hs256(\n\t\t\t\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t\t\t\t\t`${response.user.id}!${response.session.id}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tawait ctx.setSignedCookie(\n\t\t\t\t\t\t\t\t\ttrustDeviceCookieName.name,\n\t\t\t\t\t\t\t\t\t`${newToken}!${response.session.id}`,\n\t\t\t\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t\t\t\t\ttrustDeviceCookieName.attributes,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * remove the session cookie. It's set by the sign in credential\n\t\t\t\t\t\t */\n\t\t\t\t\t\tdeleteSessionCookie(ctx);\n\t\t\t\t\t\tconst hash = await hs256(ctx.context.secret, response.session.id);\n\t\t\t\t\t\tconst twoFactorCookie = ctx.context.createAuthCookie(\n\t\t\t\t\t\t\tTWO_FACTOR_COOKIE_NAME,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tmaxAge: 60 * 60 * 24, // 24 hours,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * We set the user id and the session\n\t\t\t\t\t\t * id as a hash. Later will fetch for\n\t\t\t\t\t\t * sessions with the user id compare\n\t\t\t\t\t\t * the hash and set that as session.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tawait ctx.setSignedCookie(\n\t\t\t\t\t\t\ttwoFactorCookie.name,\n\t\t\t\t\t\t\t`${response.session.userId}!${hash}`,\n\t\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t\t\ttwoFactorCookie.attributes,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst res = new Response(\n\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\ttwoFactorRedirect: true,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\theaders: ctx.responseHeader,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tresponse: res,\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\t\tschema: {\n\t\t\tuser: {\n\t\t\t\tfields: {\n\t\t\t\t\ttwoFactorEnabled: {\n\t\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\tdefaultValue: false,\n\t\t\t\t\t\tinput: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\ttwoFactor: {\n\t\t\t\ttableName: opts.twoFactorTable,\n\t\t\t\tfields: {\n\t\t\t\t\tsecret: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\treturned: false,\n\t\t\t\t\t},\n\t\t\t\t\tbackupCodes: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\treturned: false,\n\t\t\t\t\t},\n\t\t\t\t\tuserId: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\treturned: false,\n\t\t\t\t\t\treferences: {\n\t\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\t\tfield: \"id\",\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\t\trateLimit: [\n\t\t\t{\n\t\t\t\tpathMatcher(path) {\n\t\t\t\t\treturn path.startsWith(\"/two-factor/\");\n\t\t\t\t},\n\t\t\t\twindow: 10,\n\t\t\t\tmax: 3,\n\t\t\t},\n\t\t],\n\t} satisfies BetterAuthPlugin;\n};\n\nexport * from \"./client\";\n","import { alphabet, generateRandomString } from \"../../../crypto/random\";\nimport { z } from \"zod\";\nimport { createAuthEndpoint } from \"../../../api/call\";\nimport { sessionMiddleware } from \"../../../api\";\nimport { symmetricDecrypt, symmetricEncrypt } from \"../../../crypto\";\nimport { verifyTwoFactorMiddleware } from \"../verify-middleware\";\nimport type {\n\tTwoFactorProvider,\n\tTwoFactorTable,\n\tUserWithTwoFactor,\n} from \"../types\";\nimport { APIError } from \"better-call\";\nimport { setSessionCookie } from \"../../../cookies\";\n\nexport interface BackupCodeOptions {\n\t/**\n\t * The amount of backup codes to generate\n\t *\n\t * @default 10\n\t */\n\tamount?: number;\n\t/**\n\t * The length of the backup codes\n\t *\n\t * @default 10\n\t */\n\tlength?: number;\n\tcustomBackupCodesGenerate?: () => string[];\n}\n\nfunction generateBackupCodesFn(options?: BackupCodeOptions) {\n\treturn Array.from({ length: options?.amount ?? 10 })\n\t\t.fill(null)\n\t\t.map(() =>\n\t\t\tgenerateRandomString(options?.length ?? 10, alphabet(\"a-z\", \"0-9\")),\n\t\t)\n\t\t.map((code) => `${code.slice(0, 5)}-${code.slice(5)}`);\n}\n\nexport async function generateBackupCodes(\n\tsecret: string,\n\toptions?: BackupCodeOptions,\n) {\n\tconst key = secret;\n\tconst backupCodes = options?.customBackupCodesGenerate\n\t\t? options.customBackupCodesGenerate()\n\t\t: generateBackupCodesFn();\n\tconst encCodes = await symmetricEncrypt({\n\t\tdata: JSON.stringify(backupCodes),\n\t\tkey: key,\n\t});\n\treturn {\n\t\tbackupCodes,\n\t\tencryptedBackupCodes: encCodes,\n\t};\n}\n\nexport async function verifyBackupCode(\n\tdata: {\n\t\tbackupCodes: string;\n\t\tcode: string;\n\t},\n\tkey: string,\n) {\n\tconst codes = await getBackupCodes(data.backupCodes, key);\n\tif (!codes) {\n\t\treturn false;\n\t}\n\treturn codes.includes(data.code);\n}\n\nexport async function getBackupCodes(backupCodes: string, key: string) {\n\tconst secret = Buffer.from(\n\t\tawait symmetricDecrypt({ key, data: backupCodes }),\n\t).toString(\"utf-8\");\n\tconst data = JSON.parse(secret);\n\tconst result = z.array(z.string()).safeParse(data);\n\tif (result.success) {\n\t\treturn result.data;\n\t}\n\treturn null;\n}\n\nexport const backupCode2fa = (\n\toptions: BackupCodeOptions,\n\ttwoFactorTable: string,\n) => {\n\treturn {\n\t\tid: \"backup_code\",\n\t\tendpoints: {\n\t\t\tverifyBackupCode: createAuthEndpoint(\n\t\t\t\t\"/two-factor/verify-backup-code\",\n\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tcode: z.string(),\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Disable setting the session cookie\n\t\t\t\t\t\t */\n\t\t\t\t\t\tdisableSession: z.boolean().optional(),\n\t\t\t\t\t}),\n\t\t\t\t\tuse: [verifyTwoFactorMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst user = ctx.context.session.user as UserWithTwoFactor;\n\t\t\t\t\tconst twoFactor = await ctx.context.adapter.findOne<TwoFactorTable>({\n\t\t\t\t\t\tmodel: twoFactorTable,\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t\tif (!twoFactor) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Backup codes aren't enabled\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst validate = verifyBackupCode(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbackupCodes: twoFactor.backupCodes,\n\t\t\t\t\t\t\tcode: ctx.body.code,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t);\n\t\t\t\t\tif (!validate) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Invalid backup code\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (!ctx.body.disableSession) {\n\t\t\t\t\t\tawait setSessionCookie(ctx, {\n\t\t\t\t\t\t\tsession: ctx.context.session,\n\t\t\t\t\t\t\tuser,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tuser: user,\n\t\t\t\t\t\tsession: ctx.context.session,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tgenerateBackupCodes: createAuthEndpoint(\n\t\t\t\t\"/two-factor/generate-backup-codes\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tpassword: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst user = ctx.context.session.user as UserWithTwoFactor;\n\t\t\t\t\tif (!user.twoFactorEnabled) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Two factor isn't enabled\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tawait ctx.context.password.checkPassword(user.id, ctx);\n\t\t\t\t\tconst backupCodes = await generateBackupCodes(\n\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t);\n\t\t\t\t\tawait ctx.context.adapter.update({\n\t\t\t\t\t\tmodel: twoFactorTable,\n\t\t\t\t\t\tupdate: {\n\t\t\t\t\t\t\tbackupCodes: backupCodes.encryptedBackupCodes,\n\t\t\t\t\t\t},\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\t\t\tvalue: ctx.context.session.user.id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tstatus: true,\n\t\t\t\t\t\tbackupCodes: backupCodes.backupCodes,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tviewBackupCodes: createAuthEndpoint(\n\t\t\t\t\"/view/backup-codes\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tpassword: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst user = ctx.context.session.user as UserWithTwoFactor;\n\t\t\t\t\tconst twoFactor = await ctx.context.adapter.findOne<TwoFactorTable>({\n\t\t\t\t\t\tmodel: twoFactorTable,\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t\tif (!twoFactor) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Backup codes aren't enabled\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\t// Check password\n\t\t\t\t\tawait ctx.context.password.checkPassword(user.id, ctx);\n\t\t\t\t\tconst backupCodes = getBackupCodes(\n\t\t\t\t\t\ttwoFactor.backupCodes,\n\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t);\n\t\t\t\t\tif (!backupCodes) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Backup codes aren't enabled\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tstatus: true,\n\t\t\t\t\t\tbackupCodes: backupCodes,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t},\n\t} satisfies TwoFactorProvider;\n};\n","import { APIError } from \"better-call\";\nimport type { Session } from \"../../db/schema\";\nimport { createAuthMiddleware } from \"../../api/call\";\nimport { hs256 } from \"../../crypto\";\nimport { TRUST_DEVICE_COOKIE_NAME, TWO_FACTOR_COOKIE_NAME } from \"./constant\";\nimport type { UserWithTwoFactor } from \"./types\";\nimport { setSessionCookie } from \"../../cookies\";\nimport { z } from \"zod\";\nimport { getSessionFromCtx } from \"../../api\";\n\nexport const verifyTwoFactorMiddleware = createAuthMiddleware(\n\t{\n\t\tbody: z.object({\n\t\t\t/**\n\t\t\t * if true, the device will be trusted\n\t\t\t * for 30 days. It'll be refreshed on\n\t\t\t * every sign in request within this time.\n\t\t\t */\n\t\t\ttrustDevice: z.boolean().optional(),\n\t\t}),\n\t},\n\tasync (ctx) => {\n\t\tconst session = await getSessionFromCtx(ctx);\n\t\tif (!session) {\n\t\t\tconst cookieName = ctx.context.createAuthCookie(TWO_FACTOR_COOKIE_NAME);\n\t\t\tconst cookie = await ctx.getSignedCookie(\n\t\t\t\tcookieName.name,\n\t\t\t\tctx.context.secret,\n\t\t\t);\n\t\t\tif (!cookie) {\n\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\tmessage: \"invalid two factor cookie\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst [userId, hash] = cookie.split(\"!\");\n\t\t\tif (!userId || !hash) {\n\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\tmessage: \"invalid two factor cookie\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst sessions = await ctx.context.adapter.findMany<Session>({\n\t\t\t\tmodel: ctx.context.tables.session.tableName,\n\t\t\t\twhere: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\tvalue: userId,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tif (!sessions.length) {\n\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\tmessage: \"invalid session\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst activeSessions = sessions.filter(\n\t\t\t\t(session) => session.expiresAt > new Date(),\n\t\t\t);\n\t\t\tif (!activeSessions) {\n\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\tmessage: \"invalid session\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tfor (const session of activeSessions) {\n\t\t\t\tconst hashToMatch = await hs256(ctx.context.secret, session.id);\n\t\t\t\tconst user = await ctx.context.adapter.findOne<UserWithTwoFactor>({\n\t\t\t\t\tmodel: ctx.context.tables.user.tableName,\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\tvalue: session.userId,\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\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\tmessage: \"invalid session\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (hashToMatch === hash) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvalid: async () => {\n\t\t\t\t\t\t\tawait setSessionCookie(\n\t\t\t\t\t\t\t\tctx,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\t\tuser,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (ctx.body.trustDevice) {\n\t\t\t\t\t\t\t\tconst trustDeviceCookie = ctx.context.createAuthCookie(\n\t\t\t\t\t\t\t\t\tTRUST_DEVICE_COOKIE_NAME,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tmaxAge: 30 * 24 * 60 * 60, // 30 days, it'll be refreshed on sign in requests\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\t/**\n\t\t\t\t\t\t\t\t * create a token that will be used to\n\t\t\t\t\t\t\t\t * verify the device\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\tconst token = await hs256(\n\t\t\t\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t\t\t\t\t`${user.id}!${session.id}`,\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tawait ctx.setSignedCookie(\n\t\t\t\t\t\t\t\t\ttrustDeviceCookie.name,\n\t\t\t\t\t\t\t\t\t`${token}!${session.id}`,\n\t\t\t\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t\t\t\t\ttrustDeviceCookie.attributes,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\tuser,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tinvalid: async () => {\n\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\tmessage: \"invalid two factor authentication\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsession: {\n\t\t\t\t\t\t\tid: session.id,\n\t\t\t\t\t\t\tuserId: session.userId,\n\t\t\t\t\t\t\texpiresAt: session.expiresAt,\n\t\t\t\t\t\t\tuser,\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\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\tmessage: \"invalid two factor cookie\",\n\t\t\t});\n\t\t}\n\t\treturn {\n\t\t\tvalid: async () => {\n\t\t\t\treturn ctx.json({\n\t\t\t\t\tsession,\n\t\t\t\t\tuser: session.user,\n\t\t\t\t});\n\t\t\t},\n\t\t\tinvalid: async () => {\n\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\tmessage: \"invalid two factor authentication\",\n\t\t\t\t});\n\t\t\t},\n\t\t\tsession,\n\t\t};\n\t},\n);\n","export const TWO_FACTOR_COOKIE_NAME = \"two_factor\";\nexport const OTP_RANDOM_NUMBER_COOKIE_NAME = \"otp_counter\";\nexport const TRUST_DEVICE_COOKIE_NAME = \"trust_device\";\n","import { APIError } from \"better-call\";\nimport { TOTPController } from \"oslo/otp\";\nimport { z } from \"zod\";\nimport { createAuthEndpoint } from \"../../../api/call\";\nimport { verifyTwoFactorMiddleware } from \"../verify-middleware\";\nimport type {\n\tTwoFactorProvider,\n\tTwoFactorTable,\n\tUserWithTwoFactor,\n} from \"../types\";\nimport { TimeSpan } from \"oslo\";\n\nexport interface OTPOptions {\n\t/**\n\t * How long the opt will be valid for in\n\t * minutes\n\t *\n\t * @default \"3 mins\"\n\t */\n\tperiod?: number;\n\t/**\n\t * Send the otp to the user\n\t *\n\t * @param user - The user to send the otp to\n\t * @param otp - The otp to send\n\t * @returns void | Promise<void>\n\t */\n\tsendOTP?: (user: UserWithTwoFactor, otp: string) => Promise<void> | void;\n}\n\n/**\n * The otp adapter is created from the totp adapter.\n */\nexport const otp2fa = (options: OTPOptions, twoFactorTable: string) => {\n\tconst opts = {\n\t\t...options,\n\t\tperiod: new TimeSpan(options?.period || 3, \"m\"),\n\t};\n\tconst totp = new TOTPController({\n\t\tdigits: 6,\n\t\tperiod: opts.period,\n\t});\n\t/**\n\t * Generate OTP and send it to the user.\n\t */\n\tconst send2FaOTP = createAuthEndpoint(\n\t\t\"/two-factor/send-otp\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tuse: [verifyTwoFactorMiddleware],\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tif (!options || !options.sendOTP) {\n\t\t\t\tctx.context.logger.error(\n\t\t\t\t\t\"send otp isn't configured. Please configure the send otp function on otp options.\",\n\t\t\t\t);\n\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: \"otp isn't configured\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst user = ctx.context.session.user as UserWithTwoFactor;\n\t\t\tconst twoFactor = await ctx.context.adapter.findOne<TwoFactorTable>({\n\t\t\t\tmodel: twoFactorTable,\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: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tif (!twoFactor) {\n\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: \"OTP isn't enabled\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst code = await totp.generate(Buffer.from(twoFactor.secret));\n\t\t\tawait options.sendOTP(user, code);\n\t\t\treturn ctx.json({ status: true });\n\t\t},\n\t);\n\n\tconst verifyOTP = createAuthEndpoint(\n\t\t\"/two-factor/verify-otp\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tbody: z.object({\n\t\t\t\tcode: z.string(),\n\t\t\t}),\n\t\t\tuse: [verifyTwoFactorMiddleware],\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst user = ctx.context.session.user;\n\t\t\tif (!user.twoFactorEnabled) {\n\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: \"two factor isn't enabled\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst twoFactor = await ctx.context.adapter.findOne<TwoFactorTable>({\n\t\t\t\tmodel: twoFactorTable,\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: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tif (!twoFactor) {\n\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: \"OTP isn't enabled\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst toCheckOtp = await totp.generate(Buffer.from(twoFactor.secret));\n\t\t\tif (toCheckOtp === ctx.body.code) {\n\t\t\t\treturn ctx.context.valid();\n\t\t\t} else {\n\t\t\t\treturn ctx.context.invalid();\n\t\t\t}\n\t\t},\n\t);\n\treturn {\n\t\tid: \"otp\",\n\t\tendpoints: {\n\t\t\tsend2FaOTP,\n\t\t\tverifyOTP,\n\t\t},\n\t} satisfies TwoFactorProvider;\n};\n","import { APIError } from \"better-call\";\nimport { TimeSpan } from \"oslo\";\nimport { TOTPController, createTOTPKeyURI } from \"oslo/otp\";\nimport { z } from \"zod\";\nimport { createAuthEndpoint } from \"../../../api/call\";\nimport { sessionMiddleware } from \"../../../api\";\nimport { symmetricDecrypt } from \"../../../crypto\";\nimport type { BackupCodeOptions } from \"../backup-codes\";\nimport { verifyTwoFactorMiddleware } from \"../verify-middleware\";\nimport type {\n\tTwoFactorProvider,\n\tTwoFactorTable,\n\tUserWithTwoFactor,\n} from \"../types\";\nimport { setSessionCookie } from \"../../../cookies\";\n\nexport type TOTPOptions = {\n\t/**\n\t * Issuer\n\t */\n\tissuer: string;\n\t/**\n\t * How many digits the otp to be\n\t *\n\t * @default 6\n\t */\n\tdigits?: 6 | 8;\n\t/**\n\t * Period for otp in seconds.\n\t * @default 30\n\t */\n\tperiod?: number;\n\t/**\n\t * Backup codes configuration\n\t */\n\tbackupCodes?: BackupCodeOptions;\n};\n\nexport const totp2fa = (options: TOTPOptions, twoFactorTable: string) => {\n\tconst opts = {\n\t\t...options,\n\t\tdigits: 6,\n\t\tperiod: new TimeSpan(options?.period || 30, \"s\"),\n\t};\n\n\tconst generateTOTP = createAuthEndpoint(\n\t\t\"/totp/generate\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tuse: [sessionMiddleware],\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tif (!options) {\n\t\t\t\tctx.context.logger.error(\n\t\t\t\t\t\"totp isn't configured. please pass totp option on two factor plugin to enable totp\",\n\t\t\t\t);\n\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: \"totp isn't configured\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst user = ctx.context.session.user as UserWithTwoFactor;\n\t\t\tconst twoFactor = await ctx.context.adapter.findOne<TwoFactorTable>({\n\t\t\t\tmodel: twoFactorTable,\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: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tif (!twoFactor) {\n\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: \"totp isn't enabled\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst totp = new TOTPController(opts);\n\t\t\tconst code = await totp.generate(Buffer.from(twoFactor.secret));\n\t\t\treturn { code };\n\t\t},\n\t);\n\n\tconst getTOTPURI = createAuthEndpoint(\n\t\t\"/two-factor/get-totp-uri\",\n\t\t{\n\t\t\tmethod: \"GET\",\n\t\t\tuse: [sessionMiddleware],\n\t\t\tbody: z.object({\n\t\t\t\tpassword: z.string(),\n\t\t\t}),\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tif (!options) {\n\t\t\t\tctx.context.logger.error(\n\t\t\t\t\t\"totp isn't configured. please pass totp option on two factor plugin to enable totp\",\n\t\t\t\t);\n\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: \"totp isn't configured\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst user = ctx.context.session.user as UserWithTwoFactor;\n\t\t\tconst twoFactor = await ctx.context.adapter.findOne<TwoFactorTable>({\n\t\t\t\tmodel: twoFactorTable,\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: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\t\t\tif (!twoFactor || !user.twoFactorEnabled) {\n\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: \"totp isn't enabled\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tawait ctx.context.password.checkPassword(user.id, ctx);\n\t\t\treturn {\n\t\t\t\ttotpURI: createTOTPKeyURI(\n\t\t\t\t\toptions?.issuer || \"BetterAuth\",\n\t\t\t\t\tuser.email,\n\t\t\t\t\tBuffer.from(twoFactor.secret),\n\t\t\t\t\topts,\n\t\t\t\t),\n\t\t\t};\n\t\t},\n\t);\n\n\tconst verifyTOTP = createAuthEndpoint(\n\t\t\"/two-factor/verify-totp\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tbody: z.object({\n\t\t\t\tcode: z.string(),\n\t\t\t}),\n\t\t\tuse: [verifyTwoFactorMiddleware],\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tif (!options) {\n\t\t\t\tctx.context.logger.error(\n\t\t\t\t\t\"totp isn't configured. please pass totp option on two factor plugin to enable totp\",\n\t\t\t\t);\n\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: \"totp isn't configured\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst user = ctx.context.session.user as UserWithTwoFactor;\n\t\t\tconst twoFactor = await ctx.context.adapter.findOne<TwoFactorTable>({\n\t\t\t\tmodel: twoFactorTable,\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: user.id,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t});\n\n\t\t\tif (!twoFactor) {\n\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: \"totp isn't enabled\",\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst totp = new TOTPController(opts);\n\t\t\tconst decrypted = await symmetricDecrypt({\n\t\t\t\tkey: ctx.context.secret,\n\t\t\t\tdata: twoFactor.secret,\n\t\t\t});\n\t\t\tconst secret = Buffer.from(decrypted);\n\t\t\tconst status = await totp.verify(ctx.body.code, secret);\n\t\t\tif (!status) {\n\t\t\t\treturn ctx.context.invalid();\n\t\t\t}\n\n\t\t\tif (!user.twoFactorEnabled) {\n\t\t\t\tconst updatedUser = await ctx.context.internalAdapter.updateUser(\n\t\t\t\t\tuser.id,\n\t\t\t\t\t{\n\t\t\t\t\t\ttwoFactorEnabled: true,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tconst newSession = await ctx.context.internalAdapter.createSession(\n\t\t\t\t\tuser.id,\n\t\t\t\t);\n\t\t\t\tawait setSessionCookie(ctx, {\n\t\t\t\t\tsession: newSession,\n\t\t\t\t\tuser: updatedUser,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn ctx.context.valid();\n\t\t},\n\t);\n\treturn {\n\t\tid: \"totp\",\n\t\tendpoints: {\n\t\t\tgenerateTOTP: generateTOTP,\n\t\t\tviewTOTPURI: getTOTPURI,\n\t\t\tverifyTOTP,\n\t\t},\n\t} satisfies TwoFactorProvider;\n};\n","import {\n\tgenerateAuthenticationOptions,\n\tgenerateRegistrationOptions,\n\tverifyAuthenticationResponse,\n\tverifyRegistrationResponse,\n} from \"@simplewebauthn/server\";\nimport type {\n\tAuthenticationResponseJSON,\n\tAuthenticatorTransportFuture,\n\tCredentialDeviceType,\n\tPublicKeyCredentialCreationOptionsJSON,\n} from \"@simplewebauthn/types\";\nimport { APIError } from \"better-call\";\nimport { alphabet, generateRandomString } from \"../../crypto/random\";\nimport { z } from \"zod\";\nimport { createAuthEndpoint } from \"../../api/call\";\nimport { sessionMiddleware } from \"../../api\";\nimport { getSessionFromCtx } from \"../../api/routes\";\nimport type { BetterAuthPlugin } from \"../../types/plugins\";\nimport { setSessionCookie } from \"../../cookies\";\nimport { BetterAuthError } from \"../../error\";\nimport { generateId } from \"../../utils/id\";\nimport { env } from \"../../utils/env\";\n\ninterface WebAuthnChallengeValue {\n\texpectedChallenge: string;\n\tuserData: {\n\t\tid: string;\n\t};\n}\n\nexport interface PasskeyOptions {\n\t/**\n\t * A unique identifier for your website. 'localhost' is okay for\n\t * local dev\n\t *\n\t * @default \"localhost\"\n\t */\n\trpID?: string;\n\t/**\n\t * Human-readable title for your website\n\t *\n\t * @default \"Better Auth\"\n\t */\n\trpName?: string;\n\t/**\n\t * The URL at which registrations and authentications should occur.\n\t * 'http://localhost' and 'http://localhost:PORT' are also valid.\n\t * Do NOT include any trailing /\n\t *\n\t * if this isn't provided. The client itself will\n\t * pass this value.\n\t */\n\torigin?: string | null;\n\t/**\n\t * Advanced options\n\t */\n\tadvanced?: {\n\t\twebAuthnChallengeCookie?: string;\n\t};\n}\n\nexport type Passkey = {\n\tid: string;\n\tname?: string;\n\tpublicKey: string;\n\tuserId: string;\n\twebauthnUserID: string;\n\tcounter: number;\n\tdeviceType: CredentialDeviceType;\n\tbackedUp: boolean;\n\ttransports?: string;\n\tcreatedAt: Date;\n};\n\nexport const passkey = (options?: PasskeyOptions) => {\n\tconst baseURL = env.BETTER_AUTH_URL;\n\tconst rpID =\n\t\toptions?.rpID ||\n\t\tbaseURL?.replace(\"http://\", \"\").replace(\"https://\", \"\").split(\":\")[0] ||\n\t\t\"localhost\";\n\tif (!rpID) {\n\t\tthrow new BetterAuthError(\n\t\t\t\"passkey rpID not found. Please provide a rpID in the options or set the BETTER_AUTH_URL environment variable.\",\n\t\t);\n\t}\n\tconst opts = {\n\t\torigin: null,\n\t\t...options,\n\t\trpID,\n\t\tadvanced: {\n\t\t\twebAuthnChallengeCookie: \"better-auth-passkey\",\n\t\t\t...options?.advanced,\n\t\t},\n\t};\n\tconst expirationTime = new Date(Date.now() + 1000 * 60 * 5);\n\tconst currentTime = new Date();\n\tconst maxAgeInSeconds = Math.floor(\n\t\t(expirationTime.getTime() - currentTime.getTime()) / 1000,\n\t);\n\treturn {\n\t\tid: \"passkey\",\n\t\tendpoints: {\n\t\t\tgeneratePasskeyRegistrationOptions: createAuthEndpoint(\n\t\t\t\t\"/passkey/generate-register-options\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tclient: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst session = ctx.context.session;\n\t\t\t\t\tconst userPasskeys = await ctx.context.adapter.findMany<Passkey>({\n\t\t\t\t\t\tmodel: \"passkey\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\t\t\tvalue: session.user.id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t\tconst userID = new Uint8Array(\n\t\t\t\t\t\tBuffer.from(generateRandomString(32, alphabet(\"a-z\", \"0-9\"))),\n\t\t\t\t\t);\n\t\t\t\t\tlet options: PublicKeyCredentialCreationOptionsJSON;\n\t\t\t\t\toptions = await generateRegistrationOptions({\n\t\t\t\t\t\trpName: opts.rpName || ctx.context.appName,\n\t\t\t\t\t\trpID: opts.rpID,\n\t\t\t\t\t\tuserID,\n\t\t\t\t\t\tuserName: session.user.email || session.user.id,\n\t\t\t\t\t\tattestationType: \"none\",\n\t\t\t\t\t\texcludeCredentials: userPasskeys.map((passkey) => ({\n\t\t\t\t\t\t\tid: passkey.id,\n\t\t\t\t\t\t\ttransports: passkey.transports?.split(\n\t\t\t\t\t\t\t\t\",\",\n\t\t\t\t\t\t\t) as AuthenticatorTransportFuture[],\n\t\t\t\t\t\t})),\n\t\t\t\t\t\tauthenticatorSelection: {\n\t\t\t\t\t\t\tresidentKey: \"preferred\",\n\t\t\t\t\t\t\tuserVerification: \"preferred\",\n\t\t\t\t\t\t\tauthenticatorAttachment: \"platform\",\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tconst id = generateId();\n\t\t\t\t\tawait ctx.setSignedCookie(\n\t\t\t\t\t\topts.advanced.webAuthnChallengeCookie,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsecure: true,\n\t\t\t\t\t\t\thttpOnly: true,\n\t\t\t\t\t\t\tsameSite: \"lax\",\n\t\t\t\t\t\t\tmaxAge: maxAgeInSeconds,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tawait ctx.context.internalAdapter.createVerificationValue({\n\t\t\t\t\t\tidentifier: id,\n\t\t\t\t\t\tvalue: JSON.stringify({\n\t\t\t\t\t\t\texpectedChallenge: options.challenge,\n\t\t\t\t\t\t\tuserData: {\n\t\t\t\t\t\t\t\tid: session.user.id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t\texpiresAt: expirationTime,\n\t\t\t\t\t});\n\t\t\t\t\treturn ctx.json(options, {\n\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tgeneratePasskeyAuthenticationOptions: createAuthEndpoint(\n\t\t\t\t\"/passkey/generate-authenticate-options\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z\n\t\t\t\t\t\t.object({\n\t\t\t\t\t\t\temail: z.string().optional(),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst session = await getSessionFromCtx(ctx);\n\t\t\t\t\tlet userPasskeys: Passkey[] = [];\n\t\t\t\t\tif (session) {\n\t\t\t\t\t\tuserPasskeys = await ctx.context.adapter.findMany<Passkey>({\n\t\t\t\t\t\t\tmodel: \"passkey\",\n\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\t\t\t\tvalue: session.user.id,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst options = await generateAuthenticationOptions({\n\t\t\t\t\t\trpID: opts.rpID,\n\t\t\t\t\t\tuserVerification: \"preferred\",\n\t\t\t\t\t\t...(userPasskeys.length\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\tallowCredentials: userPasskeys.map((passkey) => ({\n\t\t\t\t\t\t\t\t\t\tid: passkey.id,\n\t\t\t\t\t\t\t\t\t\ttransports: passkey.transports?.split(\n\t\t\t\t\t\t\t\t\t\t\t\",\",\n\t\t\t\t\t\t\t\t\t\t) as AuthenticatorTransportFuture[],\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: {}),\n\t\t\t\t\t});\n\t\t\t\t\tconst data = {\n\t\t\t\t\t\texpectedChallenge: options.challenge,\n\t\t\t\t\t\tuserData: {\n\t\t\t\t\t\t\tid: session?.user.id || \"\",\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tconst id = generateId();\n\t\t\t\t\tawait ctx.setSignedCookie(\n\t\t\t\t\t\topts.advanced.webAuthnChallengeCookie,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsecure: true,\n\t\t\t\t\t\t\thttpOnly: true,\n\t\t\t\t\t\t\tsameSite: \"lax\",\n\t\t\t\t\t\t\tmaxAge: maxAgeInSeconds,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tawait ctx.context.internalAdapter.createVerificationValue({\n\t\t\t\t\t\tidentifier: id,\n\t\t\t\t\t\tvalue: JSON.stringify(data),\n\t\t\t\t\t\texpiresAt: expirationTime,\n\t\t\t\t\t});\n\t\t\t\t\treturn ctx.json(options, {\n\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tverifyPasskeyRegistration: createAuthEndpoint(\n\t\t\t\t\"/passkey/verify-registration\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tresponse: z.any(),\n\t\t\t\t\t\tname: z.string().optional(),\n\t\t\t\t\t}),\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst origin = options?.origin || ctx.headers?.get(\"origin\") || \"\";\n\t\t\t\t\tif (!origin) {\n\t\t\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst resp = ctx.body.response;\n\t\t\t\t\tconst challengeId = await ctx.getSignedCookie(\n\t\t\t\t\t\topts.advanced.webAuthnChallengeCookie,\n\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t);\n\t\t\t\t\tif (!challengeId) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Challenge not found\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst data =\n\t\t\t\t\t\tawait ctx.context.internalAdapter.findVerificationValue(\n\t\t\t\t\t\t\tchallengeId,\n\t\t\t\t\t\t);\n\t\t\t\t\tif (!data) {\n\t\t\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst { expectedChallenge, userData } = JSON.parse(\n\t\t\t\t\t\tdata.value,\n\t\t\t\t\t) as WebAuthnChallengeValue;\n\n\t\t\t\t\tif (userData.id !== ctx.context.session.user.id) {\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"You are not authorized to register this passkey\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst verification = await verifyRegistrationResponse({\n\t\t\t\t\t\t\tresponse: resp,\n\t\t\t\t\t\t\texpectedChallenge,\n\t\t\t\t\t\t\texpectedOrigin: origin,\n\t\t\t\t\t\t\texpectedRPID: options?.rpID,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst { verified, registrationInfo } = verification;\n\t\t\t\t\t\tif (!verified || !registrationInfo) {\n\t\t\t\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst {\n\t\t\t\t\t\t\tcredentialID,\n\t\t\t\t\t\t\tcredentialPublicKey,\n\t\t\t\t\t\t\tcounter,\n\t\t\t\t\t\t\tcredentialDeviceType,\n\t\t\t\t\t\t\tcredentialBackedUp,\n\t\t\t\t\t\t} = registrationInfo;\n\t\t\t\t\t\tconst pubKey = Buffer.from(credentialPublicKey).toString(\"base64\");\n\t\t\t\t\t\tconst userID = generateId();\n\t\t\t\t\t\tconst newPasskey: Passkey = {\n\t\t\t\t\t\t\tname: ctx.body.name,\n\t\t\t\t\t\t\tuserId: userData.id,\n\t\t\t\t\t\t\twebauthnUserID: userID,\n\t\t\t\t\t\t\tid: credentialID,\n\t\t\t\t\t\t\tpublicKey: pubKey,\n\t\t\t\t\t\t\tcounter,\n\t\t\t\t\t\t\tdeviceType: credentialDeviceType,\n\t\t\t\t\t\t\ttransports: resp.response.transports.join(\",\"),\n\t\t\t\t\t\t\tbackedUp: credentialBackedUp,\n\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst newPasskeyRes = await ctx.context.adapter.create<Passkey>({\n\t\t\t\t\t\t\tmodel: \"passkey\",\n\t\t\t\t\t\t\tdata: newPasskey,\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn ctx.json(newPasskeyRes, {\n\t\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tconsole.log(e);\n\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\tmessage: \"Failed to verify registration\",\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\tverifyPasskeyAuthentication: createAuthEndpoint(\n\t\t\t\t\"/passkey/verify-authentication\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tresponse: z.any(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst origin = options?.origin || ctx.headers?.get(\"origin\") || \"\";\n\t\t\t\t\tif (!origin) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"origin missing\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst resp = ctx.body.response;\n\t\t\t\t\tconst challengeId = await ctx.getSignedCookie(\n\t\t\t\t\t\topts.advanced.webAuthnChallengeCookie,\n\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t);\n\t\t\t\t\tif (!challengeId) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Challenge not found\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst data =\n\t\t\t\t\t\tawait ctx.context.internalAdapter.findVerificationValue(\n\t\t\t\t\t\t\tchallengeId,\n\t\t\t\t\t\t);\n\t\t\t\t\tif (!data) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Challenge not found\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst { expectedChallenge } = JSON.parse(\n\t\t\t\t\t\tdata.value,\n\t\t\t\t\t) as WebAuthnChallengeValue;\n\t\t\t\t\tconst passkey = await ctx.context.adapter.findOne<Passkey>({\n\t\t\t\t\t\tmodel: \"passkey\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t\tvalue: resp.id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t\tif (!passkey) {\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Passkey not found\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst verification = await verifyAuthenticationResponse({\n\t\t\t\t\t\t\tresponse: resp as AuthenticationResponseJSON,\n\t\t\t\t\t\t\texpectedChallenge,\n\t\t\t\t\t\t\texpectedOrigin: origin,\n\t\t\t\t\t\t\texpectedRPID: opts.rpID,\n\t\t\t\t\t\t\tauthenticator: {\n\t\t\t\t\t\t\t\tcredentialID: passkey.id,\n\t\t\t\t\t\t\t\tcredentialPublicKey: new Uint8Array(\n\t\t\t\t\t\t\t\t\tBuffer.from(passkey.publicKey, \"base64\"),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tcounter: passkey.counter,\n\t\t\t\t\t\t\t\ttransports: passkey.transports?.split(\n\t\t\t\t\t\t\t\t\t\",\",\n\t\t\t\t\t\t\t\t) as AuthenticatorTransportFuture[],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst { verified } = verification;\n\t\t\t\t\t\tif (!verified)\n\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\tmessage: \"Authentication failed\",\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait ctx.context.adapter.update<Passkey>({\n\t\t\t\t\t\t\tmodel: \"passkey\",\n\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t\t\tvalue: passkey.id,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tupdate: {\n\t\t\t\t\t\t\t\tcounter: verification.authenticationInfo.newCounter,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst s = await ctx.context.internalAdapter.createSession(\n\t\t\t\t\t\t\tpasskey.userId,\n\t\t\t\t\t\t\tctx.request,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!s) {\n\t\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\t\tmessage: \"Unable to create session\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst user = await ctx.context.internalAdapter.findUserById(\n\t\t\t\t\t\t\tpasskey.userId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!user) {\n\t\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait setSessionCookie(ctx, {\n\t\t\t\t\t\t\tsession: s,\n\t\t\t\t\t\t\tuser,\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn ctx.json(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tsession: s,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tctx.context.logger.error(e);\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Failed to verify authentication\",\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\tlistPasskeys: createAuthEndpoint(\n\t\t\t\t\"/passkey/list-user-passkeys\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst passkeys = await ctx.context.adapter.findMany<Passkey>({\n\t\t\t\t\t\tmodel: \"passkey\",\n\t\t\t\t\t\twhere: [{ field: \"userId\", value: ctx.context.session.user.id }],\n\t\t\t\t\t});\n\t\t\t\t\treturn ctx.json(passkeys, {\n\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tdeletePasskey: createAuthEndpoint(\n\t\t\t\t\"/passkey/delete-passkey\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tid: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tawait ctx.context.adapter.delete<Passkey>({\n\t\t\t\t\t\tmodel: \"passkey\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t\tvalue: ctx.body.id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t},\n\t\tschema: {\n\t\t\tpasskey: {\n\t\t\t\tfields: {\n\t\t\t\t\tname: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t},\n\t\t\t\t\tpublicKey: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t},\n\t\t\t\t\tuserId: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\treferences: {\n\t\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t},\n\t\t\t\t\twebauthnUserID: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t},\n\t\t\t\t\tcounter: {\n\t\t\t\t\t\ttype: \"number\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t},\n\t\t\t\t\tdeviceType: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t},\n\t\t\t\t\tbackedUp: {\n\t\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t},\n\t\t\t\t\ttransports: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t},\n\t\t\t\t\tcreatedAt: {\n\t\t\t\t\t\ttype: \"date\",\n\t\t\t\t\t\tdefaultValue: new Date(),\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t} satisfies BetterAuthPlugin;\n};\n\nexport * from \"./client\";\n","import { z } from \"zod\";\nimport { createAuthEndpoint } from \"../../api/call\";\nimport type { BetterAuthPlugin } from \"../../types/plugins\";\nimport { APIError } from \"better-call\";\nimport type { Account, User } from \"../../db/schema\";\n\nexport const username = () => {\n\treturn {\n\t\tid: \"username\",\n\t\tendpoints: {\n\t\t\tsignInUsername: createAuthEndpoint(\n\t\t\t\t\"/sign-in/username\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tusername: z.string(),\n\t\t\t\t\t\tpassword: z.string(),\n\t\t\t\t\t\tdontRememberMe: z.boolean().optional(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst user = await ctx.context.adapter.findOne<User>({\n\t\t\t\t\t\tmodel: ctx.context.tables.user.tableName,\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"username\",\n\t\t\t\t\t\t\t\tvalue: ctx.body.username,\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\tawait ctx.context.password.hash(ctx.body.password);\n\t\t\t\t\t\tctx.context.logger.error(\"User not found\", { username });\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Invalid username or password\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst account = await ctx.context.adapter.findOne<Account>({\n\t\t\t\t\t\tmodel: ctx.context.tables.account.tableName,\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield:\n\t\t\t\t\t\t\t\t\tctx.context.tables.account.fields.userId.fieldName ||\n\t\t\t\t\t\t\t\t\t\"userId\",\n\t\t\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield:\n\t\t\t\t\t\t\t\t\tctx.context.tables.account.fields.providerId.fieldName ||\n\t\t\t\t\t\t\t\t\t\"providerId\",\n\t\t\t\t\t\t\t\tvalue: \"credential\",\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 (!account) {\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Invalid username or password\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst currentPassword = account?.password;\n\t\t\t\t\tif (!currentPassword) {\n\t\t\t\t\t\tctx.context.logger.error(\"Password not found\", { username });\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Unexpected error\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst validPassword = await ctx.context.password.verify(\n\t\t\t\t\t\tcurrentPassword,\n\t\t\t\t\t\tctx.body.password,\n\t\t\t\t\t);\n\t\t\t\t\tif (!validPassword) {\n\t\t\t\t\t\tctx.context.logger.error(\"Invalid password\");\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Invalid username or password\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst session = await ctx.context.internalAdapter.createSession(\n\t\t\t\t\t\tuser.id,\n\t\t\t\t\t\tctx.request,\n\t\t\t\t\t);\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\t\t\tstatus: 500,\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\tmessage: \"Failed to create session\",\n\t\t\t\t\t\t\t\tstatus: 500,\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\tawait ctx.setSignedCookie(\n\t\t\t\t\t\tctx.context.authCookies.sessionToken.name,\n\t\t\t\t\t\tsession.id,\n\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t\tctx.body.dontRememberMe\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t...ctx.context.authCookies.sessionToken.options,\n\t\t\t\t\t\t\t\t\tmaxAge: undefined,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: ctx.context.authCookies.sessionToken.options,\n\t\t\t\t\t);\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tuser: user,\n\t\t\t\t\t\tsession,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t},\n\t\tschema: {\n\t\t\tuser: {\n\t\t\t\tfields: {\n\t\t\t\t\tusername: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\tunique: true,\n\t\t\t\t\t\treturned: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t} satisfies BetterAuthPlugin;\n};\n","import { serializeSigned } from \"better-call\";\nimport type { BetterAuthPlugin } from \"../../types/plugins\";\n\n/**\n * Converts bearer token to session cookie\n */\nexport const bearer = () => {\n\treturn {\n\t\tid: \"bearer\",\n\t\thooks: {\n\t\t\tbefore: [\n\t\t\t\t{\n\t\t\t\t\tmatcher(context) {\n\t\t\t\t\t\treturn Boolean(\n\t\t\t\t\t\t\tcontext.request?.headers.get(\"authorization\") ||\n\t\t\t\t\t\t\t\tcontext.headers?.get(\"authorization\"),\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\thandler: async (c) => {\n\t\t\t\t\t\tconst token =\n\t\t\t\t\t\t\tc.request?.headers.get(\"authorization\")?.replace(\"Bearer \", \"\") ||\n\t\t\t\t\t\t\tc.headers?.get(\"authorization\")?.replace(\"Bearer \", \"\");\n\t\t\t\t\t\tif (!token) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet signedToken = \"\";\n\n\t\t\t\t\t\tif (token.includes(\".\")) {\n\t\t\t\t\t\t\tsignedToken = token;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsignedToken = await serializeSigned(\"\", token, c.context.secret);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (c.request) {\n\t\t\t\t\t\t\tc.request.headers.set(\n\t\t\t\t\t\t\t\t\"cookie\",\n\t\t\t\t\t\t\t\t`${\n\t\t\t\t\t\t\t\t\tc.context.authCookies.sessionToken.name\n\t\t\t\t\t\t\t\t}=${signedToken.replace(\"=\", \"\")}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (c.headers) {\n\t\t\t\t\t\t\tc.headers.set(\n\t\t\t\t\t\t\t\t\"cookie\",\n\t\t\t\t\t\t\t\t`${\n\t\t\t\t\t\t\t\t\tc.context.authCookies.sessionToken.name\n\t\t\t\t\t\t\t\t}=${signedToken.replace(\"=\", \"\")}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tcontext: c,\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\t} satisfies BetterAuthPlugin;\n};\n","import { z } from \"zod\";\nimport { createAuthEndpoint } from \"../../api/call\";\nimport type { BetterAuthPlugin } from \"../../types/plugins\";\nimport { APIError } from \"better-call\";\nimport { setSessionCookie } from \"../../cookies\";\nimport { alphabet, generateRandomString } from \"../../crypto\";\n\ninterface MagicLinkOptions {\n\t/**\n\t * Time in seconds until the magic link expires.\n\t * @default (60 * 5) // 5 minutes\n\t */\n\texpiresIn?: number;\n\t/**\n\t * Send magic link implementation.\n\t */\n\tsendMagicLink: (data: {\n\t\temail: string;\n\t\turl: string;\n\t\ttoken: string;\n\t}) => Promise<void> | void;\n\t/**\n\t * Disable sign up if user is not found.\n\t *\n\t * @default false\n\t */\n\tdisableSignUp?: boolean;\n\t/**\n\t * Rate limit configuration.\n\t *\n\t * @default {\n\t * window: 60,\n\t * max: 5,\n\t * }\n\t */\n\trateLimit?: {\n\t\twindow: number;\n\t\tmax: number;\n\t};\n}\n\nexport const magicLink = (options: MagicLinkOptions) => {\n\treturn {\n\t\tid: \"magic-link\",\n\t\tendpoints: {\n\t\t\tsignInMagicLink: createAuthEndpoint(\n\t\t\t\t\"/sign-in/magic-link\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\trequireHeaders: true,\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\temail: z.string().email(),\n\t\t\t\t\t\tcallbackURL: z.string().optional(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { email } = ctx.body;\n\t\t\t\t\tconst verificationToken = generateRandomString(\n\t\t\t\t\t\t32,\n\t\t\t\t\t\talphabet(\"a-z\", \"A-Z\"),\n\t\t\t\t\t);\n\t\t\t\t\tawait ctx.context.internalAdapter.createVerificationValue({\n\t\t\t\t\t\tidentifier: verificationToken,\n\t\t\t\t\t\tvalue: email,\n\t\t\t\t\t\texpiresAt: new Date(\n\t\t\t\t\t\t\tDate.now() + (options.expiresIn || 60 * 5) * 1000,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t\tconst url = `${\n\t\t\t\t\t\tctx.context.baseURL\n\t\t\t\t\t}/magic-link/verify?token=${verificationToken}&callbackURL=${\n\t\t\t\t\t\tctx.body.callbackURL || \"/\"\n\t\t\t\t\t}`;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait options.sendMagicLink({\n\t\t\t\t\t\t\temail,\n\t\t\t\t\t\t\turl,\n\t\t\t\t\t\t\ttoken: verificationToken,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tctx.context.logger.error(\"Failed to send magic link\", e);\n\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\tmessage: \"Failed to send magic link\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tstatus: true,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tmagicLinkVerify: createAuthEndpoint(\n\t\t\t\t\"/magic-link/verify\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tquery: z.object({\n\t\t\t\t\t\ttoken: z.string(),\n\t\t\t\t\t\tcallbackURL: z.string().optional(),\n\t\t\t\t\t}),\n\t\t\t\t\trequireHeaders: true,\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { token, callbackURL } = ctx.query;\n\t\t\t\t\tconst toRedirectTo = callbackURL?.startsWith(\"http\")\n\t\t\t\t\t\t? callbackURL\n\t\t\t\t\t\t: callbackURL\n\t\t\t\t\t\t\t? `${ctx.context.options.baseURL}${callbackURL}`\n\t\t\t\t\t\t\t: ctx.context.options.baseURL;\n\t\t\t\t\tconst tokenValue =\n\t\t\t\t\t\tawait ctx.context.internalAdapter.findVerificationValue(token);\n\t\t\t\t\tif (!tokenValue) {\n\t\t\t\t\t\tthrow ctx.redirect(`${toRedirectTo}?error=INVALID_TOKEN`);\n\t\t\t\t\t}\n\t\t\t\t\tif (tokenValue.expiresAt < new Date()) {\n\t\t\t\t\t\tawait ctx.context.internalAdapter.deleteVerificationValue(\n\t\t\t\t\t\t\ttokenValue.id,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthrow ctx.redirect(`${toRedirectTo}?error=EXPIRED_TOKEN`);\n\t\t\t\t\t}\n\t\t\t\t\tawait ctx.context.internalAdapter.deleteVerificationValue(\n\t\t\t\t\t\ttokenValue.id,\n\t\t\t\t\t);\n\t\t\t\t\tconst email = tokenValue.value;\n\t\t\t\t\tconst user = await ctx.context.internalAdapter.findUserByEmail(email);\n\t\t\t\t\tlet userId: string = user?.user.id || \"\";\n\n\t\t\t\t\tif (!user) {\n\t\t\t\t\t\tif (!options.disableSignUp) {\n\t\t\t\t\t\t\tconst newUser = await ctx.context.internalAdapter.createUser({\n\t\t\t\t\t\t\t\temail: email,\n\t\t\t\t\t\t\t\temailVerified: true,\n\t\t\t\t\t\t\t\tname: email,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tuserId = newUser.id;\n\t\t\t\t\t\t\tif (!userId) {\n\t\t\t\t\t\t\t\tthrow ctx.redirect(`${toRedirectTo}?error=USER_NOT_CREATED`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow ctx.redirect(`${toRedirectTo}?error=USER_NOT_FOUND`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst session = await ctx.context.internalAdapter.createSession(\n\t\t\t\t\t\tuserId,\n\t\t\t\t\t\tctx.headers,\n\t\t\t\t\t);\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\tthrow ctx.redirect(`${toRedirectTo}?error=SESSION_NOT_CREATED`);\n\t\t\t\t\t}\n\t\t\t\t\tawait setSessionCookie(ctx, {\n\t\t\t\t\t\tsession,\n\t\t\t\t\t\tuser: user?.user!,\n\t\t\t\t\t});\n\t\t\t\t\tif (!callbackURL) {\n\t\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\t\tstatus: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthrow ctx.redirect(callbackURL);\n\t\t\t\t},\n\t\t\t),\n\t\t},\n\t\trateLimit: [\n\t\t\t{\n\t\t\t\tpathMatcher(path) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\tpath.startsWith(\"/sign-in/magic-link\") ||\n\t\t\t\t\t\tpath.startsWith(\"/magic-link/verify\")\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\twindow: options.rateLimit?.window || 60,\n\t\t\t\tmax: options.rateLimit?.max || 5,\n\t\t\t},\n\t\t],\n\t} satisfies BetterAuthPlugin;\n};\n","import { z } from \"zod\";\nimport { createAuthEndpoint } from \"../../api/call\";\nimport type { BetterAuthPlugin } from \"../../types/plugins\";\nimport { APIError } from \"better-call\";\nimport type { User } from \"../../db/schema\";\nimport { alphabet, generateRandomString } from \"../../crypto/random\";\nimport { getSessionFromCtx } from \"../../api\";\nimport { getDate } from \"../../utils/date\";\nimport { logger } from \"../../utils/logger\";\nimport { setSessionCookie } from \"../../cookies\";\n\nexport interface UserWithPhoneNumber extends User {\n\tphoneNumber: string;\n\tphoneNumberVerified: boolean;\n}\n\nfunction generateOTP(size: number) {\n\treturn generateRandomString(size, alphabet(\"0-9\"));\n}\n\nexport const phoneNumber = (options?: {\n\t/**\n\t * Length of the OTP code\n\t * @default 6\n\t */\n\totpLength?: number;\n\t/**\n\t * Send OTP code to the user\n\t *\n\t * @param phoneNumber\n\t * @param code\n\t * @returns\n\t */\n\tsendOTP: (phoneNumber: string, code: string) => Promise<void> | void;\n\t/**\n\t * custom function to verify the OTP code\n\t */\n\tverifyOTP?: (phoneNumber: string, code: string) => Promise<boolean> | boolean;\n\t/**\n\t * Expiry time of the OTP code in seconds\n\t * @default 300\n\t */\n\texpiresIn?: number;\n\t/**\n\t * Function to validate phone number\n\t *\n\t * by default any string is accepted\n\t */\n\tphoneNumberValidator?: (phoneNumber: string) => boolean;\n\t/**\n\t * Sign up user after phone number verification\n\t *\n\t * the user will be signed up with the temporary email\n\t * and the phone number will be updated after verification\n\t */\n\tsignUpOnVerification?: {\n\t\t/**\n\t\t * When a user signs up, a temporary email will be need to be created\n\t\t * to sign up the user. This function should return a temporary email\n\t\t * for the user given the phone number\n\t\t *\n\t\t * @param phoneNumber\n\t\t * @returns string (temporary email)\n\t\t */\n\t\tgetTempEmail: (phoneNumber: string) => string;\n\t\t/**\n\t\t * When a user signs up, a temporary name will be need to be created\n\t\t * to sign up the user. This function should return a temporary name\n\t\t * for the user given the phone number\n\t\t *\n\t\t * @param phoneNumber\n\t\t * @returns string (temporary name)\n\t\t *\n\t\t * @default phoneNumber - the phone number will be used as the name\n\t\t */\n\t\tgetTempName?: (phoneNumber: string) => string;\n\t};\n}) => {\n\tconst opts = {\n\t\tphoneNumber: \"phoneNumber\",\n\t\tphoneNumberVerified: \"phoneNumberVerified\",\n\t\tcode: \"code\",\n\t\tcreatedAt: \"createdAt\",\n\t\texpiresIn: options?.expiresIn || 300,\n\t\totpLength: options?.otpLength || 6,\n\t};\n\treturn {\n\t\tid: \"phone-number\",\n\t\tendpoints: {\n\t\t\tsendPhoneNumberOTP: createAuthEndpoint(\n\t\t\t\t\"/phone-number/send-otp\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tphoneNumber: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tif (!options?.sendOTP) {\n\t\t\t\t\t\tlogger.warn(\"sendOTP not implemented\");\n\t\t\t\t\t\tthrow new APIError(\"NOT_IMPLEMENTED\", {\n\t\t\t\t\t\t\tmessage: \"sendOTP not implemented\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst code = generateOTP(opts.otpLength);\n\t\t\t\t\tawait ctx.context.internalAdapter.createVerificationValue({\n\t\t\t\t\t\tvalue: code,\n\t\t\t\t\t\tidentifier: ctx.body.phoneNumber,\n\t\t\t\t\t\texpiresAt: getDate(opts.expiresIn, \"sec\"),\n\t\t\t\t\t});\n\t\t\t\t\tawait options.sendOTP(ctx.body.phoneNumber, code);\n\t\t\t\t\treturn ctx.json(\n\t\t\t\t\t\t{ code },\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\tmessage: \"Code sent\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t),\n\t\t\tverifyPhoneNumber: createAuthEndpoint(\n\t\t\t\t\"/phone-number/verify\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Phone number\n\t\t\t\t\t\t */\n\t\t\t\t\t\tphoneNumber: z.string(),\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * OTP code\n\t\t\t\t\t\t */\n\t\t\t\t\t\tcode: z.string(),\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Disable session creation after verification\n\t\t\t\t\t\t * @default false\n\t\t\t\t\t\t */\n\t\t\t\t\t\tdisableSession: z.boolean().optional(),\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * This checks if there is a session already\n\t\t\t\t\t\t * and updates the phone number with the provided\n\t\t\t\t\t\t * phone number\n\t\t\t\t\t\t */\n\t\t\t\t\t\tupdatePhoneNumber: z.boolean().optional(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst otp = await ctx.context.internalAdapter.findVerificationValue(\n\t\t\t\t\t\tctx.body.phoneNumber,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (!otp || otp.expiresAt < new Date()) {\n\t\t\t\t\t\tif (otp && otp.expiresAt < new Date()) {\n\t\t\t\t\t\t\tawait ctx.context.internalAdapter.deleteVerificationValue(otp.id);\n\t\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\t\tmessage: \"OTP expired\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"OTP not found\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (otp.value !== ctx.body.code) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Invalid OTP\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tawait ctx.context.internalAdapter.deleteVerificationValue(otp.id);\n\n\t\t\t\t\tif (ctx.body.updatePhoneNumber) {\n\t\t\t\t\t\tconst session = await getSessionFromCtx(ctx);\n\t\t\t\t\t\tif (!session) {\n\t\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\tmessage: \"Session not found\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst user = await ctx.context.internalAdapter.updateUser(\n\t\t\t\t\t\t\tsession.user.id,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t[opts.phoneNumber]: ctx.body.phoneNumber,\n\t\t\t\t\t\t\t\t[opts.phoneNumberVerified]: true,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\t\tuser: user as UserWithPhoneNumber,\n\t\t\t\t\t\t\tsession: session.session,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tlet user = await ctx.context.adapter.findOne<User>({\n\t\t\t\t\t\tmodel: ctx.context.tables.user.tableName,\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvalue: ctx.body.phoneNumber,\n\t\t\t\t\t\t\t\tfield: opts.phoneNumber,\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\tif (options?.signUpOnVerification) {\n\t\t\t\t\t\t\tuser = await ctx.context.internalAdapter.createUser({\n\t\t\t\t\t\t\t\temail: options.signUpOnVerification.getTempEmail(\n\t\t\t\t\t\t\t\t\tctx.body.phoneNumber,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\tname: options.signUpOnVerification.getTempName\n\t\t\t\t\t\t\t\t\t? options.signUpOnVerification.getTempName(\n\t\t\t\t\t\t\t\t\t\t\tctx.body.phoneNumber,\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t: ctx.body.phoneNumber,\n\t\t\t\t\t\t\t\t[opts.phoneNumber]: ctx.body.phoneNumber,\n\t\t\t\t\t\t\t\t[opts.phoneNumberVerified]: true,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (!user) {\n\t\t\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\t\t\tmessage: \"Failed to create user\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\t\tmessage: \"Phone number not found\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tuser = await ctx.context.internalAdapter.updateUser(user.id, {\n\t\t\t\t\t\t\t[opts.phoneNumberVerified]: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!user) {\n\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\tmessage: \"Failed to update user\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!ctx.body.disableSession) {\n\t\t\t\t\t\tconst session = await ctx.context.internalAdapter.createSession(\n\t\t\t\t\t\t\tuser.id,\n\t\t\t\t\t\t\tctx.request,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!session) {\n\t\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\t\tmessage: \"Failed to create session\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait setSessionCookie(ctx, {\n\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\tuser,\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\t\tuser,\n\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tuser,\n\t\t\t\t\t\tsession: null,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t},\n\t\tschema: {\n\t\t\tuser: {\n\t\t\t\tfields: {\n\t\t\t\t\tphoneNumber: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\tunique: true,\n\t\t\t\t\t\treturned: true,\n\t\t\t\t\t},\n\t\t\t\t\tphoneNumberVerified: {\n\t\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\treturned: true,\n\t\t\t\t\t\tinput: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t} satisfies BetterAuthPlugin;\n};\n","import { createAuthEndpoint, sessionMiddleware } from \"../../api\";\nimport type { BetterAuthPlugin } from \"../../types\";\nimport { setSessionCookie } from \"../../cookies\";\nimport { z } from \"zod\";\nimport { generateId } from \"../../utils/id\";\nimport { getOrigin } from \"../../utils/url\";\n\nexport interface AnonymousOptions {\n\t/**\n\t * Configure the domain name of the temporary email\n\t * address for anonymous users in the database.\n\t * @default \"baseURL\"\n\t */\n\temailDomainName?: string;\n}\n\nexport const anonymous = (options?: AnonymousOptions) => {\n\treturn {\n\t\tid: \"anonymous\",\n\t\tendpoints: {\n\t\t\tsignInAnonymous: createAuthEndpoint(\n\t\t\t\t\"/sign-in/anonymous\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { emailDomainName = getOrigin(ctx.context.baseURL) } =\n\t\t\t\t\t\toptions || {};\n\t\t\t\t\tconst id = generateId();\n\t\t\t\t\tconst email = `temp-${id}@${emailDomainName}`;\n\t\t\t\t\tconst newUser = await ctx.context.internalAdapter.createUser({\n\t\t\t\t\t\tid,\n\t\t\t\t\t\temail,\n\t\t\t\t\t\temailVerified: false,\n\t\t\t\t\t\tisAnonymous: true,\n\t\t\t\t\t\tname: \"Anonymous\",\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\tif (!newUser) {\n\t\t\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\t\t\tstatus: 500,\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\tmessage: \"Failed to create user\",\n\t\t\t\t\t\t\t\tstatus: 500,\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\tconst session = await ctx.context.internalAdapter.createSession(\n\t\t\t\t\t\tnewUser.id,\n\t\t\t\t\t\tctx.request,\n\t\t\t\t\t);\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\tmessage: \"Could not create session\",\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\tawait setSessionCookie(ctx, {\n\t\t\t\t\t\tsession,\n\t\t\t\t\t\tuser: newUser,\n\t\t\t\t\t});\n\t\t\t\t\treturn ctx.json({ user: newUser, session });\n\t\t\t\t},\n\t\t\t),\n\t\t\tlinkAccount: createAuthEndpoint(\n\t\t\t\t\"/anonymous/link-account\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\temail: z.string().email().optional(),\n\t\t\t\t\t\tpassword: z.string().min(6),\n\t\t\t\t\t}),\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst userId = ctx.context.session.user.id;\n\t\t\t\t\tconst { email, password } = ctx.body;\n\t\t\t\t\tlet updatedUser = null;\n\t\t\t\t\tif (email && password) {\n\t\t\t\t\t\tupdatedUser = await ctx.context.internalAdapter.updateUser(userId, {\n\t\t\t\t\t\t\temail: email,\n\t\t\t\t\t\t\tisAnonymous: false,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (!updatedUser) {\n\t\t\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\t\t\tstatus: 500,\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\tmessage: \"Failed to update user\",\n\t\t\t\t\t\t\t\tstatus: 500,\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\tconst hash = await ctx.context.password.hash(password);\n\t\t\t\t\tconst updateUserAccount =\n\t\t\t\t\t\tawait ctx.context.internalAdapter.linkAccount({\n\t\t\t\t\t\t\tuserId: updatedUser.id,\n\t\t\t\t\t\t\tproviderId: \"credential\",\n\t\t\t\t\t\t\tpassword: hash,\n\t\t\t\t\t\t\taccountId: updatedUser.id,\n\t\t\t\t\t\t});\n\t\t\t\t\tif (!updateUserAccount) {\n\t\t\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\t\t\tstatus: 500,\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\tmessage: \"Failed to update account\",\n\t\t\t\t\t\t\t\tstatus: 500,\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\tconst session = await ctx.context.internalAdapter.createSession(\n\t\t\t\t\t\tupdatedUser.id,\n\t\t\t\t\t\tctx.request,\n\t\t\t\t\t);\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\t\t\tstatus: 400,\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\tmessage: \"Could not create session\",\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\tawait setSessionCookie(ctx, {\n\t\t\t\t\t\tsession,\n\t\t\t\t\t\tuser: updatedUser,\n\t\t\t\t\t});\n\t\t\t\t\treturn ctx.json({ session, user: updatedUser });\n\t\t\t\t},\n\t\t\t),\n\t\t},\n\t\tschema: {\n\t\t\tuser: {\n\t\t\t\tfields: {\n\t\t\t\t\tisAnonymous: {\n\t\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\t\tdefaultValue: true,\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t} satisfies BetterAuthPlugin;\n};\n","import { z } from \"zod\";\nimport {\n\tAPIError,\n\tcreateAuthEndpoint,\n\tcreateAuthMiddleware,\n\tgetSessionFromCtx,\n} from \"../../api\";\nimport type { BetterAuthPlugin, Session, User } from \"../../types\";\nimport { setSessionCookie } from \"../../cookies\";\nimport { getDate } from \"../../utils/date\";\n\nexport interface UserWithRole extends User {\n\trole?: string;\n\tbanned?: boolean;\n\tbanReason?: string;\n\tbanExpires?: number;\n}\n\ninterface SessionWithImpersonatedBy extends Session {\n\timpersonatedBy?: string;\n}\n\nexport const adminMiddleware = createAuthMiddleware(async (ctx) => {\n\tconst session = await getSessionFromCtx(ctx);\n\tif (!session?.session) {\n\t\tthrow new APIError(\"UNAUTHORIZED\");\n\t}\n\tconst user = session.user as UserWithRole;\n\tif (user.role !== \"admin\") {\n\t\tthrow new APIError(\"FORBIDDEN\", {\n\t\t\tmessage: \"Only admins can access this endpoint\",\n\t\t});\n\t}\n\treturn {\n\t\tsession: {\n\t\t\tuser: user,\n\t\t\tsession: session.session,\n\t\t},\n\t};\n});\n\ninterface AdminOptions {\n\t/**\n\t * The default role for a user created by the admin\n\t *\n\t * @default \"user\"\n\t */\n\tdefaultRole?: string | false;\n\t/**\n\t * A default ban reason\n\t *\n\t * By default, no reason is provided\n\t */\n\tdefaultBanReason?: string;\n\t/**\n\t * Number of seconds until the ban expires\n\t *\n\t * By default, the ban never expires\n\t */\n\tdefaultBanExpiresIn?: number;\n\t/**\n\t * Duration of the impersonation session in seconds\n\t *\n\t * By default, the impersonation session lasts 1 hour\n\t */\n\timpersonationSessionDuration?: number;\n}\n\nexport const admin = (options?: AdminOptions) => {\n\treturn {\n\t\tid: \"admin\",\n\t\tinit(ctx) {\n\t\t\treturn {\n\t\t\t\toptions: {\n\t\t\t\t\tdatabaseHooks: {\n\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\tcreate: {\n\t\t\t\t\t\t\t\tasync before(user) {\n\t\t\t\t\t\t\t\t\tif (options?.defaultRole === false) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t\trole: options?.defaultRole ?? \"user\",\n\t\t\t\t\t\t\t\t\t\t\t...user,\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},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsession: {\n\t\t\t\t\t\t\tcreate: {\n\t\t\t\t\t\t\t\tasync before(session) {\n\t\t\t\t\t\t\t\t\tconst user = (await ctx.internalAdapter.findUserById(\n\t\t\t\t\t\t\t\t\t\tsession.userId,\n\t\t\t\t\t\t\t\t\t)) as UserWithRole;\n\n\t\t\t\t\t\t\t\t\tif (user.banned) {\n\t\t\t\t\t\t\t\t\t\tif (user.banExpires && user.banExpires < Date.now()) {\n\t\t\t\t\t\t\t\t\t\t\tawait ctx.internalAdapter.updateUser(session.userId, {\n\t\t\t\t\t\t\t\t\t\t\t\tbanned: false,\n\t\t\t\t\t\t\t\t\t\t\t\tbanReason: null,\n\t\t\t\t\t\t\t\t\t\t\t\tbanExpires: null,\n\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn false;\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},\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\t\thooks: {\n\t\t\tafter: [\n\t\t\t\t{\n\t\t\t\t\tmatcher(context) {\n\t\t\t\t\t\treturn context.path === \"/list-sessions\";\n\t\t\t\t\t},\n\t\t\t\t\thandler: createAuthMiddleware(async (ctx) => {\n\t\t\t\t\t\tconst returned = ctx.context.returned;\n\t\t\t\t\t\tif (returned) {\n\t\t\t\t\t\t\tconst json =\n\t\t\t\t\t\t\t\t(await returned.json()) as SessionWithImpersonatedBy[];\n\t\t\t\t\t\t\tconst newJson = json.filter((session) => {\n\t\t\t\t\t\t\t\treturn !session.impersonatedBy;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconst response = new Response(JSON.stringify(newJson), {\n\t\t\t\t\t\t\t\tstatus: 200,\n\t\t\t\t\t\t\t\tstatusText: \"OK\",\n\t\t\t\t\t\t\t\theaders: returned.headers,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\t\t\tresponse: response,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tendpoints: {\n\t\t\tsetRole: createAuthEndpoint(\n\t\t\t\t\"/admin/set-role\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tuserId: z.string(),\n\t\t\t\t\t\trole: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t\tuse: [adminMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst updatedUser = await ctx.context.internalAdapter.updateUser(\n\t\t\t\t\t\tctx.body.userId,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trole: ctx.body.role,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tuser: updatedUser as UserWithRole,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tcreateUser: createAuthEndpoint(\n\t\t\t\t\"/admin/create-user\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\temail: z.string(),\n\t\t\t\t\t\tpassword: z.string(),\n\t\t\t\t\t\tname: z.string(),\n\t\t\t\t\t\trole: z.string(),\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * extra fields for user\n\t\t\t\t\t\t */\n\t\t\t\t\t\tdata: z.optional(z.record(z.any())),\n\t\t\t\t\t}),\n\t\t\t\t\tuse: [adminMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst existUser = await ctx.context.internalAdapter.findUserByEmail(\n\t\t\t\t\t\tctx.body.email,\n\t\t\t\t\t);\n\t\t\t\t\tif (existUser) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"User already exists\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst user =\n\t\t\t\t\t\tawait ctx.context.internalAdapter.createUser<UserWithRole>({\n\t\t\t\t\t\t\temail: ctx.body.email,\n\t\t\t\t\t\t\tname: ctx.body.name,\n\t\t\t\t\t\t\trole: ctx.body.role,\n\t\t\t\t\t\t\t...ctx.body.data,\n\t\t\t\t\t\t});\n\n\t\t\t\t\tif (!user) {\n\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\tmessage: \"Failed to create user\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst hashedPassword = await ctx.context.password.hash(\n\t\t\t\t\t\tctx.body.password,\n\t\t\t\t\t);\n\t\t\t\t\tawait ctx.context.internalAdapter.linkAccount({\n\t\t\t\t\t\taccountId: user.id,\n\t\t\t\t\t\tproviderId: \"credential\",\n\t\t\t\t\t\tpassword: hashedPassword,\n\t\t\t\t\t\tuserId: user.id,\n\t\t\t\t\t});\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tuser: user as UserWithRole,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tlistUsers: createAuthEndpoint(\n\t\t\t\t\"/admin/list-users\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tuse: [adminMiddleware],\n\t\t\t\t\tquery: z.object({\n\t\t\t\t\t\tsearch: z\n\t\t\t\t\t\t\t.object({\n\t\t\t\t\t\t\t\tfield: z.enum([\"email\", \"name\"]),\n\t\t\t\t\t\t\t\toperator: z\n\t\t\t\t\t\t\t\t\t.enum([\"contains\", \"starts_with\", \"ends_with\"])\n\t\t\t\t\t\t\t\t\t.default(\"contains\"),\n\t\t\t\t\t\t\t\tvalue: z.string(),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.optional(),\n\t\t\t\t\t\tlimit: z.string().or(z.number()).optional(),\n\t\t\t\t\t\toffset: z.string().or(z.number()).optional(),\n\t\t\t\t\t\tsortBy: z.string().optional(),\n\t\t\t\t\t\tsortDirection: z.enum([\"asc\", \"desc\"]).optional(),\n\t\t\t\t\t\tfilter: z\n\t\t\t\t\t\t\t.array(\n\t\t\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\t\t\tfield: z.string(),\n\t\t\t\t\t\t\t\t\tvalue: z.string().or(z.number()).or(z.boolean()),\n\t\t\t\t\t\t\t\t\toperator: z.enum([\"eq\", \"ne\", \"lt\", \"lte\", \"gt\", \"gte\"]),\n\t\t\t\t\t\t\t\t\tconnector: z.enum([\"AND\", \"OR\"]).optional(),\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.optional(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst where = [];\n\n\t\t\t\t\tif (ctx.query?.search) {\n\t\t\t\t\t\twhere.push({\n\t\t\t\t\t\t\tfield: ctx.query.search.field,\n\t\t\t\t\t\t\toperator: ctx.query.search.operator,\n\t\t\t\t\t\t\tvalue: ctx.query.search.value,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (ctx.query?.filter) {\n\t\t\t\t\t\twhere.push(...(ctx.query.filter || []));\n\t\t\t\t\t}\n\n\t\t\t\t\tconst users = await ctx.context.internalAdapter.listUsers(\n\t\t\t\t\t\tNumber(ctx.query?.limit) || undefined,\n\t\t\t\t\t\tNumber(ctx.query?.offset) || undefined,\n\t\t\t\t\t\tctx.query?.sortBy\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\tfield: ctx.query.sortBy,\n\t\t\t\t\t\t\t\t\tdirection: ctx.query.sortDirection || \"asc\",\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: undefined,\n\n\t\t\t\t\t\twhere.length ? where : undefined,\n\t\t\t\t\t);\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tusers: users as UserWithRole[],\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tlistUserSessions: createAuthEndpoint(\n\t\t\t\t\"/admin/list-user-sessions\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tuse: [adminMiddleware],\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tuserId: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst sessions = await ctx.context.internalAdapter.listSessions(\n\t\t\t\t\t\tctx.body.userId,\n\t\t\t\t\t);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsessions: sessions,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t),\n\t\t\tunbanUser: createAuthEndpoint(\n\t\t\t\t\"/admin/unban-user\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tuserId: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t\tuse: [adminMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst user = await ctx.context.internalAdapter.updateUser(\n\t\t\t\t\t\tctx.body.userId,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbanned: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tuser: user,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tbanUser: createAuthEndpoint(\n\t\t\t\t\"/admin/ban-user\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tuserId: z.string(),\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Reason for the ban\n\t\t\t\t\t\t */\n\t\t\t\t\t\tbanReason: z.string().optional(),\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Number of seconds until the ban expires\n\t\t\t\t\t\t */\n\t\t\t\t\t\tbanExpiresIn: z.number().optional(),\n\t\t\t\t\t}),\n\t\t\t\t\tuse: [adminMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tif (ctx.body.userId === ctx.context.session.user.id) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"You cannot ban yourself\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst user = await ctx.context.internalAdapter.updateUser(\n\t\t\t\t\t\tctx.body.userId,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbanned: true,\n\t\t\t\t\t\t\tbanReason:\n\t\t\t\t\t\t\t\tctx.body.banReason || options?.defaultBanReason || \"No reason\",\n\t\t\t\t\t\t\tbanExpires: ctx.body.banExpiresIn\n\t\t\t\t\t\t\t\t? getDate(ctx.body.banExpiresIn, \"sec\")\n\t\t\t\t\t\t\t\t: options?.defaultBanExpiresIn\n\t\t\t\t\t\t\t\t\t? getDate(options.defaultBanExpiresIn, \"sec\")\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\t//revoke all sessions\n\t\t\t\t\tawait ctx.context.internalAdapter.deleteSessions(ctx.body.userId);\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tuser: user,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\timpersonateUser: createAuthEndpoint(\n\t\t\t\t\"/admin/impersonate-user\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tuserId: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t\tuse: [adminMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst targetUser = await ctx.context.internalAdapter.findUserById(\n\t\t\t\t\t\tctx.body.userId,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (!targetUser) {\n\t\t\t\t\t\tthrow new APIError(\"NOT_FOUND\", {\n\t\t\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst session = await ctx.context.internalAdapter.createSession(\n\t\t\t\t\t\ttargetUser.id,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\timpersonatedBy: ctx.context.session.user.id,\n\t\t\t\t\t\t\texpiresAt: options?.impersonationSessionDuration\n\t\t\t\t\t\t\t\t? getDate(options.impersonationSessionDuration, \"sec\")\n\t\t\t\t\t\t\t\t: getDate(60 * 60, \"sec\"), // 1 hour\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\tmessage: \"Failed to create session\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tawait setSessionCookie(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsession: session,\n\t\t\t\t\t\t\tuser: targetUser,\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t);\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tsession: session,\n\t\t\t\t\t\tuser: targetUser,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\trevokeUserSession: createAuthEndpoint(\n\t\t\t\t\"/admin/revoke-user-session\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tsessionId: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t\tuse: [adminMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tawait ctx.context.internalAdapter.deleteSession(ctx.body.sessionId);\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\trevokeUserSessions: createAuthEndpoint(\n\t\t\t\t\"/admin/revoke-user-sessions\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tuserId: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t\tuse: [adminMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tawait ctx.context.internalAdapter.deleteSessions(ctx.body.userId);\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tremoveUser: createAuthEndpoint(\n\t\t\t\t\"/admin/remove-user\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tuserId: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t\tuse: [adminMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tawait ctx.context.internalAdapter.deleteUser(ctx.body.userId);\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t},\n\t\tschema: {\n\t\t\tuser: {\n\t\t\t\tfields: {\n\t\t\t\t\trole: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\tinput: false,\n\t\t\t\t\t},\n\t\t\t\t\tbanned: {\n\t\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\t\tdefaultValue: false,\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\tinput: false,\n\t\t\t\t\t},\n\t\t\t\t\tbanReason: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\tinput: false,\n\t\t\t\t\t},\n\t\t\t\t\tbanExpires: {\n\t\t\t\t\t\ttype: \"date\",\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\tinput: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tsession: {\n\t\t\t\tfields: {\n\t\t\t\t\timpersonatedBy: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: false,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t} satisfies BetterAuthPlugin;\n};\n","import { z } from \"zod\";\nimport { APIError } from \"better-call\";\nimport type { BetterAuthPlugin, User } from \"../../types\";\nimport { createAuthEndpoint } from \"../../api\";\nimport { betterFetch } from \"@better-fetch/fetch\";\nimport { generateState, parseState } from \"../../oauth2/state\";\nimport { logger } from \"../../utils/logger\";\nimport { parseJWT } from \"oslo/jwt\";\nimport { userSchema } from \"../../db/schema\";\nimport { generateId } from \"../../utils/id\";\nimport { setSessionCookie } from \"../../cookies\";\nimport {\n\tcreateAuthorizationURL,\n\tvalidateAuthorizationCode,\n\ttype OAuth2Tokens,\n} from \"../../oauth2\";\n\n/**\n * Configuration interface for generic OAuth providers.\n */\ninterface GenericOAuthConfig {\n\t/** Unique identifier for the OAuth provider */\n\tproviderId: string;\n\t/**\n\t * URL to fetch OAuth 2.0 configuration.\n\t * If provided, the authorization and token endpoints will be fetched from this URL.\n\t */\n\tdiscoveryUrl?: string;\n\t/**\n\t * Type of OAuth flow.\n\t * @default \"oauth2\"\n\t */\n\ttype?: \"oauth2\" | \"oidc\";\n\t/**\n\t * URL for the authorization endpoint.\n\t * Optional if using discoveryUrl.\n\t */\n\tauthorizationUrl?: string;\n\t/**\n\t * URL for the token endpoint.\n\t * Optional if using discoveryUrl.\n\t */\n\ttokenUrl?: string;\n\t/**\n\t * URL for the user info endpoint.\n\t * Optional if using discoveryUrl.\n\t */\n\tuserInfoUrl?: string;\n\t/** OAuth client ID */\n\tclientId: string;\n\t/** OAuth client secret */\n\tclientSecret: string;\n\t/**\n\t * Array of OAuth scopes to request.\n\t * @default []\n\t */\n\tscopes?: string[];\n\t/**\n\t * Custom redirect URI.\n\t * If not provided, a default URI will be constructed.\n\t */\n\tredirectURI?: string;\n\t/**\n\t * OAuth response type.\n\t * @default \"code\"\n\t */\n\tresponseType?: string;\n\t/**\n\t * Prompt parameter for the authorization request.\n\t * Controls the authentication experience for the user.\n\t */\n\tprompt?: string;\n\t/**\n\t * Whether to use PKCE (Proof Key for Code Exchange)\n\t * @default false\n\t */\n\tpkce?: boolean;\n\t/**\n\t * Access type for the authorization request.\n\t * Use \"offline\" to request a refresh token.\n\t */\n\taccessType?: string;\n\t/**\n\t * Custom function to fetch user info.\n\t * If provided, this function will be used instead of the default user info fetching logic.\n\t * @param tokens - The OAuth tokens received after successful authentication\n\t * @returns A promise that resolves to a User object or null\n\t */\n\tgetUserInfo?: (tokens: OAuth2Tokens) => Promise<User | null>;\n}\n\ninterface GenericOAuthOptions {\n\t/**\n\t * Array of OAuth provider configurations.\n\t */\n\tconfig: GenericOAuthConfig[];\n}\n\nasync function getUserInfo(\n\ttokens: OAuth2Tokens,\n\ttype: \"oauth2\" | \"oidc\",\n\tfinalUserInfoUrl: string | undefined,\n) {\n\tif (type === \"oidc\" && tokens.idToken) {\n\t\tconst decoded = parseJWT(tokens.idToken);\n\t\tif (decoded?.payload) {\n\t\t\treturn decoded.payload;\n\t\t}\n\t}\n\n\tif (!finalUserInfoUrl) {\n\t\treturn null;\n\t}\n\n\tconst userInfo = await betterFetch<User>(finalUserInfoUrl, {\n\t\tmethod: \"GET\",\n\t\theaders: {\n\t\t\tAuthorization: `Bearer ${tokens.accessToken}`,\n\t\t},\n\t});\n\treturn userInfo.data;\n}\n\n/**\n * A generic OAuth plugin that can be used to add OAuth support to any provider\n */\nexport const genericOAuth = (options: GenericOAuthOptions) => {\n\treturn {\n\t\tid: \"generic-oauth\",\n\t\tendpoints: {\n\t\t\tsignInWithOAuth2: createAuthEndpoint(\n\t\t\t\t\"/sign-in/oauth2\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tquery: z\n\t\t\t\t\t\t.object({\n\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t * Redirect to the current URL after the\n\t\t\t\t\t\t\t * user has signed in.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tcurrentURL: z.string().optional(),\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tproviderId: z.string(),\n\t\t\t\t\t\tcallbackURL: z.string().optional(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst { providerId } = ctx.body;\n\t\t\t\t\tconst config = options.config.find(\n\t\t\t\t\t\t(c) => c.providerId === providerId,\n\t\t\t\t\t);\n\t\t\t\t\tif (!config) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: `No config found for provider ${providerId}`,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst {\n\t\t\t\t\t\tdiscoveryUrl,\n\t\t\t\t\t\tauthorizationUrl,\n\t\t\t\t\t\ttokenUrl,\n\t\t\t\t\t\tclientId,\n\t\t\t\t\t\tclientSecret,\n\t\t\t\t\t\tscopes,\n\t\t\t\t\t\tredirectURI,\n\t\t\t\t\t\tresponseType,\n\t\t\t\t\t\tpkce,\n\t\t\t\t\t\tprompt,\n\t\t\t\t\t\taccessType,\n\t\t\t\t\t} = config;\n\t\t\t\t\tlet finalAuthUrl = authorizationUrl;\n\t\t\t\t\tlet finalTokenUrl = tokenUrl;\n\t\t\t\t\tif (discoveryUrl) {\n\t\t\t\t\t\tconst discovery = await betterFetch<{\n\t\t\t\t\t\t\tauthorization_endpoint: string;\n\t\t\t\t\t\t\ttoken_endpoint: string;\n\t\t\t\t\t\t}>(discoveryUrl, {\n\t\t\t\t\t\t\tonError(context) {\n\t\t\t\t\t\t\t\tlogger.error(context.error, {\n\t\t\t\t\t\t\t\t\tdiscoveryUrl,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (discovery.data) {\n\t\t\t\t\t\t\tfinalAuthUrl = discovery.data.authorization_endpoint;\n\t\t\t\t\t\t\tfinalTokenUrl = discovery.data.token_endpoint;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!finalAuthUrl || !finalTokenUrl) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Invalid OAuth configuration.\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tconst currentURL = ctx.query?.currentURL\n\t\t\t\t\t\t? new URL(ctx.query?.currentURL)\n\t\t\t\t\t\t: null;\n\t\t\t\t\tconst callbackURL = ctx.body.callbackURL?.startsWith(\"http\")\n\t\t\t\t\t\t? ctx.body.callbackURL\n\t\t\t\t\t\t: `${currentURL?.origin}${ctx.body.callbackURL || \"\"}`;\n\t\t\t\t\tconst { state, codeVerifier } = await generateState(ctx);\n\n\t\t\t\t\tconst authUrl = await createAuthorizationURL({\n\t\t\t\t\t\tid: providerId,\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tclientId,\n\t\t\t\t\t\t\tclientSecret,\n\t\t\t\t\t\t\tredirectURI,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tauthorizationEndpoint: finalAuthUrl,\n\t\t\t\t\t\tstate,\n\t\t\t\t\t\tcodeVerifier,\n\t\t\t\t\t\tscopes: scopes || [],\n\t\t\t\t\t\tdisablePkce: !pkce,\n\t\t\t\t\t\tredirectURI: `${ctx.context.baseURL}/oauth2/callback/${providerId}`,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (responseType && responseType !== \"code\") {\n\t\t\t\t\t\tauthUrl.searchParams.set(\"response_type\", responseType);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (prompt) {\n\t\t\t\t\t\tauthUrl.searchParams.set(\"prompt\", prompt);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (accessType) {\n\t\t\t\t\t\tauthUrl.searchParams.set(\"access_type\", accessType);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\turl: authUrl.toString(),\n\t\t\t\t\t\tredirect: true,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\toAuth2Callback: createAuthEndpoint(\n\t\t\t\t\"/oauth2/callback/:providerId\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tquery: z.object({\n\t\t\t\t\t\tcode: z.string().optional(),\n\t\t\t\t\t\terror: z.string().optional(),\n\t\t\t\t\t\tstate: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tif (ctx.query.error || !ctx.query.code) {\n\t\t\t\t\t\tthrow ctx.redirect(\n\t\t\t\t\t\t\t`${ctx.context.baseURL}?error=${\n\t\t\t\t\t\t\t\tctx.query.error || \"oAuth_code_missing\"\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\tconst provider = options.config.find(\n\t\t\t\t\t\t(p) => p.providerId === ctx.params.providerId,\n\t\t\t\t\t);\n\n\t\t\t\t\tif (!provider) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: `No config found for provider ${ctx.params.providerId}`,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tlet tokens: OAuth2Tokens | undefined = undefined;\n\t\t\t\t\tconst parsedState = await parseState(ctx);\n\n\t\t\t\t\tconst { callbackURL, codeVerifier, errorURL } = parsedState;\n\t\t\t\t\tconst code = ctx.query.code;\n\n\t\t\t\t\tlet finalTokenUrl = provider.tokenUrl;\n\t\t\t\t\tlet finalUserInfoUrl = provider.userInfoUrl;\n\t\t\t\t\tif (provider.discoveryUrl) {\n\t\t\t\t\t\tconst discovery = await betterFetch<{\n\t\t\t\t\t\t\ttoken_endpoint: string;\n\t\t\t\t\t\t\tuserinfo_endpoint: string;\n\t\t\t\t\t\t}>(provider.discoveryUrl, {\n\t\t\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (discovery.data) {\n\t\t\t\t\t\t\tfinalTokenUrl = discovery.data.token_endpoint;\n\t\t\t\t\t\t\tfinalUserInfoUrl = discovery.data.userinfo_endpoint;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (!finalTokenUrl) {\n\t\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\t\tmessage: \"Invalid OAuth configuration.\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttokens = await validateAuthorizationCode({\n\t\t\t\t\t\t\tcode,\n\t\t\t\t\t\t\tcodeVerifier,\n\t\t\t\t\t\t\tredirectURI: `${ctx.context.baseURL}/oauth2/callback/${provider.providerId}`,\n\t\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\t\tclientId: provider.clientId,\n\t\t\t\t\t\t\t\tclientSecret: provider.clientSecret,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttokenEndpoint: finalTokenUrl,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tctx.context.logger.error(e);\n\t\t\t\t\t\tthrow ctx.redirect(\n\t\t\t\t\t\t\t`${errorURL}?error=oauth_code_verification_failed`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!tokens) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Invalid OAuth configuration.\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst userInfo = provider.getUserInfo\n\t\t\t\t\t\t? await provider.getUserInfo(tokens)\n\t\t\t\t\t\t: await getUserInfo(\n\t\t\t\t\t\t\t\ttokens,\n\t\t\t\t\t\t\t\tprovider.type || \"oauth2\",\n\t\t\t\t\t\t\t\tfinalUserInfoUrl,\n\t\t\t\t\t\t\t);\n\t\t\t\t\tconst id = generateId();\n\t\t\t\t\tconst user = userInfo\n\t\t\t\t\t\t? userSchema.safeParse({\n\t\t\t\t\t\t\t\t...userInfo,\n\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: null;\n\t\t\t\t\tif (!user?.success) {\n\t\t\t\t\t\tthrow ctx.redirect(`${errorURL}?error=oauth_user_info_invalid`);\n\t\t\t\t\t}\n\t\t\t\t\tconst dbUser = await ctx.context.internalAdapter\n\t\t\t\t\t\t.findUserByEmail(user.data.email, {\n\t\t\t\t\t\t\tincludeAccounts: true,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((e) => {\n\t\t\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\t\t\"Better auth was unable to query your database.\\nError: \",\n\t\t\t\t\t\t\t\te,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tthrow ctx.redirect(`${errorURL}?error=internal_server_error`);\n\t\t\t\t\t\t});\n\n\t\t\t\t\tconst userId = dbUser?.user.id || id;\n\n\t\t\t\t\tif (dbUser) {\n\t\t\t\t\t\t//check if user has already linked this provider\n\t\t\t\t\t\tconst hasBeenLinked = dbUser.accounts.find(\n\t\t\t\t\t\t\t(a) => a.providerId === provider.providerId,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst trustedProviders =\n\t\t\t\t\t\t\tctx.context.options.account?.accountLinking?.trustedProviders;\n\t\t\t\t\t\tconst isTrustedProvider = trustedProviders\n\t\t\t\t\t\t\t? trustedProviders.includes(provider.providerId as \"apple\")\n\t\t\t\t\t\t\t: true;\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!hasBeenLinked &&\n\t\t\t\t\t\t\t(!user?.data.emailVerified || !isTrustedProvider)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tlet url: URL;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\turl = new URL(errorURL!);\n\t\t\t\t\t\t\t\turl.searchParams.set(\"error\", \"account_not_linked\");\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\tthrow ctx.redirect(`${errorURL}?error=account_not_linked`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthrow ctx.redirect(url.toString());\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!hasBeenLinked) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait ctx.context.internalAdapter.linkAccount({\n\t\t\t\t\t\t\t\t\tproviderId: provider.providerId,\n\t\t\t\t\t\t\t\t\taccountId: user.data.id,\n\t\t\t\t\t\t\t\t\tid: `${provider.providerId}:${user.data.id}`,\n\t\t\t\t\t\t\t\t\tuserId: dbUser.user.id,\n\t\t\t\t\t\t\t\t\taccessToken: tokens.accessToken,\n\t\t\t\t\t\t\t\t\tidToken: tokens.idToken,\n\t\t\t\t\t\t\t\t\trefreshToken: tokens.refreshToken,\n\t\t\t\t\t\t\t\t\texpiresAt: tokens.accessTokenExpiresAt,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\tconsole.log(e);\n\t\t\t\t\t\t\t\tthrow ctx.redirect(`${errorURL}?error=failed_linking_account`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tawait ctx.context.internalAdapter.updateAccount(\n\t\t\t\t\t\t\t\thasBeenLinked.id,\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\taccessToken: tokens.accessToken,\n\t\t\t\t\t\t\t\t\tidToken: tokens.idToken,\n\t\t\t\t\t\t\t\t\trefreshToken: tokens.refreshToken,\n\t\t\t\t\t\t\t\t\texpiresAt: tokens.accessTokenExpiresAt,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait ctx.context.internalAdapter.createOAuthUser(user.data, {\n\t\t\t\t\t\t\t\tid: `${provider.providerId}:${user.data.id}`,\n\t\t\t\t\t\t\t\tproviderId: provider.providerId,\n\t\t\t\t\t\t\t\taccountId: user.data.id,\n\t\t\t\t\t\t\t\taccessToken: tokens.accessToken,\n\t\t\t\t\t\t\t\tidToken: tokens.idToken,\n\t\t\t\t\t\t\t\trefreshToken: tokens.refreshToken,\n\t\t\t\t\t\t\t\texpiresAt: tokens.accessTokenExpiresAt,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tconst url = new URL(errorURL!);\n\t\t\t\t\t\t\turl.searchParams.set(\"error\", \"unable_to_create_user\");\n\t\t\t\t\t\t\tctx.setHeader(\"Location\", url.toString());\n\t\t\t\t\t\t\tthrow ctx.redirect(url.toString());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst session = await ctx.context.internalAdapter.createSession(\n\t\t\t\t\t\t\tuserId || id,\n\t\t\t\t\t\t\tctx.request,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!session) {\n\t\t\t\t\t\t\tthrow ctx.redirect(`${errorURL}?error=unable_to_create_session`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait setSessionCookie(ctx, {\n\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\tuser: user.data,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tthrow ctx.redirect(`${errorURL}?error=unable_to_create_session`);\n\t\t\t\t\t}\n\t\t\t\t\tthrow ctx.redirect(callbackURL);\n\t\t\t\t},\n\t\t\t),\n\t\t},\n\t} satisfies BetterAuthPlugin;\n};\n","import type { PluginSchema } from \"../../types\";\nimport { z } from \"zod\";\n\nexport const schema: PluginSchema = {\n\tjwks: {\n\t\tfields: {\n\t\t\tpublicKey: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tprivateKey: {\n\t\t\t\ttype: \"string\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t\tcreatedAt: {\n\t\t\t\ttype: \"date\",\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t},\n\t},\n};\n\nexport const jwk = z.object({\n\tid: z.string(),\n\tpublicKey: z.string(),\n\tprivateKey: z.string(),\n\tcreatedAt: z.date(),\n});\n\nexport type Jwk = z.infer<typeof jwk>;\n","import type { Adapter } from \"../../types\";\nimport type { Jwk } from \"./schema\";\n\nexport const getJwksAdapter = (adapter: Adapter) => {\n\treturn {\n\t\tgetAllKeys: async () => {\n\t\t\treturn await adapter.findMany<Jwk>({\n\t\t\t\tmodel: \"jwks\",\n\t\t\t});\n\t\t},\n\t\tgetLatestKey: async () => {\n\t\t\tconst key = await adapter.findMany<Jwk>({\n\t\t\t\tmodel: \"jwks\",\n\t\t\t\tsortBy: {\n\t\t\t\t\tfield: \"createdAt\",\n\t\t\t\t\tdirection: \"desc\",\n\t\t\t\t},\n\t\t\t\tlimit: 1,\n\t\t\t});\n\n\t\t\treturn key[0];\n\t\t},\n\t\tcreateJwk: async (webKey: Jwk) => {\n\t\t\tconst jwk = await adapter.create<Jwk>({\n\t\t\t\tmodel: \"jwks\",\n\t\t\t\tdata: {\n\t\t\t\t\t...webKey,\n\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t},\n\t\t\t});\n\n\t\t\treturn jwk;\n\t\t},\n\t};\n};\n","import type { BetterAuthPlugin, User } from \"../../types\";\nimport { type Jwk, schema } from \"./schema\";\nimport { getJwksAdapter } from \"./adapter\";\nimport { exportJWK, generateKeyPair, importJWK, SignJWT } from \"jose\";\nimport { createAuthEndpoint, sessionMiddleware } from \"../../api\";\nimport { symmetricDecrypt, symmetricEncrypt } from \"../../crypto\";\n\ntype JWKOptions =\n\t| {\n\t\t\talg: \"EdDSA\"; // EdDSA with either Ed25519 or Ed448 curve\n\t\t\tcrv?: \"Ed25519\" | \"Ed448\";\n\t }\n\t| {\n\t\t\talg: \"ES256\"; // ECDSA with P-256 curve\n\t\t\tcrv?: never; // Only one valid option, no need for crv\n\t }\n\t| {\n\t\t\talg: \"RS256\"; // RSA with SHA-256\n\t\t\tmodulusLength?: number; // Default to 2048 or higher\n\t }\n\t| {\n\t\t\talg: \"PS256\"; // RSA-PSS with SHA-256\n\t\t\tmodulusLength?: number; // Default to 2048 or higher\n\t }\n\t| {\n\t\t\talg: \"ECDH-ES\"; // Key agreement algorithm with P-256 as default curve\n\t\t\tcrv?: \"P-256\" | \"P-384\" | \"P-521\";\n\t }\n\t| {\n\t\t\talg: \"ES512\"; // ECDSA with P-521 curve\n\t\t\tcrv?: never; // Only P-521 for ES512\n\t };\n\nexport interface JwtOptions {\n\tjwks?: {\n\t\t/**\n\t\t * Key pair configuration\n\t\t * @description A subset of the options available for the generateKeyPair function\n\t\t *\n\t\t * @see https://github.com/panva/jose/blob/main/src/runtime/node/generate.ts\n\t\t *\n\t\t * @default { alg: 'EdDSA', crv: 'Ed25519' }\n\t\t */\n\t\tkeyPairConfig?: JWKOptions;\n\n\t\t/**\n\t\t * Disable private key encryption\n\t\t * @description Disable the encryption of the private key in the database\n\t\t *\n\t\t * @default false\n\t\t */\n\t\tdisablePrivateKeyEncryption?: boolean;\n\t};\n\n\tjwt?: {\n\t\tissuer?: string;\n\t\taudience?: string;\n\t\t/**\n\t\t * Set the \"exp\" (Expiration Time) Claim.\n\t\t *\n\t\t * - If a `number` is passed as an argument it is used as the claim directly.\n\t\t * - If a `Date` instance is passed as an argument it is converted to unix timestamp and used as the\n\t\t * claim.\n\t\t * - If a `string` is passed as an argument it is resolved to a time span, and then added to the\n\t\t * current unix timestamp and used as the claim.\n\t\t *\n\t\t * Format used for time span should be a number followed by a unit, such as \"5 minutes\" or \"1\n\t\t * day\".\n\t\t *\n\t\t * Valid units are: \"sec\", \"secs\", \"second\", \"seconds\", \"s\", \"minute\", \"minutes\", \"min\", \"mins\",\n\t\t * \"m\", \"hour\", \"hours\", \"hr\", \"hrs\", \"h\", \"day\", \"days\", \"d\", \"week\", \"weeks\", \"w\", \"year\",\n\t\t * \"years\", \"yr\", \"yrs\", and \"y\". It is not possible to specify months. 365.25 days is used as an\n\t\t * alias for a year.\n\t\t *\n\t\t * If the string is suffixed with \"ago\", or prefixed with a \"-\", the resulting time span gets\n\t\t * subtracted from the current unix timestamp. A \"from now\" suffix can also be used for\n\t\t * readability when adding to the current unix timestamp.\n\t\t *\n\t\t * @default 15m\n\t\t */\n\t\texpirationTime?: number | string | Date;\n\t\tdefinePayload?: (\n\t\t\tuser: User,\n\t\t) => Promise<Record<string, any>> | Record<string, any>;\n\t};\n}\n\nexport const jwt = (options?: JwtOptions) => {\n\treturn {\n\t\tid: \"jwt\",\n\t\tendpoints: {\n\t\t\tgetJwks: createAuthEndpoint(\n\t\t\t\t\"/jwks\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst adapter = getJwksAdapter(ctx.context.adapter);\n\n\t\t\t\t\tconst keySets = await adapter.getAllKeys();\n\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tkeys: keySets.map((keySet) => ({\n\t\t\t\t\t\t\t...JSON.parse(keySet.publicKey),\n\t\t\t\t\t\t\tkid: keySet.id,\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\tgetToken: createAuthEndpoint(\n\t\t\t\t\"/token\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\trequireHeaders: true,\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst adapter = getJwksAdapter(ctx.context.adapter);\n\n\t\t\t\t\tlet key = await adapter.getLatestKey();\n\t\t\t\t\tconst privateKeyEncryptionEnabled =\n\t\t\t\t\t\t!options?.jwks?.disablePrivateKeyEncryption;\n\n\t\t\t\t\tif (key === undefined) {\n\t\t\t\t\t\tconst { publicKey, privateKey } = await generateKeyPair(\n\t\t\t\t\t\t\toptions?.jwks?.keyPairConfig?.alg ?? \"EdDSA\",\n\t\t\t\t\t\t\toptions?.jwks?.keyPairConfig ?? { crv: \"Ed25519\" },\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst publicWebKey = await exportJWK(publicKey);\n\t\t\t\t\t\tconst privateWebKey = await exportJWK(privateKey);\n\t\t\t\t\t\tconst stringifiedPrivateWebKey = JSON.stringify(privateWebKey);\n\n\t\t\t\t\t\tlet jwk: Partial<Jwk> = {\n\t\t\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\t\t\tpublicKey: JSON.stringify(publicWebKey),\n\t\t\t\t\t\t\tprivateKey: privateKeyEncryptionEnabled\n\t\t\t\t\t\t\t\t? JSON.stringify(\n\t\t\t\t\t\t\t\t\t\tawait symmetricEncrypt({\n\t\t\t\t\t\t\t\t\t\t\tkey: ctx.context.options.secret!,\n\t\t\t\t\t\t\t\t\t\t\tdata: stringifiedPrivateWebKey,\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: stringifiedPrivateWebKey,\n\t\t\t\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tkey = await adapter.createJwk(jwk as Jwk);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet privateWebKey = privateKeyEncryptionEnabled\n\t\t\t\t\t\t? await symmetricDecrypt({\n\t\t\t\t\t\t\t\tkey: ctx.context.options.secret!,\n\t\t\t\t\t\t\t\tdata: JSON.parse(key.privateKey),\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t: key.privateKey;\n\n\t\t\t\t\tconst privateKey = await importJWK(JSON.parse(privateWebKey));\n\n\t\t\t\t\tconst payload = !options?.jwt?.definePayload\n\t\t\t\t\t\t? ctx.context.session.user\n\t\t\t\t\t\t: await options?.jwt.definePayload(ctx.context.session.user);\n\n\t\t\t\t\tconst jwt = await new SignJWT({\n\t\t\t\t\t\t...payload,\n\t\t\t\t\t\t// I am aware that this is not the best way to handle this, but this is the only way I know to get the impersonatedBy field\n\t\t\t\t\t\t...((ctx.context.session.session as any).impersonatedBy!\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\timpersonatedBy: (ctx.context.session.session as any)\n\t\t\t\t\t\t\t\t\t\t.impersonatedBy,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t})\n\t\t\t\t\t\t.setProtectedHeader({\n\t\t\t\t\t\t\talg: options?.jwks?.keyPairConfig?.alg ?? \"EdDSA\",\n\t\t\t\t\t\t\tkid: key.id,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.setIssuedAt()\n\t\t\t\t\t\t.setIssuer(options?.jwt?.issuer ?? ctx.context.options.baseURL!)\n\t\t\t\t\t\t.setAudience(options?.jwt?.audience ?? ctx.context.options.baseURL!)\n\t\t\t\t\t\t.setExpirationTime(options?.jwt?.expirationTime ?? \"15m\")\n\t\t\t\t\t\t.setSubject(ctx.context.session.user.id)\n\t\t\t\t\t\t.sign(privateKey);\n\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\ttoken: jwt,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t},\n\t\tschema,\n\t} satisfies BetterAuthPlugin;\n};\n","import { z } from \"zod\";\nimport {\n\tAPIError,\n\tcreateAuthEndpoint,\n\tcreateAuthMiddleware,\n\tsessionMiddleware,\n} from \"../../api\";\nimport { parseCookies, parseSetCookieHeader } from \"../../cookies\";\nimport type { BetterAuthPlugin } from \"../../types\";\n\ninterface MultiSessionConfig {\n\t/**\n\t * The maximum number of sessions a user can have\n\t * at a time\n\t * @default 5\n\t */\n\tmaximumSessions?: number;\n}\n\nexport const multiSession = (options?: MultiSessionConfig) => {\n\tconst opts = {\n\t\tmaximumSessions: 5,\n\t\t...options,\n\t};\n\n\tconst isMultiSessionCookie = (key: string) => key.includes(\"_multi-\");\n\n\treturn {\n\t\tid: \"multi-session\",\n\t\tendpoints: {\n\t\t\tlistDeviceSessions: createAuthEndpoint(\n\t\t\t\t\"/multi-session/list-device-sessions\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\trequireHeaders: true,\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst cookieHeader = ctx.headers?.get(\"cookie\");\n\t\t\t\t\tif (!cookieHeader) return ctx.json([]);\n\n\t\t\t\t\tconst cookies = Object.fromEntries(parseCookies(cookieHeader));\n\n\t\t\t\t\tconst sessionIds = (\n\t\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\t\tObject.entries(cookies)\n\t\t\t\t\t\t\t\t.filter(([key]) => isMultiSessionCookie(key))\n\t\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t\tasync ([key]) =>\n\t\t\t\t\t\t\t\t\t\tawait ctx.getSignedCookie(key, ctx.context.secret),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t).filter((v) => v !== undefined);\n\t\t\t\t\tif (!sessionIds.length) return ctx.json([]);\n\t\t\t\t\tconst sessions =\n\t\t\t\t\t\tawait ctx.context.internalAdapter.findSessions(sessionIds);\n\n\t\t\t\t\tconst validSessions = sessions\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t(session) => session && session.session.expiresAt > new Date(),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t(session, index, self) =>\n\t\t\t\t\t\t\t\tindex === self.findIndex((s) => s.user.id === session.user.id),\n\t\t\t\t\t\t);\n\n\t\t\t\t\tObject.entries(cookies)\n\t\t\t\t\t\t.filter(([key]) => isMultiSessionCookie(key))\n\t\t\t\t\t\t.forEach(([key, value]) => {\n\t\t\t\t\t\t\tif (!validSessions.some((s) => s.session.id === value)) {\n\t\t\t\t\t\t\t\tctx.setCookie(key, \"\", {\n\t\t\t\t\t\t\t\t\t...ctx.context.authCookies.sessionToken.options,\n\t\t\t\t\t\t\t\t\tmaxAge: 0,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\treturn ctx.json(validSessions);\n\t\t\t\t},\n\t\t\t),\n\t\t\tsetActiveSession: createAuthEndpoint(\n\t\t\t\t\"/multi-session/set-active\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tsessionId: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t\trequireHeaders: true,\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst sessionId = ctx.body.sessionId;\n\t\t\t\t\tconst multiSessionCookieName = `${ctx.context.authCookies.sessionToken.name}_multi-${sessionId}`;\n\t\t\t\t\tconst sessionCookie = await ctx.getSignedCookie(\n\t\t\t\t\t\tmultiSessionCookieName,\n\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t);\n\t\t\t\t\tif (!sessionCookie) {\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Invalid session id\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst session =\n\t\t\t\t\t\tawait ctx.context.internalAdapter.findSession(sessionId);\n\t\t\t\t\tif (!session || session.session.expiresAt < new Date()) {\n\t\t\t\t\t\tctx.setCookie(multiSessionCookieName, \"\", {\n\t\t\t\t\t\t\t...ctx.context.authCookies.sessionToken.options,\n\t\t\t\t\t\t\tmaxAge: 0,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Invalid session id\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tawait ctx.setSignedCookie(\n\t\t\t\t\t\tctx.context.authCookies.sessionToken.name,\n\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t\tctx.context.authCookies.sessionToken.options,\n\t\t\t\t\t);\n\t\t\t\t\treturn ctx.json(session);\n\t\t\t\t},\n\t\t\t),\n\t\t\trevokeDeviceSession: createAuthEndpoint(\n\t\t\t\t\"/multi-session/revoke\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\tsessionId: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t\trequireHeaders: true,\n\t\t\t\t\tuse: [sessionMiddleware],\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst sessionId = ctx.body.sessionId;\n\t\t\t\t\tconst multiSessionCookieName = `${ctx.context.authCookies.sessionToken.name}_multi-${sessionId}`;\n\t\t\t\t\tconst sessionCookie = await ctx.getSignedCookie(\n\t\t\t\t\t\tmultiSessionCookieName,\n\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t);\n\t\t\t\t\tif (!sessionCookie) {\n\t\t\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\tmessage: \"Invalid session id\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst session =\n\t\t\t\t\t\tawait ctx.context.internalAdapter.findSession(sessionId);\n\t\t\t\t\tctx.setCookie(multiSessionCookieName, \"\", {\n\t\t\t\t\t\t...ctx.context.authCookies.sessionToken.options,\n\t\t\t\t\t\tmaxAge: 0,\n\t\t\t\t\t});\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tawait ctx.context.internalAdapter.deleteSession(sessionId);\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t},\n\t\thooks: {\n\t\t\tafter: [\n\t\t\t\t{\n\t\t\t\t\tmatcher: () => true,\n\t\t\t\t\thandler: createAuthMiddleware(async (ctx) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!ctx.context.returned ||\n\t\t\t\t\t\t\t!(ctx.context.returned instanceof Response)\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\tconst cookieString = ctx.context.returned.headers.get(\"set-cookie\");\n\t\t\t\t\t\tif (!cookieString) return;\n\n\t\t\t\t\t\tconst setCookies = parseSetCookieHeader(cookieString);\n\t\t\t\t\t\tconst sessionCookieConfig = ctx.context.authCookies.sessionToken;\n\t\t\t\t\t\tconst sessionToken = setCookies.get(\n\t\t\t\t\t\t\tsessionCookieConfig.name,\n\t\t\t\t\t\t)?.value;\n\t\t\t\t\t\tif (!sessionToken) return;\n\n\t\t\t\t\t\tconst cookies = parseCookies(ctx.headers?.get(\"cookie\") || \"\");\n\t\t\t\t\t\tconst rawSession = sessionToken.split(\".\")[0];\n\t\t\t\t\t\tconst cookieName = `${sessionCookieConfig.name}_multi-${rawSession}`;\n\n\t\t\t\t\t\tif (setCookies.get(cookieName) || cookies.get(cookieName)) return;\n\n\t\t\t\t\t\tconst currentMultiSessions =\n\t\t\t\t\t\t\tObject.keys(Object.fromEntries(cookies)).filter(\n\t\t\t\t\t\t\t\tisMultiSessionCookie,\n\t\t\t\t\t\t\t).length + (cookieString.includes(\"session_token\") ? 1 : 0);\n\n\t\t\t\t\t\tif (currentMultiSessions > opts.maximumSessions) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tawait ctx.setSignedCookie(\n\t\t\t\t\t\t\tcookieName,\n\t\t\t\t\t\t\trawSession,\n\t\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t\t\tsessionCookieConfig.options,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst response = ctx.context.returned;\n\t\t\t\t\t\tresponse.headers.append(\n\t\t\t\t\t\t\t\"Set-Cookie\",\n\t\t\t\t\t\t\tctx.responseHeader.get(\"set-cookie\")!,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn { response };\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmatcher: (context) => context.path === \"/sign-out\",\n\t\t\t\t\thandler: createAuthMiddleware(async (ctx) => {\n\t\t\t\t\t\tconst cookieHeader = ctx.headers?.get(\"cookie\");\n\t\t\t\t\t\tif (!cookieHeader) return;\n\n\t\t\t\t\t\tconst cookies = Object.fromEntries(parseCookies(cookieHeader));\n\n\t\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\t\tObject.entries(cookies).map(async ([key, value]) => {\n\t\t\t\t\t\t\t\tif (isMultiSessionCookie(key)) {\n\t\t\t\t\t\t\t\t\tctx.setCookie(key, \"\", { maxAge: 0 });\n\t\t\t\t\t\t\t\t\tconst id = key.split(\"_multi-\")[1];\n\t\t\t\t\t\t\t\t\tawait ctx.context.internalAdapter.deleteSession(id);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst response = ctx.context.returned;\n\t\t\t\t\t\tresponse?.headers.append(\n\t\t\t\t\t\t\t\"Set-Cookie\",\n\t\t\t\t\t\t\tctx.responseHeader.get(\"set-cookie\")!,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\treturn { response };\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t} satisfies BetterAuthPlugin;\n};\n","import { z } from \"zod\";\nimport { APIError, createAuthEndpoint, sessionMiddleware } from \"../../api\";\nimport type { BetterAuthPlugin, User } from \"../../types\";\nimport { alphabet, generateRandomString } from \"../../crypto\";\nimport { getDate } from \"../../utils/date\";\nimport { logger } from \"../../utils\";\nimport { setSessionCookie } from \"../../cookies\";\n\ninterface EmailOTPOptions {\n\t/**\n\t * Function to send email verification\n\t */\n\tsendVerificationOTP: (data: {\n\t\temail: string;\n\t\totp: string;\n\t\ttype: \"sign-in\" | \"email-verification\";\n\t}) => Promise<void>;\n\t/**\n\t * Length of the OTP\n\t */\n\totpLength?: number;\n\t/**\n\t * Expiry time of the OTP in seconds\n\t */\n\texpiresIn?: number;\n\t/**\n\t * Send email verification on sign-up\n\t *\n\t * @Default false\n\t */\n\tsendVerificationOnSignUp?: boolean;\n}\n\nexport const emailOTP = (options: EmailOTPOptions) => {\n\tconst opts = {\n\t\texpireIn: 5 * 60,\n\t\totpLength: 6,\n\t\t...options,\n\t};\n\treturn {\n\t\tid: \"email-otp\",\n\t\tendpoints: {\n\t\t\tsendVerificationOTP: createAuthEndpoint(\n\t\t\t\t\"/email-otp/send-verification-otp\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\temail: z.string(),\n\t\t\t\t\t\ttype: z.enum([\"email-verification\", \"sign-in\"]),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tif (!options?.sendVerificationOTP) {\n\t\t\t\t\t\tlogger.error(\"send email verification is not implemented\");\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"send email verification is not implemented\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst email = ctx.body.email;\n\t\t\t\t\tconst otp = generateRandomString(opts.otpLength, alphabet(\"0-9\"));\n\t\t\t\t\tawait ctx.context.internalAdapter.createVerificationValue({\n\t\t\t\t\t\tvalue: otp,\n\t\t\t\t\t\tidentifier: `${ctx.body.type}-otp-${email}`,\n\t\t\t\t\t\texpiresAt: getDate(opts.expireIn, \"sec\"),\n\t\t\t\t\t});\n\t\t\t\t\tawait options.sendVerificationOTP({\n\t\t\t\t\t\temail,\n\t\t\t\t\t\totp,\n\t\t\t\t\t\ttype: ctx.body.type,\n\t\t\t\t\t});\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tverifyEmailOTP: createAuthEndpoint(\n\t\t\t\t\"/email-otp/verify-email\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\temail: z.string(),\n\t\t\t\t\t\totp: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst email = ctx.body.email;\n\t\t\t\t\tconst verificationValue =\n\t\t\t\t\t\tawait ctx.context.internalAdapter.findVerificationValue(\n\t\t\t\t\t\t\t`email-verification-otp-${email}`,\n\t\t\t\t\t\t);\n\t\t\t\t\tif (!verificationValue || verificationValue.expiresAt < new Date()) {\n\t\t\t\t\t\tif (verificationValue) {\n\t\t\t\t\t\t\tawait ctx.context.internalAdapter.deleteVerificationValue(\n\t\t\t\t\t\t\t\tverificationValue.id,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Invalid OTP\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst otp = ctx.body.otp;\n\t\t\t\t\tif (verificationValue.value !== otp) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Invalid OTP\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tawait ctx.context.internalAdapter.deleteVerificationValue(\n\t\t\t\t\t\tverificationValue.id,\n\t\t\t\t\t);\n\t\t\t\t\tconst user = await ctx.context.internalAdapter.findUserByEmail(email);\n\t\t\t\t\tif (!user) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst updatedUser = await ctx.context.internalAdapter.updateUser(\n\t\t\t\t\t\tuser.user.id,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\temail,\n\t\t\t\t\t\t\temailVerified: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tuser: updatedUser,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tsignInEmailOTP: createAuthEndpoint(\n\t\t\t\t\"/sign-in/email-otp\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: z.object({\n\t\t\t\t\t\temail: z.string(),\n\t\t\t\t\t\totp: z.string(),\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst email = ctx.body.email;\n\t\t\t\t\tconst verificationValue =\n\t\t\t\t\t\tawait ctx.context.internalAdapter.findVerificationValue(\n\t\t\t\t\t\t\t`sign-in-otp-${email}`,\n\t\t\t\t\t\t);\n\t\t\t\t\tif (!verificationValue || verificationValue.expiresAt < new Date()) {\n\t\t\t\t\t\tif (verificationValue) {\n\t\t\t\t\t\t\tawait ctx.context.internalAdapter.deleteVerificationValue(\n\t\t\t\t\t\t\t\tverificationValue.id,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Invalid OTP\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst otp = ctx.body.otp;\n\t\t\t\t\tif (verificationValue.value !== otp) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Invalid OTP\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tawait ctx.context.internalAdapter.deleteVerificationValue(\n\t\t\t\t\t\tverificationValue.id,\n\t\t\t\t\t);\n\t\t\t\t\tconst user = await ctx.context.internalAdapter.findUserByEmail(email);\n\t\t\t\t\tif (!user) {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst session = await ctx.context.internalAdapter.createSession(\n\t\t\t\t\t\tuser.user.id,\n\t\t\t\t\t\tctx.request,\n\t\t\t\t\t);\n\t\t\t\t\tawait setSessionCookie(ctx, {\n\t\t\t\t\t\tsession,\n\t\t\t\t\t\tuser: user.user,\n\t\t\t\t\t});\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tsession,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t},\n\t\thooks: {\n\t\t\tafter: [\n\t\t\t\t{\n\t\t\t\t\tmatcher(context) {\n\t\t\t\t\t\treturn !!(\n\t\t\t\t\t\t\tcontext.path?.startsWith(\"/sign-up\") &&\n\t\t\t\t\t\t\topts.sendVerificationOnSignUp\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\tasync handler(ctx) {\n\t\t\t\t\t\tconst returned = ctx.context.returned as Response;\n\t\t\t\t\t\tif (returned?.status !== 200) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst response = (await returned.clone().json()) as {\n\t\t\t\t\t\t\tuser: User;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (response.user.email && response.user.emailVerified === false) {\n\t\t\t\t\t\t\tconst otp = generateRandomString(opts.otpLength, alphabet(\"0-9\"));\n\t\t\t\t\t\t\tawait ctx.context.internalAdapter.createVerificationValue({\n\t\t\t\t\t\t\t\tvalue: otp,\n\t\t\t\t\t\t\t\tidentifier: `email-verification-otp-${response.user.email}`,\n\t\t\t\t\t\t\t\texpiresAt: getDate(opts.expireIn, \"sec\"),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tawait options.sendVerificationOTP({\n\t\t\t\t\t\t\t\temail: response.user.email,\n\t\t\t\t\t\t\t\totp,\n\t\t\t\t\t\t\t\ttype: \"email-verification\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t} satisfies BetterAuthPlugin;\n};\n"],"mappings":"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","names":["APIError","z","organization","role","z","APIError","z","role","organization","z","APIError","z","role","z","APIError","z","organization","role","z","APIError","role","z","z","APIError","z","z","APIError","session","APIError","z","twoFactor","APIError","APIError","z","APIError","twoFactor","z","APIError","TimeSpan","TOTPController","z","TimeSpan","APIError","twoFactor","TOTPController","z","APIError","createTOTPKeyURI","TimeSpan","z","APIError","createTOTPKeyURI","TimeSpan","APIError","z","options","passkey","z","APIError","z","APIError","z","z","APIError","z","APIError","z","APIError","z","APIError","user","z","z","z","z","z","APIError","z","APIError","z","jwk","privateKey","privateWebKey","jwk","jwt","z","z","z","z"]}
|