@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,518 @@
1
+ import { toZodSchema } from "../../../db/to-zod.mjs";
2
+ import { getSessionFromCtx, sessionMiddleware } from "../../../api/routes/session.mjs";
3
+ import { defaultRoles } from "../access/statement.mjs";
4
+ import { ORGANIZATION_ERROR_CODES } from "../error-codes.mjs";
5
+ import { getOrgAdapter } from "../adapter.mjs";
6
+ import { orgMiddleware, orgSessionMiddleware } from "../call.mjs";
7
+ import { hasPermission } from "../has-permission.mjs";
8
+ import { parseRoles } from "../organization.mjs";
9
+ import { APIError, BASE_ERROR_CODES } from "@better-auth/core/error";
10
+ import { whereOperators } from "@better-auth/core/db/adapter";
11
+ import { createAuthEndpoint } from "@better-auth/core/api";
12
+ import * as z from "zod";
13
+ //#region src/plugins/organization/routes/crud-members.ts
14
+ const baseMemberSchema = z.object({
15
+ userId: z.coerce.string().meta({ description: "The user Id which represents the user to be added as a member. If `null` is provided, then it's expected to provide session headers. Eg: \"user-id\"" }),
16
+ role: z.union([z.string(), z.array(z.string())]).meta({ description: "The role(s) to assign to the new member. Eg: [\"admin\", \"sale\"]" }),
17
+ organizationId: z.string().meta({ description: "An optional organization ID to pass. If not provided, will default to the user's active organization. Eg: \"org-id\"" }).optional(),
18
+ teamId: z.string().meta({ description: "An optional team ID to add the member to. Eg: \"team-id\"" }).optional()
19
+ });
20
+ const addMember = (option) => {
21
+ const additionalFieldsSchema = toZodSchema({
22
+ fields: option?.schema?.member?.additionalFields || {},
23
+ isClientSide: true
24
+ });
25
+ return createAuthEndpoint({
26
+ method: "POST",
27
+ body: z.object({
28
+ ...baseMemberSchema.shape,
29
+ ...additionalFieldsSchema.shape
30
+ }),
31
+ use: [orgMiddleware],
32
+ metadata: {
33
+ $Infer: { body: {} },
34
+ openapi: {
35
+ operationId: "addOrganizationMember",
36
+ description: "Add a member to an organization"
37
+ }
38
+ }
39
+ }, async (ctx) => {
40
+ const session = ctx.body.userId ? await getSessionFromCtx(ctx).catch((e) => null) : null;
41
+ const orgId = ctx.body.organizationId || session?.session.activeOrganizationId;
42
+ if (!orgId) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION);
43
+ const teamId = "teamId" in ctx.body ? ctx.body.teamId : void 0;
44
+ if (teamId && !ctx.context.orgOptions.teams?.enabled) {
45
+ ctx.context.logger.error("Teams are not enabled");
46
+ throw APIError.fromStatus("BAD_REQUEST", { message: "Teams are not enabled" });
47
+ }
48
+ const adapter = getOrgAdapter(ctx.context, option);
49
+ const user = await ctx.context.internalAdapter.findUserById(ctx.body.userId);
50
+ if (!user) throw APIError.from("BAD_REQUEST", BASE_ERROR_CODES.USER_NOT_FOUND);
51
+ if (await adapter.findMemberByEmail({
52
+ email: user.email,
53
+ organizationId: orgId
54
+ })) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.USER_IS_ALREADY_A_MEMBER_OF_THIS_ORGANIZATION);
55
+ if (teamId) {
56
+ const team = await adapter.findTeamById({
57
+ teamId,
58
+ organizationId: orgId
59
+ });
60
+ if (!team || team.organizationId !== orgId) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.TEAM_NOT_FOUND);
61
+ }
62
+ const membershipLimit = ctx.context.orgOptions?.membershipLimit || 100;
63
+ const count = await adapter.countMembers({ organizationId: orgId });
64
+ const organization = await adapter.findOrganizationById(orgId);
65
+ if (!organization) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND);
66
+ if (count >= (typeof membershipLimit === "number" ? membershipLimit : await membershipLimit(user, organization))) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.ORGANIZATION_MEMBERSHIP_LIMIT_REACHED);
67
+ const { role: _, userId: __, organizationId: ___, ...additionalFields } = ctx.body;
68
+ let memberData = {
69
+ organizationId: orgId,
70
+ userId: user.id,
71
+ role: parseRoles(ctx.body.role),
72
+ createdAt: /* @__PURE__ */ new Date(),
73
+ ...additionalFields ? additionalFields : {}
74
+ };
75
+ if (option?.organizationHooks?.beforeAddMember) {
76
+ const response = await option?.organizationHooks.beforeAddMember({
77
+ member: {
78
+ userId: user.id,
79
+ organizationId: orgId,
80
+ role: parseRoles(ctx.body.role),
81
+ ...additionalFields
82
+ },
83
+ user,
84
+ organization
85
+ });
86
+ if (response && typeof response === "object" && "data" in response) memberData = {
87
+ ...memberData,
88
+ ...response.data
89
+ };
90
+ }
91
+ const createdMember = await adapter.createMember(memberData);
92
+ if (teamId) try {
93
+ if (typeof ctx.context.orgOptions.teams?.maximumMembersPerTeam !== "undefined") {
94
+ const configuredMaximumMembersPerTeam = ctx.context.orgOptions.teams.maximumMembersPerTeam;
95
+ let maximumMembersPerTeam;
96
+ if (typeof configuredMaximumMembersPerTeam === "function") {
97
+ if (!session) throw APIError.fromStatus("UNAUTHORIZED");
98
+ maximumMembersPerTeam = await configuredMaximumMembersPerTeam({
99
+ teamId,
100
+ session: {
101
+ user: session.user,
102
+ session: session.session
103
+ },
104
+ organizationId: orgId
105
+ });
106
+ } else maximumMembersPerTeam = configuredMaximumMembersPerTeam;
107
+ if ((await adapter.addTeamMemberWithLimit({
108
+ userId: user.id,
109
+ teamId,
110
+ maximumMembersPerTeam
111
+ })).status === "limitReached") throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.TEAM_MEMBER_LIMIT_REACHED);
112
+ } else await adapter.findOrCreateTeamMember({
113
+ userId: user.id,
114
+ teamId
115
+ });
116
+ } catch (error) {
117
+ await adapter.deleteMember({
118
+ memberId: createdMember.id,
119
+ organizationId: orgId,
120
+ userId: user.id
121
+ });
122
+ throw error;
123
+ }
124
+ if (option?.organizationHooks?.afterAddMember) await option?.organizationHooks.afterAddMember({
125
+ member: createdMember,
126
+ user,
127
+ organization
128
+ });
129
+ return ctx.json(createdMember);
130
+ });
131
+ };
132
+ const removeMemberBodySchema = z.object({
133
+ memberIdOrEmail: z.string().meta({ description: "The ID or email of the member to remove" }),
134
+ /**
135
+ * If not provided, the active organization will be used
136
+ */
137
+ organizationId: z.string().meta({ description: "The ID of the organization to remove the member from. If not provided, the active organization will be used. Eg: \"org-id\"" }).optional()
138
+ });
139
+ const removeMember = (options) => createAuthEndpoint("/organization/remove-member", {
140
+ method: "POST",
141
+ body: removeMemberBodySchema,
142
+ requireHeaders: true,
143
+ use: [orgMiddleware, orgSessionMiddleware],
144
+ metadata: { openapi: {
145
+ description: "Remove a member from an organization",
146
+ responses: { "200": {
147
+ description: "Success",
148
+ content: { "application/json": { schema: {
149
+ type: "object",
150
+ properties: { member: {
151
+ type: "object",
152
+ properties: {
153
+ id: { type: "string" },
154
+ userId: { type: "string" },
155
+ organizationId: { type: "string" },
156
+ role: { type: "string" }
157
+ },
158
+ required: [
159
+ "id",
160
+ "userId",
161
+ "organizationId",
162
+ "role"
163
+ ]
164
+ } },
165
+ required: ["member"]
166
+ } } }
167
+ } }
168
+ } }
169
+ }, async (ctx) => {
170
+ const session = ctx.context.session;
171
+ const organizationId = ctx.body.organizationId || session.session.activeOrganizationId;
172
+ if (!organizationId) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION);
173
+ const adapter = getOrgAdapter(ctx.context, options);
174
+ const member = await adapter.findMemberByOrgId({
175
+ userId: session.user.id,
176
+ organizationId
177
+ });
178
+ if (!member) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
179
+ let toBeRemovedMember = null;
180
+ if (ctx.body.memberIdOrEmail.includes("@")) toBeRemovedMember = await adapter.findMemberByEmail({
181
+ email: ctx.body.memberIdOrEmail,
182
+ organizationId
183
+ });
184
+ else {
185
+ const result = await adapter.findMemberById(ctx.body.memberIdOrEmail);
186
+ if (!result) toBeRemovedMember = null;
187
+ else {
188
+ const { user: _user, ...member } = result;
189
+ toBeRemovedMember = member;
190
+ }
191
+ }
192
+ if (!toBeRemovedMember) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
193
+ const roles = toBeRemovedMember.role.split(",");
194
+ const creatorRole = ctx.context.orgOptions?.creatorRole || "owner";
195
+ if (roles.includes(creatorRole)) {
196
+ if (!member.role.split(",").map((r) => r.trim()).includes(creatorRole)) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.YOU_CANNOT_LEAVE_THE_ORGANIZATION_AS_THE_ONLY_OWNER);
197
+ const { members } = await adapter.listMembers({ organizationId });
198
+ if (members.filter((member) => {
199
+ return member.role.split(",").includes(creatorRole);
200
+ }).length <= 1) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.YOU_CANNOT_LEAVE_THE_ORGANIZATION_AS_THE_ONLY_OWNER);
201
+ }
202
+ if (!await hasPermission({
203
+ role: member.role,
204
+ options: ctx.context.orgOptions,
205
+ permissions: { member: ["delete"] },
206
+ organizationId
207
+ }, ctx)) throw APIError.from("UNAUTHORIZED", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_DELETE_THIS_MEMBER);
208
+ if (toBeRemovedMember?.organizationId !== organizationId) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
209
+ const organization = await adapter.findOrganizationById(organizationId);
210
+ if (!organization) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND);
211
+ const userBeingRemoved = await ctx.context.internalAdapter.findUserById(toBeRemovedMember.userId);
212
+ if (!userBeingRemoved) throw APIError.fromStatus("BAD_REQUEST", { message: "User not found" });
213
+ if (options?.organizationHooks?.beforeRemoveMember) await options?.organizationHooks.beforeRemoveMember({
214
+ member: toBeRemovedMember,
215
+ user: userBeingRemoved,
216
+ organization
217
+ });
218
+ await adapter.deleteMember({
219
+ memberId: toBeRemovedMember.id,
220
+ organizationId,
221
+ userId: toBeRemovedMember.userId
222
+ });
223
+ if (session.user.id === toBeRemovedMember.userId && session.session.activeOrganizationId === toBeRemovedMember.organizationId) await adapter.setActiveOrganization(session.session.token, null, ctx);
224
+ if (options?.organizationHooks?.afterRemoveMember) await options?.organizationHooks.afterRemoveMember({
225
+ member: toBeRemovedMember,
226
+ user: userBeingRemoved,
227
+ organization
228
+ });
229
+ return ctx.json({ member: toBeRemovedMember });
230
+ });
231
+ const updateMemberRoleBodySchema = z.object({
232
+ role: z.union([z.string(), z.array(z.string())]).meta({ description: "The new role to be applied. This can be a string or array of strings representing the roles. Eg: [\"admin\", \"sale\"]" }),
233
+ memberId: z.string().meta({ description: "The member id to apply the role update to. Eg: \"member-id\"" }),
234
+ organizationId: z.string().meta({ description: "An optional organization ID which the member is a part of to apply the role update. If not provided, you must provide session headers to get the active organization. Eg: \"organization-id\"" }).optional()
235
+ });
236
+ const updateMemberRole = (option) => createAuthEndpoint("/organization/update-member-role", {
237
+ method: "POST",
238
+ body: updateMemberRoleBodySchema,
239
+ use: [orgMiddleware, orgSessionMiddleware],
240
+ requireHeaders: true,
241
+ metadata: {
242
+ $Infer: { body: {} },
243
+ openapi: {
244
+ operationId: "updateOrganizationMemberRole",
245
+ description: "Update the role of a member in an organization",
246
+ responses: { "200": {
247
+ description: "Success",
248
+ content: { "application/json": { schema: {
249
+ type: "object",
250
+ properties: { member: {
251
+ type: "object",
252
+ properties: {
253
+ id: { type: "string" },
254
+ userId: { type: "string" },
255
+ organizationId: { type: "string" },
256
+ role: { type: "string" }
257
+ },
258
+ required: [
259
+ "id",
260
+ "userId",
261
+ "organizationId",
262
+ "role"
263
+ ]
264
+ } },
265
+ required: ["member"]
266
+ } } }
267
+ } }
268
+ }
269
+ }
270
+ }, async (ctx) => {
271
+ const session = ctx.context.session;
272
+ if (!ctx.body.role) throw APIError.fromStatus("BAD_REQUEST");
273
+ const organizationId = ctx.body.organizationId || session.session.activeOrganizationId;
274
+ if (!organizationId) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION);
275
+ const adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);
276
+ const roleToSet = (Array.isArray(ctx.body.role) ? ctx.body.role : [ctx.body.role]).flatMap((role) => role.split(",")).map((role) => role.trim()).filter(Boolean);
277
+ if (roleToSet.length === 0) throw APIError.fromStatus("BAD_REQUEST");
278
+ const member = await adapter.findMemberByOrgId({
279
+ userId: session.user.id,
280
+ organizationId
281
+ });
282
+ if (!member) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
283
+ const toBeUpdatedMember = member.id !== ctx.body.memberId ? await adapter.findMemberById(ctx.body.memberId) : member;
284
+ if (!toBeUpdatedMember) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
285
+ if (!(toBeUpdatedMember.organizationId === organizationId)) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_MEMBER);
286
+ const creatorRole = ctx.context.orgOptions?.creatorRole || "owner";
287
+ const updatingMemberRoles = member.role.split(",");
288
+ const isUpdatingCreator = toBeUpdatedMember.role.split(",").includes(creatorRole);
289
+ const updaterIsCreator = updatingMemberRoles.includes(creatorRole);
290
+ const isSettingCreatorRole = roleToSet.includes(creatorRole);
291
+ const memberIsUpdatingThemselves = member.id === toBeUpdatedMember.id;
292
+ if (isUpdatingCreator && !updaterIsCreator || isSettingCreatorRole && !updaterIsCreator) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_MEMBER);
293
+ if (updaterIsCreator && memberIsUpdatingThemselves) {
294
+ if ((await ctx.context.adapter.findMany({
295
+ model: "member",
296
+ where: [{
297
+ field: "organizationId",
298
+ value: organizationId
299
+ }]
300
+ })).filter((member) => {
301
+ return member.role.split(",").includes(creatorRole);
302
+ }).length <= 1 && !isSettingCreatorRole) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.YOU_CANNOT_LEAVE_THE_ORGANIZATION_WITHOUT_AN_OWNER);
303
+ }
304
+ if (!await hasPermission({
305
+ role: member.role,
306
+ options: ctx.context.orgOptions,
307
+ permissions: { member: ["update"] },
308
+ allowCreatorAllPermissions: true,
309
+ organizationId
310
+ }, ctx)) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_MEMBER);
311
+ const validStaticRoles = new Set([...Object.keys(defaultRoles), ...Object.keys(ctx.context.orgOptions.roles || {})]);
312
+ const unknownRoles = roleToSet.filter((role) => !validStaticRoles.has(role));
313
+ if (unknownRoles.length > 0) if (ctx.context.orgOptions.dynamicAccessControl?.enabled) {
314
+ const foundRoleNames = (await ctx.context.adapter.findMany({
315
+ model: "organizationRole",
316
+ where: [{
317
+ field: "organizationId",
318
+ value: organizationId
319
+ }, {
320
+ field: "role",
321
+ value: unknownRoles,
322
+ operator: "in"
323
+ }]
324
+ })).map((role) => role.role);
325
+ const stillInvalid = unknownRoles.filter((role) => !foundRoleNames.includes(role));
326
+ if (stillInvalid.length > 0) throw new APIError("BAD_REQUEST", {
327
+ code: ORGANIZATION_ERROR_CODES.ROLE_NOT_FOUND.code,
328
+ message: `${ORGANIZATION_ERROR_CODES.ROLE_NOT_FOUND.code}: ${stillInvalid.join(", ")}`
329
+ });
330
+ } else throw new APIError("BAD_REQUEST", {
331
+ code: ORGANIZATION_ERROR_CODES.ROLE_NOT_FOUND.code,
332
+ message: `${ORGANIZATION_ERROR_CODES.ROLE_NOT_FOUND.code}: ${unknownRoles.join(", ")}`
333
+ });
334
+ const organization = await adapter.findOrganizationById(organizationId);
335
+ if (!organization) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND);
336
+ const userBeingUpdated = await ctx.context.internalAdapter.findUserById(toBeUpdatedMember.userId);
337
+ if (!userBeingUpdated) throw APIError.fromStatus("BAD_REQUEST", { message: "User not found" });
338
+ const previousRole = toBeUpdatedMember.role;
339
+ const newRole = parseRoles(roleToSet);
340
+ if (option?.organizationHooks?.beforeUpdateMemberRole) {
341
+ const response = await option?.organizationHooks.beforeUpdateMemberRole({
342
+ member: toBeUpdatedMember,
343
+ newRole,
344
+ user: userBeingUpdated,
345
+ organization
346
+ });
347
+ if (response && typeof response === "object" && "data" in response) {
348
+ const updatedMember = await adapter.updateMember(ctx.body.memberId, response.data.role || newRole);
349
+ if (!updatedMember) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
350
+ if (option?.organizationHooks?.afterUpdateMemberRole) await option?.organizationHooks.afterUpdateMemberRole({
351
+ member: updatedMember,
352
+ previousRole,
353
+ user: userBeingUpdated,
354
+ organization
355
+ });
356
+ return ctx.json(updatedMember);
357
+ }
358
+ }
359
+ const updatedMember = await adapter.updateMember(ctx.body.memberId, newRole);
360
+ if (!updatedMember) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
361
+ if (option?.organizationHooks?.afterUpdateMemberRole) await option?.organizationHooks.afterUpdateMemberRole({
362
+ member: updatedMember,
363
+ previousRole,
364
+ user: userBeingUpdated,
365
+ organization
366
+ });
367
+ return ctx.json(updatedMember);
368
+ });
369
+ const getActiveMember = (options) => createAuthEndpoint("/organization/get-active-member", {
370
+ method: "GET",
371
+ use: [orgMiddleware, orgSessionMiddleware],
372
+ requireHeaders: true,
373
+ metadata: { openapi: {
374
+ description: "Get the member details of the active organization",
375
+ responses: { "200": {
376
+ description: "Success",
377
+ content: { "application/json": { schema: {
378
+ type: "object",
379
+ properties: {
380
+ id: { type: "string" },
381
+ userId: { type: "string" },
382
+ organizationId: { type: "string" },
383
+ role: { type: "string" }
384
+ },
385
+ required: [
386
+ "id",
387
+ "userId",
388
+ "organizationId",
389
+ "role"
390
+ ]
391
+ } } }
392
+ } }
393
+ } }
394
+ }, async (ctx) => {
395
+ const session = ctx.context.session;
396
+ const organizationId = session.session.activeOrganizationId;
397
+ if (!organizationId) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION);
398
+ const member = await getOrgAdapter(ctx.context, options).findMemberByOrgId({
399
+ userId: session.user.id,
400
+ organizationId
401
+ });
402
+ if (!member) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
403
+ return ctx.json(member);
404
+ });
405
+ const leaveOrganizationBodySchema = z.object({ organizationId: z.string().meta({ description: "The organization Id for the member to leave. Eg: \"organization-id\"" }) });
406
+ const leaveOrganization = (options) => createAuthEndpoint("/organization/leave", {
407
+ method: "POST",
408
+ body: leaveOrganizationBodySchema,
409
+ requireHeaders: true,
410
+ use: [sessionMiddleware, orgMiddleware]
411
+ }, async (ctx) => {
412
+ const session = ctx.context.session;
413
+ const adapter = getOrgAdapter(ctx.context, options);
414
+ const member = await adapter.findMemberByOrgId({
415
+ userId: session.user.id,
416
+ organizationId: ctx.body.organizationId
417
+ });
418
+ if (!member) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
419
+ const creatorRole = ctx.context.orgOptions?.creatorRole || "owner";
420
+ if (member.role.split(",").includes(creatorRole)) {
421
+ if ((await ctx.context.adapter.findMany({
422
+ model: "member",
423
+ where: [{
424
+ field: "organizationId",
425
+ value: ctx.body.organizationId
426
+ }]
427
+ })).filter((member) => member.role.split(",").includes(creatorRole)).length <= 1) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.YOU_CANNOT_LEAVE_THE_ORGANIZATION_AS_THE_ONLY_OWNER);
428
+ }
429
+ await adapter.deleteMember({
430
+ memberId: member.id,
431
+ organizationId: ctx.body.organizationId,
432
+ userId: session.user.id
433
+ });
434
+ if (session.session.activeOrganizationId === ctx.body.organizationId) await adapter.setActiveOrganization(session.session.token, null, ctx);
435
+ return ctx.json(member);
436
+ });
437
+ const listMembers = (options) => createAuthEndpoint("/organization/list-members", {
438
+ method: "GET",
439
+ query: z.object({
440
+ limit: z.string().meta({ description: "The number of users to return" }).or(z.number()).optional(),
441
+ offset: z.string().meta({ description: "The offset to start from" }).or(z.number()).optional(),
442
+ sortBy: z.string().meta({ description: "The field to sort by" }).optional(),
443
+ sortDirection: z.enum(["asc", "desc"]).meta({ description: "The direction to sort by" }).optional(),
444
+ filterField: z.string().meta({ description: "The field to filter by" }).optional(),
445
+ filterValue: z.string().meta({ description: "The value to filter by" }).or(z.number()).or(z.boolean()).or(z.array(z.string())).or(z.array(z.number())).optional(),
446
+ filterOperator: z.enum(whereOperators).meta({ description: "The operator to use for the filter" }).optional(),
447
+ organizationId: z.string().meta({ description: "The organization ID to list members for. If not provided, will default to the user's active organization. Eg: \"organization-id\"" }).optional(),
448
+ organizationSlug: z.string().meta({ description: "The organization slug to list members for. If not provided, will default to the user's active organization. Eg: \"organization-slug\"" }).optional()
449
+ }).optional(),
450
+ requireHeaders: true,
451
+ use: [orgMiddleware, orgSessionMiddleware]
452
+ }, async (ctx) => {
453
+ const session = ctx.context.session;
454
+ let organizationId = ctx.query?.organizationId || session.session.activeOrganizationId;
455
+ const adapter = getOrgAdapter(ctx.context, options);
456
+ if (ctx.query?.organizationSlug) {
457
+ const organization = await adapter.findOrganizationBySlug(ctx.query?.organizationSlug);
458
+ if (!organization) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND);
459
+ organizationId = organization.id;
460
+ }
461
+ if (!organizationId) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION);
462
+ if (!await adapter.findMemberByOrgId({
463
+ userId: session.user.id,
464
+ organizationId
465
+ })) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_A_MEMBER_OF_THIS_ORGANIZATION);
466
+ const { members, total } = await adapter.listMembers({
467
+ organizationId,
468
+ limit: ctx.query?.limit ? Number(ctx.query.limit) : void 0,
469
+ offset: ctx.query?.offset ? Number(ctx.query.offset) : void 0,
470
+ sortBy: ctx.query?.sortBy,
471
+ sortOrder: ctx.query?.sortDirection,
472
+ filter: ctx.query?.filterField ? {
473
+ field: ctx.query?.filterField,
474
+ operator: ctx.query.filterOperator,
475
+ value: ctx.query.filterValue
476
+ } : void 0
477
+ });
478
+ return ctx.json({
479
+ members,
480
+ total
481
+ });
482
+ });
483
+ const getActiveMemberRoleQuerySchema = z.object({
484
+ userId: z.string().meta({ description: "The user ID to get the role for. If not provided, will default to the current user's" }).optional(),
485
+ organizationId: z.string().meta({ description: "The organization ID to list members for. If not provided, will default to the user's active organization. Eg: \"organization-id\"" }).optional(),
486
+ organizationSlug: z.string().meta({ description: "The organization slug to list members for. If not provided, will default to the user's active organization. Eg: \"organization-slug\"" }).optional()
487
+ }).optional();
488
+ const getActiveMemberRole = (options) => createAuthEndpoint("/organization/get-active-member-role", {
489
+ method: "GET",
490
+ query: getActiveMemberRoleQuerySchema,
491
+ requireHeaders: true,
492
+ use: [orgMiddleware, orgSessionMiddleware]
493
+ }, async (ctx) => {
494
+ const session = ctx.context.session;
495
+ let organizationId = ctx.query?.organizationId || session.session.activeOrganizationId;
496
+ const adapter = getOrgAdapter(ctx.context, options);
497
+ if (ctx.query?.organizationSlug) {
498
+ const organization = await adapter.findOrganizationBySlug(ctx.query?.organizationSlug);
499
+ if (!organization) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND);
500
+ organizationId = organization.id;
501
+ }
502
+ if (!organizationId) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION);
503
+ const isMember = await adapter.findMemberByOrgId({
504
+ userId: session.user.id,
505
+ organizationId
506
+ });
507
+ if (!isMember) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_A_MEMBER_OF_THIS_ORGANIZATION);
508
+ if (!ctx.query?.userId) return ctx.json({ role: isMember.role });
509
+ const userIdToGetRole = ctx.query?.userId;
510
+ const member = await adapter.findMemberByOrgId({
511
+ userId: userIdToGetRole,
512
+ organizationId
513
+ });
514
+ if (!member) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_A_MEMBER_OF_THIS_ORGANIZATION);
515
+ return ctx.json({ role: member?.role });
516
+ });
517
+ //#endregion
518
+ export { addMember, getActiveMember, getActiveMemberRole, leaveOrganization, listMembers, removeMember, updateMemberRole };