@masheev/better-auth 0.0.0-stage → 1.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (465) hide show
  1. package/LICENSE.md +20 -0
  2. package/README.md +31 -2
  3. package/TYPE-PATCH-NOTICE.md +9 -0
  4. package/TYPE-PATCH-PROVENANCE.json +267 -0
  5. package/dist/_virtual/_rolldown/runtime.mjs +27 -0
  6. package/dist/adapters/drizzle-adapter/index.d.mts +1 -0
  7. package/dist/adapters/drizzle-adapter/index.mjs +2 -0
  8. package/dist/adapters/index.d.mts +26 -0
  9. package/dist/adapters/index.mjs +9 -0
  10. package/dist/adapters/kysely-adapter/index.d.mts +1 -0
  11. package/dist/adapters/kysely-adapter/index.mjs +2 -0
  12. package/dist/adapters/memory-adapter/index.d.mts +1 -0
  13. package/dist/adapters/memory-adapter/index.mjs +2 -0
  14. package/dist/adapters/mongodb-adapter/index.d.mts +1 -0
  15. package/dist/adapters/mongodb-adapter/index.mjs +2 -0
  16. package/dist/adapters/prisma-adapter/index.d.mts +1 -0
  17. package/dist/adapters/prisma-adapter/index.mjs +2 -0
  18. package/dist/api/dispatch.d.mts +34 -0
  19. package/dist/api/dispatch.mjs +275 -0
  20. package/dist/api/index.d.mts +4053 -0
  21. package/dist/api/index.mjs +220 -0
  22. package/dist/api/middlewares/authorization.d.mts +69 -0
  23. package/dist/api/middlewares/authorization.mjs +78 -0
  24. package/dist/api/middlewares/index.d.mts +2 -0
  25. package/dist/api/middlewares/origin-check.d.mts +17 -0
  26. package/dist/api/middlewares/origin-check.mjs +155 -0
  27. package/dist/api/rate-limiter/index.mjs +318 -0
  28. package/dist/api/routes/account.d.mts +413 -0
  29. package/dist/api/routes/account.mjs +619 -0
  30. package/dist/api/routes/callback.d.mts +32 -0
  31. package/dist/api/routes/callback.mjs +261 -0
  32. package/dist/api/routes/email-verification.d.mts +160 -0
  33. package/dist/api/routes/email-verification.mjs +324 -0
  34. package/dist/api/routes/error.d.mts +27 -0
  35. package/dist/api/routes/error.mjs +387 -0
  36. package/dist/api/routes/index.d.mts +12 -0
  37. package/dist/api/routes/ok.d.mts +35 -0
  38. package/dist/api/routes/ok.mjs +27 -0
  39. package/dist/api/routes/password.d.mts +182 -0
  40. package/dist/api/routes/password.mjs +206 -0
  41. package/dist/api/routes/session.d.mts +450 -0
  42. package/dist/api/routes/session.mjs +481 -0
  43. package/dist/api/routes/sign-in.d.mts +186 -0
  44. package/dist/api/routes/sign-in.mjs +368 -0
  45. package/dist/api/routes/sign-out.d.mts +51 -0
  46. package/dist/api/routes/sign-out.mjs +96 -0
  47. package/dist/api/routes/sign-up.d.mts +159 -0
  48. package/dist/api/routes/sign-up.mjs +275 -0
  49. package/dist/api/routes/update-session.d.mts +74 -0
  50. package/dist/api/routes/update-session.mjs +57 -0
  51. package/dist/api/routes/update-user.d.mts +428 -0
  52. package/dist/api/routes/update-user.mjs +522 -0
  53. package/dist/api/state/oauth.d.mts +53 -0
  54. package/dist/api/state/oauth.mjs +38 -0
  55. package/dist/api/state/should-session-refresh.d.mts +12 -0
  56. package/dist/api/state/should-session-refresh.mjs +13 -0
  57. package/dist/api/to-auth-endpoints.mjs +60 -0
  58. package/dist/auth/base.mjs +66 -0
  59. package/dist/auth/full.d.mts +28 -0
  60. package/dist/auth/full.mjs +29 -0
  61. package/dist/auth/minimal.d.mts +10 -0
  62. package/dist/auth/minimal.mjs +11 -0
  63. package/dist/auth/trusted-origins.mjs +106 -0
  64. package/dist/client/broadcast-channel.d.mts +19 -0
  65. package/dist/client/broadcast-channel.mjs +44 -0
  66. package/dist/client/config.d.mts +90 -0
  67. package/dist/client/config.mjs +113 -0
  68. package/dist/client/equality.d.mts +19 -0
  69. package/dist/client/equality.mjs +42 -0
  70. package/dist/client/fetch-plugins.mjs +17 -0
  71. package/dist/client/focus-manager.d.mts +10 -0
  72. package/dist/client/focus-manager.mjs +30 -0
  73. package/dist/client/index.d.mts +35 -0
  74. package/dist/client/index.mjs +22 -0
  75. package/dist/client/lynx/index.d.mts +43 -0
  76. package/dist/client/lynx/index.mjs +22 -0
  77. package/dist/client/lynx/lynx-store.d.mts +46 -0
  78. package/dist/client/lynx/lynx-store.mjs +44 -0
  79. package/dist/client/online-manager.d.mts +11 -0
  80. package/dist/client/online-manager.mjs +33 -0
  81. package/dist/client/parser.d.mts +10 -0
  82. package/dist/client/parser.mjs +70 -0
  83. package/dist/client/path-to-object.d.mts +113 -0
  84. package/dist/client/plugins/index.d.mts +44 -0
  85. package/dist/client/plugins/index.mjs +30 -0
  86. package/dist/client/plugins/infer-plugin.d.mts +16 -0
  87. package/dist/client/plugins/infer-plugin.mjs +11 -0
  88. package/dist/client/proxy.mjs +78 -0
  89. package/dist/client/query.d.mts +23 -0
  90. package/dist/client/query.mjs +124 -0
  91. package/dist/client/react/index.d.mts +44 -0
  92. package/dist/client/react/index.mjs +22 -0
  93. package/dist/client/react/react-store.d.mts +46 -0
  94. package/dist/client/react/react-store.mjs +44 -0
  95. package/dist/client/session-atom.d.mts +11 -0
  96. package/dist/client/session-atom.mjs +178 -0
  97. package/dist/client/session-refresh.d.mts +20 -0
  98. package/dist/client/session-refresh.mjs +131 -0
  99. package/dist/client/solid/index.d.mts +44 -0
  100. package/dist/client/solid/index.mjs +22 -0
  101. package/dist/client/solid/solid-store.mjs +21 -0
  102. package/dist/client/svelte/index.d.mts +44 -0
  103. package/dist/client/svelte/index.mjs +18 -0
  104. package/dist/client/types.d.mts +51 -0
  105. package/dist/client/vanilla.d.mts +42 -0
  106. package/dist/client/vanilla.mjs +18 -0
  107. package/dist/client/vue/index.d.mts +67 -0
  108. package/dist/client/vue/index.mjs +54 -0
  109. package/dist/client/vue/vue-store.mjs +23 -0
  110. package/dist/context/create-context.mjs +235 -0
  111. package/dist/context/helpers.mjs +158 -0
  112. package/dist/context/init-minimal.mjs +17 -0
  113. package/dist/context/init.mjs +19 -0
  114. package/dist/context/secret-utils.mjs +53 -0
  115. package/dist/context/store-capabilities.mjs +12 -0
  116. package/dist/cookies/cache.mjs +33 -0
  117. package/dist/cookies/cookie-utils.d.mts +72 -0
  118. package/dist/cookies/cookie-utils.mjs +203 -0
  119. package/dist/cookies/index.d.mts +124 -0
  120. package/dist/cookies/index.mjs +350 -0
  121. package/dist/cookies/jwt.mjs +44 -0
  122. package/dist/cookies/session-store.d.mts +32 -0
  123. package/dist/cookies/session-store.mjs +183 -0
  124. package/dist/crypto/buffer.d.mts +7 -0
  125. package/dist/crypto/buffer.mjs +16 -0
  126. package/dist/crypto/index.d.mts +32 -0
  127. package/dist/crypto/index.mjs +69 -0
  128. package/dist/crypto/jwt.d.mts +9 -0
  129. package/dist/crypto/jwt.mjs +141 -0
  130. package/dist/crypto/password.d.mts +13 -0
  131. package/dist/crypto/password.mjs +14 -0
  132. package/dist/crypto/random.d.mts +4 -0
  133. package/dist/crypto/random.mjs +5 -0
  134. package/dist/db/adapter-base.d.mts +7 -0
  135. package/dist/db/adapter-base.mjs +25 -0
  136. package/dist/db/adapter-kysely.d.mts +7 -0
  137. package/dist/db/adapter-kysely.mjs +17 -0
  138. package/dist/db/field-converter.d.mts +7 -0
  139. package/dist/db/field-converter.mjs +19 -0
  140. package/dist/db/field.d.mts +41 -0
  141. package/dist/db/get-migration.d.mts +56 -0
  142. package/dist/db/get-migration.mjs +685 -0
  143. package/dist/db/get-schema.d.mts +13 -0
  144. package/dist/db/get-schema.mjs +39 -0
  145. package/dist/db/index.d.mts +10 -0
  146. package/dist/db/index.mjs +35 -0
  147. package/dist/db/internal-adapter.d.mts +14 -0
  148. package/dist/db/internal-adapter.mjs +951 -0
  149. package/dist/db/revoke-unproven-account-access.d.mts +21 -0
  150. package/dist/db/revoke-unproven-account-access.mjs +58 -0
  151. package/dist/db/schema.d.mts +62 -0
  152. package/dist/db/schema.mjs +161 -0
  153. package/dist/db/to-zod.d.mts +35 -0
  154. package/dist/db/to-zod.mjs +23 -0
  155. package/dist/db/verification-token-storage.mjs +25 -0
  156. package/dist/db/with-hooks.d.mts +37 -0
  157. package/dist/db/with-hooks.mjs +255 -0
  158. package/dist/index.d.mts +30 -0
  159. package/dist/index.mjs +17 -0
  160. package/dist/integrations/cookie-plugin-guard.mjs +18 -0
  161. package/dist/integrations/next-js.d.mts +29 -0
  162. package/dist/integrations/next-js.mjs +105 -0
  163. package/dist/integrations/node.d.mts +11 -0
  164. package/dist/integrations/node.mjs +13 -0
  165. package/dist/integrations/solid-start.d.mts +22 -0
  166. package/dist/integrations/solid-start.mjs +15 -0
  167. package/dist/integrations/svelte-kit.d.mts +38 -0
  168. package/dist/integrations/svelte-kit.mjs +57 -0
  169. package/dist/integrations/tanstack-start-solid.d.mts +33 -0
  170. package/dist/integrations/tanstack-start-solid.mjs +57 -0
  171. package/dist/integrations/tanstack-start.d.mts +33 -0
  172. package/dist/integrations/tanstack-start.mjs +57 -0
  173. package/dist/oauth2/account-key.mjs +43 -0
  174. package/dist/oauth2/errors.mjs +49 -0
  175. package/dist/oauth2/index.d.mts +5 -0
  176. package/dist/oauth2/index.mjs +5 -0
  177. package/dist/oauth2/link-account.d.mts +96 -0
  178. package/dist/oauth2/link-account.mjs +329 -0
  179. package/dist/oauth2/state.d.mts +54 -0
  180. package/dist/oauth2/state.mjs +67 -0
  181. package/dist/oauth2/utils.d.mts +11 -0
  182. package/dist/oauth2/utils.mjs +33 -0
  183. package/dist/package.mjs +4 -0
  184. package/dist/plugins/access/access.d.mts +17 -0
  185. package/dist/plugins/access/access.mjs +78 -0
  186. package/dist/plugins/access/index.d.mts +3 -0
  187. package/dist/plugins/access/index.mjs +2 -0
  188. package/dist/plugins/access/types.d.mts +24 -0
  189. package/dist/plugins/additional-fields/client.d.mts +100 -0
  190. package/dist/plugins/additional-fields/client.mjs +11 -0
  191. package/dist/plugins/admin/access/index.d.mts +2 -0
  192. package/dist/plugins/admin/access/index.mjs +2 -0
  193. package/dist/plugins/admin/access/statement.d.mts +51 -0
  194. package/dist/plugins/admin/access/statement.mjs +52 -0
  195. package/dist/plugins/admin/admin.d.mts +911 -0
  196. package/dist/plugins/admin/admin.mjs +89 -0
  197. package/dist/plugins/admin/client.d.mts +81 -0
  198. package/dist/plugins/admin/client.mjs +39 -0
  199. package/dist/plugins/admin/error-codes.d.mts +30 -0
  200. package/dist/plugins/admin/error-codes.mjs +29 -0
  201. package/dist/plugins/admin/has-permission.mjs +12 -0
  202. package/dist/plugins/admin/index.d.mts +3 -0
  203. package/dist/plugins/admin/index.mjs +2 -0
  204. package/dist/plugins/admin/routes.mjs +919 -0
  205. package/dist/plugins/admin/schema.d.mts +40 -0
  206. package/dist/plugins/admin/schema.mjs +33 -0
  207. package/dist/plugins/admin/types.d.mts +88 -0
  208. package/dist/plugins/anonymous/client.d.mts +32 -0
  209. package/dist/plugins/anonymous/client.mjs +21 -0
  210. package/dist/plugins/anonymous/error-codes.d.mts +15 -0
  211. package/dist/plugins/anonymous/error-codes.mjs +14 -0
  212. package/dist/plugins/anonymous/index.d.mts +175 -0
  213. package/dist/plugins/anonymous/index.mjs +219 -0
  214. package/dist/plugins/anonymous/schema.d.mts +15 -0
  215. package/dist/plugins/anonymous/schema.mjs +9 -0
  216. package/dist/plugins/anonymous/types.d.mts +65 -0
  217. package/dist/plugins/bearer/index.d.mts +45 -0
  218. package/dist/plugins/bearer/index.mjs +74 -0
  219. package/dist/plugins/captcha/constants.d.mts +9 -0
  220. package/dist/plugins/captcha/constants.mjs +27 -0
  221. package/dist/plugins/captcha/error-codes.mjs +13 -0
  222. package/dist/plugins/captcha/index.d.mts +27 -0
  223. package/dist/plugins/captcha/index.mjs +79 -0
  224. package/dist/plugins/captcha/types.d.mts +52 -0
  225. package/dist/plugins/captcha/utils.mjs +9 -0
  226. package/dist/plugins/captcha/verify-handlers/captchafox.mjs +27 -0
  227. package/dist/plugins/captcha/verify-handlers/cloudflare-turnstile.mjs +47 -0
  228. package/dist/plugins/captcha/verify-handlers/google-recaptcha.mjs +32 -0
  229. package/dist/plugins/captcha/verify-handlers/h-captcha.mjs +27 -0
  230. package/dist/plugins/custom-session/client.d.mts +17 -0
  231. package/dist/plugins/custom-session/client.mjs +7 -0
  232. package/dist/plugins/custom-session/index.d.mts +73 -0
  233. package/dist/plugins/custom-session/index.mjs +65 -0
  234. package/dist/plugins/device-authorization/client.d.mts +17 -0
  235. package/dist/plugins/device-authorization/client.mjs +18 -0
  236. package/dist/plugins/device-authorization/error-codes.mjs +19 -0
  237. package/dist/plugins/device-authorization/index.d.mts +558 -0
  238. package/dist/plugins/device-authorization/index.mjs +87 -0
  239. package/dist/plugins/device-authorization/routes.d.mts +32 -0
  240. package/dist/plugins/device-authorization/routes.mjs +725 -0
  241. package/dist/plugins/device-authorization/schema.d.mts +18 -0
  242. package/dist/plugins/device-authorization/schema.mjs +63 -0
  243. package/dist/plugins/email-otp/client.d.mts +21 -0
  244. package/dist/plugins/email-otp/client.mjs +17 -0
  245. package/dist/plugins/email-otp/error-codes.d.mts +10 -0
  246. package/dist/plugins/email-otp/error-codes.mjs +9 -0
  247. package/dist/plugins/email-otp/index.d.mts +551 -0
  248. package/dist/plugins/email-otp/index.mjs +145 -0
  249. package/dist/plugins/email-otp/otp-token.mjs +55 -0
  250. package/dist/plugins/email-otp/routes.mjs +784 -0
  251. package/dist/plugins/email-otp/types.d.mts +109 -0
  252. package/dist/plugins/email-otp/utils.mjs +17 -0
  253. package/dist/plugins/generic-oauth/error-codes.mjs +8 -0
  254. package/dist/plugins/generic-oauth/index.d.mts +52 -0
  255. package/dist/plugins/generic-oauth/index.mjs +279 -0
  256. package/dist/plugins/generic-oauth/providers/auth0.d.mts +36 -0
  257. package/dist/plugins/generic-oauth/providers/auth0.mjs +49 -0
  258. package/dist/plugins/generic-oauth/providers/gumroad.d.mts +31 -0
  259. package/dist/plugins/generic-oauth/providers/gumroad.mjs +62 -0
  260. package/dist/plugins/generic-oauth/providers/hubspot.d.mts +36 -0
  261. package/dist/plugins/generic-oauth/providers/hubspot.mjs +62 -0
  262. package/dist/plugins/generic-oauth/providers/index.d.mts +10 -0
  263. package/dist/plugins/generic-oauth/providers/keycloak.d.mts +36 -0
  264. package/dist/plugins/generic-oauth/providers/keycloak.mjs +47 -0
  265. package/dist/plugins/generic-oauth/providers/line.d.mts +54 -0
  266. package/dist/plugins/generic-oauth/providers/line.mjs +93 -0
  267. package/dist/plugins/generic-oauth/providers/microsoft-entra-id.d.mts +39 -0
  268. package/dist/plugins/generic-oauth/providers/microsoft-entra-id.mjs +104 -0
  269. package/dist/plugins/generic-oauth/providers/okta.d.mts +36 -0
  270. package/dist/plugins/generic-oauth/providers/okta.mjs +47 -0
  271. package/dist/plugins/generic-oauth/providers/patreon.d.mts +29 -0
  272. package/dist/plugins/generic-oauth/providers/patreon.mjs +61 -0
  273. package/dist/plugins/generic-oauth/providers/slack.d.mts +29 -0
  274. package/dist/plugins/generic-oauth/providers/slack.mjs +63 -0
  275. package/dist/plugins/generic-oauth/providers/yandex.d.mts +29 -0
  276. package/dist/plugins/generic-oauth/providers/yandex.mjs +67 -0
  277. package/dist/plugins/generic-oauth/types.d.mts +268 -0
  278. package/dist/plugins/haveibeenpwned/index.d.mts +63 -0
  279. package/dist/plugins/haveibeenpwned/index.mjs +81 -0
  280. package/dist/plugins/index.d.mts +69 -0
  281. package/dist/plugins/index.mjs +49 -0
  282. package/dist/plugins/jwt/adapter.mjs +68 -0
  283. package/dist/plugins/jwt/client.d.mts +41 -0
  284. package/dist/plugins/jwt/client.mjs +19 -0
  285. package/dist/plugins/jwt/cookie-cache.mjs +77 -0
  286. package/dist/plugins/jwt/index.d.mts +246 -0
  287. package/dist/plugins/jwt/index.mjs +214 -0
  288. package/dist/plugins/jwt/schema.d.mts +33 -0
  289. package/dist/plugins/jwt/schema.mjs +29 -0
  290. package/dist/plugins/jwt/sign.d.mts +128 -0
  291. package/dist/plugins/jwt/sign.mjs +130 -0
  292. package/dist/plugins/jwt/types.d.mts +256 -0
  293. package/dist/plugins/jwt/utils.d.mts +41 -0
  294. package/dist/plugins/jwt/utils.mjs +64 -0
  295. package/dist/plugins/jwt/verify.d.mts +11 -0
  296. package/dist/plugins/jwt/verify.mjs +45 -0
  297. package/dist/plugins/last-login-method/client.d.mts +48 -0
  298. package/dist/plugins/last-login-method/client.mjs +48 -0
  299. package/dist/plugins/last-login-method/index.d.mts +127 -0
  300. package/dist/plugins/last-login-method/index.mjs +98 -0
  301. package/dist/plugins/magic-link/client.d.mts +10 -0
  302. package/dist/plugins/magic-link/client.mjs +11 -0
  303. package/dist/plugins/magic-link/index.d.mts +213 -0
  304. package/dist/plugins/magic-link/index.mjs +208 -0
  305. package/dist/plugins/magic-link/utils.mjs +9 -0
  306. package/dist/plugins/multi-session/client.d.mts +19 -0
  307. package/dist/plugins/multi-session/client.mjs +19 -0
  308. package/dist/plugins/multi-session/error-codes.d.mts +8 -0
  309. package/dist/plugins/multi-session/error-codes.mjs +5 -0
  310. package/dist/plugins/multi-session/index.d.mts +212 -0
  311. package/dist/plugins/multi-session/index.mjs +217 -0
  312. package/dist/plugins/oauth-popup/client.d.mts +82 -0
  313. package/dist/plugins/oauth-popup/client.mjs +203 -0
  314. package/dist/plugins/oauth-popup/constants.d.mts +11 -0
  315. package/dist/plugins/oauth-popup/constants.mjs +11 -0
  316. package/dist/plugins/oauth-popup/error-codes.d.mts +11 -0
  317. package/dist/plugins/oauth-popup/error-codes.mjs +10 -0
  318. package/dist/plugins/oauth-popup/index.d.mts +67 -0
  319. package/dist/plugins/oauth-popup/index.mjs +232 -0
  320. package/dist/plugins/oauth-popup/types.d.mts +30 -0
  321. package/dist/plugins/oauth-proxy/index.d.mts +130 -0
  322. package/dist/plugins/oauth-proxy/index.mjs +407 -0
  323. package/dist/plugins/oauth-proxy/utils.mjs +55 -0
  324. package/dist/plugins/one-tap/client.d.mts +174 -0
  325. package/dist/plugins/one-tap/client.mjs +208 -0
  326. package/dist/plugins/one-tap/index.d.mts +82 -0
  327. package/dist/plugins/one-tap/index.mjs +100 -0
  328. package/dist/plugins/one-time-token/client.d.mts +10 -0
  329. package/dist/plugins/one-time-token/client.mjs +11 -0
  330. package/dist/plugins/one-time-token/index.d.mts +132 -0
  331. package/dist/plugins/one-time-token/index.mjs +107 -0
  332. package/dist/plugins/one-time-token/utils.mjs +9 -0
  333. package/dist/plugins/open-api/generator.d.mts +126 -0
  334. package/dist/plugins/open-api/generator.mjs +557 -0
  335. package/dist/plugins/open-api/index.d.mts +97 -0
  336. package/dist/plugins/open-api/index.mjs +65 -0
  337. package/dist/plugins/open-api/logo.mjs +13 -0
  338. package/dist/plugins/organization/access/index.d.mts +2 -0
  339. package/dist/plugins/organization/access/index.mjs +2 -0
  340. package/dist/plugins/organization/access/statement.d.mts +113 -0
  341. package/dist/plugins/organization/access/statement.mjs +77 -0
  342. package/dist/plugins/organization/adapter.d.mts +815 -0
  343. package/dist/plugins/organization/adapter.mjs +813 -0
  344. package/dist/plugins/organization/call.mjs +15 -0
  345. package/dist/plugins/organization/client.d.mts +375 -0
  346. package/dist/plugins/organization/client.mjs +104 -0
  347. package/dist/plugins/organization/error-codes.d.mts +66 -0
  348. package/dist/plugins/organization/error-codes.mjs +65 -0
  349. package/dist/plugins/organization/has-permission.d.mts +17 -0
  350. package/dist/plugins/organization/has-permission.mjs +34 -0
  351. package/dist/plugins/organization/index.d.mts +6 -0
  352. package/dist/plugins/organization/index.mjs +4 -0
  353. package/dist/plugins/organization/organization.d.mts +420 -0
  354. package/dist/plugins/organization/organization.mjs +886 -0
  355. package/dist/plugins/organization/permission.d.mts +15 -0
  356. package/dist/plugins/organization/permission.mjs +14 -0
  357. package/dist/plugins/organization/routes/crud-access-control.d.mts +511 -0
  358. package/dist/plugins/organization/routes/crud-access-control.mjs +674 -0
  359. package/dist/plugins/organization/routes/crud-invites.d.mts +1154 -0
  360. package/dist/plugins/organization/routes/crud-invites.mjs +602 -0
  361. package/dist/plugins/organization/routes/crud-members.d.mts +1057 -0
  362. package/dist/plugins/organization/routes/crud-members.mjs +518 -0
  363. package/dist/plugins/organization/routes/crud-org.d.mts +918 -0
  364. package/dist/plugins/organization/routes/crud-org.mjs +455 -0
  365. package/dist/plugins/organization/routes/crud-team.d.mts +1238 -0
  366. package/dist/plugins/organization/routes/crud-team.mjs +766 -0
  367. package/dist/plugins/organization/schema.d.mts +390 -0
  368. package/dist/plugins/organization/schema.mjs +65 -0
  369. package/dist/plugins/organization/types.d.mts +691 -0
  370. package/dist/plugins/phone-number/client.d.mts +31 -0
  371. package/dist/plugins/phone-number/client.mjs +19 -0
  372. package/dist/plugins/phone-number/error-codes.d.mts +19 -0
  373. package/dist/plugins/phone-number/error-codes.mjs +18 -0
  374. package/dist/plugins/phone-number/index.d.mts +360 -0
  375. package/dist/plugins/phone-number/index.mjs +57 -0
  376. package/dist/plugins/phone-number/routes.mjs +529 -0
  377. package/dist/plugins/phone-number/schema.d.mts +22 -0
  378. package/dist/plugins/phone-number/schema.mjs +18 -0
  379. package/dist/plugins/phone-number/types.d.mts +116 -0
  380. package/dist/plugins/siwe/client.d.mts +14 -0
  381. package/dist/plugins/siwe/client.mjs +15 -0
  382. package/dist/plugins/siwe/index.d.mts +62 -0
  383. package/dist/plugins/siwe/index.mjs +272 -0
  384. package/dist/plugins/siwe/parse-message.mjs +60 -0
  385. package/dist/plugins/siwe/schema.d.mts +35 -0
  386. package/dist/plugins/siwe/schema.mjs +30 -0
  387. package/dist/plugins/siwe/types.d.mts +43 -0
  388. package/dist/plugins/test-utils/auth-helpers.mjs +33 -0
  389. package/dist/plugins/test-utils/cookie-builder.mjs +55 -0
  390. package/dist/plugins/test-utils/db-helpers.mjs +65 -0
  391. package/dist/plugins/test-utils/factories.mjs +38 -0
  392. package/dist/plugins/test-utils/index.d.mts +73 -0
  393. package/dist/plugins/test-utils/index.mjs +97 -0
  394. package/dist/plugins/test-utils/otp-sink.mjs +21 -0
  395. package/dist/plugins/test-utils/types.d.mts +51 -0
  396. package/dist/plugins/two-factor/backup-codes/index.d.mts +291 -0
  397. package/dist/plugins/two-factor/backup-codes/index.mjs +341 -0
  398. package/dist/plugins/two-factor/client.d.mts +76 -0
  399. package/dist/plugins/two-factor/client.mjs +41 -0
  400. package/dist/plugins/two-factor/constant.mjs +6 -0
  401. package/dist/plugins/two-factor/error-code.d.mts +20 -0
  402. package/dist/plugins/two-factor/error-code.mjs +19 -0
  403. package/dist/plugins/two-factor/index.d.mts +720 -0
  404. package/dist/plugins/two-factor/index.mjs +349 -0
  405. package/dist/plugins/two-factor/otp/index.d.mts +216 -0
  406. package/dist/plugins/two-factor/otp/index.mjs +252 -0
  407. package/dist/plugins/two-factor/schema.d.mts +59 -0
  408. package/dist/plugins/two-factor/schema.mjs +53 -0
  409. package/dist/plugins/two-factor/totp/index.d.mts +219 -0
  410. package/dist/plugins/two-factor/totp/index.mjs +230 -0
  411. package/dist/plugins/two-factor/types.d.mts +111 -0
  412. package/dist/plugins/two-factor/utils.mjs +9 -0
  413. package/dist/plugins/two-factor/verify-two-factor.mjs +205 -0
  414. package/dist/plugins/username/client.d.mts +38 -0
  415. package/dist/plugins/username/client.mjs +17 -0
  416. package/dist/plugins/username/error-codes.d.mts +16 -0
  417. package/dist/plugins/username/error-codes.mjs +15 -0
  418. package/dist/plugins/username/index.d.mts +326 -0
  419. package/dist/plugins/username/index.mjs +312 -0
  420. package/dist/plugins/username/schema.d.mts +50 -0
  421. package/dist/plugins/username/schema.mjs +25 -0
  422. package/dist/social-providers/index.d.mts +1 -0
  423. package/dist/social-providers/index.mjs +2 -0
  424. package/dist/state.d.mts +48 -0
  425. package/dist/state.mjs +149 -0
  426. package/dist/test-utils/headers.d.mts +8 -0
  427. package/dist/test-utils/headers.mjs +17 -0
  428. package/dist/test-utils/http-test-instance.d.mts +413 -0
  429. package/dist/test-utils/http-test-instance.mjs +107 -0
  430. package/dist/test-utils/index.d.mts +4 -0
  431. package/dist/test-utils/index.mjs +4 -0
  432. package/dist/test-utils/test-instance.d.mts +56 -0
  433. package/dist/test-utils/test-instance.mjs +242 -0
  434. package/dist/types/adapter.d.mts +2 -0
  435. package/dist/types/api.d.mts +28 -0
  436. package/dist/types/auth.d.mts +32 -0
  437. package/dist/types/helper.d.mts +26 -0
  438. package/dist/types/index.d.mts +10 -0
  439. package/dist/types/index.mjs +1 -0
  440. package/dist/types/models.d.mts +10 -0
  441. package/dist/types/plugins.d.mts +19 -0
  442. package/dist/utils/boolean.mjs +6 -0
  443. package/dist/utils/constants.mjs +4 -0
  444. package/dist/utils/date.mjs +6 -0
  445. package/dist/utils/hashing.mjs +18 -0
  446. package/dist/utils/hide-metadata.d.mts +6 -0
  447. package/dist/utils/hide-metadata.mjs +4 -0
  448. package/dist/utils/index.d.mts +4 -0
  449. package/dist/utils/is-api-error.d.mts +2 -0
  450. package/dist/utils/is-api-error.mjs +2 -0
  451. package/dist/utils/is-atom.mjs +6 -0
  452. package/dist/utils/is-promise.mjs +6 -0
  453. package/dist/utils/middleware-response.mjs +7 -0
  454. package/dist/utils/password.mjs +32 -0
  455. package/dist/utils/plugin-helper.mjs +14 -0
  456. package/dist/utils/request.mjs +23 -0
  457. package/dist/utils/shim.mjs +22 -0
  458. package/dist/utils/time.d.mts +48 -0
  459. package/dist/utils/time.mjs +98 -0
  460. package/dist/utils/url.d.mts +78 -0
  461. package/dist/utils/url.mjs +238 -0
  462. package/dist/utils/validate-user-info.mjs +44 -0
  463. package/dist/utils/wildcard.mjs +106 -0
  464. package/dist/version.mjs +5 -0
  465. package/package.json +595 -3
@@ -0,0 +1,602 @@
1
+ import { getDate } from "../../../utils/date.mjs";
2
+ import { setSessionCookie } from "../../../cookies/index.mjs";
3
+ import { toZodSchema } from "../../../db/to-zod.mjs";
4
+ import { getSessionFromCtx } from "../../../api/routes/session.mjs";
5
+ import { defaultRoles } from "../access/statement.mjs";
6
+ import { ORGANIZATION_ERROR_CODES } from "../error-codes.mjs";
7
+ import { getOrgAdapter } from "../adapter.mjs";
8
+ import { orgMiddleware, orgSessionMiddleware } from "../call.mjs";
9
+ import { hasPermission } from "../has-permission.mjs";
10
+ import { parseRoles } from "../organization.mjs";
11
+ import { runWithTransaction } from "@better-auth/core/context";
12
+ import { APIError, BASE_ERROR_CODES } from "@better-auth/core/error";
13
+ import { createAuthEndpoint } from "@better-auth/core/api";
14
+ import * as z from "zod";
15
+ //#region src/plugins/organization/routes/crud-invites.ts
16
+ const baseInvitationSchema = z.object({
17
+ email: z.string().meta({ description: "The email address of the user to invite" }),
18
+ role: z.union([z.string().meta({ description: "The role to assign to the user" }), z.array(z.string().meta({ description: "The roles to assign to the user" }))]).meta({ description: "The role(s) to assign to the user. It can be `admin`, `member`, owner. Eg: \"member\"" }),
19
+ organizationId: z.string().meta({ description: "The organization ID to invite the user to" }).optional(),
20
+ resend: z.boolean().meta({ description: "Resend the invitation email, if the user is already invited. Eg: true" }).optional(),
21
+ teamId: z.union([z.string().meta({ description: "The team ID to invite the user to" }).optional(), z.array(z.string()).meta({ description: "The team IDs to invite the user to" }).optional()])
22
+ });
23
+ const getAdvancedGenerateId = (advancedOptions) => {
24
+ if (typeof advancedOptions !== "object" || advancedOptions === null) return;
25
+ const generateId = advancedOptions.generateId;
26
+ if (typeof generateId !== "function") return;
27
+ return generateId;
28
+ };
29
+ const hasBuiltInOpaqueInvitationIdGeneration = ({ advancedGenerateId, databaseGenerateId }) => advancedGenerateId === void 0 && (databaseGenerateId === void 0 || databaseGenerateId === "uuid");
30
+ const shouldRequireVerifiedEmailForInvitationIdAction = ({ organizationOptions, advancedGenerateId, databaseGenerateId }) => {
31
+ if (organizationOptions.requireEmailVerificationOnInvitation !== void 0) return organizationOptions.requireEmailVerificationOnInvitation;
32
+ return !hasBuiltInOpaqueInvitationIdGeneration({
33
+ advancedGenerateId,
34
+ databaseGenerateId
35
+ });
36
+ };
37
+ const createInvitation = (option) => {
38
+ const additionalFieldsSchema = toZodSchema({
39
+ fields: option?.schema?.invitation?.additionalFields || {},
40
+ isClientSide: true
41
+ });
42
+ return createAuthEndpoint("/organization/invite-member", {
43
+ method: "POST",
44
+ requireHeaders: true,
45
+ use: [orgMiddleware, orgSessionMiddleware],
46
+ body: z.object({
47
+ ...baseInvitationSchema.shape,
48
+ ...additionalFieldsSchema.shape
49
+ }),
50
+ metadata: {
51
+ $Infer: { body: {} },
52
+ openapi: {
53
+ operationId: "createOrganizationInvitation",
54
+ description: "Create an invitation to an organization",
55
+ responses: { "200": {
56
+ description: "Success",
57
+ content: { "application/json": { schema: {
58
+ type: "object",
59
+ properties: {
60
+ id: { type: "string" },
61
+ email: { type: "string" },
62
+ role: { type: "string" },
63
+ organizationId: { type: "string" },
64
+ inviterId: { type: "string" },
65
+ status: { type: "string" },
66
+ expiresAt: { type: "string" },
67
+ createdAt: { type: "string" }
68
+ },
69
+ required: [
70
+ "id",
71
+ "email",
72
+ "role",
73
+ "organizationId",
74
+ "inviterId",
75
+ "status",
76
+ "expiresAt",
77
+ "createdAt"
78
+ ]
79
+ } } }
80
+ } }
81
+ }
82
+ }
83
+ }, async (ctx) => {
84
+ const session = ctx.context.session;
85
+ const organizationId = ctx.body.organizationId || session.session.activeOrganizationId;
86
+ if (!organizationId) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND);
87
+ const email = ctx.body.email.toLowerCase();
88
+ if (!z.email().safeParse(email).success) throw APIError.from("BAD_REQUEST", BASE_ERROR_CODES.INVALID_EMAIL);
89
+ const adapter = getOrgAdapter(ctx.context, option);
90
+ const member = await adapter.findMemberByOrgId({
91
+ userId: session.user.id,
92
+ organizationId
93
+ });
94
+ if (!member) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
95
+ if (!await hasPermission({
96
+ role: member.role,
97
+ options: ctx.context.orgOptions,
98
+ permissions: { invitation: ["create"] },
99
+ organizationId
100
+ }, ctx)) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_INVITE_USERS_TO_THIS_ORGANIZATION);
101
+ const creatorRole = ctx.context.orgOptions.creatorRole || "owner";
102
+ const roles = parseRoles(ctx.body.role);
103
+ const rolesArray = roles.split(",").map((r) => r.trim()).filter(Boolean);
104
+ const defaults = Object.keys(defaultRoles);
105
+ const customRoles = Object.keys(ctx.context.orgOptions.roles || {});
106
+ const validStaticRoles = new Set([...defaults, ...customRoles]);
107
+ const unknownRoles = rolesArray.filter((role) => !validStaticRoles.has(role));
108
+ if (unknownRoles.length > 0) if (ctx.context.orgOptions.dynamicAccessControl?.enabled) {
109
+ const foundRoleNames = (await ctx.context.adapter.findMany({
110
+ model: "organizationRole",
111
+ where: [{
112
+ field: "organizationId",
113
+ value: organizationId
114
+ }, {
115
+ field: "role",
116
+ value: unknownRoles,
117
+ operator: "in"
118
+ }]
119
+ })).map((r) => r.role);
120
+ const stillInvalid = unknownRoles.filter((r) => !foundRoleNames.includes(r));
121
+ if (stillInvalid.length > 0) throw new APIError("BAD_REQUEST", { message: `${ORGANIZATION_ERROR_CODES.ROLE_NOT_FOUND}: ${stillInvalid.join(", ")}` });
122
+ } else throw new APIError("BAD_REQUEST", { message: `${ORGANIZATION_ERROR_CODES.ROLE_NOT_FOUND}: ${unknownRoles.join(", ")}` });
123
+ if (!member.role.split(",").map((r) => r.trim()).includes(creatorRole) && roles.split(",").includes(creatorRole)) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_INVITE_USER_WITH_THIS_ROLE);
124
+ if (await adapter.findMemberByEmail({
125
+ email,
126
+ organizationId
127
+ })) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.USER_IS_ALREADY_A_MEMBER_OF_THIS_ORGANIZATION);
128
+ const alreadyInvited = await adapter.findPendingInvitation({
129
+ email,
130
+ organizationId
131
+ });
132
+ if (alreadyInvited.length && !ctx.body.resend && !ctx.context.orgOptions.cancelPendingInvitationsOnReInvite) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.USER_IS_ALREADY_INVITED_TO_THIS_ORGANIZATION);
133
+ const organization = await adapter.findOrganizationById(organizationId);
134
+ if (!organization) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND);
135
+ if (alreadyInvited.length && ctx.body.resend) {
136
+ const existingInvitation = alreadyInvited[0];
137
+ const newExpiresAt = getDate(ctx.context.orgOptions.invitationExpiresIn || 3600 * 48, "sec");
138
+ await ctx.context.adapter.update({
139
+ model: "invitation",
140
+ where: [{
141
+ field: "id",
142
+ value: existingInvitation.id
143
+ }],
144
+ update: { expiresAt: newExpiresAt }
145
+ });
146
+ const updatedInvitation = {
147
+ ...existingInvitation,
148
+ expiresAt: newExpiresAt
149
+ };
150
+ if (ctx.context.orgOptions.sendInvitationEmail) await ctx.context.runInBackgroundOrAwait(ctx.context.orgOptions.sendInvitationEmail({
151
+ id: updatedInvitation.id,
152
+ role: updatedInvitation.role,
153
+ email: updatedInvitation.email.toLowerCase(),
154
+ organization,
155
+ inviter: {
156
+ ...member,
157
+ user: session.user
158
+ },
159
+ invitation: updatedInvitation
160
+ }, ctx.request));
161
+ return ctx.json(updatedInvitation);
162
+ }
163
+ if (alreadyInvited.length && ctx.context.orgOptions.cancelPendingInvitationsOnReInvite) await adapter.updateInvitation({
164
+ invitationId: alreadyInvited[0].id,
165
+ status: "canceled"
166
+ });
167
+ const invitationLimit = typeof ctx.context.orgOptions.invitationLimit === "function" ? await ctx.context.orgOptions.invitationLimit({
168
+ user: session.user,
169
+ organization,
170
+ member
171
+ }, ctx.context) : ctx.context.orgOptions.invitationLimit ?? 100;
172
+ if ((await adapter.findPendingInvitations({ organizationId })).length >= invitationLimit) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.INVITATION_LIMIT_REACHED);
173
+ if (ctx.context.orgOptions.teams?.enabled && "teamId" in ctx.body && ctx.body.teamId) {
174
+ const requestedTeamIds = typeof ctx.body.teamId === "string" ? [ctx.body.teamId] : ctx.body.teamId;
175
+ if (requestedTeamIds.some((id) => id.includes(","))) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.INVALID_TEAM_ID);
176
+ for (const teamId of requestedTeamIds) if (!await adapter.findTeamById({
177
+ teamId,
178
+ organizationId
179
+ })) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.TEAM_NOT_FOUND);
180
+ }
181
+ if (ctx.context.orgOptions.teams && ctx.context.orgOptions.teams.enabled && typeof ctx.context.orgOptions.teams.maximumMembersPerTeam !== "undefined" && "teamId" in ctx.body && ctx.body.teamId) {
182
+ const teamIds = typeof ctx.body.teamId === "string" ? [ctx.body.teamId] : ctx.body.teamId;
183
+ for (const teamId of teamIds) {
184
+ const team = await adapter.findTeamById({
185
+ teamId,
186
+ organizationId,
187
+ includeTeamMembers: true
188
+ });
189
+ if (!team) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.TEAM_NOT_FOUND);
190
+ const maximumMembersPerTeam = typeof ctx.context.orgOptions.teams.maximumMembersPerTeam === "function" ? await ctx.context.orgOptions.teams.maximumMembersPerTeam({
191
+ teamId,
192
+ session,
193
+ organizationId
194
+ }) : ctx.context.orgOptions.teams.maximumMembersPerTeam;
195
+ if (team.members.length >= maximumMembersPerTeam) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.TEAM_MEMBER_LIMIT_REACHED);
196
+ }
197
+ }
198
+ const teamIds = "teamId" in ctx.body ? typeof ctx.body.teamId === "string" ? [ctx.body.teamId] : ctx.body.teamId ?? [] : [];
199
+ const { email: _, role: __, organizationId: ___, resend: ____, ...additionalFields } = ctx.body;
200
+ let invitationData = {
201
+ role: roles,
202
+ email,
203
+ organizationId,
204
+ teamIds,
205
+ ...additionalFields ? additionalFields : {}
206
+ };
207
+ if (option?.organizationHooks?.beforeCreateInvitation) {
208
+ const response = await option?.organizationHooks.beforeCreateInvitation({
209
+ invitation: {
210
+ ...invitationData,
211
+ inviterId: session.user.id,
212
+ teamId: teamIds.length > 0 ? teamIds[0] : void 0
213
+ },
214
+ inviter: session.user,
215
+ organization
216
+ });
217
+ if (response && typeof response === "object" && "data" in response) invitationData = {
218
+ ...invitationData,
219
+ ...response.data
220
+ };
221
+ }
222
+ const invitation = await adapter.createInvitation({
223
+ invitation: invitationData,
224
+ user: session.user
225
+ });
226
+ if (ctx.context.orgOptions.sendInvitationEmail) await ctx.context.runInBackgroundOrAwait(ctx.context.orgOptions.sendInvitationEmail({
227
+ id: invitation.id,
228
+ role: invitation.role,
229
+ email: invitation.email.toLowerCase(),
230
+ organization,
231
+ inviter: {
232
+ ...member,
233
+ user: session.user
234
+ },
235
+ invitation
236
+ }, ctx.request));
237
+ if (option?.organizationHooks?.afterCreateInvitation) await option?.organizationHooks.afterCreateInvitation({
238
+ invitation,
239
+ inviter: session.user,
240
+ organization
241
+ });
242
+ return ctx.json(invitation);
243
+ });
244
+ };
245
+ const acceptInvitationBodySchema = z.object({ invitationId: z.string().meta({ description: "The ID of the invitation to accept" }) });
246
+ const acceptInvitation = (options) => createAuthEndpoint("/organization/accept-invitation", {
247
+ method: "POST",
248
+ body: acceptInvitationBodySchema,
249
+ requireHeaders: true,
250
+ use: [orgMiddleware, orgSessionMiddleware],
251
+ metadata: { openapi: {
252
+ description: "Accept an invitation to an organization",
253
+ responses: { "200": {
254
+ description: "Success",
255
+ content: { "application/json": { schema: {
256
+ type: "object",
257
+ properties: {
258
+ invitation: { type: "object" },
259
+ member: { type: "object" }
260
+ }
261
+ } } }
262
+ } }
263
+ } }
264
+ }, async (ctx) => {
265
+ const session = ctx.context.session;
266
+ const adapter = getOrgAdapter(ctx.context, options);
267
+ const invitation = await adapter.findInvitationById(ctx.body.invitationId);
268
+ if (!invitation || invitation.expiresAt < /* @__PURE__ */ new Date() || invitation.status !== "pending") throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.INVITATION_NOT_FOUND);
269
+ if (invitation.email.toLowerCase() !== session.user.email.toLowerCase()) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_THE_RECIPIENT_OF_THE_INVITATION);
270
+ if (shouldRequireVerifiedEmailForInvitationIdAction({
271
+ organizationOptions: ctx.context.orgOptions,
272
+ advancedGenerateId: getAdvancedGenerateId(ctx.context.options.advanced),
273
+ databaseGenerateId: ctx.context.options.advanced?.database?.generateId
274
+ }) && !session.user.emailVerified) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.EMAIL_VERIFICATION_REQUIRED_BEFORE_ACCEPTING_OR_REJECTING_INVITATION);
275
+ const membershipLimit = ctx.context.orgOptions?.membershipLimit || 100;
276
+ const membersCount = await adapter.countMembers({ organizationId: invitation.organizationId });
277
+ const organization = await adapter.findOrganizationById(invitation.organizationId);
278
+ if (!organization) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND);
279
+ if (membersCount >= (typeof membershipLimit === "number" ? membershipLimit : await membershipLimit(session.user, organization))) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.ORGANIZATION_MEMBERSHIP_LIMIT_REACHED);
280
+ if (options?.organizationHooks?.beforeAcceptInvitation) await options?.organizationHooks.beforeAcceptInvitation({
281
+ invitation,
282
+ user: session.user,
283
+ organization
284
+ });
285
+ const acceptedI = await adapter.updateInvitation({
286
+ invitationId: ctx.body.invitationId,
287
+ status: "accepted",
288
+ fromStatus: "pending"
289
+ });
290
+ if (!acceptedI) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.INVITATION_NOT_FOUND);
291
+ const member = await runWithTransaction(ctx.context.adapter, async () => {
292
+ if (ctx.context.orgOptions.teams && ctx.context.orgOptions.teams.enabled && "teamId" in acceptedI && acceptedI.teamId) {
293
+ const teamIds = acceptedI.teamId.split(",");
294
+ const onlyOne = teamIds.length === 1;
295
+ for (const teamId of teamIds) {
296
+ if (!await adapter.findTeamById({
297
+ teamId,
298
+ organizationId: acceptedI.organizationId
299
+ })) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.TEAM_NOT_FOUND);
300
+ if (typeof ctx.context.orgOptions.teams.maximumMembersPerTeam !== "undefined") {
301
+ const maximumMembersPerTeam = typeof ctx.context.orgOptions.teams.maximumMembersPerTeam === "function" ? await ctx.context.orgOptions.teams.maximumMembersPerTeam({
302
+ teamId,
303
+ session,
304
+ organizationId: acceptedI.organizationId
305
+ }) : ctx.context.orgOptions.teams.maximumMembersPerTeam;
306
+ if ((await adapter.addTeamMemberWithLimit({
307
+ teamId,
308
+ userId: session.user.id,
309
+ maximumMembersPerTeam
310
+ })).status === "limitReached") throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.TEAM_MEMBER_LIMIT_REACHED);
311
+ } else await adapter.findOrCreateTeamMember({
312
+ teamId,
313
+ userId: session.user.id
314
+ });
315
+ }
316
+ if (onlyOne) {
317
+ const teamId = teamIds[0];
318
+ await setSessionCookie(ctx, {
319
+ session: await adapter.setActiveTeam(session.session.token, teamId, ctx),
320
+ user: session.user
321
+ });
322
+ }
323
+ }
324
+ const createdMember = await adapter.createMember({
325
+ organizationId: acceptedI.organizationId,
326
+ userId: session.user.id,
327
+ role: acceptedI.role,
328
+ createdAt: /* @__PURE__ */ new Date()
329
+ });
330
+ await adapter.setActiveOrganization(session.session.token, acceptedI.organizationId, ctx);
331
+ return createdMember;
332
+ }).catch(async (error) => {
333
+ await adapter.updateInvitation({
334
+ invitationId: ctx.body.invitationId,
335
+ status: "pending",
336
+ fromStatus: "accepted"
337
+ });
338
+ throw error;
339
+ });
340
+ if (options?.organizationHooks?.afterAcceptInvitation) await options?.organizationHooks.afterAcceptInvitation({
341
+ invitation: acceptedI,
342
+ member,
343
+ user: session.user,
344
+ organization
345
+ });
346
+ return ctx.json({
347
+ invitation: acceptedI,
348
+ member
349
+ });
350
+ });
351
+ const rejectInvitationBodySchema = z.object({ invitationId: z.string().meta({ description: "The ID of the invitation to reject" }) });
352
+ const rejectInvitation = (options) => createAuthEndpoint("/organization/reject-invitation", {
353
+ method: "POST",
354
+ body: rejectInvitationBodySchema,
355
+ requireHeaders: true,
356
+ use: [orgMiddleware, orgSessionMiddleware],
357
+ metadata: { openapi: {
358
+ description: "Reject an invitation to an organization",
359
+ responses: { "200": {
360
+ description: "Success",
361
+ content: { "application/json": { schema: {
362
+ type: "object",
363
+ properties: {
364
+ invitation: { type: "object" },
365
+ member: {
366
+ type: "object",
367
+ nullable: true
368
+ }
369
+ }
370
+ } } }
371
+ } }
372
+ } }
373
+ }, async (ctx) => {
374
+ const session = ctx.context.session;
375
+ const adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);
376
+ const invitation = await adapter.findInvitationById(ctx.body.invitationId);
377
+ if (!invitation || invitation.status !== "pending") throw APIError.from("BAD_REQUEST", {
378
+ message: "Invitation not found!",
379
+ code: "INVITATION_NOT_FOUND"
380
+ });
381
+ if (invitation.email.toLowerCase() !== session.user.email.toLowerCase()) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_THE_RECIPIENT_OF_THE_INVITATION);
382
+ if (shouldRequireVerifiedEmailForInvitationIdAction({
383
+ organizationOptions: ctx.context.orgOptions,
384
+ advancedGenerateId: getAdvancedGenerateId(ctx.context.options.advanced),
385
+ databaseGenerateId: ctx.context.options.advanced?.database?.generateId
386
+ }) && !session.user.emailVerified) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.EMAIL_VERIFICATION_REQUIRED_BEFORE_ACCEPTING_OR_REJECTING_INVITATION);
387
+ const organization = await adapter.findOrganizationById(invitation.organizationId);
388
+ if (!organization) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND);
389
+ if (options?.organizationHooks?.beforeRejectInvitation) await options?.organizationHooks.beforeRejectInvitation({
390
+ invitation,
391
+ user: session.user,
392
+ organization
393
+ });
394
+ const rejectedI = await adapter.updateInvitation({
395
+ invitationId: ctx.body.invitationId,
396
+ status: "rejected"
397
+ });
398
+ if (options?.organizationHooks?.afterRejectInvitation) await options?.organizationHooks.afterRejectInvitation({
399
+ invitation: rejectedI || invitation,
400
+ user: session.user,
401
+ organization
402
+ });
403
+ return ctx.json({
404
+ invitation: rejectedI,
405
+ member: null
406
+ });
407
+ });
408
+ const cancelInvitationBodySchema = z.object({ invitationId: z.string().meta({ description: "The ID of the invitation to cancel" }) });
409
+ const cancelInvitation = (options) => createAuthEndpoint("/organization/cancel-invitation", {
410
+ method: "POST",
411
+ body: cancelInvitationBodySchema,
412
+ requireHeaders: true,
413
+ use: [orgMiddleware, orgSessionMiddleware],
414
+ openapi: {
415
+ operationId: "cancelOrganizationInvitation",
416
+ description: "Cancel an invitation to an organization",
417
+ responses: { "200": {
418
+ description: "Success",
419
+ content: { "application/json": { schema: {
420
+ type: "object",
421
+ properties: { invitation: { type: "object" } }
422
+ } } }
423
+ } }
424
+ }
425
+ }, async (ctx) => {
426
+ const session = ctx.context.session;
427
+ const adapter = getOrgAdapter(ctx.context, options);
428
+ const invitation = await adapter.findInvitationById(ctx.body.invitationId);
429
+ if (!invitation) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.INVITATION_NOT_FOUND);
430
+ const member = await adapter.findMemberByOrgId({
431
+ userId: session.user.id,
432
+ organizationId: invitation.organizationId
433
+ });
434
+ if (!member) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
435
+ if (!await hasPermission({
436
+ role: member.role,
437
+ options: ctx.context.orgOptions,
438
+ permissions: { invitation: ["cancel"] },
439
+ organizationId: invitation.organizationId
440
+ }, ctx)) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_CANCEL_THIS_INVITATION);
441
+ const organization = await adapter.findOrganizationById(invitation.organizationId);
442
+ if (!organization) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND);
443
+ if (options?.organizationHooks?.beforeCancelInvitation) await options?.organizationHooks.beforeCancelInvitation({
444
+ invitation,
445
+ cancelledBy: session.user,
446
+ organization
447
+ });
448
+ const canceledI = await adapter.updateInvitation({
449
+ invitationId: ctx.body.invitationId,
450
+ status: "canceled"
451
+ });
452
+ if (options?.organizationHooks?.afterCancelInvitation) await options?.organizationHooks.afterCancelInvitation({
453
+ invitation: canceledI || invitation,
454
+ cancelledBy: session.user,
455
+ organization
456
+ });
457
+ return ctx.json(canceledI);
458
+ });
459
+ const getInvitationQuerySchema = z.object({ id: z.string().meta({ description: "The ID of the invitation to get" }) });
460
+ const getInvitation = (options) => createAuthEndpoint("/organization/get-invitation", {
461
+ method: "GET",
462
+ use: [orgMiddleware],
463
+ requireHeaders: true,
464
+ query: getInvitationQuerySchema,
465
+ metadata: { openapi: {
466
+ description: "Get an invitation by ID",
467
+ responses: { "200": {
468
+ description: "Success",
469
+ content: { "application/json": { schema: {
470
+ type: "object",
471
+ properties: {
472
+ id: { type: "string" },
473
+ email: { type: "string" },
474
+ role: { type: "string" },
475
+ organizationId: { type: "string" },
476
+ inviterId: { type: "string" },
477
+ status: { type: "string" },
478
+ expiresAt: { type: "string" },
479
+ organizationName: { type: "string" },
480
+ organizationSlug: { type: "string" },
481
+ inviterEmail: { type: "string" }
482
+ },
483
+ required: [
484
+ "id",
485
+ "email",
486
+ "role",
487
+ "organizationId",
488
+ "inviterId",
489
+ "status",
490
+ "expiresAt",
491
+ "organizationName",
492
+ "organizationSlug",
493
+ "inviterEmail"
494
+ ]
495
+ } } }
496
+ } }
497
+ } }
498
+ }, async (ctx) => {
499
+ const session = await getSessionFromCtx(ctx);
500
+ if (!session) throw APIError.fromStatus("UNAUTHORIZED", { message: "Not authenticated" });
501
+ const adapter = getOrgAdapter(ctx.context, options);
502
+ const invitation = await adapter.findInvitationById(ctx.query.id);
503
+ if (!invitation || invitation.status !== "pending" || invitation.expiresAt < /* @__PURE__ */ new Date()) throw APIError.fromStatus("BAD_REQUEST", { message: "Invitation not found!" });
504
+ if (invitation.email.toLowerCase() !== session.user.email.toLowerCase()) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_THE_RECIPIENT_OF_THE_INVITATION);
505
+ if (shouldRequireVerifiedEmailForInvitationIdAction({
506
+ organizationOptions: ctx.context.orgOptions,
507
+ advancedGenerateId: getAdvancedGenerateId(ctx.context.options.advanced),
508
+ databaseGenerateId: ctx.context.options.advanced?.database?.generateId
509
+ }) && !session.user.emailVerified) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.EMAIL_VERIFICATION_REQUIRED_FOR_INVITATION);
510
+ const organization = await adapter.findOrganizationById(invitation.organizationId);
511
+ if (!organization) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND);
512
+ const member = await adapter.findMemberByOrgId({
513
+ userId: invitation.inviterId,
514
+ organizationId: invitation.organizationId
515
+ });
516
+ if (!member) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.INVITER_IS_NO_LONGER_A_MEMBER_OF_THE_ORGANIZATION);
517
+ return ctx.json({
518
+ ...invitation,
519
+ organizationName: organization.name,
520
+ organizationSlug: organization.slug,
521
+ inviterEmail: member.user.email
522
+ });
523
+ });
524
+ const listInvitationQuerySchema = z.object({ organizationId: z.string().meta({ description: "The ID of the organization to list invitations for" }).optional() }).optional();
525
+ const listInvitations = (options) => createAuthEndpoint("/organization/list-invitations", {
526
+ method: "GET",
527
+ requireHeaders: true,
528
+ use: [orgMiddleware, orgSessionMiddleware],
529
+ query: listInvitationQuerySchema
530
+ }, async (ctx) => {
531
+ const session = await getSessionFromCtx(ctx);
532
+ if (!session) throw APIError.fromStatus("UNAUTHORIZED", { message: "Not authenticated" });
533
+ const orgId = ctx.query?.organizationId || session.session.activeOrganizationId;
534
+ if (!orgId) throw APIError.fromStatus("BAD_REQUEST", { message: "Organization ID is required" });
535
+ const adapter = getOrgAdapter(ctx.context, options);
536
+ if (!await adapter.findMemberByOrgId({
537
+ userId: session.user.id,
538
+ organizationId: orgId
539
+ })) throw APIError.fromStatus("FORBIDDEN", { message: "You are not a member of this organization" });
540
+ const invitations = await adapter.listInvitations({ organizationId: orgId });
541
+ return ctx.json(invitations);
542
+ });
543
+ /**
544
+ * List all invitations a user has received
545
+ */
546
+ const listUserInvitations = (options) => createAuthEndpoint("/organization/list-user-invitations", {
547
+ method: "GET",
548
+ use: [orgMiddleware],
549
+ query: z.object({ email: z.string().meta({ description: "The email of the user to list invitations for. This only works for server side API calls." }).optional() }).optional(),
550
+ metadata: { openapi: {
551
+ description: "List all invitations a user has received",
552
+ responses: { "200": {
553
+ description: "Success",
554
+ content: { "application/json": { schema: {
555
+ type: "array",
556
+ items: {
557
+ type: "object",
558
+ properties: {
559
+ id: { type: "string" },
560
+ email: { type: "string" },
561
+ role: { type: "string" },
562
+ organizationId: { type: "string" },
563
+ organizationName: { type: "string" },
564
+ inviterId: {
565
+ type: "string",
566
+ description: "The ID of the user who created the invitation"
567
+ },
568
+ teamId: {
569
+ type: "string",
570
+ description: "The ID of the team associated with the invitation",
571
+ nullable: true
572
+ },
573
+ status: { type: "string" },
574
+ expiresAt: { type: "string" },
575
+ createdAt: { type: "string" }
576
+ },
577
+ required: [
578
+ "id",
579
+ "email",
580
+ "role",
581
+ "organizationId",
582
+ "organizationName",
583
+ "inviterId",
584
+ "status",
585
+ "expiresAt",
586
+ "createdAt"
587
+ ]
588
+ }
589
+ } } }
590
+ } }
591
+ } }
592
+ }, async (ctx) => {
593
+ const session = await getSessionFromCtx(ctx);
594
+ if (ctx.request && ctx.query?.email) throw APIError.fromStatus("BAD_REQUEST", { message: "User email cannot be passed for client side API calls." });
595
+ if (session && !session.user.emailVerified) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.EMAIL_VERIFICATION_REQUIRED_FOR_INVITATION);
596
+ const userEmail = session?.user.email || ctx.query?.email;
597
+ if (!userEmail) throw APIError.fromStatus("BAD_REQUEST", { message: "Missing session headers, or email query parameter." });
598
+ const pendingInvitations = (await getOrgAdapter(ctx.context, options).listUserInvitations(userEmail)).filter((inv) => inv.status === "pending");
599
+ return ctx.json(pendingInvitations);
600
+ });
601
+ //#endregion
602
+ export { acceptInvitation, cancelInvitation, createInvitation, getInvitation, listInvitations, listUserInvitations, rejectInvitation };