better-auth 1.4.8-beta.1 → 1.4.8-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/api/index.d.mts +393 -393
  2. package/dist/api/middlewares/origin-check.d.mts +3 -3
  3. package/dist/api/routes/account.d.mts +11 -11
  4. package/dist/api/routes/callback.d.mts +2 -2
  5. package/dist/api/routes/email-verification.d.mts +4 -4
  6. package/dist/api/routes/error.d.mts +2 -2
  7. package/dist/api/routes/ok.d.mts +2 -2
  8. package/dist/api/routes/reset-password.d.mts +5 -5
  9. package/dist/api/routes/session.d.mts +14 -14
  10. package/dist/api/routes/sign-in.d.mts +3 -3
  11. package/dist/api/routes/sign-out.d.mts +2 -2
  12. package/dist/api/routes/sign-up.d.mts +2 -2
  13. package/dist/api/routes/update-user.d.mts +13 -13
  14. package/dist/client/lynx/index.d.mts +15 -15
  15. package/dist/client/react/index.d.mts +13 -13
  16. package/dist/client/solid/index.d.mts +13 -13
  17. package/dist/client/svelte/index.d.mts +13 -13
  18. package/dist/client/vue/index.d.mts +15 -15
  19. package/dist/db/field.d.mts +6 -6
  20. package/dist/integrations/next-js.d.mts +4 -4
  21. package/dist/integrations/svelte-kit.d.mts +2 -2
  22. package/dist/integrations/tanstack-start.d.mts +4 -4
  23. package/dist/plugins/anonymous/index.d.mts +6 -5
  24. package/dist/plugins/anonymous/index.mjs +1 -0
  25. package/dist/plugins/anonymous/index.mjs.map +1 -1
  26. package/dist/plugins/api-key/index.d.mts +18 -18
  27. package/dist/plugins/bearer/index.d.mts +8 -7
  28. package/dist/plugins/bearer/index.mjs +2 -1
  29. package/dist/plugins/bearer/index.mjs.map +1 -1
  30. package/dist/plugins/captcha/index.d.mts +3 -2
  31. package/dist/plugins/captcha/index.mjs +2 -1
  32. package/dist/plugins/captcha/index.mjs.map +1 -1
  33. package/dist/plugins/custom-session/index.d.mts +6 -5
  34. package/dist/plugins/custom-session/index.mjs +2 -1
  35. package/dist/plugins/custom-session/index.mjs.map +1 -1
  36. package/dist/plugins/device-authorization/index.d.mts +35 -8
  37. package/dist/plugins/device-authorization/index.mjs +2 -1
  38. package/dist/plugins/device-authorization/index.mjs.map +1 -1
  39. package/dist/plugins/email-otp/index.d.mts +49 -48
  40. package/dist/plugins/email-otp/index.mjs +2 -1
  41. package/dist/plugins/email-otp/index.mjs.map +1 -1
  42. package/dist/plugins/generic-oauth/index.d.mts +1 -0
  43. package/dist/plugins/generic-oauth/index.mjs +1 -0
  44. package/dist/plugins/generic-oauth/index.mjs.map +1 -1
  45. package/dist/plugins/haveibeenpwned/index.d.mts +4 -3
  46. package/dist/plugins/haveibeenpwned/index.mjs +1 -0
  47. package/dist/plugins/haveibeenpwned/index.mjs.map +1 -1
  48. package/dist/plugins/index.d.mts +4 -3
  49. package/dist/plugins/jwt/index.d.mts +9 -9
  50. package/dist/plugins/last-login-method/index.d.mts +3 -2
  51. package/dist/plugins/last-login-method/index.mjs +2 -1
  52. package/dist/plugins/last-login-method/index.mjs.map +1 -1
  53. package/dist/plugins/magic-link/index.d.mts +5 -4
  54. package/dist/plugins/magic-link/index.mjs +2 -1
  55. package/dist/plugins/magic-link/index.mjs.map +1 -1
  56. package/dist/plugins/mcp/index.d.mts +11 -10
  57. package/dist/plugins/mcp/index.mjs +2 -1
  58. package/dist/plugins/mcp/index.mjs.map +1 -1
  59. package/dist/plugins/multi-session/index.d.mts +10 -9
  60. package/dist/plugins/multi-session/index.mjs +1 -0
  61. package/dist/plugins/multi-session/index.mjs.map +1 -1
  62. package/dist/plugins/oauth-proxy/index.d.mts +8 -8
  63. package/dist/plugins/oidc-provider/index.d.mts +13 -13
  64. package/dist/plugins/one-tap/index.d.mts +4 -3
  65. package/dist/plugins/one-tap/index.mjs +2 -1
  66. package/dist/plugins/one-tap/index.mjs.map +1 -1
  67. package/dist/plugins/one-time-token/index.d.mts +6 -5
  68. package/dist/plugins/one-time-token/index.mjs +2 -1
  69. package/dist/plugins/one-time-token/index.mjs.map +1 -1
  70. package/dist/plugins/open-api/index.d.mts +4 -3
  71. package/dist/plugins/open-api/index.mjs +2 -1
  72. package/dist/plugins/open-api/index.mjs.map +1 -1
  73. package/dist/plugins/organization/organization.d.mts +4 -4
  74. package/dist/plugins/organization/organization.mjs.map +1 -1
  75. package/dist/plugins/organization/routes/crud-access-control.d.mts +22 -22
  76. package/dist/plugins/organization/routes/crud-invites.d.mts +58 -58
  77. package/dist/plugins/organization/routes/crud-members.d.mts +62 -62
  78. package/dist/plugins/organization/routes/crud-org.d.mts +51 -51
  79. package/dist/plugins/organization/routes/crud-team.d.mts +76 -76
  80. package/dist/plugins/phone-number/index.d.mts +10 -9
  81. package/dist/plugins/phone-number/index.mjs +1 -0
  82. package/dist/plugins/phone-number/index.mjs.map +1 -1
  83. package/dist/plugins/siwe/index.d.mts +4 -3
  84. package/dist/plugins/siwe/index.mjs +2 -1
  85. package/dist/plugins/siwe/index.mjs.map +1 -1
  86. package/dist/plugins/two-factor/backup-codes/index.d.mts +5 -5
  87. package/dist/plugins/two-factor/index.d.mts +18 -18
  88. package/dist/plugins/two-factor/otp/index.d.mts +3 -3
  89. package/dist/plugins/two-factor/totp/index.d.mts +5 -5
  90. package/dist/plugins/username/index.d.mts +10 -9
  91. package/dist/plugins/username/index.mjs +1 -0
  92. package/dist/plugins/username/index.mjs.map +1 -1
  93. package/dist/test-utils/test-instance.d.mts +271 -271
  94. package/dist/utils/time.d.mts +29 -1
  95. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["payload: any","session"],"sources":["../../../src/plugins/one-tap/index.ts"],"sourcesContent":["import type { BetterAuthPlugin } from \"@better-auth/core\";\nimport { createAuthEndpoint } from \"@better-auth/core/api\";\nimport { createRemoteJWKSet, jwtVerify } from \"jose\";\nimport * as z from \"zod\";\nimport { APIError } from \"../../api\";\nimport { setSessionCookie } from \"../../cookies\";\nimport { toBoolean } from \"../../utils/boolean\";\n\ninterface OneTapOptions {\n\t/**\n\t * Disable the signup flow\n\t *\n\t * @default false\n\t */\n\tdisableSignup?: boolean | undefined;\n\t/**\n\t * Google Client ID\n\t *\n\t * If a client ID is provided in the social provider configuration,\n\t * it will be used.\n\t */\n\tclientId?: string | undefined;\n}\n\nconst oneTapCallbackBodySchema = z.object({\n\tidToken: z.string().meta({\n\t\tdescription:\n\t\t\t\"Google ID token, which the client obtains from the One Tap API\",\n\t}),\n});\n\nexport const oneTap = (options?: OneTapOptions | undefined) =>\n\t({\n\t\tid: \"one-tap\",\n\t\tendpoints: {\n\t\t\toneTapCallback: createAuthEndpoint(\n\t\t\t\t\"/one-tap/callback\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: oneTapCallbackBodySchema,\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\topenapi: {\n\t\t\t\t\t\t\tsummary: \"One tap callback\",\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\"Use this endpoint to authenticate with Google One Tap\",\n\t\t\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\t\t200: {\n\t\t\t\t\t\t\t\t\tdescription: \"Successful response\",\n\t\t\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tsession: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$ref: \"#/components/schemas/Session\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$ref: \"#/components/schemas/User\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t},\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\t400: {\n\t\t\t\t\t\t\t\t\tdescription: \"Invalid token\",\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\tasync (ctx) => {\n\t\t\t\t\tconst { idToken } = ctx.body;\n\t\t\t\t\tlet payload: any;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst JWKS = createRemoteJWKSet(\n\t\t\t\t\t\t\tnew URL(\"https://www.googleapis.com/oauth2/v3/certs\"),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst { payload: verifiedPayload } = await jwtVerify(\n\t\t\t\t\t\t\tidToken,\n\t\t\t\t\t\t\tJWKS,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tissuer: [\"https://accounts.google.com\", \"accounts.google.com\"],\n\t\t\t\t\t\t\t\taudience:\n\t\t\t\t\t\t\t\t\toptions?.clientId ||\n\t\t\t\t\t\t\t\t\tctx.context.options.socialProviders?.google?.clientId,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tpayload = verifiedPayload;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"invalid id token\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst { email, email_verified, name, picture, sub } = payload;\n\t\t\t\t\tif (!email) {\n\t\t\t\t\t\treturn ctx.json({ error: \"Email not available in token\" });\n\t\t\t\t\t}\n\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\tif (options?.disableSignup) {\n\t\t\t\t\t\t\tthrow new APIError(\"BAD_GATEWAY\", {\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\tconst newUser = await ctx.context.internalAdapter.createOAuthUser(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\temail,\n\t\t\t\t\t\t\t\temailVerified:\n\t\t\t\t\t\t\t\t\ttypeof email_verified === \"boolean\"\n\t\t\t\t\t\t\t\t\t\t? email_verified\n\t\t\t\t\t\t\t\t\t\t: toBoolean(email_verified),\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\timage: picture,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tproviderId: \"google\",\n\t\t\t\t\t\t\t\taccountId: sub,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!newUser) {\n\t\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\t\tmessage: \"Could not create user\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst session = await ctx.context.internalAdapter.createSession(\n\t\t\t\t\t\t\tnewUser.user.id,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait setSessionCookie(ctx, {\n\t\t\t\t\t\t\tuser: newUser.user,\n\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\t\ttoken: session.token,\n\t\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\t\tid: newUser.user.id,\n\t\t\t\t\t\t\t\temail: newUser.user.email,\n\t\t\t\t\t\t\t\temailVerified: newUser.user.emailVerified,\n\t\t\t\t\t\t\t\tname: newUser.user.name,\n\t\t\t\t\t\t\t\timage: newUser.user.image,\n\t\t\t\t\t\t\t\tcreatedAt: newUser.user.createdAt,\n\t\t\t\t\t\t\t\tupdatedAt: newUser.user.updatedAt,\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 account = await ctx.context.internalAdapter.findAccount(sub);\n\t\t\t\t\tif (!account) {\n\t\t\t\t\t\tconst accountLinking = ctx.context.options.account?.accountLinking;\n\t\t\t\t\t\tconst shouldLinkAccount =\n\t\t\t\t\t\t\taccountLinking?.enabled &&\n\t\t\t\t\t\t\t(accountLinking.trustedProviders?.includes(\"google\") ||\n\t\t\t\t\t\t\t\temail_verified);\n\t\t\t\t\t\tif (shouldLinkAccount) {\n\t\t\t\t\t\t\tawait ctx.context.internalAdapter.linkAccount({\n\t\t\t\t\t\t\t\tuserId: user.user.id,\n\t\t\t\t\t\t\t\tproviderId: \"google\",\n\t\t\t\t\t\t\t\taccountId: sub,\n\t\t\t\t\t\t\t\tscope: \"openid,profile,email\",\n\t\t\t\t\t\t\t\tidToken,\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(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\tmessage: \"Google sub doesn't match\",\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\tuser.user.id,\n\t\t\t\t\t);\n\n\t\t\t\t\tawait setSessionCookie(ctx, {\n\t\t\t\t\t\tuser: user.user,\n\t\t\t\t\t\tsession,\n\t\t\t\t\t});\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\ttoken: session.token,\n\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\tid: user.user.id,\n\t\t\t\t\t\t\temail: user.user.email,\n\t\t\t\t\t\t\temailVerified: user.user.emailVerified,\n\t\t\t\t\t\t\tname: user.user.name,\n\t\t\t\t\t\t\timage: user.user.image,\n\t\t\t\t\t\t\tcreatedAt: user.user.createdAt,\n\t\t\t\t\t\t\tupdatedAt: user.user.updatedAt,\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"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["payload: any","session"],"sources":["../../../src/plugins/one-tap/index.ts"],"sourcesContent":["import type { BetterAuthPlugin } from \"@better-auth/core\";\nimport { createAuthEndpoint } from \"@better-auth/core/api\";\nimport { createRemoteJWKSet, jwtVerify } from \"jose\";\nimport * as z from \"zod\";\nimport { APIError } from \"../../api\";\nimport { setSessionCookie } from \"../../cookies\";\nimport { toBoolean } from \"../../utils/boolean\";\n\nexport interface OneTapOptions {\n\t/**\n\t * Disable the signup flow\n\t *\n\t * @default false\n\t */\n\tdisableSignup?: boolean | undefined;\n\t/**\n\t * Google Client ID\n\t *\n\t * If a client ID is provided in the social provider configuration,\n\t * it will be used.\n\t */\n\tclientId?: string | undefined;\n}\n\nconst oneTapCallbackBodySchema = z.object({\n\tidToken: z.string().meta({\n\t\tdescription:\n\t\t\t\"Google ID token, which the client obtains from the One Tap API\",\n\t}),\n});\n\nexport const oneTap = (options?: OneTapOptions | undefined) =>\n\t({\n\t\tid: \"one-tap\",\n\t\tendpoints: {\n\t\t\toneTapCallback: createAuthEndpoint(\n\t\t\t\t\"/one-tap/callback\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: oneTapCallbackBodySchema,\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\topenapi: {\n\t\t\t\t\t\t\tsummary: \"One tap callback\",\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\"Use this endpoint to authenticate with Google One Tap\",\n\t\t\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\t\t200: {\n\t\t\t\t\t\t\t\t\tdescription: \"Successful response\",\n\t\t\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tsession: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$ref: \"#/components/schemas/Session\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$ref: \"#/components/schemas/User\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t},\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\t400: {\n\t\t\t\t\t\t\t\t\tdescription: \"Invalid token\",\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\tasync (ctx) => {\n\t\t\t\t\tconst { idToken } = ctx.body;\n\t\t\t\t\tlet payload: any;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst JWKS = createRemoteJWKSet(\n\t\t\t\t\t\t\tnew URL(\"https://www.googleapis.com/oauth2/v3/certs\"),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst { payload: verifiedPayload } = await jwtVerify(\n\t\t\t\t\t\t\tidToken,\n\t\t\t\t\t\t\tJWKS,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tissuer: [\"https://accounts.google.com\", \"accounts.google.com\"],\n\t\t\t\t\t\t\t\taudience:\n\t\t\t\t\t\t\t\t\toptions?.clientId ||\n\t\t\t\t\t\t\t\t\tctx.context.options.socialProviders?.google?.clientId,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tpayload = verifiedPayload;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"invalid id token\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst { email, email_verified, name, picture, sub } = payload;\n\t\t\t\t\tif (!email) {\n\t\t\t\t\t\treturn ctx.json({ error: \"Email not available in token\" });\n\t\t\t\t\t}\n\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\tif (options?.disableSignup) {\n\t\t\t\t\t\t\tthrow new APIError(\"BAD_GATEWAY\", {\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\tconst newUser = await ctx.context.internalAdapter.createOAuthUser(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\temail,\n\t\t\t\t\t\t\t\temailVerified:\n\t\t\t\t\t\t\t\t\ttypeof email_verified === \"boolean\"\n\t\t\t\t\t\t\t\t\t\t? email_verified\n\t\t\t\t\t\t\t\t\t\t: toBoolean(email_verified),\n\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\timage: picture,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tproviderId: \"google\",\n\t\t\t\t\t\t\t\taccountId: sub,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!newUser) {\n\t\t\t\t\t\t\tthrow new APIError(\"INTERNAL_SERVER_ERROR\", {\n\t\t\t\t\t\t\t\tmessage: \"Could not create user\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst session = await ctx.context.internalAdapter.createSession(\n\t\t\t\t\t\t\tnewUser.user.id,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait setSessionCookie(ctx, {\n\t\t\t\t\t\t\tuser: newUser.user,\n\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\t\ttoken: session.token,\n\t\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\t\tid: newUser.user.id,\n\t\t\t\t\t\t\t\temail: newUser.user.email,\n\t\t\t\t\t\t\t\temailVerified: newUser.user.emailVerified,\n\t\t\t\t\t\t\t\tname: newUser.user.name,\n\t\t\t\t\t\t\t\timage: newUser.user.image,\n\t\t\t\t\t\t\t\tcreatedAt: newUser.user.createdAt,\n\t\t\t\t\t\t\t\tupdatedAt: newUser.user.updatedAt,\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 account = await ctx.context.internalAdapter.findAccount(sub);\n\t\t\t\t\tif (!account) {\n\t\t\t\t\t\tconst accountLinking = ctx.context.options.account?.accountLinking;\n\t\t\t\t\t\tconst shouldLinkAccount =\n\t\t\t\t\t\t\taccountLinking?.enabled &&\n\t\t\t\t\t\t\t(accountLinking.trustedProviders?.includes(\"google\") ||\n\t\t\t\t\t\t\t\temail_verified);\n\t\t\t\t\t\tif (shouldLinkAccount) {\n\t\t\t\t\t\t\tawait ctx.context.internalAdapter.linkAccount({\n\t\t\t\t\t\t\t\tuserId: user.user.id,\n\t\t\t\t\t\t\t\tproviderId: \"google\",\n\t\t\t\t\t\t\t\taccountId: sub,\n\t\t\t\t\t\t\t\tscope: \"openid,profile,email\",\n\t\t\t\t\t\t\t\tidToken,\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(\"UNAUTHORIZED\", {\n\t\t\t\t\t\t\t\tmessage: \"Google sub doesn't match\",\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\tuser.user.id,\n\t\t\t\t\t);\n\n\t\t\t\t\tawait setSessionCookie(ctx, {\n\t\t\t\t\t\tuser: user.user,\n\t\t\t\t\t\tsession,\n\t\t\t\t\t});\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\ttoken: session.token,\n\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\tid: user.user.id,\n\t\t\t\t\t\t\temail: user.user.email,\n\t\t\t\t\t\t\temailVerified: user.user.emailVerified,\n\t\t\t\t\t\t\tname: user.user.name,\n\t\t\t\t\t\t\timage: user.user.image,\n\t\t\t\t\t\t\tcreatedAt: user.user.createdAt,\n\t\t\t\t\t\t\tupdatedAt: user.user.updatedAt,\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\toptions,\n\t}) satisfies BetterAuthPlugin;\n"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { Session, User } from "../../types/models.mjs";
2
2
  import "../../types/index.mjs";
3
3
  import { GenericEndpointContext } from "@better-auth/core";
4
4
  import * as z from "zod";
5
- import * as better_call234 from "better-call";
5
+ import * as better_call174 from "better-call";
6
6
 
7
7
  //#region src/plugins/one-time-token/index.d.ts
8
8
  interface OneTimeTokenOptions {
@@ -60,9 +60,9 @@ declare const oneTimeToken: (options?: OneTimeTokenOptions | undefined) => {
60
60
  *
61
61
  * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/one-time-token#api-method-one-time-token-generate)
62
62
  */
63
- generateOneTimeToken: better_call234.StrictEndpoint<"/one-time-token/generate", {
63
+ generateOneTimeToken: better_call174.StrictEndpoint<"/one-time-token/generate", {
64
64
  method: "GET";
65
- use: ((inputContext: better_call234.MiddlewareInputContext<better_call234.MiddlewareOptions>) => Promise<{
65
+ use: ((inputContext: better_call174.MiddlewareInputContext<better_call174.MiddlewareOptions>) => Promise<{
66
66
  session: {
67
67
  session: Record<string, any> & {
68
68
  id: string;
@@ -103,7 +103,7 @@ declare const oneTimeToken: (options?: OneTimeTokenOptions | undefined) => {
103
103
  *
104
104
  * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/one-time-token#api-method-one-time-token-verify)
105
105
  */
106
- verifyOneTimeToken: better_call234.StrictEndpoint<"/one-time-token/verify", {
106
+ verifyOneTimeToken: better_call174.StrictEndpoint<"/one-time-token/verify", {
107
107
  method: "POST";
108
108
  body: z.ZodObject<{
109
109
  token: z.ZodString;
@@ -116,9 +116,10 @@ declare const oneTimeToken: (options?: OneTimeTokenOptions | undefined) => {
116
116
  hooks: {
117
117
  after: {
118
118
  matcher: () => true;
119
- handler: (inputContext: better_call234.MiddlewareInputContext<better_call234.MiddlewareOptions>) => Promise<void>;
119
+ handler: (inputContext: better_call174.MiddlewareInputContext<better_call174.MiddlewareOptions>) => Promise<void>;
120
120
  }[];
121
121
  };
122
+ options: OneTimeTokenOptions | undefined;
122
123
  };
123
124
  //#endregion
124
125
  export { OneTimeTokenOptions, oneTimeToken };
@@ -72,7 +72,8 @@ const oneTimeToken = (options) => {
72
72
  ctx.setHeader("Access-Control-Expose-Headers", Array.from(headersSet).join(", "));
73
73
  }
74
74
  })
75
- }] }
75
+ }] },
76
+ options
76
77
  };
77
78
  };
78
79
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/plugins/one-time-token/index.ts"],"sourcesContent":["import type {\n\tBetterAuthPlugin,\n\tGenericEndpointContext,\n} from \"@better-auth/core\";\nimport {\n\tcreateAuthEndpoint,\n\tcreateAuthMiddleware,\n} from \"@better-auth/core/api\";\nimport * as z from \"zod\";\nimport { sessionMiddleware } from \"../../api\";\nimport { setSessionCookie } from \"../../cookies\";\nimport { generateRandomString } from \"../../crypto\";\nimport type { Session, User } from \"../../types\";\nimport { defaultKeyHasher } from \"./utils\";\n\nexport interface OneTimeTokenOptions {\n\t/**\n\t * Expires in minutes\n\t *\n\t * @default 3\n\t */\n\texpiresIn?: number | undefined;\n\t/**\n\t * Only allow server initiated requests\n\t */\n\tdisableClientRequest?: boolean | undefined;\n\t/**\n\t * Generate a custom token\n\t */\n\tgenerateToken?:\n\t\t| ((\n\t\t\t\tsession: {\n\t\t\t\t\tuser: User & Record<string, any>;\n\t\t\t\t\tsession: Session & Record<string, any>;\n\t\t\t\t},\n\t\t\t\tctx: GenericEndpointContext,\n\t\t ) => Promise<string>)\n\t\t| undefined;\n\t/**\n\t * Disable setting the session cookie when the token is verified\n\t */\n\tdisableSetSessionCookie?: boolean;\n\t/**\n\t * This option allows you to configure how the token is stored in your database.\n\t * Note: This will not affect the token that's sent, it will only affect the token stored in your database.\n\t *\n\t * @default \"plain\"\n\t */\n\tstoreToken?:\n\t\t| (\n\t\t\t\t| \"plain\"\n\t\t\t\t| \"hashed\"\n\t\t\t\t| { type: \"custom-hasher\"; hash: (token: string) => Promise<string> }\n\t\t )\n\t\t| undefined;\n\t/**\n\t * Set the OTT header on new sessions\n\t */\n\tsetOttHeaderOnNewSession?: boolean;\n}\n\nconst verifyOneTimeTokenBodySchema = z.object({\n\ttoken: z.string().meta({\n\t\tdescription: 'The token to verify. Eg: \"some-token\"',\n\t}),\n});\n\nexport const oneTimeToken = (options?: OneTimeTokenOptions | undefined) => {\n\tconst opts = {\n\t\tstoreToken: \"plain\",\n\t\t...options,\n\t} satisfies OneTimeTokenOptions;\n\n\tasync function storeToken(ctx: GenericEndpointContext, token: string) {\n\t\tif (opts.storeToken === \"hashed\") {\n\t\t\treturn await defaultKeyHasher(token);\n\t\t}\n\t\tif (\n\t\t\ttypeof opts.storeToken === \"object\" &&\n\t\t\t\"type\" in opts.storeToken &&\n\t\t\topts.storeToken.type === \"custom-hasher\"\n\t\t) {\n\t\t\treturn await opts.storeToken.hash(token);\n\t\t}\n\n\t\treturn token;\n\t}\n\n\tasync function generateToken(\n\t\tc: GenericEndpointContext,\n\t\tsession: {\n\t\t\tsession: Session;\n\t\t\tuser: User;\n\t\t},\n\t) {\n\t\tconst token = opts?.generateToken\n\t\t\t? await opts.generateToken(session, c)\n\t\t\t: generateRandomString(32);\n\t\tconst expiresAt = new Date(Date.now() + (opts?.expiresIn ?? 3) * 60 * 1000);\n\t\tconst storedToken = await storeToken(c, token);\n\t\tawait c.context.internalAdapter.createVerificationValue({\n\t\t\tvalue: session.session.token,\n\t\t\tidentifier: `one-time-token:${storedToken}`,\n\t\t\texpiresAt,\n\t\t});\n\t\treturn token;\n\t}\n\n\treturn {\n\t\tid: \"one-time-token\",\n\t\tendpoints: {\n\t\t\t/**\n\t\t\t * ### Endpoint\n\t\t\t *\n\t\t\t * GET `/one-time-token/generate`\n\t\t\t *\n\t\t\t * ### API Methods\n\t\t\t *\n\t\t\t * **server:**\n\t\t\t * `auth.api.generateOneTimeToken`\n\t\t\t *\n\t\t\t * **client:**\n\t\t\t * `authClient.oneTimeToken.generate`\n\t\t\t *\n\t\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/one-time-token#api-method-one-time-token-generate)\n\t\t\t */\n\t\t\tgenerateOneTimeToken: createAuthEndpoint(\n\t\t\t\t\"/one-time-token/generate\",\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 (c) => {\n\t\t\t\t\t//if request exist, it means it's a client request\n\t\t\t\t\tif (opts?.disableClientRequest && c.request) {\n\t\t\t\t\t\tthrow c.error(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Client requests are disabled\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst session = c.context.session;\n\t\t\t\t\tconst token = await generateToken(c, session);\n\t\t\t\t\treturn c.json({ token });\n\t\t\t\t},\n\t\t\t),\n\t\t\t/**\n\t\t\t * ### Endpoint\n\t\t\t *\n\t\t\t * POST `/one-time-token/verify`\n\t\t\t *\n\t\t\t * ### API Methods\n\t\t\t *\n\t\t\t * **server:**\n\t\t\t * `auth.api.verifyOneTimeToken`\n\t\t\t *\n\t\t\t * **client:**\n\t\t\t * `authClient.oneTimeToken.verify`\n\t\t\t *\n\t\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/one-time-token#api-method-one-time-token-verify)\n\t\t\t */\n\t\t\tverifyOneTimeToken: createAuthEndpoint(\n\t\t\t\t\"/one-time-token/verify\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: verifyOneTimeTokenBodySchema,\n\t\t\t\t},\n\t\t\t\tasync (c) => {\n\t\t\t\t\tconst { token } = c.body;\n\t\t\t\t\tconst storedToken = await storeToken(c, token);\n\t\t\t\t\tconst verificationValue =\n\t\t\t\t\t\tawait c.context.internalAdapter.findVerificationValue(\n\t\t\t\t\t\t\t`one-time-token:${storedToken}`,\n\t\t\t\t\t\t);\n\t\t\t\t\tif (!verificationValue) {\n\t\t\t\t\t\tthrow c.error(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Invalid token\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tawait c.context.internalAdapter.deleteVerificationValue(\n\t\t\t\t\t\tverificationValue.id,\n\t\t\t\t\t);\n\t\t\t\t\tif (verificationValue.expiresAt < new Date()) {\n\t\t\t\t\t\tthrow c.error(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Token expired\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst session = await c.context.internalAdapter.findSession(\n\t\t\t\t\t\tverificationValue.value,\n\t\t\t\t\t);\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\tthrow c.error(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Session not found\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (!opts?.disableSetSessionCookie) {\n\t\t\t\t\t\tawait setSessionCookie(c, session);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (session.session.expiresAt < new Date()) {\n\t\t\t\t\t\tthrow c.error(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Session expired\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\treturn c.json(session);\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 (ctx.context.newSession) {\n\t\t\t\t\t\t\tif (!opts?.setOttHeaderOnNewSession) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst exposedHeaders =\n\t\t\t\t\t\t\t\tctx.context.responseHeaders?.get(\n\t\t\t\t\t\t\t\t\t\"access-control-expose-headers\",\n\t\t\t\t\t\t\t\t) || \"\";\n\t\t\t\t\t\t\tconst headersSet = new Set(\n\t\t\t\t\t\t\t\texposedHeaders\n\t\t\t\t\t\t\t\t\t.split(\",\")\n\t\t\t\t\t\t\t\t\t.map((header) => header.trim())\n\t\t\t\t\t\t\t\t\t.filter(Boolean),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\theadersSet.add(\"set-ott\");\n\t\t\t\t\t\t\tconst token = await generateToken(ctx, ctx.context.newSession);\n\t\t\t\t\t\t\tctx.setHeader(\"set-ott\", token);\n\t\t\t\t\t\t\tctx.setHeader(\n\t\t\t\t\t\t\t\t\"Access-Control-Expose-Headers\",\n\t\t\t\t\t\t\t\tArray.from(headersSet).join(\", \"),\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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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/plugins/one-time-token/index.ts"],"sourcesContent":["import type {\n\tBetterAuthPlugin,\n\tGenericEndpointContext,\n} from \"@better-auth/core\";\nimport {\n\tcreateAuthEndpoint,\n\tcreateAuthMiddleware,\n} from \"@better-auth/core/api\";\nimport * as z from \"zod\";\nimport { sessionMiddleware } from \"../../api\";\nimport { setSessionCookie } from \"../../cookies\";\nimport { generateRandomString } from \"../../crypto\";\nimport type { Session, User } from \"../../types\";\nimport { defaultKeyHasher } from \"./utils\";\n\nexport interface OneTimeTokenOptions {\n\t/**\n\t * Expires in minutes\n\t *\n\t * @default 3\n\t */\n\texpiresIn?: number | undefined;\n\t/**\n\t * Only allow server initiated requests\n\t */\n\tdisableClientRequest?: boolean | undefined;\n\t/**\n\t * Generate a custom token\n\t */\n\tgenerateToken?:\n\t\t| ((\n\t\t\t\tsession: {\n\t\t\t\t\tuser: User & Record<string, any>;\n\t\t\t\t\tsession: Session & Record<string, any>;\n\t\t\t\t},\n\t\t\t\tctx: GenericEndpointContext,\n\t\t ) => Promise<string>)\n\t\t| undefined;\n\t/**\n\t * Disable setting the session cookie when the token is verified\n\t */\n\tdisableSetSessionCookie?: boolean;\n\t/**\n\t * This option allows you to configure how the token is stored in your database.\n\t * Note: This will not affect the token that's sent, it will only affect the token stored in your database.\n\t *\n\t * @default \"plain\"\n\t */\n\tstoreToken?:\n\t\t| (\n\t\t\t\t| \"plain\"\n\t\t\t\t| \"hashed\"\n\t\t\t\t| { type: \"custom-hasher\"; hash: (token: string) => Promise<string> }\n\t\t )\n\t\t| undefined;\n\t/**\n\t * Set the OTT header on new sessions\n\t */\n\tsetOttHeaderOnNewSession?: boolean;\n}\n\nconst verifyOneTimeTokenBodySchema = z.object({\n\ttoken: z.string().meta({\n\t\tdescription: 'The token to verify. Eg: \"some-token\"',\n\t}),\n});\n\nexport const oneTimeToken = (options?: OneTimeTokenOptions | undefined) => {\n\tconst opts = {\n\t\tstoreToken: \"plain\",\n\t\t...options,\n\t} satisfies OneTimeTokenOptions;\n\n\tasync function storeToken(ctx: GenericEndpointContext, token: string) {\n\t\tif (opts.storeToken === \"hashed\") {\n\t\t\treturn await defaultKeyHasher(token);\n\t\t}\n\t\tif (\n\t\t\ttypeof opts.storeToken === \"object\" &&\n\t\t\t\"type\" in opts.storeToken &&\n\t\t\topts.storeToken.type === \"custom-hasher\"\n\t\t) {\n\t\t\treturn await opts.storeToken.hash(token);\n\t\t}\n\n\t\treturn token;\n\t}\n\n\tasync function generateToken(\n\t\tc: GenericEndpointContext,\n\t\tsession: {\n\t\t\tsession: Session;\n\t\t\tuser: User;\n\t\t},\n\t) {\n\t\tconst token = opts?.generateToken\n\t\t\t? await opts.generateToken(session, c)\n\t\t\t: generateRandomString(32);\n\t\tconst expiresAt = new Date(Date.now() + (opts?.expiresIn ?? 3) * 60 * 1000);\n\t\tconst storedToken = await storeToken(c, token);\n\t\tawait c.context.internalAdapter.createVerificationValue({\n\t\t\tvalue: session.session.token,\n\t\t\tidentifier: `one-time-token:${storedToken}`,\n\t\t\texpiresAt,\n\t\t});\n\t\treturn token;\n\t}\n\n\treturn {\n\t\tid: \"one-time-token\",\n\t\tendpoints: {\n\t\t\t/**\n\t\t\t * ### Endpoint\n\t\t\t *\n\t\t\t * GET `/one-time-token/generate`\n\t\t\t *\n\t\t\t * ### API Methods\n\t\t\t *\n\t\t\t * **server:**\n\t\t\t * `auth.api.generateOneTimeToken`\n\t\t\t *\n\t\t\t * **client:**\n\t\t\t * `authClient.oneTimeToken.generate`\n\t\t\t *\n\t\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/one-time-token#api-method-one-time-token-generate)\n\t\t\t */\n\t\t\tgenerateOneTimeToken: createAuthEndpoint(\n\t\t\t\t\"/one-time-token/generate\",\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 (c) => {\n\t\t\t\t\t//if request exist, it means it's a client request\n\t\t\t\t\tif (opts?.disableClientRequest && c.request) {\n\t\t\t\t\t\tthrow c.error(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Client requests are disabled\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst session = c.context.session;\n\t\t\t\t\tconst token = await generateToken(c, session);\n\t\t\t\t\treturn c.json({ token });\n\t\t\t\t},\n\t\t\t),\n\t\t\t/**\n\t\t\t * ### Endpoint\n\t\t\t *\n\t\t\t * POST `/one-time-token/verify`\n\t\t\t *\n\t\t\t * ### API Methods\n\t\t\t *\n\t\t\t * **server:**\n\t\t\t * `auth.api.verifyOneTimeToken`\n\t\t\t *\n\t\t\t * **client:**\n\t\t\t * `authClient.oneTimeToken.verify`\n\t\t\t *\n\t\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/one-time-token#api-method-one-time-token-verify)\n\t\t\t */\n\t\t\tverifyOneTimeToken: createAuthEndpoint(\n\t\t\t\t\"/one-time-token/verify\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: verifyOneTimeTokenBodySchema,\n\t\t\t\t},\n\t\t\t\tasync (c) => {\n\t\t\t\t\tconst { token } = c.body;\n\t\t\t\t\tconst storedToken = await storeToken(c, token);\n\t\t\t\t\tconst verificationValue =\n\t\t\t\t\t\tawait c.context.internalAdapter.findVerificationValue(\n\t\t\t\t\t\t\t`one-time-token:${storedToken}`,\n\t\t\t\t\t\t);\n\t\t\t\t\tif (!verificationValue) {\n\t\t\t\t\t\tthrow c.error(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Invalid token\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tawait c.context.internalAdapter.deleteVerificationValue(\n\t\t\t\t\t\tverificationValue.id,\n\t\t\t\t\t);\n\t\t\t\t\tif (verificationValue.expiresAt < new Date()) {\n\t\t\t\t\t\tthrow c.error(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Token expired\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tconst session = await c.context.internalAdapter.findSession(\n\t\t\t\t\t\tverificationValue.value,\n\t\t\t\t\t);\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\tthrow c.error(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Session not found\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (!opts?.disableSetSessionCookie) {\n\t\t\t\t\t\tawait setSessionCookie(c, session);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (session.session.expiresAt < new Date()) {\n\t\t\t\t\t\tthrow c.error(\"BAD_REQUEST\", {\n\t\t\t\t\t\t\tmessage: \"Session expired\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\treturn c.json(session);\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 (ctx.context.newSession) {\n\t\t\t\t\t\t\tif (!opts?.setOttHeaderOnNewSession) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst exposedHeaders =\n\t\t\t\t\t\t\t\tctx.context.responseHeaders?.get(\n\t\t\t\t\t\t\t\t\t\"access-control-expose-headers\",\n\t\t\t\t\t\t\t\t) || \"\";\n\t\t\t\t\t\t\tconst headersSet = new Set(\n\t\t\t\t\t\t\t\texposedHeaders\n\t\t\t\t\t\t\t\t\t.split(\",\")\n\t\t\t\t\t\t\t\t\t.map((header) => header.trim())\n\t\t\t\t\t\t\t\t\t.filter(Boolean),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\theadersSet.add(\"set-ott\");\n\t\t\t\t\t\t\tconst token = await generateToken(ctx, ctx.context.newSession);\n\t\t\t\t\t\t\tctx.setHeader(\"set-ott\", token);\n\t\t\t\t\t\t\tctx.setHeader(\n\t\t\t\t\t\t\t\t\"Access-Control-Expose-Headers\",\n\t\t\t\t\t\t\t\tArray.from(headersSet).join(\", \"),\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\toptions,\n\t} satisfies BetterAuthPlugin;\n};\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { FieldSchema, OpenAPIModelSchema, Path, generator } from "./generator.mjs";
2
2
  import { LiteralString } from "@better-auth/core";
3
- import * as better_call130 from "better-call";
3
+ import * as better_call194 from "better-call";
4
4
 
5
5
  //#region src/plugins/open-api/index.d.ts
6
6
  type ScalarTheme = "alternate" | "default" | "moon" | "purple" | "solarized" | "bluePlanet" | "saturn" | "kepler" | "mars" | "deepSpace" | "laserwave" | "none";
@@ -36,7 +36,7 @@ interface OpenAPIOptions {
36
36
  declare const openAPI: <O extends OpenAPIOptions>(options?: O | undefined) => {
37
37
  id: "open-api";
38
38
  endpoints: {
39
- generateOpenAPISchema: better_call130.StrictEndpoint<"/open-api/generate-schema", {
39
+ generateOpenAPISchema: better_call194.StrictEndpoint<"/open-api/generate-schema", {
40
40
  method: "GET";
41
41
  }, {
42
42
  openapi: string;
@@ -76,13 +76,14 @@ declare const openAPI: <O extends OpenAPIOptions>(options?: O | undefined) => {
76
76
  }[];
77
77
  paths: Record<string, Path>;
78
78
  }>;
79
- openAPIReference: better_call130.StrictEndpoint<"/reference", {
79
+ openAPIReference: better_call194.StrictEndpoint<"/reference", {
80
80
  method: "GET";
81
81
  metadata: {
82
82
  readonly scope: "server";
83
83
  };
84
84
  }, Response>;
85
85
  };
86
+ options: NoInfer<O>;
86
87
  };
87
88
  //#endregion
88
89
  export { type FieldSchema, type OpenAPIModelSchema, OpenAPIOptions, type Path, generator, openAPI };
@@ -57,7 +57,8 @@ const openAPI = (options) => {
57
57
  const schema = await generator(ctx.context, ctx.context.options);
58
58
  return new Response(getHTML(schema, options?.theme, options?.nonce), { headers: { "Content-Type": "text/html" } });
59
59
  })
60
- }
60
+ },
61
+ options
61
62
  };
62
63
  };
63
64
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/plugins/open-api/index.ts"],"sourcesContent":["import type { BetterAuthPlugin, LiteralString } from \"@better-auth/core\";\nimport { createAuthEndpoint } from \"@better-auth/core/api\";\nimport { APIError } from \"../../api\";\nimport { HIDE_METADATA } from \"../../utils\";\nimport { generator } from \"./generator\";\nimport { logo } from \"./logo\";\n\nexport type { FieldSchema, OpenAPIModelSchema, Path } from \"./generator\";\n\ntype ScalarTheme =\n\t| \"alternate\"\n\t| \"default\"\n\t| \"moon\"\n\t| \"purple\"\n\t| \"solarized\"\n\t| \"bluePlanet\"\n\t| \"saturn\"\n\t| \"kepler\"\n\t| \"mars\"\n\t| \"deepSpace\"\n\t| \"laserwave\"\n\t| \"none\";\n\nconst getHTML = (\n\tapiReference: Record<string, any>,\n\ttheme?: ScalarTheme | undefined,\n\tnonce?: string | undefined,\n) => {\n\tconst nonceAttr = nonce ? `nonce=\"${nonce}\"` : \"\";\n\treturn `<!doctype html>\n<html>\n <head>\n <title>Scalar API Reference</title>\n <meta charset=\"utf-8\" />\n <meta\n name=\"viewport\"\n content=\"width=device-width, initial-scale=1\" />\n </head>\n <body>\n <script\n id=\"api-reference\"\n type=\"application/json\">\n ${JSON.stringify(apiReference)}\n </script>\n\t <script ${nonceAttr}>\n var configuration = {\n\t \tfavicon: \"data:image/svg+xml;utf8,${encodeURIComponent(logo)}\",\n\t \ttheme: \"${theme || \"default\"}\",\n metaData: {\n\t\t\ttitle: \"Better Auth API\",\n\t\t\tdescription: \"API Reference for your Better Auth Instance\",\n\t\t}\n }\n\n document.getElementById('api-reference').dataset.configuration =\n JSON.stringify(configuration)\n </script>\n\t <script src=\"https://cdn.jsdelivr.net/npm/@scalar/api-reference\" ${nonceAttr}></script>\n </body>\n</html>`;\n};\n\nexport interface OpenAPIOptions {\n\t/**\n\t * The path to the OpenAPI reference page\n\t *\n\t * keep in mind that this path will be appended to the base URL `/api/auth` path\n\t * by default, so if you set this to `/reference`, the full path will be `/api/auth/reference`\n\t *\n\t * @default \"/reference\"\n\t */\n\tpath?: LiteralString | undefined;\n\t/**\n\t * Disable the default reference page that is generated by Scalar\n\t *\n\t * @default false\n\t */\n\tdisableDefaultReference?: boolean | undefined;\n\t/**\n\t * Theme of the OpenAPI reference page.\n\t *\n\t * @default \"default\"\n\t */\n\ttheme?: ScalarTheme | undefined;\n\t/**\n\t * A 'nonce' string to be attached to inline scripts\n\t * for Content Security Policy (CSP) compliance.\n\t * @default undefined\n\t */\n\tnonce?: string | undefined;\n}\n\nexport const openAPI = <O extends OpenAPIOptions>(options?: O | undefined) => {\n\tconst path = (options?.path ?? \"/reference\") as \"/reference\";\n\treturn {\n\t\tid: \"open-api\",\n\t\tendpoints: {\n\t\t\tgenerateOpenAPISchema: createAuthEndpoint(\n\t\t\t\t\"/open-api/generate-schema\",\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 schema = await generator(ctx.context, ctx.context.options);\n\t\t\t\t\treturn ctx.json(schema);\n\t\t\t\t},\n\t\t\t),\n\t\t\topenAPIReference: createAuthEndpoint(\n\t\t\t\tpath,\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tmetadata: HIDE_METADATA,\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tif (options?.disableDefaultReference) {\n\t\t\t\t\t\tthrow new APIError(\"NOT_FOUND\");\n\t\t\t\t\t}\n\t\t\t\t\tconst schema = await generator(ctx.context, ctx.context.options);\n\t\t\t\t\treturn new Response(getHTML(schema, options?.theme, options?.nonce), {\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\"Content-Type\": \"text/html\",\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\nexport type * from \"./generator\";\n"],"mappings":";;;;;;;;AAuBA,MAAM,WACL,cACA,OACA,UACI;CACJ,MAAM,YAAY,QAAQ,UAAU,MAAM,KAAK;AAC/C,QAAO;;;;;;;;;;;;;MAaF,KAAK,UAAU,aAAa,CAAC;;YAEvB,UAAU;;wCAEkB,mBAAmB,KAAK,CAAC;eAClD,SAAS,UAAU;;;;;;;;;;sEAUoC,UAAU;;;;AAmChF,MAAa,WAAqC,YAA4B;CAC7E,MAAM,OAAQ,SAAS,QAAQ;AAC/B,QAAO;EACN,IAAI;EACJ,WAAW;GACV,uBAAuB,mBACtB,6BACA,EACC,QAAQ,OACR,EACD,OAAO,QAAQ;IACd,MAAM,SAAS,MAAM,UAAU,IAAI,SAAS,IAAI,QAAQ,QAAQ;AAChE,WAAO,IAAI,KAAK,OAAO;KAExB;GACD,kBAAkB,mBACjB,MACA;IACC,QAAQ;IACR,UAAU;IACV,EACD,OAAO,QAAQ;AACd,QAAI,SAAS,wBACZ,OAAM,IAAI,SAAS,YAAY;IAEhC,MAAM,SAAS,MAAM,UAAU,IAAI,SAAS,IAAI,QAAQ,QAAQ;AAChE,WAAO,IAAI,SAAS,QAAQ,QAAQ,SAAS,OAAO,SAAS,MAAM,EAAE,EACpE,SAAS,EACR,gBAAgB,aAChB,EACD,CAAC;KAEH;GACD;EACD"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/plugins/open-api/index.ts"],"sourcesContent":["import type { BetterAuthPlugin, LiteralString } from \"@better-auth/core\";\nimport { createAuthEndpoint } from \"@better-auth/core/api\";\nimport { APIError } from \"../../api\";\nimport { HIDE_METADATA } from \"../../utils\";\nimport { generator } from \"./generator\";\nimport { logo } from \"./logo\";\n\nexport type { FieldSchema, OpenAPIModelSchema, Path } from \"./generator\";\n\ntype ScalarTheme =\n\t| \"alternate\"\n\t| \"default\"\n\t| \"moon\"\n\t| \"purple\"\n\t| \"solarized\"\n\t| \"bluePlanet\"\n\t| \"saturn\"\n\t| \"kepler\"\n\t| \"mars\"\n\t| \"deepSpace\"\n\t| \"laserwave\"\n\t| \"none\";\n\nconst getHTML = (\n\tapiReference: Record<string, any>,\n\ttheme?: ScalarTheme | undefined,\n\tnonce?: string | undefined,\n) => {\n\tconst nonceAttr = nonce ? `nonce=\"${nonce}\"` : \"\";\n\treturn `<!doctype html>\n<html>\n <head>\n <title>Scalar API Reference</title>\n <meta charset=\"utf-8\" />\n <meta\n name=\"viewport\"\n content=\"width=device-width, initial-scale=1\" />\n </head>\n <body>\n <script\n id=\"api-reference\"\n type=\"application/json\">\n ${JSON.stringify(apiReference)}\n </script>\n\t <script ${nonceAttr}>\n var configuration = {\n\t \tfavicon: \"data:image/svg+xml;utf8,${encodeURIComponent(logo)}\",\n\t \ttheme: \"${theme || \"default\"}\",\n metaData: {\n\t\t\ttitle: \"Better Auth API\",\n\t\t\tdescription: \"API Reference for your Better Auth Instance\",\n\t\t}\n }\n\n document.getElementById('api-reference').dataset.configuration =\n JSON.stringify(configuration)\n </script>\n\t <script src=\"https://cdn.jsdelivr.net/npm/@scalar/api-reference\" ${nonceAttr}></script>\n </body>\n</html>`;\n};\n\nexport interface OpenAPIOptions {\n\t/**\n\t * The path to the OpenAPI reference page\n\t *\n\t * keep in mind that this path will be appended to the base URL `/api/auth` path\n\t * by default, so if you set this to `/reference`, the full path will be `/api/auth/reference`\n\t *\n\t * @default \"/reference\"\n\t */\n\tpath?: LiteralString | undefined;\n\t/**\n\t * Disable the default reference page that is generated by Scalar\n\t *\n\t * @default false\n\t */\n\tdisableDefaultReference?: boolean | undefined;\n\t/**\n\t * Theme of the OpenAPI reference page.\n\t *\n\t * @default \"default\"\n\t */\n\ttheme?: ScalarTheme | undefined;\n\t/**\n\t * A 'nonce' string to be attached to inline scripts\n\t * for Content Security Policy (CSP) compliance.\n\t * @default undefined\n\t */\n\tnonce?: string | undefined;\n}\n\nexport const openAPI = <O extends OpenAPIOptions>(options?: O | undefined) => {\n\tconst path = (options?.path ?? \"/reference\") as \"/reference\";\n\treturn {\n\t\tid: \"open-api\",\n\t\tendpoints: {\n\t\t\tgenerateOpenAPISchema: createAuthEndpoint(\n\t\t\t\t\"/open-api/generate-schema\",\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 schema = await generator(ctx.context, ctx.context.options);\n\t\t\t\t\treturn ctx.json(schema);\n\t\t\t\t},\n\t\t\t),\n\t\t\topenAPIReference: createAuthEndpoint(\n\t\t\t\tpath,\n\t\t\t\t{\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\tmetadata: HIDE_METADATA,\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tif (options?.disableDefaultReference) {\n\t\t\t\t\t\tthrow new APIError(\"NOT_FOUND\");\n\t\t\t\t\t}\n\t\t\t\t\tconst schema = await generator(ctx.context, ctx.context.options);\n\t\t\t\t\treturn new Response(getHTML(schema, options?.theme, options?.nonce), {\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\"Content-Type\": \"text/html\",\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\toptions: options as NoInfer<O>,\n\t} satisfies BetterAuthPlugin;\n};\n\nexport type * from \"./generator\";\n"],"mappings":";;;;;;;;AAuBA,MAAM,WACL,cACA,OACA,UACI;CACJ,MAAM,YAAY,QAAQ,UAAU,MAAM,KAAK;AAC/C,QAAO;;;;;;;;;;;;;MAaF,KAAK,UAAU,aAAa,CAAC;;YAEvB,UAAU;;wCAEkB,mBAAmB,KAAK,CAAC;eAClD,SAAS,UAAU;;;;;;;;;;sEAUoC,UAAU;;;;AAmChF,MAAa,WAAqC,YAA4B;CAC7E,MAAM,OAAQ,SAAS,QAAQ;AAC/B,QAAO;EACN,IAAI;EACJ,WAAW;GACV,uBAAuB,mBACtB,6BACA,EACC,QAAQ,OACR,EACD,OAAO,QAAQ;IACd,MAAM,SAAS,MAAM,UAAU,IAAI,SAAS,IAAI,QAAQ,QAAQ;AAChE,WAAO,IAAI,KAAK,OAAO;KAExB;GACD,kBAAkB,mBACjB,MACA;IACC,QAAQ;IACR,UAAU;IACV,EACD,OAAO,QAAQ;AACd,QAAI,SAAS,wBACZ,OAAM,IAAI,SAAS,YAAY;IAEhC,MAAM,SAAS,MAAM,UAAU,IAAI,SAAS,IAAI,QAAQ,QAAQ;AAChE,WAAO,IAAI,SAAS,QAAQ,QAAQ,SAAS,OAAO,SAAS,MAAM,EAAE,EACpE,SAAS,EACR,gBAAgB,aAChB,EACD,CAAC;KAEH;GACD;EACQ;EACT"}
@@ -11,7 +11,7 @@ import { checkOrganizationSlug, createOrganization, deleteOrganization, getFullO
11
11
  import { addTeamMember, createTeam, listOrganizationTeams, listTeamMembers, listUserTeams, removeTeam, removeTeamMember, setActiveTeam, updateTeam } from "./routes/crud-team.mjs";
12
12
  import * as _better_auth_core_db32 from "@better-auth/core/db";
13
13
  import * as z from "zod";
14
- import * as better_call679 from "better-call";
14
+ import * as better_call313 from "better-call";
15
15
 
16
16
  //#region src/plugins/organization/organization.d.ts
17
17
  declare function parseRoles(roles: string | string[]): string;
@@ -57,7 +57,7 @@ type OrganizationEndpoints<O extends OrganizationOptions> = {
57
57
  getActiveMemberRole: ReturnType<typeof getActiveMemberRole<O>>;
58
58
  hasPermission: ReturnType<typeof createHasPermission<O>>;
59
59
  };
60
- declare const createHasPermission: <O extends OrganizationOptions>(options: O) => better_call679.StrictEndpoint<"/organization/has-permission", {
60
+ declare const createHasPermission: <O extends OrganizationOptions>(options: O) => better_call313.StrictEndpoint<"/organization/has-permission", {
61
61
  method: "POST";
62
62
  requireHeaders: true;
63
63
  body: z.ZodIntersection<z.ZodObject<{
@@ -69,8 +69,8 @@ declare const createHasPermission: <O extends OrganizationOptions>(options: O) =
69
69
  permission: z.ZodUndefined;
70
70
  permissions: z.ZodRecord<z.ZodString, z.ZodArray<z.ZodString>>;
71
71
  }, z.core.$strip>]>>;
72
- use: ((inputContext: better_call679.MiddlewareInputContext<{
73
- use: ((inputContext: better_call679.MiddlewareInputContext<better_call679.MiddlewareOptions>) => Promise<{
72
+ use: ((inputContext: better_call313.MiddlewareInputContext<{
73
+ use: ((inputContext: better_call313.MiddlewareInputContext<better_call313.MiddlewareOptions>) => Promise<{
74
74
  session: {
75
75
  session: Record<string, any> & {
76
76
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"organization.mjs","names":[],"sources":["../../../src/plugins/organization/organization.ts"],"sourcesContent":["import type { AuthContext, BetterAuthPlugin } from \"@better-auth/core\";\nimport { createAuthEndpoint } from \"@better-auth/core/api\";\nimport type { BetterAuthPluginDBSchema } from \"@better-auth/core/db\";\nimport { APIError } from \"better-call\";\nimport * as z from \"zod\";\nimport { getSessionFromCtx } from \"../../api\";\nimport { shimContext } from \"../../utils/shim\";\nimport type { AccessControl } from \"../access\";\nimport type { defaultStatements } from \"./access\";\nimport { defaultRoles } from \"./access\";\nimport { getOrgAdapter } from \"./adapter\";\nimport { orgSessionMiddleware } from \"./call\";\nimport { ORGANIZATION_ERROR_CODES } from \"./error-codes\";\nimport { hasPermission } from \"./has-permission\";\nimport {\n\tcreateOrgRole,\n\tdeleteOrgRole,\n\tgetOrgRole,\n\tlistOrgRoles,\n\tupdateOrgRole,\n} from \"./routes/crud-access-control\";\nimport {\n\tacceptInvitation,\n\tcancelInvitation,\n\tcreateInvitation,\n\tgetInvitation,\n\tlistInvitations,\n\tlistUserInvitations,\n\trejectInvitation,\n} from \"./routes/crud-invites\";\nimport {\n\taddMember,\n\tgetActiveMember,\n\tgetActiveMemberRole,\n\tleaveOrganization,\n\tlistMembers,\n\tremoveMember,\n\tupdateMemberRole,\n} from \"./routes/crud-members\";\nimport {\n\tcheckOrganizationSlug,\n\tcreateOrganization,\n\tdeleteOrganization,\n\tgetFullOrganization,\n\tlistOrganizations,\n\tsetActiveOrganization,\n\tupdateOrganization,\n} from \"./routes/crud-org\";\nimport {\n\taddTeamMember,\n\tcreateTeam,\n\tlistOrganizationTeams,\n\tlistTeamMembers,\n\tlistUserTeams,\n\tremoveTeam,\n\tremoveTeamMember,\n\tsetActiveTeam,\n\tupdateTeam,\n} from \"./routes/crud-team\";\nimport type {\n\tInferInvitation,\n\tInferMember,\n\tInferOrganization,\n\tInferTeam,\n\tOrganizationSchema,\n\tTeam,\n\tTeamMember,\n} from \"./schema\";\nimport type { OrganizationOptions } from \"./types\";\n\nexport function parseRoles(roles: string | string[]): string {\n\treturn Array.isArray(roles) ? roles.join(\",\") : roles;\n}\n\nexport type DynamicAccessControlEndpoints<O extends OrganizationOptions> = {\n\tcreateOrgRole: ReturnType<typeof createOrgRole<O>>;\n\tdeleteOrgRole: ReturnType<typeof deleteOrgRole<O>>;\n\tlistOrgRoles: ReturnType<typeof listOrgRoles<O>>;\n\tgetOrgRole: ReturnType<typeof getOrgRole<O>>;\n\tupdateOrgRole: ReturnType<typeof updateOrgRole<O>>;\n};\n\nexport type TeamEndpoints<O extends OrganizationOptions> = {\n\tcreateTeam: ReturnType<typeof createTeam<O>>;\n\tlistOrganizationTeams: ReturnType<typeof listOrganizationTeams<O>>;\n\tremoveTeam: ReturnType<typeof removeTeam<O>>;\n\tupdateTeam: ReturnType<typeof updateTeam<O>>;\n\tsetActiveTeam: ReturnType<typeof setActiveTeam<O>>;\n\tlistUserTeams: ReturnType<typeof listUserTeams<O>>;\n\tlistTeamMembers: ReturnType<typeof listTeamMembers<O>>;\n\taddTeamMember: ReturnType<typeof addTeamMember<O>>;\n\tremoveTeamMember: ReturnType<typeof removeTeamMember<O>>;\n};\n\nexport type OrganizationEndpoints<O extends OrganizationOptions> = {\n\tcreateOrganization: ReturnType<typeof createOrganization<O>>;\n\tupdateOrganization: ReturnType<typeof updateOrganization<O>>;\n\tdeleteOrganization: ReturnType<typeof deleteOrganization<O>>;\n\tsetActiveOrganization: ReturnType<typeof setActiveOrganization<O>>;\n\tgetFullOrganization: ReturnType<typeof getFullOrganization<O>>;\n\tlistOrganizations: ReturnType<typeof listOrganizations<O>>;\n\tcreateInvitation: ReturnType<typeof createInvitation<O>>;\n\tcancelInvitation: ReturnType<typeof cancelInvitation<O>>;\n\tacceptInvitation: ReturnType<typeof acceptInvitation<O>>;\n\tgetInvitation: ReturnType<typeof getInvitation<O>>;\n\trejectInvitation: ReturnType<typeof rejectInvitation<O>>;\n\tlistInvitations: ReturnType<typeof listInvitations<O>>;\n\tgetActiveMember: ReturnType<typeof getActiveMember<O>>;\n\tcheckOrganizationSlug: ReturnType<typeof checkOrganizationSlug<O>>;\n\taddMember: ReturnType<typeof addMember<O>>;\n\tremoveMember: ReturnType<typeof removeMember<O>>;\n\tupdateMemberRole: ReturnType<typeof updateMemberRole<O>>;\n\tleaveOrganization: ReturnType<typeof leaveOrganization<O>>;\n\tlistUserInvitations: ReturnType<typeof listUserInvitations<O>>;\n\tlistMembers: ReturnType<typeof listMembers<O>>;\n\tgetActiveMemberRole: ReturnType<typeof getActiveMemberRole<O>>;\n\thasPermission: ReturnType<typeof createHasPermission<O>>;\n};\n\nconst createHasPermissionBodySchema = z\n\t.object({\n\t\torganizationId: z.string().optional(),\n\t})\n\t.and(\n\t\tz.union([\n\t\t\tz.object({\n\t\t\t\tpermission: z.record(z.string(), z.array(z.string())),\n\t\t\t\tpermissions: z.undefined(),\n\t\t\t}),\n\t\t\tz.object({\n\t\t\t\tpermission: z.undefined(),\n\t\t\t\tpermissions: z.record(z.string(), z.array(z.string())),\n\t\t\t}),\n\t\t]),\n\t);\n\nconst createHasPermission = <O extends OrganizationOptions>(options: O) => {\n\ttype DefaultStatements = typeof defaultStatements;\n\ttype Statements =\n\t\tO[\"ac\"] extends AccessControl<infer S> ? S : DefaultStatements;\n\ttype PermissionType = {\n\t\t[key in keyof Statements]?: Array<\n\t\t\tStatements[key] extends readonly unknown[]\n\t\t\t\t? Statements[key][number]\n\t\t\t\t: never\n\t\t>;\n\t};\n\ttype PermissionExclusive =\n\t\t| {\n\t\t\t\t/**\n\t\t\t\t * @deprecated Use `permissions` instead\n\t\t\t\t */\n\t\t\t\tpermission: PermissionType;\n\t\t\t\tpermissions?: never | undefined;\n\t\t }\n\t\t| {\n\t\t\t\tpermissions: PermissionType;\n\t\t\t\tpermission?: never | undefined;\n\t\t };\n\n\treturn createAuthEndpoint(\n\t\t\"/organization/has-permission\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\trequireHeaders: true,\n\t\t\tbody: createHasPermissionBodySchema,\n\t\t\tuse: [orgSessionMiddleware],\n\t\t\tmetadata: {\n\t\t\t\t$Infer: {\n\t\t\t\t\tbody: {} as PermissionExclusive & {\n\t\t\t\t\t\torganizationId?: string | undefined;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\topenapi: {\n\t\t\t\t\tdescription: \"Check if the user has permission\",\n\t\t\t\t\trequestBody: {\n\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\tpermission: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\t\tdescription: \"The permission to check\",\n\t\t\t\t\t\t\t\t\t\t\tdeprecated: true,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tpermissions: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\t\tdescription: \"The permission to check\",\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\trequired: [\"permissions\"],\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\tresponses: {\n\t\t\t\t\t\t\"200\": {\n\t\t\t\t\t\t\tdescription: \"Success\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tsuccess: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\trequired: [\"success\"],\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\tasync (ctx) => {\n\t\t\tconst activeOrganizationId =\n\t\t\t\tctx.body.organizationId ||\n\t\t\t\tctx.context.session.session.activeOrganizationId;\n\t\t\tif (!activeOrganizationId) {\n\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: ORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, options);\n\t\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: ctx.context.session.user.id,\n\t\t\t\torganizationId: activeOrganizationId,\n\t\t\t});\n\t\t\tif (!member) {\n\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\tmessage:\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.USER_IS_NOT_A_MEMBER_OF_THE_ORGANIZATION,\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst result = await hasPermission(\n\t\t\t\t{\n\t\t\t\t\trole: member.role,\n\t\t\t\t\toptions: options || {},\n\t\t\t\t\tpermissions: (ctx.body.permissions ?? ctx.body.permission) as any,\n\t\t\t\t\torganizationId: activeOrganizationId,\n\t\t\t\t},\n\t\t\t\tctx,\n\t\t\t);\n\n\t\t\treturn ctx.json({\n\t\t\t\terror: null,\n\t\t\t\tsuccess: result,\n\t\t\t});\n\t\t},\n\t);\n};\n\nexport type OrganizationPlugin<O extends OrganizationOptions> = {\n\tid: \"organization\";\n\tendpoints: OrganizationEndpoints<O> &\n\t\t(O extends { teams: { enabled: true } } ? TeamEndpoints<O> : {}) &\n\t\t(O extends { dynamicAccessControl: { enabled: true } }\n\t\t\t? DynamicAccessControlEndpoints<O>\n\t\t\t: {});\n\tschema: OrganizationSchema<O>;\n\t$Infer: {\n\t\tOrganization: InferOrganization<O>;\n\t\tInvitation: InferInvitation<O>;\n\t\tMember: InferMember<O>;\n\t\tTeam: O[\"teams\"] extends { enabled: true } ? Team : any;\n\t\tTeamMember: O[\"teams\"] extends { enabled: true } ? TeamMember : any;\n\t\tActiveOrganization: O[\"teams\"] extends { enabled: true }\n\t\t\t? {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t\tteams: InferTeam<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>\n\t\t\t: {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>;\n\t};\n\t$ERROR_CODES: typeof ORGANIZATION_ERROR_CODES;\n\toptions: NoInfer<O>;\n};\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 = betterAuth({\n * plugins: [\n * organization({\n * allowUserToCreateOrganization: true,\n * }),\n * ],\n * });\n * ```\n */\nexport function organization<\n\tO extends OrganizationOptions & {\n\t\tteams: { enabled: true };\n\t},\n>(\n\toptions?: O | undefined,\n): {\n\tid: \"organization\";\n\tendpoints: OrganizationEndpoints<O> & TeamEndpoints<O>;\n\tschema: OrganizationSchema<O>;\n\t$Infer: {\n\t\tOrganization: InferOrganization<O>;\n\t\tInvitation: InferInvitation<O>;\n\t\tMember: InferMember<O>;\n\t\tTeam: O[\"teams\"] extends { enabled: true } ? Team : unknown;\n\t\tTeamMember: O[\"teams\"] extends { enabled: true } ? TeamMember : unknown;\n\t\tActiveOrganization: O[\"teams\"] extends { enabled: true }\n\t\t\t? {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t\tteams: InferTeam<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>\n\t\t\t: {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>;\n\t};\n\t$ERROR_CODES: typeof ORGANIZATION_ERROR_CODES;\n\toptions: NoInfer<O>;\n};\nexport function organization<\n\tO extends OrganizationOptions & {\n\t\tteams: { enabled: true };\n\t\tdynamicAccessControl: { enabled: true };\n\t},\n>(\n\toptions?: O | undefined,\n): {\n\tid: \"organization\";\n\tendpoints: OrganizationEndpoints<O> &\n\t\tTeamEndpoints<O> &\n\t\tDynamicAccessControlEndpoints<O>;\n\tschema: OrganizationSchema<O>;\n\t$Infer: {\n\t\tOrganization: InferOrganization<O>;\n\t\tInvitation: InferInvitation<O>;\n\t\tMember: InferMember<O>;\n\t\tTeam: O[\"teams\"] extends { enabled: true } ? Team : any;\n\t\tTeamMember: O[\"teams\"] extends { enabled: true } ? TeamMember : any;\n\t\tActiveOrganization: O[\"teams\"] extends { enabled: true }\n\t\t\t? {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t\tteams: InferTeam<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>\n\t\t\t: {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>;\n\t};\n\t$ERROR_CODES: typeof ORGANIZATION_ERROR_CODES;\n\toptions: NoInfer<O>;\n};\nexport function organization<\n\tO extends OrganizationOptions & {\n\t\tdynamicAccessControl: { enabled: true };\n\t},\n>(\n\toptions?: O | undefined,\n): {\n\tid: \"organization\";\n\tendpoints: OrganizationEndpoints<O> & DynamicAccessControlEndpoints<O>;\n\tschema: OrganizationSchema<O>;\n\t$Infer: {\n\t\tOrganization: InferOrganization<O>;\n\t\tInvitation: InferInvitation<O>;\n\t\tMember: InferMember<O>;\n\t\tTeam: O[\"teams\"] extends { enabled: true } ? Team : any;\n\t\tTeamMember: O[\"teams\"] extends { enabled: true } ? TeamMember : any;\n\t\tActiveOrganization: O[\"teams\"] extends { enabled: true }\n\t\t\t? {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t\tteams: InferTeam<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>\n\t\t\t: {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>;\n\t};\n\t$ERROR_CODES: typeof ORGANIZATION_ERROR_CODES;\n\toptions: NoInfer<O>;\n};\nexport function organization<O extends OrganizationOptions>(\n\toptions?: O | undefined,\n): {\n\tid: \"organization\";\n\tendpoints: OrganizationEndpoints<O>;\n\tschema: OrganizationSchema<O>;\n\t$Infer: {\n\t\tOrganization: InferOrganization<O>;\n\t\tInvitation: InferInvitation<O>;\n\t\tMember: InferMember<O>;\n\t\tTeam: O[\"teams\"] extends { enabled: true } ? Team : any;\n\t\tTeamMember: O[\"teams\"] extends { enabled: true } ? TeamMember : any;\n\t\tActiveOrganization: O[\"teams\"] extends { enabled: true }\n\t\t\t? {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t\tteams: InferTeam<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>\n\t\t\t: {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>;\n\t};\n\t$ERROR_CODES: typeof ORGANIZATION_ERROR_CODES;\n\toptions: NoInfer<O>;\n};\nexport function organization<O extends OrganizationOptions>(\n\toptions?: O | undefined,\n): any {\n\tlet endpoints = {\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/create`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.createOrganization`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.create`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-create)\n\t\t */\n\t\tcreateOrganization: createOrganization(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/update`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.updateOrganization`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.update`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-update)\n\t\t */\n\t\tupdateOrganization: updateOrganization(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/delete`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.deleteOrganization`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.delete`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-delete)\n\t\t */\n\t\tdeleteOrganization: deleteOrganization(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/set-active`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.setActiveOrganization`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.setActive`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-set-active)\n\t\t */\n\t\tsetActiveOrganization: setActiveOrganization(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * GET `/organization/get-full-organization`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.getFullOrganization`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.getFullOrganization`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-get-full-organization)\n\t\t */\n\t\tgetFullOrganization: getFullOrganization(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * GET `/organization/list`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.listOrganizations`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.list`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-list)\n\t\t */\n\t\tlistOrganizations: listOrganizations(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/invite-member`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.createInvitation`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.inviteMember`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-invite-member)\n\t\t */\n\t\tcreateInvitation: createInvitation(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/cancel-invitation`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.cancelInvitation`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.cancelInvitation`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-cancel-invitation)\n\t\t */\n\t\tcancelInvitation: cancelInvitation(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/accept-invitation`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.acceptInvitation`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.acceptInvitation`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-accept-invitation)\n\t\t */\n\t\tacceptInvitation: acceptInvitation(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * GET `/organization/get-invitation`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.getInvitation`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.getInvitation`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-get-invitation)\n\t\t */\n\t\tgetInvitation: getInvitation(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/reject-invitation`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.rejectInvitation`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.rejectInvitation`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-reject-invitation)\n\t\t */\n\t\trejectInvitation: rejectInvitation(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * GET `/organization/list-invitations`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.listInvitations`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.listInvitations`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-list-invitations)\n\t\t */\n\t\tlistInvitations: listInvitations(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * GET `/organization/get-active-member`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.getActiveMember`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.getActiveMember`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-get-active-member)\n\t\t */\n\t\tgetActiveMember: getActiveMember(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/check-slug`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.checkOrganizationSlug`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.checkSlug`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-check-slug)\n\t\t */\n\t\tcheckOrganizationSlug: checkOrganizationSlug(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/add-member`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.addMember`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-add-member)\n\t\t */\n\n\t\taddMember: addMember<O>(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/remove-member`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.removeMember`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.removeMember`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-remove-member)\n\t\t */\n\t\tremoveMember: removeMember(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/update-member-role`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.updateMemberRole`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.updateMemberRole`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-update-member-role)\n\t\t */\n\t\tupdateMemberRole: updateMemberRole(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/leave`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.leaveOrganization`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.leave`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-leave)\n\t\t */\n\t\tleaveOrganization: leaveOrganization(options as O),\n\t\tlistUserInvitations: listUserInvitations(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * GET `/organization/list-members`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.listMembers`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.listMembers`\n\t\t */\n\t\tlistMembers: listMembers(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * GET `/organization/get-active-member-role`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.getActiveMemberRole`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.getActiveMemberRole`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-get-active-member-role)\n\t\t */\n\t\tgetActiveMemberRole: getActiveMemberRole(options as O),\n\t};\n\tconst teamSupport = options?.teams?.enabled;\n\tconst teamEndpoints = {\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/create-team`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.createTeam`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.createTeam`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-create-team)\n\t\t */\n\t\tcreateTeam: createTeam(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * GET `/organization/list-teams`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.listOrganizationTeams`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.listTeams`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-list-teams)\n\t\t */\n\t\tlistOrganizationTeams: listOrganizationTeams(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/remove-team`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.removeTeam`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.removeTeam`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-remove-team)\n\t\t */\n\t\tremoveTeam: removeTeam(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/update-team`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.updateTeam`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.updateTeam`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-update-team)\n\t\t */\n\t\tupdateTeam: updateTeam(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/set-active-team`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.setActiveTeam`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.setActiveTeam`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-set-active-team)\n\t\t */\n\t\tsetActiveTeam: setActiveTeam(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * GET `/organization/list-user-teams`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.listUserTeams`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.listUserTeams`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-set-active-team)\n\t\t */\n\t\tlistUserTeams: listUserTeams(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/list-team-members`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.listTeamMembers`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.listTeamMembers`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-set-active-team)\n\t\t */\n\t\tlistTeamMembers: listTeamMembers(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/add-team-member`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.addTeamMember`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.addTeamMember`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-add-team-member)\n\t\t */\n\t\taddTeamMember: addTeamMember(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/remove-team-member`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.removeTeamMember`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.removeTeamMember`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-remove-team-member)\n\t\t */\n\t\tremoveTeamMember: removeTeamMember(options as O),\n\t};\n\tif (teamSupport) {\n\t\tendpoints = {\n\t\t\t...endpoints,\n\t\t\t...teamEndpoints,\n\t\t};\n\t}\n\n\tconst dynamicAccessControlEndpoints = {\n\t\tcreateOrgRole: createOrgRole(options as O),\n\t\tdeleteOrgRole: deleteOrgRole(options as O),\n\t\tlistOrgRoles: listOrgRoles(options as O),\n\t\tgetOrgRole: getOrgRole(options as O),\n\t\tupdateOrgRole: updateOrgRole(options as O),\n\t};\n\tif (options?.dynamicAccessControl?.enabled) {\n\t\tendpoints = {\n\t\t\t...endpoints,\n\t\t\t...dynamicAccessControlEndpoints,\n\t\t};\n\t}\n\tconst roles = {\n\t\t...defaultRoles,\n\t\t...options?.roles,\n\t};\n\n\t// Build team schema in a way that never introduces undefined values when spreading\n\tconst teamSchema = teamSupport\n\t\t? ({\n\t\t\t\tteam: {\n\t\t\t\t\tmodelName: options?.schema?.team?.modelName,\n\t\t\t\t\tfields: {\n\t\t\t\t\t\tname: {\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\tfieldName: options?.schema?.team?.fields?.name,\n\t\t\t\t\t\t},\n\t\t\t\t\t\torganizationId: {\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\treferences: {\n\t\t\t\t\t\t\t\tmodel: \"organization\",\n\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfieldName: options?.schema?.team?.fields?.organizationId,\n\t\t\t\t\t\t\tindex: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcreatedAt: {\n\t\t\t\t\t\t\ttype: \"date\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\tfieldName: options?.schema?.team?.fields?.createdAt,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tupdatedAt: {\n\t\t\t\t\t\t\ttype: \"date\",\n\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\tfieldName: options?.schema?.team?.fields?.updatedAt,\n\t\t\t\t\t\t\tonUpdate: () => new Date(),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t...(options?.schema?.team?.additionalFields || {}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tteamMember: {\n\t\t\t\t\tmodelName: options?.schema?.teamMember?.modelName,\n\t\t\t\t\tfields: {\n\t\t\t\t\t\tteamId: {\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\treferences: {\n\t\t\t\t\t\t\t\tmodel: \"team\",\n\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfieldName: options?.schema?.teamMember?.fields?.teamId,\n\t\t\t\t\t\t\tindex: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tuserId: {\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\treferences: {\n\t\t\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfieldName: options?.schema?.teamMember?.fields?.userId,\n\t\t\t\t\t\t\tindex: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcreatedAt: {\n\t\t\t\t\t\t\ttype: \"date\",\n\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\tfieldName: options?.schema?.teamMember?.fields?.createdAt,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t} satisfies BetterAuthPluginDBSchema)\n\t\t: {};\n\n\tconst organizationRoleSchema = options?.dynamicAccessControl?.enabled\n\t\t? ({\n\t\t\t\torganizationRole: {\n\t\t\t\t\tfields: {\n\t\t\t\t\t\torganizationId: {\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\treferences: {\n\t\t\t\t\t\t\t\tmodel: \"organization\",\n\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfieldName:\n\t\t\t\t\t\t\t\toptions?.schema?.organizationRole?.fields?.organizationId,\n\t\t\t\t\t\t\tindex: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\trole: {\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\tfieldName: options?.schema?.organizationRole?.fields?.role,\n\t\t\t\t\t\t\tindex: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpermission: {\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\tfieldName: options?.schema?.organizationRole?.fields?.permission,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcreatedAt: {\n\t\t\t\t\t\t\ttype: \"date\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\tdefaultValue: () => new Date(),\n\t\t\t\t\t\t\tfieldName: options?.schema?.organizationRole?.fields?.createdAt,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tupdatedAt: {\n\t\t\t\t\t\t\ttype: \"date\",\n\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\tfieldName: options?.schema?.organizationRole?.fields?.updatedAt,\n\t\t\t\t\t\t\tonUpdate: () => new Date(),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t...(options?.schema?.organizationRole?.additionalFields || {}),\n\t\t\t\t\t},\n\t\t\t\t\tmodelName: options?.schema?.organizationRole?.modelName,\n\t\t\t\t},\n\t\t\t} satisfies BetterAuthPluginDBSchema)\n\t\t: {};\n\n\tconst schema = {\n\t\t...({\n\t\t\torganization: {\n\t\t\t\tmodelName: options?.schema?.organization?.modelName,\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\tsortable: true,\n\t\t\t\t\t\tfieldName: options?.schema?.organization?.fields?.name,\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\trequired: true,\n\t\t\t\t\t\tunique: true,\n\t\t\t\t\t\tsortable: true,\n\t\t\t\t\t\tfieldName: options?.schema?.organization?.fields?.slug,\n\t\t\t\t\t\tindex: 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\tfieldName: options?.schema?.organization?.fields?.logo,\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\tfieldName: options?.schema?.organization?.fields?.createdAt,\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\tfieldName: options?.schema?.organization?.fields?.metadata,\n\t\t\t\t\t},\n\t\t\t\t\t...(options?.schema?.organization?.additionalFields || {}),\n\t\t\t\t},\n\t\t\t},\n\t\t} satisfies BetterAuthPluginDBSchema),\n\t\t...organizationRoleSchema,\n\t\t...teamSchema,\n\t\t...({\n\t\t\tmember: {\n\t\t\t\tmodelName: options?.schema?.member?.modelName,\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\tfieldName: options?.schema?.member?.fields?.organizationId,\n\t\t\t\t\t\tindex: 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\trequired: true,\n\t\t\t\t\t\tfieldName: options?.schema?.member?.fields?.userId,\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\tindex: 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\tsortable: true,\n\t\t\t\t\t\tdefaultValue: \"member\",\n\t\t\t\t\t\tfieldName: options?.schema?.member?.fields?.role,\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\tfieldName: options?.schema?.member?.fields?.createdAt,\n\t\t\t\t\t},\n\t\t\t\t\t...(options?.schema?.member?.additionalFields || {}),\n\t\t\t\t},\n\t\t\t},\n\t\t\tinvitation: {\n\t\t\t\tmodelName: options?.schema?.invitation?.modelName,\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\tfieldName: options?.schema?.invitation?.fields?.organizationId,\n\t\t\t\t\t\tindex: 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\tsortable: true,\n\t\t\t\t\t\tfieldName: options?.schema?.invitation?.fields?.email,\n\t\t\t\t\t\tindex: 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\tsortable: true,\n\t\t\t\t\t\tfieldName: options?.schema?.invitation?.fields?.role,\n\t\t\t\t\t},\n\t\t\t\t\t...(teamSupport\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tteamId: {\n\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\t\t\tsortable: true,\n\t\t\t\t\t\t\t\t\tfieldName: options?.schema?.invitation?.fields?.teamId,\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\tstatus: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\tsortable: true,\n\t\t\t\t\t\tdefaultValue: \"pending\",\n\t\t\t\t\t\tfieldName: options?.schema?.invitation?.fields?.status,\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\tfieldName: options?.schema?.invitation?.fields?.expiresAt,\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\tfieldName: options?.schema?.invitation?.fields?.createdAt,\n\t\t\t\t\t\tdefaultValue: () => new Date(),\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\tfieldName: options?.schema?.invitation?.fields?.inviterId,\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t},\n\t\t\t\t\t...(options?.schema?.invitation?.additionalFields || {}),\n\t\t\t\t},\n\t\t\t},\n\t\t} satisfies BetterAuthPluginDBSchema),\n\t};\n\n\t/**\n\t * the orgMiddleware type-asserts an empty object representing org options, roles, and a getSession function.\n\t * This `shimContext` function is used to add those missing properties to the context object.\n\t */\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\treturn {\n\t\tid: \"organization\",\n\t\tendpoints: {\n\t\t\t...(api as OrganizationEndpoints<O>),\n\t\t\thasPermission: createHasPermission(options as O),\n\t\t},\n\t\tschema: {\n\t\t\t...(schema as BetterAuthPluginDBSchema),\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\tfieldName: options?.schema?.session?.fields?.activeOrganizationId,\n\t\t\t\t\t},\n\t\t\t\t\t...(teamSupport\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tactiveTeamId: {\n\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\t\t\tfieldName: options?.schema?.session?.fields?.activeTeamId,\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} as unknown as O[\"teams\"] extends {\n\t\t\t\t\tenabled: true;\n\t\t\t\t}\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tactiveTeamId: {\n\t\t\t\t\t\t\t\ttype: \"string\";\n\t\t\t\t\t\t\t\trequired: false;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tactiveOrganizationId: {\n\t\t\t\t\t\t\t\ttype: \"string\";\n\t\t\t\t\t\t\t\trequired: false;\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\t\t\tactiveOrganizationId: {\n\t\t\t\t\t\t\t\ttype: \"string\";\n\t\t\t\t\t\t\t\trequired: false;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t$Infer: {\n\t\t\tOrganization: {} as InferOrganization<O>,\n\t\t\tInvitation: {} as InferInvitation<O>,\n\t\t\tMember: {} as InferMember<O>,\n\t\t\tTeam: teamSupport ? ({} as Team) : ({} as any),\n\t\t\tTeamMember: teamSupport ? ({} as TeamMember) : ({} as any),\n\t\t\tActiveOrganization: {} as O[\"teams\"] extends { enabled: true }\n\t\t\t\t? {\n\t\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t\t\tteams: InferTeam<O, false>[];\n\t\t\t\t\t} & InferOrganization<O, false>\n\t\t\t\t: {\n\t\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t\t} & InferOrganization<O, false>,\n\t\t},\n\t\t$ERROR_CODES: ORGANIZATION_ERROR_CODES,\n\t\toptions: options as O,\n\t} satisfies BetterAuthPlugin;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"organization.mjs","names":[],"sources":["../../../src/plugins/organization/organization.ts"],"sourcesContent":["import type { AuthContext, BetterAuthPlugin } from \"@better-auth/core\";\nimport { createAuthEndpoint } from \"@better-auth/core/api\";\nimport type { BetterAuthPluginDBSchema } from \"@better-auth/core/db\";\nimport { APIError } from \"better-call\";\nimport * as z from \"zod\";\nimport { getSessionFromCtx } from \"../../api\";\nimport { shimContext } from \"../../utils/shim\";\nimport type { AccessControl } from \"../access\";\nimport type { defaultStatements } from \"./access\";\nimport { defaultRoles } from \"./access\";\nimport { getOrgAdapter } from \"./adapter\";\nimport { orgSessionMiddleware } from \"./call\";\nimport { ORGANIZATION_ERROR_CODES } from \"./error-codes\";\nimport { hasPermission } from \"./has-permission\";\nimport {\n\tcreateOrgRole,\n\tdeleteOrgRole,\n\tgetOrgRole,\n\tlistOrgRoles,\n\tupdateOrgRole,\n} from \"./routes/crud-access-control\";\nimport {\n\tacceptInvitation,\n\tcancelInvitation,\n\tcreateInvitation,\n\tgetInvitation,\n\tlistInvitations,\n\tlistUserInvitations,\n\trejectInvitation,\n} from \"./routes/crud-invites\";\nimport {\n\taddMember,\n\tgetActiveMember,\n\tgetActiveMemberRole,\n\tleaveOrganization,\n\tlistMembers,\n\tremoveMember,\n\tupdateMemberRole,\n} from \"./routes/crud-members\";\nimport {\n\tcheckOrganizationSlug,\n\tcreateOrganization,\n\tdeleteOrganization,\n\tgetFullOrganization,\n\tlistOrganizations,\n\tsetActiveOrganization,\n\tupdateOrganization,\n} from \"./routes/crud-org\";\nimport {\n\taddTeamMember,\n\tcreateTeam,\n\tlistOrganizationTeams,\n\tlistTeamMembers,\n\tlistUserTeams,\n\tremoveTeam,\n\tremoveTeamMember,\n\tsetActiveTeam,\n\tupdateTeam,\n} from \"./routes/crud-team\";\nimport type {\n\tInferInvitation,\n\tInferMember,\n\tInferOrganization,\n\tInferTeam,\n\tOrganizationSchema,\n\tTeam,\n\tTeamMember,\n} from \"./schema\";\nimport type { OrganizationOptions } from \"./types\";\n\nexport function parseRoles(roles: string | string[]): string {\n\treturn Array.isArray(roles) ? roles.join(\",\") : roles;\n}\n\nexport type DynamicAccessControlEndpoints<O extends OrganizationOptions> = {\n\tcreateOrgRole: ReturnType<typeof createOrgRole<O>>;\n\tdeleteOrgRole: ReturnType<typeof deleteOrgRole<O>>;\n\tlistOrgRoles: ReturnType<typeof listOrgRoles<O>>;\n\tgetOrgRole: ReturnType<typeof getOrgRole<O>>;\n\tupdateOrgRole: ReturnType<typeof updateOrgRole<O>>;\n};\n\nexport type TeamEndpoints<O extends OrganizationOptions> = {\n\tcreateTeam: ReturnType<typeof createTeam<O>>;\n\tlistOrganizationTeams: ReturnType<typeof listOrganizationTeams<O>>;\n\tremoveTeam: ReturnType<typeof removeTeam<O>>;\n\tupdateTeam: ReturnType<typeof updateTeam<O>>;\n\tsetActiveTeam: ReturnType<typeof setActiveTeam<O>>;\n\tlistUserTeams: ReturnType<typeof listUserTeams<O>>;\n\tlistTeamMembers: ReturnType<typeof listTeamMembers<O>>;\n\taddTeamMember: ReturnType<typeof addTeamMember<O>>;\n\tremoveTeamMember: ReturnType<typeof removeTeamMember<O>>;\n};\n\nexport type OrganizationEndpoints<O extends OrganizationOptions> = {\n\tcreateOrganization: ReturnType<typeof createOrganization<O>>;\n\tupdateOrganization: ReturnType<typeof updateOrganization<O>>;\n\tdeleteOrganization: ReturnType<typeof deleteOrganization<O>>;\n\tsetActiveOrganization: ReturnType<typeof setActiveOrganization<O>>;\n\tgetFullOrganization: ReturnType<typeof getFullOrganization<O>>;\n\tlistOrganizations: ReturnType<typeof listOrganizations<O>>;\n\tcreateInvitation: ReturnType<typeof createInvitation<O>>;\n\tcancelInvitation: ReturnType<typeof cancelInvitation<O>>;\n\tacceptInvitation: ReturnType<typeof acceptInvitation<O>>;\n\tgetInvitation: ReturnType<typeof getInvitation<O>>;\n\trejectInvitation: ReturnType<typeof rejectInvitation<O>>;\n\tlistInvitations: ReturnType<typeof listInvitations<O>>;\n\tgetActiveMember: ReturnType<typeof getActiveMember<O>>;\n\tcheckOrganizationSlug: ReturnType<typeof checkOrganizationSlug<O>>;\n\taddMember: ReturnType<typeof addMember<O>>;\n\tremoveMember: ReturnType<typeof removeMember<O>>;\n\tupdateMemberRole: ReturnType<typeof updateMemberRole<O>>;\n\tleaveOrganization: ReturnType<typeof leaveOrganization<O>>;\n\tlistUserInvitations: ReturnType<typeof listUserInvitations<O>>;\n\tlistMembers: ReturnType<typeof listMembers<O>>;\n\tgetActiveMemberRole: ReturnType<typeof getActiveMemberRole<O>>;\n\thasPermission: ReturnType<typeof createHasPermission<O>>;\n};\n\nconst createHasPermissionBodySchema = z\n\t.object({\n\t\torganizationId: z.string().optional(),\n\t})\n\t.and(\n\t\tz.union([\n\t\t\tz.object({\n\t\t\t\tpermission: z.record(z.string(), z.array(z.string())),\n\t\t\t\tpermissions: z.undefined(),\n\t\t\t}),\n\t\t\tz.object({\n\t\t\t\tpermission: z.undefined(),\n\t\t\t\tpermissions: z.record(z.string(), z.array(z.string())),\n\t\t\t}),\n\t\t]),\n\t);\n\nconst createHasPermission = <O extends OrganizationOptions>(options: O) => {\n\ttype DefaultStatements = typeof defaultStatements;\n\ttype Statements =\n\t\tO[\"ac\"] extends AccessControl<infer S> ? S : DefaultStatements;\n\ttype PermissionType = {\n\t\t[key in keyof Statements]?: Array<\n\t\t\tStatements[key] extends readonly unknown[]\n\t\t\t\t? Statements[key][number]\n\t\t\t\t: never\n\t\t>;\n\t};\n\ttype PermissionExclusive =\n\t\t| {\n\t\t\t\t/**\n\t\t\t\t * @deprecated Use `permissions` instead\n\t\t\t\t */\n\t\t\t\tpermission: PermissionType;\n\t\t\t\tpermissions?: never | undefined;\n\t\t }\n\t\t| {\n\t\t\t\tpermissions: PermissionType;\n\t\t\t\tpermission?: never | undefined;\n\t\t };\n\n\treturn createAuthEndpoint(\n\t\t\"/organization/has-permission\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\trequireHeaders: true,\n\t\t\tbody: createHasPermissionBodySchema,\n\t\t\tuse: [orgSessionMiddleware],\n\t\t\tmetadata: {\n\t\t\t\t$Infer: {\n\t\t\t\t\tbody: {} as PermissionExclusive & {\n\t\t\t\t\t\torganizationId?: string | undefined;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\topenapi: {\n\t\t\t\t\tdescription: \"Check if the user has permission\",\n\t\t\t\t\trequestBody: {\n\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\tpermission: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\t\tdescription: \"The permission to check\",\n\t\t\t\t\t\t\t\t\t\t\tdeprecated: true,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tpermissions: {\n\t\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\t\tdescription: \"The permission to check\",\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\trequired: [\"permissions\"],\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\tresponses: {\n\t\t\t\t\t\t\"200\": {\n\t\t\t\t\t\t\tdescription: \"Success\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tsuccess: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"boolean\",\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\trequired: [\"success\"],\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\tasync (ctx) => {\n\t\t\tconst activeOrganizationId =\n\t\t\t\tctx.body.organizationId ||\n\t\t\t\tctx.context.session.session.activeOrganizationId;\n\t\t\tif (!activeOrganizationId) {\n\t\t\t\tthrow new APIError(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: ORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, options);\n\t\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: ctx.context.session.user.id,\n\t\t\t\torganizationId: activeOrganizationId,\n\t\t\t});\n\t\t\tif (!member) {\n\t\t\t\tthrow new APIError(\"UNAUTHORIZED\", {\n\t\t\t\t\tmessage:\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.USER_IS_NOT_A_MEMBER_OF_THE_ORGANIZATION,\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst result = await hasPermission(\n\t\t\t\t{\n\t\t\t\t\trole: member.role,\n\t\t\t\t\toptions: options || {},\n\t\t\t\t\tpermissions: (ctx.body.permissions ?? ctx.body.permission) as any,\n\t\t\t\t\torganizationId: activeOrganizationId,\n\t\t\t\t},\n\t\t\t\tctx,\n\t\t\t);\n\n\t\t\treturn ctx.json({\n\t\t\t\terror: null,\n\t\t\t\tsuccess: result,\n\t\t\t});\n\t\t},\n\t);\n};\n\nexport type OrganizationPlugin<O extends OrganizationOptions> = {\n\tid: \"organization\";\n\tendpoints: OrganizationEndpoints<O> &\n\t\t(O extends { teams: { enabled: true } } ? TeamEndpoints<O> : {}) &\n\t\t(O extends { dynamicAccessControl: { enabled: true } }\n\t\t\t? DynamicAccessControlEndpoints<O>\n\t\t\t: {});\n\tschema: OrganizationSchema<O>;\n\t$Infer: {\n\t\tOrganization: InferOrganization<O>;\n\t\tInvitation: InferInvitation<O>;\n\t\tMember: InferMember<O>;\n\t\tTeam: O[\"teams\"] extends { enabled: true } ? Team : any;\n\t\tTeamMember: O[\"teams\"] extends { enabled: true } ? TeamMember : any;\n\t\tActiveOrganization: O[\"teams\"] extends { enabled: true }\n\t\t\t? {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t\tteams: InferTeam<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>\n\t\t\t: {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>;\n\t};\n\t$ERROR_CODES: typeof ORGANIZATION_ERROR_CODES;\n\toptions: NoInfer<O>;\n};\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 = betterAuth({\n * plugins: [\n * organization({\n * allowUserToCreateOrganization: true,\n * }),\n * ],\n * });\n * ```\n */\nexport function organization<\n\tO extends OrganizationOptions & {\n\t\tteams: { enabled: true };\n\t},\n>(\n\toptions?: O | undefined,\n): {\n\tid: \"organization\";\n\tendpoints: OrganizationEndpoints<O> & TeamEndpoints<O>;\n\tschema: OrganizationSchema<O>;\n\t$Infer: {\n\t\tOrganization: InferOrganization<O>;\n\t\tInvitation: InferInvitation<O>;\n\t\tMember: InferMember<O>;\n\t\tTeam: O[\"teams\"] extends { enabled: true } ? Team : unknown;\n\t\tTeamMember: O[\"teams\"] extends { enabled: true } ? TeamMember : unknown;\n\t\tActiveOrganization: O[\"teams\"] extends { enabled: true }\n\t\t\t? {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t\tteams: InferTeam<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>\n\t\t\t: {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>;\n\t};\n\t$ERROR_CODES: typeof ORGANIZATION_ERROR_CODES;\n\toptions: NoInfer<O>;\n};\nexport function organization<\n\tO extends OrganizationOptions & {\n\t\tteams: { enabled: true };\n\t\tdynamicAccessControl: { enabled: true };\n\t},\n>(\n\toptions?: O | undefined,\n): {\n\tid: \"organization\";\n\tendpoints: OrganizationEndpoints<O> &\n\t\tTeamEndpoints<O> &\n\t\tDynamicAccessControlEndpoints<O>;\n\tschema: OrganizationSchema<O>;\n\t$Infer: {\n\t\tOrganization: InferOrganization<O>;\n\t\tInvitation: InferInvitation<O>;\n\t\tMember: InferMember<O>;\n\t\tTeam: O[\"teams\"] extends { enabled: true } ? Team : any;\n\t\tTeamMember: O[\"teams\"] extends { enabled: true } ? TeamMember : any;\n\t\tActiveOrganization: O[\"teams\"] extends { enabled: true }\n\t\t\t? {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t\tteams: InferTeam<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>\n\t\t\t: {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>;\n\t};\n\t$ERROR_CODES: typeof ORGANIZATION_ERROR_CODES;\n\toptions: NoInfer<O>;\n};\nexport function organization<\n\tO extends OrganizationOptions & {\n\t\tdynamicAccessControl: { enabled: true };\n\t},\n>(\n\toptions?: O | undefined,\n): {\n\tid: \"organization\";\n\tendpoints: OrganizationEndpoints<O> & DynamicAccessControlEndpoints<O>;\n\tschema: OrganizationSchema<O>;\n\t$Infer: {\n\t\tOrganization: InferOrganization<O>;\n\t\tInvitation: InferInvitation<O>;\n\t\tMember: InferMember<O>;\n\t\tTeam: O[\"teams\"] extends { enabled: true } ? Team : any;\n\t\tTeamMember: O[\"teams\"] extends { enabled: true } ? TeamMember : any;\n\t\tActiveOrganization: O[\"teams\"] extends { enabled: true }\n\t\t\t? {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t\tteams: InferTeam<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>\n\t\t\t: {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>;\n\t};\n\t$ERROR_CODES: typeof ORGANIZATION_ERROR_CODES;\n\toptions: NoInfer<O>;\n};\nexport function organization<O extends OrganizationOptions>(\n\toptions?: O | undefined,\n): {\n\tid: \"organization\";\n\tendpoints: OrganizationEndpoints<O>;\n\tschema: OrganizationSchema<O>;\n\t$Infer: {\n\t\tOrganization: InferOrganization<O>;\n\t\tInvitation: InferInvitation<O>;\n\t\tMember: InferMember<O>;\n\t\tTeam: O[\"teams\"] extends { enabled: true } ? Team : any;\n\t\tTeamMember: O[\"teams\"] extends { enabled: true } ? TeamMember : any;\n\t\tActiveOrganization: O[\"teams\"] extends { enabled: true }\n\t\t\t? {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t\tteams: InferTeam<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>\n\t\t\t: {\n\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t} & InferOrganization<O, false>;\n\t};\n\t$ERROR_CODES: typeof ORGANIZATION_ERROR_CODES;\n\toptions: NoInfer<O>;\n};\nexport function organization<O extends OrganizationOptions>(\n\toptions?: O | undefined,\n): any {\n\tlet endpoints = {\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/create`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.createOrganization`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.create`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-create)\n\t\t */\n\t\tcreateOrganization: createOrganization(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/update`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.updateOrganization`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.update`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-update)\n\t\t */\n\t\tupdateOrganization: updateOrganization(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/delete`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.deleteOrganization`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.delete`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-delete)\n\t\t */\n\t\tdeleteOrganization: deleteOrganization(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/set-active`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.setActiveOrganization`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.setActive`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-set-active)\n\t\t */\n\t\tsetActiveOrganization: setActiveOrganization(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * GET `/organization/get-full-organization`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.getFullOrganization`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.getFullOrganization`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-get-full-organization)\n\t\t */\n\t\tgetFullOrganization: getFullOrganization(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * GET `/organization/list`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.listOrganizations`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.list`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-list)\n\t\t */\n\t\tlistOrganizations: listOrganizations(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/invite-member`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.createInvitation`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.inviteMember`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-invite-member)\n\t\t */\n\t\tcreateInvitation: createInvitation(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/cancel-invitation`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.cancelInvitation`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.cancelInvitation`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-cancel-invitation)\n\t\t */\n\t\tcancelInvitation: cancelInvitation(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/accept-invitation`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.acceptInvitation`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.acceptInvitation`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-accept-invitation)\n\t\t */\n\t\tacceptInvitation: acceptInvitation(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * GET `/organization/get-invitation`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.getInvitation`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.getInvitation`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-get-invitation)\n\t\t */\n\t\tgetInvitation: getInvitation(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/reject-invitation`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.rejectInvitation`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.rejectInvitation`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-reject-invitation)\n\t\t */\n\t\trejectInvitation: rejectInvitation(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * GET `/organization/list-invitations`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.listInvitations`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.listInvitations`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-list-invitations)\n\t\t */\n\t\tlistInvitations: listInvitations(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * GET `/organization/get-active-member`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.getActiveMember`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.getActiveMember`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-get-active-member)\n\t\t */\n\t\tgetActiveMember: getActiveMember(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/check-slug`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.checkOrganizationSlug`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.checkSlug`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-check-slug)\n\t\t */\n\t\tcheckOrganizationSlug: checkOrganizationSlug(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/add-member`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.addMember`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-add-member)\n\t\t */\n\n\t\taddMember: addMember<O>(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/remove-member`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.removeMember`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.removeMember`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-remove-member)\n\t\t */\n\t\tremoveMember: removeMember(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/update-member-role`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.updateMemberRole`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.updateMemberRole`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-update-member-role)\n\t\t */\n\t\tupdateMemberRole: updateMemberRole(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/leave`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.leaveOrganization`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.leave`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-leave)\n\t\t */\n\t\tleaveOrganization: leaveOrganization(options as O),\n\t\tlistUserInvitations: listUserInvitations(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * GET `/organization/list-members`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.listMembers`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.listMembers`\n\t\t */\n\t\tlistMembers: listMembers(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * GET `/organization/get-active-member-role`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.getActiveMemberRole`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.getActiveMemberRole`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-get-active-member-role)\n\t\t */\n\t\tgetActiveMemberRole: getActiveMemberRole(options as O),\n\t};\n\tconst teamSupport = options?.teams?.enabled;\n\tconst teamEndpoints = {\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/create-team`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.createTeam`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.createTeam`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-create-team)\n\t\t */\n\t\tcreateTeam: createTeam(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * GET `/organization/list-teams`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.listOrganizationTeams`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.listTeams`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-list-teams)\n\t\t */\n\t\tlistOrganizationTeams: listOrganizationTeams(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/remove-team`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.removeTeam`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.removeTeam`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-remove-team)\n\t\t */\n\t\tremoveTeam: removeTeam(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/update-team`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.updateTeam`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.updateTeam`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-method-organization-update-team)\n\t\t */\n\t\tupdateTeam: updateTeam(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/set-active-team`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.setActiveTeam`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.setActiveTeam`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-set-active-team)\n\t\t */\n\t\tsetActiveTeam: setActiveTeam(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * GET `/organization/list-user-teams`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.listUserTeams`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.listUserTeams`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-set-active-team)\n\t\t */\n\t\tlistUserTeams: listUserTeams(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/list-team-members`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.listTeamMembers`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.listTeamMembers`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-set-active-team)\n\t\t */\n\t\tlistTeamMembers: listTeamMembers(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/add-team-member`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.addTeamMember`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.addTeamMember`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-add-team-member)\n\t\t */\n\t\taddTeamMember: addTeamMember(options as O),\n\t\t/**\n\t\t * ### Endpoint\n\t\t *\n\t\t * POST `/organization/remove-team-member`\n\t\t *\n\t\t * ### API Methods\n\t\t *\n\t\t * **server:**\n\t\t * `auth.api.removeTeamMember`\n\t\t *\n\t\t * **client:**\n\t\t * `authClient.organization.removeTeamMember`\n\t\t *\n\t\t * @see [Read our docs to learn more.](https://better-auth.com/docs/plugins/organization#api-remove-team-member)\n\t\t */\n\t\tremoveTeamMember: removeTeamMember(options as O),\n\t};\n\tif (teamSupport) {\n\t\tendpoints = {\n\t\t\t...endpoints,\n\t\t\t...teamEndpoints,\n\t\t};\n\t}\n\n\tconst dynamicAccessControlEndpoints = {\n\t\tcreateOrgRole: createOrgRole(options as O),\n\t\tdeleteOrgRole: deleteOrgRole(options as O),\n\t\tlistOrgRoles: listOrgRoles(options as O),\n\t\tgetOrgRole: getOrgRole(options as O),\n\t\tupdateOrgRole: updateOrgRole(options as O),\n\t};\n\tif (options?.dynamicAccessControl?.enabled) {\n\t\tendpoints = {\n\t\t\t...endpoints,\n\t\t\t...dynamicAccessControlEndpoints,\n\t\t};\n\t}\n\tconst roles = {\n\t\t...defaultRoles,\n\t\t...options?.roles,\n\t};\n\n\t// Build team schema in a way that never introduces undefined values when spreading\n\tconst teamSchema = teamSupport\n\t\t? ({\n\t\t\t\tteam: {\n\t\t\t\t\tmodelName: options?.schema?.team?.modelName,\n\t\t\t\t\tfields: {\n\t\t\t\t\t\tname: {\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\tfieldName: options?.schema?.team?.fields?.name,\n\t\t\t\t\t\t},\n\t\t\t\t\t\torganizationId: {\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\treferences: {\n\t\t\t\t\t\t\t\tmodel: \"organization\",\n\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfieldName: options?.schema?.team?.fields?.organizationId,\n\t\t\t\t\t\t\tindex: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcreatedAt: {\n\t\t\t\t\t\t\ttype: \"date\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\tfieldName: options?.schema?.team?.fields?.createdAt,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tupdatedAt: {\n\t\t\t\t\t\t\ttype: \"date\",\n\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\tfieldName: options?.schema?.team?.fields?.updatedAt,\n\t\t\t\t\t\t\tonUpdate: () => new Date(),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t...(options?.schema?.team?.additionalFields || {}),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tteamMember: {\n\t\t\t\t\tmodelName: options?.schema?.teamMember?.modelName,\n\t\t\t\t\tfields: {\n\t\t\t\t\t\tteamId: {\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\treferences: {\n\t\t\t\t\t\t\t\tmodel: \"team\",\n\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfieldName: options?.schema?.teamMember?.fields?.teamId,\n\t\t\t\t\t\t\tindex: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tuserId: {\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\treferences: {\n\t\t\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfieldName: options?.schema?.teamMember?.fields?.userId,\n\t\t\t\t\t\t\tindex: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcreatedAt: {\n\t\t\t\t\t\t\ttype: \"date\",\n\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\tfieldName: options?.schema?.teamMember?.fields?.createdAt,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t} satisfies BetterAuthPluginDBSchema)\n\t\t: {};\n\n\tconst organizationRoleSchema = options?.dynamicAccessControl?.enabled\n\t\t? ({\n\t\t\t\torganizationRole: {\n\t\t\t\t\tfields: {\n\t\t\t\t\t\torganizationId: {\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\treferences: {\n\t\t\t\t\t\t\t\tmodel: \"organization\",\n\t\t\t\t\t\t\t\tfield: \"id\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tfieldName:\n\t\t\t\t\t\t\t\toptions?.schema?.organizationRole?.fields?.organizationId,\n\t\t\t\t\t\t\tindex: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\trole: {\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\tfieldName: options?.schema?.organizationRole?.fields?.role,\n\t\t\t\t\t\t\tindex: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tpermission: {\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\tfieldName: options?.schema?.organizationRole?.fields?.permission,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcreatedAt: {\n\t\t\t\t\t\t\ttype: \"date\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\tdefaultValue: () => new Date(),\n\t\t\t\t\t\t\tfieldName: options?.schema?.organizationRole?.fields?.createdAt,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tupdatedAt: {\n\t\t\t\t\t\t\ttype: \"date\",\n\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\tfieldName: options?.schema?.organizationRole?.fields?.updatedAt,\n\t\t\t\t\t\t\tonUpdate: () => new Date(),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t...(options?.schema?.organizationRole?.additionalFields || {}),\n\t\t\t\t\t},\n\t\t\t\t\tmodelName: options?.schema?.organizationRole?.modelName,\n\t\t\t\t},\n\t\t\t} satisfies BetterAuthPluginDBSchema)\n\t\t: {};\n\n\tconst schema = {\n\t\t...({\n\t\t\torganization: {\n\t\t\t\tmodelName: options?.schema?.organization?.modelName,\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\tsortable: true,\n\t\t\t\t\t\tfieldName: options?.schema?.organization?.fields?.name,\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\trequired: true,\n\t\t\t\t\t\tunique: true,\n\t\t\t\t\t\tsortable: true,\n\t\t\t\t\t\tfieldName: options?.schema?.organization?.fields?.slug,\n\t\t\t\t\t\tindex: 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\tfieldName: options?.schema?.organization?.fields?.logo,\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\tfieldName: options?.schema?.organization?.fields?.createdAt,\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\tfieldName: options?.schema?.organization?.fields?.metadata,\n\t\t\t\t\t},\n\t\t\t\t\t...(options?.schema?.organization?.additionalFields || {}),\n\t\t\t\t},\n\t\t\t},\n\t\t} satisfies BetterAuthPluginDBSchema),\n\t\t...organizationRoleSchema,\n\t\t...teamSchema,\n\t\t...({\n\t\t\tmember: {\n\t\t\t\tmodelName: options?.schema?.member?.modelName,\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\tfieldName: options?.schema?.member?.fields?.organizationId,\n\t\t\t\t\t\tindex: 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\trequired: true,\n\t\t\t\t\t\tfieldName: options?.schema?.member?.fields?.userId,\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\tindex: 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\tsortable: true,\n\t\t\t\t\t\tdefaultValue: \"member\",\n\t\t\t\t\t\tfieldName: options?.schema?.member?.fields?.role,\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\tfieldName: options?.schema?.member?.fields?.createdAt,\n\t\t\t\t\t},\n\t\t\t\t\t...(options?.schema?.member?.additionalFields || {}),\n\t\t\t\t},\n\t\t\t},\n\t\t\tinvitation: {\n\t\t\t\tmodelName: options?.schema?.invitation?.modelName,\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\tfieldName: options?.schema?.invitation?.fields?.organizationId,\n\t\t\t\t\t\tindex: 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\tsortable: true,\n\t\t\t\t\t\tfieldName: options?.schema?.invitation?.fields?.email,\n\t\t\t\t\t\tindex: 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\tsortable: true,\n\t\t\t\t\t\tfieldName: options?.schema?.invitation?.fields?.role,\n\t\t\t\t\t},\n\t\t\t\t\t...(teamSupport\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tteamId: {\n\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\t\t\tsortable: true,\n\t\t\t\t\t\t\t\t\tfieldName: options?.schema?.invitation?.fields?.teamId,\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\tstatus: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\tsortable: true,\n\t\t\t\t\t\tdefaultValue: \"pending\",\n\t\t\t\t\t\tfieldName: options?.schema?.invitation?.fields?.status,\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\tfieldName: options?.schema?.invitation?.fields?.expiresAt,\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\tfieldName: options?.schema?.invitation?.fields?.createdAt,\n\t\t\t\t\t\tdefaultValue: () => new Date(),\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\tfieldName: options?.schema?.invitation?.fields?.inviterId,\n\t\t\t\t\t\trequired: true,\n\t\t\t\t\t},\n\t\t\t\t\t...(options?.schema?.invitation?.additionalFields || {}),\n\t\t\t\t},\n\t\t\t},\n\t\t} satisfies BetterAuthPluginDBSchema),\n\t};\n\n\t/**\n\t * the orgMiddleware type-asserts an empty object representing org options, roles, and a getSession function.\n\t * This `shimContext` function is used to add those missing properties to the context object.\n\t */\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\treturn {\n\t\tid: \"organization\",\n\t\tendpoints: {\n\t\t\t...(api as OrganizationEndpoints<O>),\n\t\t\thasPermission: createHasPermission(options as O),\n\t\t},\n\t\tschema: {\n\t\t\t...(schema as BetterAuthPluginDBSchema),\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\tfieldName: options?.schema?.session?.fields?.activeOrganizationId,\n\t\t\t\t\t},\n\t\t\t\t\t...(teamSupport\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\tactiveTeamId: {\n\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\t\t\tfieldName: options?.schema?.session?.fields?.activeTeamId,\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} as unknown as O[\"teams\"] extends {\n\t\t\t\t\tenabled: true;\n\t\t\t\t}\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tactiveTeamId: {\n\t\t\t\t\t\t\t\ttype: \"string\";\n\t\t\t\t\t\t\t\trequired: false;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tactiveOrganizationId: {\n\t\t\t\t\t\t\t\ttype: \"string\";\n\t\t\t\t\t\t\t\trequired: false;\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\t\t\tactiveOrganizationId: {\n\t\t\t\t\t\t\t\ttype: \"string\";\n\t\t\t\t\t\t\t\trequired: false;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t$Infer: {\n\t\t\tOrganization: {} as InferOrganization<O>,\n\t\t\tInvitation: {} as InferInvitation<O>,\n\t\t\tMember: {} as InferMember<O>,\n\t\t\tTeam: teamSupport ? ({} as Team) : ({} as any),\n\t\t\tTeamMember: teamSupport ? ({} as TeamMember) : ({} as any),\n\t\t\tActiveOrganization: {} as O[\"teams\"] extends { enabled: true }\n\t\t\t\t? {\n\t\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t\t\tteams: InferTeam<O, false>[];\n\t\t\t\t\t} & InferOrganization<O, false>\n\t\t\t\t: {\n\t\t\t\t\t\tmembers: InferMember<O, false>[];\n\t\t\t\t\t\tinvitations: InferInvitation<O, false>[];\n\t\t\t\t\t} & InferOrganization<O, false>,\n\t\t},\n\t\t$ERROR_CODES: ORGANIZATION_ERROR_CODES,\n\t\toptions: options as NoInfer<O>,\n\t} satisfies BetterAuthPlugin;\n}\n"],"mappings":"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"}