@sirketio/auth 0.0.1

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 (594) hide show
  1. package/dist/_virtual/_rolldown/runtime.mjs +36 -0
  2. package/dist/adapter/index.d.mts +4 -0
  3. package/dist/adapter/index.mjs +7 -0
  4. package/dist/api/index.d.mts +3872 -0
  5. package/dist/api/index.mjs +206 -0
  6. package/dist/api/index.mjs.map +1 -0
  7. package/dist/api/middlewares/index.d.mts +1 -0
  8. package/dist/api/middlewares/index.mjs +3 -0
  9. package/dist/api/middlewares/origin-check.d.mts +18 -0
  10. package/dist/api/middlewares/origin-check.mjs +140 -0
  11. package/dist/api/middlewares/origin-check.mjs.map +1 -0
  12. package/dist/api/rate-limiter/index.mjs +204 -0
  13. package/dist/api/rate-limiter/index.mjs.map +1 -0
  14. package/dist/api/routes/account.d.mts +410 -0
  15. package/dist/api/routes/account.mjs +493 -0
  16. package/dist/api/routes/account.mjs.map +1 -0
  17. package/dist/api/routes/callback.d.mts +31 -0
  18. package/dist/api/routes/callback.mjs +179 -0
  19. package/dist/api/routes/callback.mjs.map +1 -0
  20. package/dist/api/routes/email-verification.d.mts +161 -0
  21. package/dist/api/routes/email-verification.mjs +299 -0
  22. package/dist/api/routes/email-verification.mjs.map +1 -0
  23. package/dist/api/routes/error.d.mts +28 -0
  24. package/dist/api/routes/error.mjs +386 -0
  25. package/dist/api/routes/error.mjs.map +1 -0
  26. package/dist/api/routes/index.d.mts +11 -0
  27. package/dist/api/routes/index.mjs +13 -0
  28. package/dist/api/routes/ok.d.mts +36 -0
  29. package/dist/api/routes/ok.mjs +30 -0
  30. package/dist/api/routes/ok.mjs.map +1 -0
  31. package/dist/api/routes/password.d.mts +182 -0
  32. package/dist/api/routes/password.mjs +198 -0
  33. package/dist/api/routes/password.mjs.map +1 -0
  34. package/dist/api/routes/session.d.mts +415 -0
  35. package/dist/api/routes/session.mjs +483 -0
  36. package/dist/api/routes/session.mjs.map +1 -0
  37. package/dist/api/routes/sign-in.d.mts +171 -0
  38. package/dist/api/routes/sign-in.mjs +263 -0
  39. package/dist/api/routes/sign-in.mjs.map +1 -0
  40. package/dist/api/routes/sign-out.d.mts +36 -0
  41. package/dist/api/routes/sign-out.mjs +33 -0
  42. package/dist/api/routes/sign-out.mjs.map +1 -0
  43. package/dist/api/routes/sign-up.d.mts +160 -0
  44. package/dist/api/routes/sign-up.mjs +227 -0
  45. package/dist/api/routes/sign-up.mjs.map +1 -0
  46. package/dist/api/routes/update-user.d.mts +445 -0
  47. package/dist/api/routes/update-user.mjs +493 -0
  48. package/dist/api/routes/update-user.mjs.map +1 -0
  49. package/dist/api/state/oauth.d.mts +18 -0
  50. package/dist/api/state/oauth.mjs +8 -0
  51. package/dist/api/state/oauth.mjs.map +1 -0
  52. package/dist/api/state/should-session-refresh.d.mts +13 -0
  53. package/dist/api/state/should-session-refresh.mjs +16 -0
  54. package/dist/api/state/should-session-refresh.mjs.map +1 -0
  55. package/dist/api/to-auth-endpoints.mjs +197 -0
  56. package/dist/api/to-auth-endpoints.mjs.map +1 -0
  57. package/dist/auth/base.mjs +45 -0
  58. package/dist/auth/base.mjs.map +1 -0
  59. package/dist/auth/minimal.d.mts +12 -0
  60. package/dist/auth/minimal.mjs +14 -0
  61. package/dist/auth/minimal.mjs.map +1 -0
  62. package/dist/auth/trusted-origins.mjs +31 -0
  63. package/dist/auth/trusted-origins.mjs.map +1 -0
  64. package/dist/client/broadcast-channel.d.mts +20 -0
  65. package/dist/client/broadcast-channel.mjs +46 -0
  66. package/dist/client/broadcast-channel.mjs.map +1 -0
  67. package/dist/client/config.mjs +90 -0
  68. package/dist/client/config.mjs.map +1 -0
  69. package/dist/client/fetch-plugins.mjs +18 -0
  70. package/dist/client/fetch-plugins.mjs.map +1 -0
  71. package/dist/client/focus-manager.d.mts +11 -0
  72. package/dist/client/focus-manager.mjs +32 -0
  73. package/dist/client/focus-manager.mjs.map +1 -0
  74. package/dist/client/index.d.mts +33 -0
  75. package/dist/client/index.mjs +21 -0
  76. package/dist/client/index.mjs.map +1 -0
  77. package/dist/client/online-manager.d.mts +12 -0
  78. package/dist/client/online-manager.mjs +35 -0
  79. package/dist/client/online-manager.mjs.map +1 -0
  80. package/dist/client/parser.mjs +73 -0
  81. package/dist/client/parser.mjs.map +1 -0
  82. package/dist/client/path-to-object.d.mts +65 -0
  83. package/dist/client/plugins/index.d.mts +53 -0
  84. package/dist/client/plugins/index.mjs +30 -0
  85. package/dist/client/plugins/infer-plugin.d.mts +16 -0
  86. package/dist/client/plugins/infer-plugin.mjs +11 -0
  87. package/dist/client/plugins/infer-plugin.mjs.map +1 -0
  88. package/dist/client/proxy.mjs +79 -0
  89. package/dist/client/proxy.mjs.map +1 -0
  90. package/dist/client/query.d.mts +23 -0
  91. package/dist/client/query.mjs +98 -0
  92. package/dist/client/query.mjs.map +1 -0
  93. package/dist/client/react/index.d.mts +128 -0
  94. package/dist/client/react/index.mjs +24 -0
  95. package/dist/client/react/index.mjs.map +1 -0
  96. package/dist/client/react/react-store.d.mts +47 -0
  97. package/dist/client/react/react-store.mjs +47 -0
  98. package/dist/client/react/react-store.mjs.map +1 -0
  99. package/dist/client/session-atom.mjs +29 -0
  100. package/dist/client/session-atom.mjs.map +1 -0
  101. package/dist/client/session-refresh.d.mts +28 -0
  102. package/dist/client/session-refresh.mjs +140 -0
  103. package/dist/client/session-refresh.mjs.map +1 -0
  104. package/dist/client/types.d.mts +41 -0
  105. package/dist/client/vanilla.d.mts +127 -0
  106. package/dist/client/vanilla.mjs +20 -0
  107. package/dist/client/vanilla.mjs.map +1 -0
  108. package/dist/context/create-context.mjs +211 -0
  109. package/dist/context/create-context.mjs.map +1 -0
  110. package/dist/context/helpers.mjs +83 -0
  111. package/dist/context/helpers.mjs.map +1 -0
  112. package/dist/context/init.mjs +20 -0
  113. package/dist/context/init.mjs.map +1 -0
  114. package/dist/cookies/cookie-utils.d.mts +29 -0
  115. package/dist/cookies/cookie-utils.mjs +105 -0
  116. package/dist/cookies/cookie-utils.mjs.map +1 -0
  117. package/dist/cookies/index.d.mts +121 -0
  118. package/dist/cookies/index.mjs +261 -0
  119. package/dist/cookies/index.mjs.map +1 -0
  120. package/dist/cookies/session-store.d.mts +36 -0
  121. package/dist/cookies/session-store.mjs +200 -0
  122. package/dist/cookies/session-store.mjs.map +1 -0
  123. package/dist/crypto/buffer.d.mts +8 -0
  124. package/dist/crypto/buffer.mjs +18 -0
  125. package/dist/crypto/buffer.mjs.map +1 -0
  126. package/dist/crypto/index.d.mts +27 -0
  127. package/dist/crypto/index.mjs +38 -0
  128. package/dist/crypto/index.mjs.map +1 -0
  129. package/dist/crypto/jwt.d.mts +8 -0
  130. package/dist/crypto/jwt.mjs +95 -0
  131. package/dist/crypto/jwt.mjs.map +1 -0
  132. package/dist/crypto/password.d.mts +12 -0
  133. package/dist/crypto/password.mjs +36 -0
  134. package/dist/crypto/password.mjs.map +1 -0
  135. package/dist/crypto/random.d.mts +5 -0
  136. package/dist/crypto/random.mjs +8 -0
  137. package/dist/crypto/random.mjs.map +1 -0
  138. package/dist/db/adapter-base.d.mts +8 -0
  139. package/dist/db/adapter-base.mjs +19 -0
  140. package/dist/db/adapter-base.mjs.map +1 -0
  141. package/dist/db/field-converter.d.mts +8 -0
  142. package/dist/db/field-converter.mjs +21 -0
  143. package/dist/db/field-converter.mjs.map +1 -0
  144. package/dist/db/field.d.mts +42 -0
  145. package/dist/db/get-schema.d.mts +11 -0
  146. package/dist/db/get-schema.mjs +39 -0
  147. package/dist/db/get-schema.mjs.map +1 -0
  148. package/dist/db/index.d.mts +18 -0
  149. package/dist/db/index.mjs +34 -0
  150. package/dist/db/index.mjs.map +1 -0
  151. package/dist/db/internal-adapter.d.mts +14 -0
  152. package/dist/db/internal-adapter.mjs +616 -0
  153. package/dist/db/internal-adapter.mjs.map +1 -0
  154. package/dist/db/schema.d.mts +49 -0
  155. package/dist/db/schema.mjs +118 -0
  156. package/dist/db/schema.mjs.map +1 -0
  157. package/dist/db/to-zod.d.mts +36 -0
  158. package/dist/db/to-zod.mjs +26 -0
  159. package/dist/db/to-zod.mjs.map +1 -0
  160. package/dist/db/verification-token-storage.mjs +28 -0
  161. package/dist/db/verification-token-storage.mjs.map +1 -0
  162. package/dist/db/with-hooks.d.mts +33 -0
  163. package/dist/db/with-hooks.mjs +159 -0
  164. package/dist/db/with-hooks.mjs.map +1 -0
  165. package/dist/index.d.mts +53 -0
  166. package/dist/index.mjs +27 -0
  167. package/dist/integrations/next-js.d.mts +29 -0
  168. package/dist/integrations/next-js.mjs +85 -0
  169. package/dist/integrations/next-js.mjs.map +1 -0
  170. package/dist/oauth2/index.d.mts +5 -0
  171. package/dist/oauth2/index.mjs +7 -0
  172. package/dist/oauth2/link-account.d.mts +48 -0
  173. package/dist/oauth2/link-account.mjs +143 -0
  174. package/dist/oauth2/link-account.mjs.map +1 -0
  175. package/dist/oauth2/state.d.mts +26 -0
  176. package/dist/oauth2/state.mjs +51 -0
  177. package/dist/oauth2/state.mjs.map +1 -0
  178. package/dist/oauth2/utils.d.mts +8 -0
  179. package/dist/oauth2/utils.mjs +31 -0
  180. package/dist/oauth2/utils.mjs.map +1 -0
  181. package/dist/plugins/access/access.d.mts +30 -0
  182. package/dist/plugins/access/access.mjs +46 -0
  183. package/dist/plugins/access/access.mjs.map +1 -0
  184. package/dist/plugins/access/index.d.mts +3 -0
  185. package/dist/plugins/access/index.mjs +3 -0
  186. package/dist/plugins/access/types.d.mts +17 -0
  187. package/dist/plugins/additional-fields/client.d.mts +96 -0
  188. package/dist/plugins/additional-fields/client.mjs +11 -0
  189. package/dist/plugins/additional-fields/client.mjs.map +1 -0
  190. package/dist/plugins/admin/access/index.d.mts +2 -0
  191. package/dist/plugins/admin/access/index.mjs +3 -0
  192. package/dist/plugins/admin/access/statement.d.mts +118 -0
  193. package/dist/plugins/admin/access/statement.mjs +53 -0
  194. package/dist/plugins/admin/access/statement.mjs.map +1 -0
  195. package/dist/plugins/admin/admin.d.mts +911 -0
  196. package/dist/plugins/admin/admin.mjs +95 -0
  197. package/dist/plugins/admin/admin.mjs.map +1 -0
  198. package/dist/plugins/admin/client.d.mts +76 -0
  199. package/dist/plugins/admin/client.mjs +36 -0
  200. package/dist/plugins/admin/client.mjs.map +1 -0
  201. package/dist/plugins/admin/error-codes.d.mts +29 -0
  202. package/dist/plugins/admin/error-codes.mjs +30 -0
  203. package/dist/plugins/admin/error-codes.mjs.map +1 -0
  204. package/dist/plugins/admin/has-permission.mjs +16 -0
  205. package/dist/plugins/admin/has-permission.mjs.map +1 -0
  206. package/dist/plugins/admin/index.d.mts +3 -0
  207. package/dist/plugins/admin/index.mjs +3 -0
  208. package/dist/plugins/admin/routes.mjs +841 -0
  209. package/dist/plugins/admin/routes.mjs.map +1 -0
  210. package/dist/plugins/admin/schema.d.mts +40 -0
  211. package/dist/plugins/admin/schema.mjs +34 -0
  212. package/dist/plugins/admin/schema.mjs.map +1 -0
  213. package/dist/plugins/admin/types.d.mts +89 -0
  214. package/dist/plugins/api-key/adapter.mjs +468 -0
  215. package/dist/plugins/api-key/adapter.mjs.map +1 -0
  216. package/dist/plugins/api-key/client.d.mts +46 -0
  217. package/dist/plugins/api-key/client.mjs +19 -0
  218. package/dist/plugins/api-key/client.mjs.map +1 -0
  219. package/dist/plugins/api-key/error-codes.d.mts +33 -0
  220. package/dist/plugins/api-key/error-codes.mjs +34 -0
  221. package/dist/plugins/api-key/error-codes.mjs.map +1 -0
  222. package/dist/plugins/api-key/index.d.mts +1251 -0
  223. package/dist/plugins/api-key/index.mjs +134 -0
  224. package/dist/plugins/api-key/index.mjs.map +1 -0
  225. package/dist/plugins/api-key/rate-limit.mjs +74 -0
  226. package/dist/plugins/api-key/rate-limit.mjs.map +1 -0
  227. package/dist/plugins/api-key/routes/create-api-key.mjs +252 -0
  228. package/dist/plugins/api-key/routes/create-api-key.mjs.map +1 -0
  229. package/dist/plugins/api-key/routes/delete-all-expired-api-keys.mjs +24 -0
  230. package/dist/plugins/api-key/routes/delete-all-expired-api-keys.mjs.map +1 -0
  231. package/dist/plugins/api-key/routes/delete-api-key.mjs +74 -0
  232. package/dist/plugins/api-key/routes/delete-api-key.mjs.map +1 -0
  233. package/dist/plugins/api-key/routes/get-api-key.mjs +158 -0
  234. package/dist/plugins/api-key/routes/get-api-key.mjs.map +1 -0
  235. package/dist/plugins/api-key/routes/index.mjs +71 -0
  236. package/dist/plugins/api-key/routes/index.mjs.map +1 -0
  237. package/dist/plugins/api-key/routes/list-api-keys.mjs +194 -0
  238. package/dist/plugins/api-key/routes/list-api-keys.mjs.map +1 -0
  239. package/dist/plugins/api-key/routes/update-api-key.mjs +248 -0
  240. package/dist/plugins/api-key/routes/update-api-key.mjs.map +1 -0
  241. package/dist/plugins/api-key/routes/verify-api-key.mjs +224 -0
  242. package/dist/plugins/api-key/routes/verify-api-key.mjs.map +1 -0
  243. package/dist/plugins/api-key/schema.d.mts +199 -0
  244. package/dist/plugins/api-key/schema.mjs +130 -0
  245. package/dist/plugins/api-key/schema.mjs.map +1 -0
  246. package/dist/plugins/api-key/types.d.mts +346 -0
  247. package/dist/plugins/bearer/index.d.mts +45 -0
  248. package/dist/plugins/bearer/index.mjs +66 -0
  249. package/dist/plugins/bearer/index.mjs.map +1 -0
  250. package/dist/plugins/captcha/constants.d.mts +10 -0
  251. package/dist/plugins/captcha/constants.mjs +22 -0
  252. package/dist/plugins/captcha/constants.mjs.map +1 -0
  253. package/dist/plugins/captcha/error-codes.mjs +16 -0
  254. package/dist/plugins/captcha/error-codes.mjs.map +1 -0
  255. package/dist/plugins/captcha/index.d.mts +21 -0
  256. package/dist/plugins/captcha/index.mjs +62 -0
  257. package/dist/plugins/captcha/index.mjs.map +1 -0
  258. package/dist/plugins/captcha/types.d.mts +28 -0
  259. package/dist/plugins/captcha/utils.mjs +11 -0
  260. package/dist/plugins/captcha/utils.mjs.map +1 -0
  261. package/dist/plugins/captcha/verify-handlers/captchafox.mjs +28 -0
  262. package/dist/plugins/captcha/verify-handlers/captchafox.mjs.map +1 -0
  263. package/dist/plugins/captcha/verify-handlers/cloudflare-turnstile.mjs +26 -0
  264. package/dist/plugins/captcha/verify-handlers/cloudflare-turnstile.mjs.map +1 -0
  265. package/dist/plugins/captcha/verify-handlers/google-recaptcha.mjs +30 -0
  266. package/dist/plugins/captcha/verify-handlers/google-recaptcha.mjs.map +1 -0
  267. package/dist/plugins/captcha/verify-handlers/h-captcha.mjs +28 -0
  268. package/dist/plugins/captcha/verify-handlers/h-captcha.mjs.map +1 -0
  269. package/dist/plugins/captcha/verify-handlers/index.mjs +6 -0
  270. package/dist/plugins/custom-session/client.d.mts +17 -0
  271. package/dist/plugins/custom-session/client.mjs +11 -0
  272. package/dist/plugins/custom-session/client.mjs.map +1 -0
  273. package/dist/plugins/custom-session/index.d.mts +72 -0
  274. package/dist/plugins/custom-session/index.mjs +78 -0
  275. package/dist/plugins/custom-session/index.mjs.map +1 -0
  276. package/dist/plugins/device-authorization/client.d.mts +17 -0
  277. package/dist/plugins/device-authorization/client.mjs +18 -0
  278. package/dist/plugins/device-authorization/client.mjs.map +1 -0
  279. package/dist/plugins/device-authorization/error-codes.mjs +21 -0
  280. package/dist/plugins/device-authorization/error-codes.mjs.map +1 -0
  281. package/dist/plugins/device-authorization/index.d.mts +424 -0
  282. package/dist/plugins/device-authorization/index.mjs +50 -0
  283. package/dist/plugins/device-authorization/index.mjs.map +1 -0
  284. package/dist/plugins/device-authorization/routes.mjs +510 -0
  285. package/dist/plugins/device-authorization/routes.mjs.map +1 -0
  286. package/dist/plugins/device-authorization/schema.mjs +57 -0
  287. package/dist/plugins/device-authorization/schema.mjs.map +1 -0
  288. package/dist/plugins/email-otp/client.d.mts +21 -0
  289. package/dist/plugins/email-otp/client.mjs +18 -0
  290. package/dist/plugins/email-otp/client.mjs.map +1 -0
  291. package/dist/plugins/email-otp/error-codes.d.mts +11 -0
  292. package/dist/plugins/email-otp/error-codes.mjs +12 -0
  293. package/dist/plugins/email-otp/error-codes.mjs.map +1 -0
  294. package/dist/plugins/email-otp/index.d.mts +428 -0
  295. package/dist/plugins/email-otp/index.mjs +130 -0
  296. package/dist/plugins/email-otp/index.mjs.map +1 -0
  297. package/dist/plugins/email-otp/otp-token.mjs +29 -0
  298. package/dist/plugins/email-otp/otp-token.mjs.map +1 -0
  299. package/dist/plugins/email-otp/routes.mjs +631 -0
  300. package/dist/plugins/email-otp/routes.mjs.map +1 -0
  301. package/dist/plugins/email-otp/types.d.mts +86 -0
  302. package/dist/plugins/email-otp/utils.mjs +17 -0
  303. package/dist/plugins/email-otp/utils.mjs.map +1 -0
  304. package/dist/plugins/generic-oauth/client.d.mts +33 -0
  305. package/dist/plugins/generic-oauth/client.mjs +14 -0
  306. package/dist/plugins/generic-oauth/client.mjs.map +1 -0
  307. package/dist/plugins/generic-oauth/error-codes.d.mts +16 -0
  308. package/dist/plugins/generic-oauth/error-codes.mjs +17 -0
  309. package/dist/plugins/generic-oauth/error-codes.mjs.map +1 -0
  310. package/dist/plugins/generic-oauth/index.d.mts +201 -0
  311. package/dist/plugins/generic-oauth/index.mjs +145 -0
  312. package/dist/plugins/generic-oauth/index.mjs.map +1 -0
  313. package/dist/plugins/generic-oauth/providers/auth0.d.mts +37 -0
  314. package/dist/plugins/generic-oauth/providers/auth0.mjs +62 -0
  315. package/dist/plugins/generic-oauth/providers/auth0.mjs.map +1 -0
  316. package/dist/plugins/generic-oauth/providers/gumroad.d.mts +32 -0
  317. package/dist/plugins/generic-oauth/providers/gumroad.mjs +60 -0
  318. package/dist/plugins/generic-oauth/providers/gumroad.mjs.map +1 -0
  319. package/dist/plugins/generic-oauth/providers/hubspot.d.mts +37 -0
  320. package/dist/plugins/generic-oauth/providers/hubspot.mjs +60 -0
  321. package/dist/plugins/generic-oauth/providers/hubspot.mjs.map +1 -0
  322. package/dist/plugins/generic-oauth/providers/index.d.mts +9 -0
  323. package/dist/plugins/generic-oauth/providers/index.mjs +11 -0
  324. package/dist/plugins/generic-oauth/providers/keycloak.d.mts +37 -0
  325. package/dist/plugins/generic-oauth/providers/keycloak.mjs +62 -0
  326. package/dist/plugins/generic-oauth/providers/keycloak.mjs.map +1 -0
  327. package/dist/plugins/generic-oauth/providers/line.d.mts +55 -0
  328. package/dist/plugins/generic-oauth/providers/line.mjs +91 -0
  329. package/dist/plugins/generic-oauth/providers/line.mjs.map +1 -0
  330. package/dist/plugins/generic-oauth/providers/microsoft-entra-id.d.mts +37 -0
  331. package/dist/plugins/generic-oauth/providers/microsoft-entra-id.mjs +66 -0
  332. package/dist/plugins/generic-oauth/providers/microsoft-entra-id.mjs.map +1 -0
  333. package/dist/plugins/generic-oauth/providers/okta.d.mts +37 -0
  334. package/dist/plugins/generic-oauth/providers/okta.mjs +62 -0
  335. package/dist/plugins/generic-oauth/providers/okta.mjs.map +1 -0
  336. package/dist/plugins/generic-oauth/providers/patreon.d.mts +30 -0
  337. package/dist/plugins/generic-oauth/providers/patreon.mjs +59 -0
  338. package/dist/plugins/generic-oauth/providers/patreon.mjs.map +1 -0
  339. package/dist/plugins/generic-oauth/providers/slack.d.mts +30 -0
  340. package/dist/plugins/generic-oauth/providers/slack.mjs +61 -0
  341. package/dist/plugins/generic-oauth/providers/slack.mjs.map +1 -0
  342. package/dist/plugins/generic-oauth/routes.mjs +411 -0
  343. package/dist/plugins/generic-oauth/routes.mjs.map +1 -0
  344. package/dist/plugins/generic-oauth/types.d.mts +159 -0
  345. package/dist/plugins/haveibeenpwned/index.d.mts +46 -0
  346. package/dist/plugins/haveibeenpwned/index.mjs +57 -0
  347. package/dist/plugins/haveibeenpwned/index.mjs.map +1 -0
  348. package/dist/plugins/index.d.mts +65 -0
  349. package/dist/plugins/index.mjs +48 -0
  350. package/dist/plugins/jwt/adapter.mjs +27 -0
  351. package/dist/plugins/jwt/adapter.mjs.map +1 -0
  352. package/dist/plugins/jwt/client.d.mts +40 -0
  353. package/dist/plugins/jwt/client.mjs +19 -0
  354. package/dist/plugins/jwt/client.mjs.map +1 -0
  355. package/dist/plugins/jwt/index.d.mts +224 -0
  356. package/dist/plugins/jwt/index.mjs +202 -0
  357. package/dist/plugins/jwt/index.mjs.map +1 -0
  358. package/dist/plugins/jwt/schema.d.mts +26 -0
  359. package/dist/plugins/jwt/schema.mjs +23 -0
  360. package/dist/plugins/jwt/schema.mjs.map +1 -0
  361. package/dist/plugins/jwt/sign.d.mts +57 -0
  362. package/dist/plugins/jwt/sign.mjs +66 -0
  363. package/dist/plugins/jwt/sign.mjs.map +1 -0
  364. package/dist/plugins/jwt/types.d.mts +194 -0
  365. package/dist/plugins/jwt/utils.d.mts +42 -0
  366. package/dist/plugins/jwt/utils.mjs +64 -0
  367. package/dist/plugins/jwt/utils.mjs.map +1 -0
  368. package/dist/plugins/jwt/verify.d.mts +12 -0
  369. package/dist/plugins/jwt/verify.mjs +46 -0
  370. package/dist/plugins/jwt/verify.mjs.map +1 -0
  371. package/dist/plugins/last-login-method/client.d.mts +38 -0
  372. package/dist/plugins/last-login-method/client.mjs +32 -0
  373. package/dist/plugins/last-login-method/client.mjs.map +1 -0
  374. package/dist/plugins/last-login-method/index.d.mts +118 -0
  375. package/dist/plugins/last-login-method/index.mjs +76 -0
  376. package/dist/plugins/last-login-method/index.mjs.map +1 -0
  377. package/dist/plugins/magic-link/client.d.mts +10 -0
  378. package/dist/plugins/magic-link/client.mjs +11 -0
  379. package/dist/plugins/magic-link/client.mjs.map +1 -0
  380. package/dist/plugins/magic-link/index.d.mts +193 -0
  381. package/dist/plugins/magic-link/index.mjs +177 -0
  382. package/dist/plugins/magic-link/index.mjs.map +1 -0
  383. package/dist/plugins/magic-link/utils.mjs +12 -0
  384. package/dist/plugins/magic-link/utils.mjs.map +1 -0
  385. package/dist/plugins/mcp/authorize.mjs +133 -0
  386. package/dist/plugins/mcp/authorize.mjs.map +1 -0
  387. package/dist/plugins/mcp/index.d.mts +458 -0
  388. package/dist/plugins/mcp/index.mjs +717 -0
  389. package/dist/plugins/mcp/index.mjs.map +1 -0
  390. package/dist/plugins/multi-session/client.d.mts +19 -0
  391. package/dist/plugins/multi-session/client.mjs +20 -0
  392. package/dist/plugins/multi-session/client.mjs.map +1 -0
  393. package/dist/plugins/multi-session/error-codes.d.mts +9 -0
  394. package/dist/plugins/multi-session/error-codes.mjs +8 -0
  395. package/dist/plugins/multi-session/error-codes.mjs.map +1 -0
  396. package/dist/plugins/multi-session/index.d.mts +235 -0
  397. package/dist/plugins/multi-session/index.mjs +172 -0
  398. package/dist/plugins/multi-session/index.mjs.map +1 -0
  399. package/dist/plugins/oauth-proxy/index.d.mts +97 -0
  400. package/dist/plugins/oauth-proxy/index.mjs +305 -0
  401. package/dist/plugins/oauth-proxy/index.mjs.map +1 -0
  402. package/dist/plugins/oauth-proxy/utils.mjs +51 -0
  403. package/dist/plugins/oauth-proxy/utils.mjs.map +1 -0
  404. package/dist/plugins/oidc-provider/authorize.mjs +194 -0
  405. package/dist/plugins/oidc-provider/authorize.mjs.map +1 -0
  406. package/dist/plugins/oidc-provider/client.d.mts +12 -0
  407. package/dist/plugins/oidc-provider/client.mjs +11 -0
  408. package/dist/plugins/oidc-provider/client.mjs.map +1 -0
  409. package/dist/plugins/oidc-provider/error.mjs +17 -0
  410. package/dist/plugins/oidc-provider/error.mjs.map +1 -0
  411. package/dist/plugins/oidc-provider/index.d.mts +702 -0
  412. package/dist/plugins/oidc-provider/index.mjs +1093 -0
  413. package/dist/plugins/oidc-provider/index.mjs.map +1 -0
  414. package/dist/plugins/oidc-provider/schema.d.mts +160 -0
  415. package/dist/plugins/oidc-provider/schema.mjs +132 -0
  416. package/dist/plugins/oidc-provider/schema.mjs.map +1 -0
  417. package/dist/plugins/oidc-provider/types.d.mts +517 -0
  418. package/dist/plugins/oidc-provider/utils/prompt.mjs +19 -0
  419. package/dist/plugins/oidc-provider/utils/prompt.mjs.map +1 -0
  420. package/dist/plugins/oidc-provider/utils.mjs +15 -0
  421. package/dist/plugins/oidc-provider/utils.mjs.map +1 -0
  422. package/dist/plugins/one-tap/client.d.mts +174 -0
  423. package/dist/plugins/one-tap/client.mjs +188 -0
  424. package/dist/plugins/one-tap/client.mjs.map +1 -0
  425. package/dist/plugins/one-tap/index.d.mts +83 -0
  426. package/dist/plugins/one-tap/index.mjs +95 -0
  427. package/dist/plugins/one-tap/index.mjs.map +1 -0
  428. package/dist/plugins/one-time-token/client.d.mts +10 -0
  429. package/dist/plugins/one-time-token/client.mjs +11 -0
  430. package/dist/plugins/one-time-token/client.mjs.map +1 -0
  431. package/dist/plugins/one-time-token/index.d.mts +133 -0
  432. package/dist/plugins/one-time-token/index.mjs +82 -0
  433. package/dist/plugins/one-time-token/index.mjs.map +1 -0
  434. package/dist/plugins/one-time-token/utils.mjs +12 -0
  435. package/dist/plugins/one-time-token/utils.mjs.map +1 -0
  436. package/dist/plugins/open-api/generator.d.mts +115 -0
  437. package/dist/plugins/open-api/generator.mjs +315 -0
  438. package/dist/plugins/open-api/generator.mjs.map +1 -0
  439. package/dist/plugins/open-api/index.d.mts +97 -0
  440. package/dist/plugins/open-api/index.mjs +67 -0
  441. package/dist/plugins/open-api/index.mjs.map +1 -0
  442. package/dist/plugins/open-api/logo.mjs +15 -0
  443. package/dist/plugins/open-api/logo.mjs.map +1 -0
  444. package/dist/plugins/organization/access/index.d.mts +2 -0
  445. package/dist/plugins/organization/access/index.mjs +3 -0
  446. package/dist/plugins/organization/access/statement.d.mts +249 -0
  447. package/dist/plugins/organization/access/statement.mjs +81 -0
  448. package/dist/plugins/organization/access/statement.mjs.map +1 -0
  449. package/dist/plugins/organization/adapter.d.mts +792 -0
  450. package/dist/plugins/organization/adapter.mjs +624 -0
  451. package/dist/plugins/organization/adapter.mjs.map +1 -0
  452. package/dist/plugins/organization/call.mjs +19 -0
  453. package/dist/plugins/organization/call.mjs.map +1 -0
  454. package/dist/plugins/organization/client.d.mts +372 -0
  455. package/dist/plugins/organization/client.mjs +95 -0
  456. package/dist/plugins/organization/client.mjs.map +1 -0
  457. package/dist/plugins/organization/error-codes.d.mts +65 -0
  458. package/dist/plugins/organization/error-codes.mjs +66 -0
  459. package/dist/plugins/organization/error-codes.mjs.map +1 -0
  460. package/dist/plugins/organization/has-permission.mjs +35 -0
  461. package/dist/plugins/organization/has-permission.mjs.map +1 -0
  462. package/dist/plugins/organization/index.d.mts +5 -0
  463. package/dist/plugins/organization/index.mjs +4 -0
  464. package/dist/plugins/organization/organization.d.mts +394 -0
  465. package/dist/plugins/organization/organization.mjs +428 -0
  466. package/dist/plugins/organization/organization.mjs.map +1 -0
  467. package/dist/plugins/organization/permission.d.mts +17 -0
  468. package/dist/plugins/organization/permission.mjs +16 -0
  469. package/dist/plugins/organization/permission.mjs.map +1 -0
  470. package/dist/plugins/organization/routes/crud-access-control.d.mts +394 -0
  471. package/dist/plugins/organization/routes/crud-access-control.mjs +678 -0
  472. package/dist/plugins/organization/routes/crud-access-control.mjs.map +1 -0
  473. package/dist/plugins/organization/routes/crud-invites.d.mts +1031 -0
  474. package/dist/plugins/organization/routes/crud-invites.mjs +551 -0
  475. package/dist/plugins/organization/routes/crud-invites.mjs.map +1 -0
  476. package/dist/plugins/organization/routes/crud-members.d.mts +940 -0
  477. package/dist/plugins/organization/routes/crud-members.mjs +466 -0
  478. package/dist/plugins/organization/routes/crud-members.mjs.map +1 -0
  479. package/dist/plugins/organization/routes/crud-org.d.mts +708 -0
  480. package/dist/plugins/organization/routes/crud-org.mjs +423 -0
  481. package/dist/plugins/organization/routes/crud-org.mjs.map +1 -0
  482. package/dist/plugins/organization/routes/crud-team.d.mts +1071 -0
  483. package/dist/plugins/organization/routes/crud-team.mjs +676 -0
  484. package/dist/plugins/organization/routes/crud-team.mjs.map +1 -0
  485. package/dist/plugins/organization/schema.d.mts +376 -0
  486. package/dist/plugins/organization/schema.mjs +68 -0
  487. package/dist/plugins/organization/schema.mjs.map +1 -0
  488. package/dist/plugins/organization/types.d.mts +677 -0
  489. package/dist/plugins/phone-number/client.d.mts +31 -0
  490. package/dist/plugins/phone-number/client.mjs +20 -0
  491. package/dist/plugins/phone-number/client.mjs.map +1 -0
  492. package/dist/plugins/phone-number/error-codes.d.mts +20 -0
  493. package/dist/plugins/phone-number/error-codes.mjs +21 -0
  494. package/dist/plugins/phone-number/error-codes.mjs.map +1 -0
  495. package/dist/plugins/phone-number/index.d.mts +318 -0
  496. package/dist/plugins/phone-number/index.mjs +49 -0
  497. package/dist/plugins/phone-number/index.mjs.map +1 -0
  498. package/dist/plugins/phone-number/routes.mjs +472 -0
  499. package/dist/plugins/phone-number/routes.mjs.map +1 -0
  500. package/dist/plugins/phone-number/schema.d.mts +23 -0
  501. package/dist/plugins/phone-number/schema.mjs +20 -0
  502. package/dist/plugins/phone-number/schema.mjs.map +1 -0
  503. package/dist/plugins/phone-number/types.d.mts +118 -0
  504. package/dist/plugins/two-factor/backup-codes/index.d.mts +279 -0
  505. package/dist/plugins/two-factor/backup-codes/index.mjs +277 -0
  506. package/dist/plugins/two-factor/backup-codes/index.mjs.map +1 -0
  507. package/dist/plugins/two-factor/client.d.mts +55 -0
  508. package/dist/plugins/two-factor/client.mjs +37 -0
  509. package/dist/plugins/two-factor/client.mjs.map +1 -0
  510. package/dist/plugins/two-factor/constant.mjs +8 -0
  511. package/dist/plugins/two-factor/constant.mjs.map +1 -0
  512. package/dist/plugins/two-factor/error-code.d.mts +17 -0
  513. package/dist/plugins/two-factor/error-code.mjs +18 -0
  514. package/dist/plugins/two-factor/error-code.mjs.map +1 -0
  515. package/dist/plugins/two-factor/index.d.mts +670 -0
  516. package/dist/plugins/two-factor/index.mjs +228 -0
  517. package/dist/plugins/two-factor/index.mjs.map +1 -0
  518. package/dist/plugins/two-factor/otp/index.d.mts +216 -0
  519. package/dist/plugins/two-factor/otp/index.mjs +199 -0
  520. package/dist/plugins/two-factor/otp/index.mjs.map +1 -0
  521. package/dist/plugins/two-factor/schema.d.mts +41 -0
  522. package/dist/plugins/two-factor/schema.mjs +36 -0
  523. package/dist/plugins/two-factor/schema.mjs.map +1 -0
  524. package/dist/plugins/two-factor/totp/index.d.mts +210 -0
  525. package/dist/plugins/two-factor/totp/index.mjs +157 -0
  526. package/dist/plugins/two-factor/totp/index.mjs.map +1 -0
  527. package/dist/plugins/two-factor/types.d.mts +73 -0
  528. package/dist/plugins/two-factor/utils.mjs +12 -0
  529. package/dist/plugins/two-factor/utils.mjs.map +1 -0
  530. package/dist/plugins/two-factor/verify-two-factor.mjs +85 -0
  531. package/dist/plugins/two-factor/verify-two-factor.mjs.map +1 -0
  532. package/dist/plugins/username/client.d.mts +26 -0
  533. package/dist/plugins/username/client.mjs +18 -0
  534. package/dist/plugins/username/client.mjs.map +1 -0
  535. package/dist/plugins/username/error-codes.d.mts +16 -0
  536. package/dist/plugins/username/error-codes.mjs +17 -0
  537. package/dist/plugins/username/error-codes.mjs.map +1 -0
  538. package/dist/plugins/username/index.d.mts +251 -0
  539. package/dist/plugins/username/index.mjs +234 -0
  540. package/dist/plugins/username/index.mjs.map +1 -0
  541. package/dist/plugins/username/schema.d.mts +33 -0
  542. package/dist/plugins/username/schema.mjs +26 -0
  543. package/dist/plugins/username/schema.mjs.map +1 -0
  544. package/dist/providers/index.d.mts +1 -0
  545. package/dist/providers/index.mjs +3 -0
  546. package/dist/state.d.mts +42 -0
  547. package/dist/state.mjs +107 -0
  548. package/dist/state.mjs.map +1 -0
  549. package/dist/types/adapter.d.mts +2 -0
  550. package/dist/types/api.d.mts +29 -0
  551. package/dist/types/auth.d.mts +29 -0
  552. package/dist/types/helper.d.mts +10 -0
  553. package/dist/types/index.d.mts +11 -0
  554. package/dist/types/index.mjs +1 -0
  555. package/dist/types/models.d.mts +11 -0
  556. package/dist/types/plugins.d.mts +20 -0
  557. package/dist/utils/boolean.mjs +8 -0
  558. package/dist/utils/boolean.mjs.map +1 -0
  559. package/dist/utils/constants.mjs +6 -0
  560. package/dist/utils/constants.mjs.map +1 -0
  561. package/dist/utils/date.mjs +8 -0
  562. package/dist/utils/date.mjs.map +1 -0
  563. package/dist/utils/get-request-ip.d.mts +7 -0
  564. package/dist/utils/get-request-ip.mjs +23 -0
  565. package/dist/utils/get-request-ip.mjs.map +1 -0
  566. package/dist/utils/hide-metadata.d.mts +7 -0
  567. package/dist/utils/hide-metadata.mjs +6 -0
  568. package/dist/utils/hide-metadata.mjs.map +1 -0
  569. package/dist/utils/index.d.mts +4 -0
  570. package/dist/utils/index.mjs +6 -0
  571. package/dist/utils/is-api-error.d.mts +7 -0
  572. package/dist/utils/is-api-error.mjs +11 -0
  573. package/dist/utils/is-api-error.mjs.map +1 -0
  574. package/dist/utils/is-atom.mjs +8 -0
  575. package/dist/utils/is-atom.mjs.map +1 -0
  576. package/dist/utils/is-promise.mjs +8 -0
  577. package/dist/utils/is-promise.mjs.map +1 -0
  578. package/dist/utils/middleware-response.mjs +9 -0
  579. package/dist/utils/middleware-response.mjs.map +1 -0
  580. package/dist/utils/password.mjs +26 -0
  581. package/dist/utils/password.mjs.map +1 -0
  582. package/dist/utils/plugin-helper.mjs +17 -0
  583. package/dist/utils/plugin-helper.mjs.map +1 -0
  584. package/dist/utils/shim.mjs +24 -0
  585. package/dist/utils/shim.mjs.map +1 -0
  586. package/dist/utils/time.d.mts +49 -0
  587. package/dist/utils/time.mjs +100 -0
  588. package/dist/utils/time.mjs.map +1 -0
  589. package/dist/utils/url.d.mts +8 -0
  590. package/dist/utils/url.mjs +92 -0
  591. package/dist/utils/url.mjs.map +1 -0
  592. package/dist/utils/wildcard.mjs +108 -0
  593. package/dist/utils/wildcard.mjs.map +1 -0
  594. package/package.json +428 -0
@@ -0,0 +1,466 @@
1
+ import { toZodSchema } from "../../../db/to-zod.mjs";
2
+ import { getSessionFromCtx, sessionMiddleware } from "../../../api/routes/session.mjs";
3
+ import "../../../api/index.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 { createAuthEndpoint } from "@better-auth/core/api";
11
+ import * as z from "zod";
12
+ import { whereOperators } from "@better-auth/core/db/adapter";
13
+
14
+ //#region src/plugins/organization/routes/crud-members.ts
15
+ const baseMemberSchema = z.object({
16
+ 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\"" }),
17
+ role: z.union([z.string(), z.array(z.string())]).meta({ description: "The role(s) to assign to the new member. Eg: [\"admin\", \"sale\"]" }),
18
+ 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(),
19
+ teamId: z.string().meta({ description: "An optional team ID to add the member to. Eg: \"team-id\"" }).optional()
20
+ });
21
+ const addMember = (option) => {
22
+ const additionalFieldsSchema = toZodSchema({
23
+ fields: option?.schema?.member?.additionalFields || {},
24
+ isClientSide: true
25
+ });
26
+ return createAuthEndpoint({
27
+ method: "POST",
28
+ body: z.object({
29
+ ...baseMemberSchema.shape,
30
+ ...additionalFieldsSchema.shape
31
+ }),
32
+ use: [orgMiddleware],
33
+ metadata: {
34
+ $Infer: { body: {} },
35
+ openapi: {
36
+ operationId: "addOrganizationMember",
37
+ description: "Add a member to an organization"
38
+ }
39
+ }
40
+ }, async (ctx) => {
41
+ const session = ctx.body.userId ? await getSessionFromCtx(ctx).catch((e) => null) : null;
42
+ const orgId = ctx.body.organizationId || session?.session.activeOrganizationId;
43
+ if (!orgId) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION);
44
+ const teamId = "teamId" in ctx.body ? ctx.body.teamId : void 0;
45
+ if (teamId && !ctx.context.orgOptions.teams?.enabled) {
46
+ ctx.context.logger.error("Teams are not enabled");
47
+ throw APIError.fromStatus("BAD_REQUEST", { message: "Teams are not enabled" });
48
+ }
49
+ const adapter = getOrgAdapter(ctx.context, option);
50
+ const user = await ctx.context.internalAdapter.findUserById(ctx.body.userId);
51
+ if (!user) throw APIError.from("BAD_REQUEST", BASE_ERROR_CODES.USER_NOT_FOUND);
52
+ if (await adapter.findMemberByEmail({
53
+ email: user.email,
54
+ organizationId: orgId
55
+ })) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.USER_IS_ALREADY_A_MEMBER_OF_THIS_ORGANIZATION);
56
+ if (teamId) {
57
+ const team = await adapter.findTeamById({
58
+ teamId,
59
+ organizationId: orgId
60
+ });
61
+ if (!team || team.organizationId !== orgId) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.TEAM_NOT_FOUND);
62
+ }
63
+ const membershipLimit = ctx.context.orgOptions?.membershipLimit || 100;
64
+ const count = await adapter.countMembers({ organizationId: orgId });
65
+ const organization = await adapter.findOrganizationById(orgId);
66
+ if (!organization) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND);
67
+ if (count >= (typeof membershipLimit === "number" ? membershipLimit : await membershipLimit(user, organization))) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.ORGANIZATION_MEMBERSHIP_LIMIT_REACHED);
68
+ const { role: _, userId: __, organizationId: ___, ...additionalFields } = ctx.body;
69
+ let memberData = {
70
+ organizationId: orgId,
71
+ userId: user.id,
72
+ role: parseRoles(ctx.body.role),
73
+ createdAt: /* @__PURE__ */ new Date(),
74
+ ...additionalFields ? additionalFields : {}
75
+ };
76
+ if (option?.organizationHooks?.beforeAddMember) {
77
+ const response = await option?.organizationHooks.beforeAddMember({
78
+ member: {
79
+ userId: user.id,
80
+ organizationId: orgId,
81
+ role: parseRoles(ctx.body.role),
82
+ ...additionalFields
83
+ },
84
+ user,
85
+ organization
86
+ });
87
+ if (response && typeof response === "object" && "data" in response) memberData = {
88
+ ...memberData,
89
+ ...response.data
90
+ };
91
+ }
92
+ const createdMember = await adapter.createMember(memberData);
93
+ if (teamId) await adapter.findOrCreateTeamMember({
94
+ userId: user.id,
95
+ teamId
96
+ });
97
+ if (option?.organizationHooks?.afterAddMember) await option?.organizationHooks.afterAddMember({
98
+ member: createdMember,
99
+ user,
100
+ organization
101
+ });
102
+ return ctx.json(createdMember);
103
+ });
104
+ };
105
+ const removeMemberBodySchema = z.object({
106
+ memberIdOrEmail: z.string().meta({ description: "The ID or email of the member to remove" }),
107
+ 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()
108
+ });
109
+ const removeMember = (options) => createAuthEndpoint("/organization/remove-member", {
110
+ method: "POST",
111
+ body: removeMemberBodySchema,
112
+ requireHeaders: true,
113
+ use: [orgMiddleware, orgSessionMiddleware],
114
+ metadata: { openapi: {
115
+ description: "Remove a member from an organization",
116
+ responses: { "200": {
117
+ description: "Success",
118
+ content: { "application/json": { schema: {
119
+ type: "object",
120
+ properties: { member: {
121
+ type: "object",
122
+ properties: {
123
+ id: { type: "string" },
124
+ userId: { type: "string" },
125
+ organizationId: { type: "string" },
126
+ role: { type: "string" }
127
+ },
128
+ required: [
129
+ "id",
130
+ "userId",
131
+ "organizationId",
132
+ "role"
133
+ ]
134
+ } },
135
+ required: ["member"]
136
+ } } }
137
+ } }
138
+ } }
139
+ }, async (ctx) => {
140
+ const session = ctx.context.session;
141
+ const organizationId = ctx.body.organizationId || session.session.activeOrganizationId;
142
+ if (!organizationId) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION);
143
+ const adapter = getOrgAdapter(ctx.context, options);
144
+ const member = await adapter.findMemberByOrgId({
145
+ userId: session.user.id,
146
+ organizationId
147
+ });
148
+ if (!member) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
149
+ let toBeRemovedMember = null;
150
+ if (ctx.body.memberIdOrEmail.includes("@")) toBeRemovedMember = await adapter.findMemberByEmail({
151
+ email: ctx.body.memberIdOrEmail,
152
+ organizationId
153
+ });
154
+ else {
155
+ const result = await adapter.findMemberById(ctx.body.memberIdOrEmail);
156
+ if (!result) toBeRemovedMember = null;
157
+ else {
158
+ const { user: _user, ...member } = result;
159
+ toBeRemovedMember = member;
160
+ }
161
+ }
162
+ if (!toBeRemovedMember) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
163
+ const roles = toBeRemovedMember.role.split(",");
164
+ const creatorRole = ctx.context.orgOptions?.creatorRole || "owner";
165
+ if (roles.includes(creatorRole)) {
166
+ if (member.role !== creatorRole) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.YOU_CANNOT_LEAVE_THE_ORGANIZATION_AS_THE_ONLY_OWNER);
167
+ const { members } = await adapter.listMembers({ organizationId });
168
+ if (members.filter((member) => {
169
+ return member.role.split(",").includes(creatorRole);
170
+ }).length <= 1) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.YOU_CANNOT_LEAVE_THE_ORGANIZATION_AS_THE_ONLY_OWNER);
171
+ }
172
+ if (!await hasPermission({
173
+ role: member.role,
174
+ options: ctx.context.orgOptions,
175
+ permissions: { member: ["delete"] },
176
+ organizationId
177
+ }, ctx)) throw APIError.from("UNAUTHORIZED", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_DELETE_THIS_MEMBER);
178
+ if (toBeRemovedMember?.organizationId !== organizationId) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
179
+ const organization = await adapter.findOrganizationById(organizationId);
180
+ if (!organization) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND);
181
+ const userBeingRemoved = await ctx.context.internalAdapter.findUserById(toBeRemovedMember.userId);
182
+ if (!userBeingRemoved) throw APIError.fromStatus("BAD_REQUEST", { message: "User not found" });
183
+ if (options?.organizationHooks?.beforeRemoveMember) await options?.organizationHooks.beforeRemoveMember({
184
+ member: toBeRemovedMember,
185
+ user: userBeingRemoved,
186
+ organization
187
+ });
188
+ await adapter.deleteMember({
189
+ memberId: toBeRemovedMember.id,
190
+ organizationId,
191
+ userId: toBeRemovedMember.userId
192
+ });
193
+ if (session.user.id === toBeRemovedMember.userId && session.session.activeOrganizationId === toBeRemovedMember.organizationId) await adapter.setActiveOrganization(session.session.token, null, ctx);
194
+ if (options?.organizationHooks?.afterRemoveMember) await options?.organizationHooks.afterRemoveMember({
195
+ member: toBeRemovedMember,
196
+ user: userBeingRemoved,
197
+ organization
198
+ });
199
+ return ctx.json({ member: toBeRemovedMember });
200
+ });
201
+ const updateMemberRoleBodySchema = z.object({
202
+ 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\"]" }),
203
+ memberId: z.string().meta({ description: "The member id to apply the role update to. Eg: \"member-id\"" }),
204
+ 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()
205
+ });
206
+ const updateMemberRole = (option) => createAuthEndpoint("/organization/update-member-role", {
207
+ method: "POST",
208
+ body: updateMemberRoleBodySchema,
209
+ use: [orgMiddleware, orgSessionMiddleware],
210
+ requireHeaders: true,
211
+ metadata: {
212
+ $Infer: { body: {} },
213
+ openapi: {
214
+ operationId: "updateOrganizationMemberRole",
215
+ description: "Update the role of a member in an organization",
216
+ responses: { "200": {
217
+ description: "Success",
218
+ content: { "application/json": { schema: {
219
+ type: "object",
220
+ properties: { member: {
221
+ type: "object",
222
+ properties: {
223
+ id: { type: "string" },
224
+ userId: { type: "string" },
225
+ organizationId: { type: "string" },
226
+ role: { type: "string" }
227
+ },
228
+ required: [
229
+ "id",
230
+ "userId",
231
+ "organizationId",
232
+ "role"
233
+ ]
234
+ } },
235
+ required: ["member"]
236
+ } } }
237
+ } }
238
+ }
239
+ }
240
+ }, async (ctx) => {
241
+ const session = ctx.context.session;
242
+ if (!ctx.body.role) throw APIError.fromStatus("BAD_REQUEST");
243
+ const organizationId = ctx.body.organizationId || session.session.activeOrganizationId;
244
+ if (!organizationId) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION);
245
+ const adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);
246
+ const roleToSet = Array.isArray(ctx.body.role) ? ctx.body.role : ctx.body.role ? [ctx.body.role] : [];
247
+ const member = await adapter.findMemberByOrgId({
248
+ userId: session.user.id,
249
+ organizationId
250
+ });
251
+ if (!member) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
252
+ const toBeUpdatedMember = member.id !== ctx.body.memberId ? await adapter.findMemberById(ctx.body.memberId) : member;
253
+ if (!toBeUpdatedMember) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
254
+ if (!(toBeUpdatedMember.organizationId === organizationId)) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_MEMBER);
255
+ const creatorRole = ctx.context.orgOptions?.creatorRole || "owner";
256
+ const updatingMemberRoles = member.role.split(",");
257
+ const isUpdatingCreator = toBeUpdatedMember.role.split(",").includes(creatorRole);
258
+ const updaterIsCreator = updatingMemberRoles.includes(creatorRole);
259
+ const isSettingCreatorRole = roleToSet.includes(creatorRole);
260
+ const memberIsUpdatingThemselves = member.id === toBeUpdatedMember.id;
261
+ if (isUpdatingCreator && !updaterIsCreator || isSettingCreatorRole && !updaterIsCreator) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_MEMBER);
262
+ if (updaterIsCreator && memberIsUpdatingThemselves) {
263
+ if ((await ctx.context.adapter.findMany({
264
+ model: "member",
265
+ where: [{
266
+ field: "organizationId",
267
+ value: organizationId
268
+ }]
269
+ })).filter((member) => {
270
+ return member.role.split(",").includes(creatorRole);
271
+ }).length <= 1 && !isSettingCreatorRole) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.YOU_CANNOT_LEAVE_THE_ORGANIZATION_WITHOUT_AN_OWNER);
272
+ }
273
+ if (!await hasPermission({
274
+ role: member.role,
275
+ options: ctx.context.orgOptions,
276
+ permissions: { member: ["update"] },
277
+ allowCreatorAllPermissions: true,
278
+ organizationId
279
+ }, ctx)) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_MEMBER);
280
+ const organization = await adapter.findOrganizationById(organizationId);
281
+ if (!organization) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND);
282
+ const userBeingUpdated = await ctx.context.internalAdapter.findUserById(toBeUpdatedMember.userId);
283
+ if (!userBeingUpdated) throw APIError.fromStatus("BAD_REQUEST", { message: "User not found" });
284
+ const previousRole = toBeUpdatedMember.role;
285
+ const newRole = parseRoles(ctx.body.role);
286
+ if (option?.organizationHooks?.beforeUpdateMemberRole) {
287
+ const response = await option?.organizationHooks.beforeUpdateMemberRole({
288
+ member: toBeUpdatedMember,
289
+ newRole,
290
+ user: userBeingUpdated,
291
+ organization
292
+ });
293
+ if (response && typeof response === "object" && "data" in response) {
294
+ const updatedMember = await adapter.updateMember(ctx.body.memberId, response.data.role || newRole);
295
+ if (!updatedMember) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
296
+ if (option?.organizationHooks?.afterUpdateMemberRole) await option?.organizationHooks.afterUpdateMemberRole({
297
+ member: updatedMember,
298
+ previousRole,
299
+ user: userBeingUpdated,
300
+ organization
301
+ });
302
+ return ctx.json(updatedMember);
303
+ }
304
+ }
305
+ const updatedMember = await adapter.updateMember(ctx.body.memberId, newRole);
306
+ if (!updatedMember) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
307
+ if (option?.organizationHooks?.afterUpdateMemberRole) await option?.organizationHooks.afterUpdateMemberRole({
308
+ member: updatedMember,
309
+ previousRole,
310
+ user: userBeingUpdated,
311
+ organization
312
+ });
313
+ return ctx.json(updatedMember);
314
+ });
315
+ const getActiveMember = (options) => createAuthEndpoint("/organization/get-active-member", {
316
+ method: "GET",
317
+ use: [orgMiddleware, orgSessionMiddleware],
318
+ requireHeaders: true,
319
+ metadata: { openapi: {
320
+ description: "Get the member details of the active organization",
321
+ responses: { "200": {
322
+ description: "Success",
323
+ content: { "application/json": { schema: {
324
+ type: "object",
325
+ properties: {
326
+ id: { type: "string" },
327
+ userId: { type: "string" },
328
+ organizationId: { type: "string" },
329
+ role: { type: "string" }
330
+ },
331
+ required: [
332
+ "id",
333
+ "userId",
334
+ "organizationId",
335
+ "role"
336
+ ]
337
+ } } }
338
+ } }
339
+ } }
340
+ }, async (ctx) => {
341
+ const session = ctx.context.session;
342
+ const organizationId = session.session.activeOrganizationId;
343
+ if (!organizationId) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION);
344
+ const member = await getOrgAdapter(ctx.context, options).findMemberByOrgId({
345
+ userId: session.user.id,
346
+ organizationId
347
+ });
348
+ if (!member) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
349
+ return ctx.json(member);
350
+ });
351
+ const leaveOrganizationBodySchema = z.object({ organizationId: z.string().meta({ description: "The organization Id for the member to leave. Eg: \"organization-id\"" }) });
352
+ const leaveOrganization = (options) => createAuthEndpoint("/organization/leave", {
353
+ method: "POST",
354
+ body: leaveOrganizationBodySchema,
355
+ requireHeaders: true,
356
+ use: [sessionMiddleware, orgMiddleware]
357
+ }, async (ctx) => {
358
+ const session = ctx.context.session;
359
+ const adapter = getOrgAdapter(ctx.context, options);
360
+ const member = await adapter.findMemberByOrgId({
361
+ userId: session.user.id,
362
+ organizationId: ctx.body.organizationId
363
+ });
364
+ if (!member) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND);
365
+ const creatorRole = ctx.context.orgOptions?.creatorRole || "owner";
366
+ if (member.role.split(",").includes(creatorRole)) {
367
+ if ((await ctx.context.adapter.findMany({
368
+ model: "member",
369
+ where: [{
370
+ field: "organizationId",
371
+ value: ctx.body.organizationId
372
+ }]
373
+ })).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);
374
+ }
375
+ await adapter.deleteMember({
376
+ memberId: member.id,
377
+ organizationId: ctx.body.organizationId,
378
+ userId: session.user.id
379
+ });
380
+ if (session.session.activeOrganizationId === ctx.body.organizationId) await adapter.setActiveOrganization(session.session.token, null, ctx);
381
+ return ctx.json(member);
382
+ });
383
+ const listMembers = (options) => createAuthEndpoint("/organization/list-members", {
384
+ method: "GET",
385
+ query: z.object({
386
+ limit: z.string().meta({ description: "The number of users to return" }).or(z.number()).optional(),
387
+ offset: z.string().meta({ description: "The offset to start from" }).or(z.number()).optional(),
388
+ sortBy: z.string().meta({ description: "The field to sort by" }).optional(),
389
+ sortDirection: z.enum(["asc", "desc"]).meta({ description: "The direction to sort by" }).optional(),
390
+ filterField: z.string().meta({ description: "The field to filter by" }).optional(),
391
+ 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(),
392
+ filterOperator: z.enum(whereOperators).meta({ description: "The operator to use for the filter" }).optional(),
393
+ 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(),
394
+ 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()
395
+ }).optional(),
396
+ requireHeaders: true,
397
+ use: [orgMiddleware, orgSessionMiddleware]
398
+ }, async (ctx) => {
399
+ const session = ctx.context.session;
400
+ let organizationId = ctx.query?.organizationId || session.session.activeOrganizationId;
401
+ const adapter = getOrgAdapter(ctx.context, options);
402
+ if (ctx.query?.organizationSlug) {
403
+ const organization = await adapter.findOrganizationBySlug(ctx.query?.organizationSlug);
404
+ if (!organization) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND);
405
+ organizationId = organization.id;
406
+ }
407
+ if (!organizationId) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION);
408
+ if (!await adapter.findMemberByOrgId({
409
+ userId: session.user.id,
410
+ organizationId
411
+ })) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_A_MEMBER_OF_THIS_ORGANIZATION);
412
+ const { members, total } = await adapter.listMembers({
413
+ organizationId,
414
+ limit: ctx.query?.limit ? Number(ctx.query.limit) : void 0,
415
+ offset: ctx.query?.offset ? Number(ctx.query.offset) : void 0,
416
+ sortBy: ctx.query?.sortBy,
417
+ sortOrder: ctx.query?.sortDirection,
418
+ filter: ctx.query?.filterField ? {
419
+ field: ctx.query?.filterField,
420
+ operator: ctx.query.filterOperator,
421
+ value: ctx.query.filterValue
422
+ } : void 0
423
+ });
424
+ return ctx.json({
425
+ members,
426
+ total
427
+ });
428
+ });
429
+ const getActiveMemberRoleQuerySchema = z.object({
430
+ userId: z.string().meta({ description: "The user ID to get the role for. If not provided, will default to the current user's" }).optional(),
431
+ 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(),
432
+ 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()
433
+ }).optional();
434
+ const getActiveMemberRole = (options) => createAuthEndpoint("/organization/get-active-member-role", {
435
+ method: "GET",
436
+ query: getActiveMemberRoleQuerySchema,
437
+ requireHeaders: true,
438
+ use: [orgMiddleware, orgSessionMiddleware]
439
+ }, async (ctx) => {
440
+ const session = ctx.context.session;
441
+ let organizationId = ctx.query?.organizationId || session.session.activeOrganizationId;
442
+ const adapter = getOrgAdapter(ctx.context, options);
443
+ if (ctx.query?.organizationSlug) {
444
+ const organization = await adapter.findOrganizationBySlug(ctx.query?.organizationSlug);
445
+ if (!organization) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND);
446
+ organizationId = organization.id;
447
+ }
448
+ if (!organizationId) throw APIError.from("BAD_REQUEST", ORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION);
449
+ const isMember = await adapter.findMemberByOrgId({
450
+ userId: session.user.id,
451
+ organizationId
452
+ });
453
+ if (!isMember) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_A_MEMBER_OF_THIS_ORGANIZATION);
454
+ if (!ctx.query?.userId) return ctx.json({ role: isMember.role });
455
+ const userIdToGetRole = ctx.query?.userId;
456
+ const member = await adapter.findMemberByOrgId({
457
+ userId: userIdToGetRole,
458
+ organizationId
459
+ });
460
+ if (!member) throw APIError.from("FORBIDDEN", ORGANIZATION_ERROR_CODES.YOU_ARE_NOT_A_MEMBER_OF_THIS_ORGANIZATION);
461
+ return ctx.json({ role: member?.role });
462
+ });
463
+
464
+ //#endregion
465
+ export { addMember, getActiveMember, getActiveMemberRole, leaveOrganization, listMembers, removeMember, updateMemberRole };
466
+ //# sourceMappingURL=crud-members.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crud-members.mjs","names":[],"sources":["../../../../src/plugins/organization/routes/crud-members.ts"],"sourcesContent":["import type { LiteralString } from \"@better-auth/core\";\nimport { createAuthEndpoint } from \"@better-auth/core/api\";\nimport { whereOperators } from \"@better-auth/core/db/adapter\";\nimport { APIError, BASE_ERROR_CODES } from \"@better-auth/core/error\";\nimport * as z from \"zod\";\nimport { getSessionFromCtx, sessionMiddleware } from \"../../../api\";\nimport type { InferAdditionalFieldsFromPluginOptions } from \"../../../db\";\nimport { toZodSchema } from \"../../../db/to-zod\";\nimport { getOrgAdapter } from \"../adapter\";\nimport { orgMiddleware, orgSessionMiddleware } from \"../call\";\nimport { ORGANIZATION_ERROR_CODES } from \"../error-codes\";\nimport { hasPermission } from \"../has-permission\";\nimport { parseRoles } from \"../organization\";\nimport type {\n\tInferMember,\n\tInferOrganizationRolesFromOption,\n\tMember,\n} from \"../schema\";\nimport type { OrganizationOptions } from \"../types\";\n\nconst baseMemberSchema = z.object({\n\tuserId: z.coerce.string().meta({\n\t\tdescription:\n\t\t\t'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\"',\n\t}),\n\trole: z.union([z.string(), z.array(z.string())]).meta({\n\t\tdescription:\n\t\t\t'The role(s) to assign to the new member. Eg: [\"admin\", \"sale\"]',\n\t}),\n\torganizationId: z\n\t\t.string()\n\t\t.meta({\n\t\t\tdescription:\n\t\t\t\t'An optional organization ID to pass. If not provided, will default to the user\\'s active organization. Eg: \"org-id\"',\n\t\t})\n\t\t.optional(),\n\tteamId: z\n\t\t.string()\n\t\t.meta({\n\t\t\tdescription: 'An optional team ID to add the member to. Eg: \"team-id\"',\n\t\t})\n\t\t.optional(),\n});\n\nexport const addMember = <O extends OrganizationOptions>(option: O) => {\n\tconst additionalFieldsSchema = toZodSchema({\n\t\tfields: option?.schema?.member?.additionalFields || {},\n\t\tisClientSide: true,\n\t});\n\treturn createAuthEndpoint(\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tbody: z.object({\n\t\t\t\t...baseMemberSchema.shape,\n\t\t\t\t...additionalFieldsSchema.shape,\n\t\t\t}),\n\t\t\tuse: [orgMiddleware],\n\t\t\tmetadata: {\n\t\t\t\t$Infer: {\n\t\t\t\t\tbody: {} as {\n\t\t\t\t\t\tuserId: string;\n\t\t\t\t\t\trole:\n\t\t\t\t\t\t\t| InferOrganizationRolesFromOption<O>\n\t\t\t\t\t\t\t| InferOrganizationRolesFromOption<O>[];\n\t\t\t\t\t\torganizationId?: string | undefined;\n\t\t\t\t\t} & (O extends { teams: { enabled: true } }\n\t\t\t\t\t\t? { teamId?: string | undefined }\n\t\t\t\t\t\t: {}) &\n\t\t\t\t\t\tInferAdditionalFieldsFromPluginOptions<\"member\", O>,\n\t\t\t\t},\n\t\t\t\topenapi: {\n\t\t\t\t\toperationId: \"addOrganizationMember\",\n\t\t\t\t\tdescription: \"Add a member to an organization\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.body.userId\n\t\t\t\t? await getSessionFromCtx<{\n\t\t\t\t\t\tsession: {\n\t\t\t\t\t\t\tactiveOrganizationId?: string | undefined;\n\t\t\t\t\t\t};\n\t\t\t\t\t}>(ctx).catch((e) => null)\n\t\t\t\t: null;\n\t\t\tconst orgId =\n\t\t\t\tctx.body.organizationId || session?.session.activeOrganizationId;\n\t\t\tif (!orgId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst teamId =\n\t\t\t\t\"teamId\" in ctx.body ? (ctx.body.teamId as string) : undefined;\n\t\t\tif (teamId && !ctx.context.orgOptions.teams?.enabled) {\n\t\t\t\tctx.context.logger.error(\"Teams are not enabled\");\n\t\t\t\tthrow APIError.fromStatus(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: \"Teams are not enabled\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, option);\n\n\t\t\tconst user = await ctx.context.internalAdapter.findUserById(\n\t\t\t\tctx.body.userId,\n\t\t\t);\n\n\t\t\tif (!user) {\n\t\t\t\tthrow APIError.from(\"BAD_REQUEST\", BASE_ERROR_CODES.USER_NOT_FOUND);\n\t\t\t}\n\n\t\t\tconst alreadyMember = await adapter.findMemberByEmail({\n\t\t\t\temail: user.email,\n\t\t\t\torganizationId: orgId,\n\t\t\t});\n\n\t\t\tif (alreadyMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.USER_IS_ALREADY_A_MEMBER_OF_THIS_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (teamId) {\n\t\t\t\tconst team = await adapter.findTeamById({\n\t\t\t\t\tteamId,\n\t\t\t\t\torganizationId: orgId,\n\t\t\t\t});\n\t\t\t\tif (!team || team.organizationId !== orgId) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.TEAM_NOT_FOUND,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst membershipLimit = ctx.context.orgOptions?.membershipLimit || 100;\n\t\t\tconst count = await adapter.countMembers({ organizationId: orgId });\n\n\t\t\tconst organization = await adapter.findOrganizationById(orgId);\n\t\t\tif (!organization) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst limit =\n\t\t\t\ttypeof membershipLimit === \"number\"\n\t\t\t\t\t? membershipLimit\n\t\t\t\t\t: await membershipLimit(user, organization);\n\n\t\t\tif (count >= limit) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.ORGANIZATION_MEMBERSHIP_LIMIT_REACHED,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst {\n\t\t\t\trole: _,\n\t\t\t\tuserId: __,\n\t\t\t\torganizationId: ___,\n\t\t\t\t...additionalFields\n\t\t\t} = ctx.body;\n\n\t\t\tlet memberData = {\n\t\t\t\torganizationId: orgId,\n\t\t\t\tuserId: user.id,\n\t\t\t\trole: parseRoles(ctx.body.role),\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\t...(additionalFields ? additionalFields : {}),\n\t\t\t};\n\n\t\t\t// Run beforeAddMember hook\n\t\t\tif (option?.organizationHooks?.beforeAddMember) {\n\t\t\t\tconst response = await option?.organizationHooks.beforeAddMember({\n\t\t\t\t\tmember: {\n\t\t\t\t\t\tuserId: user.id,\n\t\t\t\t\t\torganizationId: orgId,\n\t\t\t\t\t\trole: parseRoles(ctx.body.role as string | string[]),\n\t\t\t\t\t\t...additionalFields,\n\t\t\t\t\t},\n\t\t\t\t\tuser,\n\t\t\t\t\torganization,\n\t\t\t\t});\n\t\t\t\tif (response && typeof response === \"object\" && \"data\" in response) {\n\t\t\t\t\tmemberData = {\n\t\t\t\t\t\t...memberData,\n\t\t\t\t\t\t...response.data,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst createdMember = await adapter.createMember(memberData);\n\n\t\t\tif (teamId) {\n\t\t\t\tawait adapter.findOrCreateTeamMember({\n\t\t\t\t\tuserId: user.id,\n\t\t\t\t\tteamId,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Run afterAddMember hook\n\t\t\tif (option?.organizationHooks?.afterAddMember) {\n\t\t\t\tawait option?.organizationHooks.afterAddMember({\n\t\t\t\t\tmember: createdMember,\n\t\t\t\t\tuser,\n\t\t\t\t\torganization,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn ctx.json(createdMember);\n\t\t},\n\t);\n};\n\nconst removeMemberBodySchema = z.object({\n\tmemberIdOrEmail: z.string().meta({\n\t\tdescription: \"The ID or email of the member to remove\",\n\t}),\n\t/**\n\t * If not provided, the active organization will be used\n\t */\n\torganizationId: z\n\t\t.string()\n\t\t.meta({\n\t\t\tdescription:\n\t\t\t\t'The ID of the organization to remove the member from. If not provided, the active organization will be used. Eg: \"org-id\"',\n\t\t})\n\t\t.optional(),\n});\n\nexport const removeMember = <O extends OrganizationOptions>(options: O) =>\n\tcreateAuthEndpoint(\n\t\t\"/organization/remove-member\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tbody: removeMemberBodySchema,\n\t\t\trequireHeaders: true,\n\t\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t\t\tmetadata: {\n\t\t\t\topenapi: {\n\t\t\t\t\tdescription: \"Remove a member from an organization\",\n\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\"200\": {\n\t\t\t\t\t\t\tdescription: \"Success\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\tmember: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\tuserId: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\torganizationId: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\trole: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\trequired: [\"id\", \"userId\", \"organizationId\", \"role\"],\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\trequired: [\"member\"],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.context.session;\n\t\t\tconst organizationId =\n\t\t\t\tctx.body.organizationId || session.session.activeOrganizationId;\n\t\t\tif (!organizationId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, options);\n\t\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: session.user.id,\n\t\t\t\torganizationId: organizationId,\n\t\t\t});\n\t\t\tif (!member) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlet toBeRemovedMember: InferMember<O> | null = null;\n\t\t\tif (ctx.body.memberIdOrEmail.includes(\"@\")) {\n\t\t\t\ttoBeRemovedMember = await adapter.findMemberByEmail({\n\t\t\t\t\temail: ctx.body.memberIdOrEmail,\n\t\t\t\t\torganizationId: organizationId,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst result = await adapter.findMemberById(ctx.body.memberIdOrEmail);\n\t\t\t\tif (!result) toBeRemovedMember = null;\n\t\t\t\telse {\n\t\t\t\t\tconst { user: _user, ...member } = result;\n\t\t\t\t\ttoBeRemovedMember = member as unknown as InferMember<O>;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!toBeRemovedMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst roles = toBeRemovedMember.role.split(\",\");\n\t\t\tconst creatorRole = ctx.context.orgOptions?.creatorRole || \"owner\";\n\t\t\tconst isOwner = roles.includes(creatorRole);\n\t\t\tif (isOwner) {\n\t\t\t\tif (member.role !== creatorRole) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_CANNOT_LEAVE_THE_ORGANIZATION_AS_THE_ONLY_OWNER,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst { members } = await adapter.listMembers({\n\t\t\t\t\torganizationId: organizationId,\n\t\t\t\t});\n\t\t\t\tconst owners = members.filter((member) => {\n\t\t\t\t\tconst roles = member.role.split(\",\");\n\t\t\t\t\treturn roles.includes(creatorRole);\n\t\t\t\t});\n\t\t\t\tif (owners.length <= 1) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_CANNOT_LEAVE_THE_ORGANIZATION_AS_THE_ONLY_OWNER,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst canDeleteMember = await hasPermission(\n\t\t\t\t{\n\t\t\t\t\trole: member.role,\n\t\t\t\t\toptions: ctx.context.orgOptions,\n\t\t\t\t\tpermissions: {\n\t\t\t\t\t\tmember: [\"delete\"],\n\t\t\t\t\t},\n\t\t\t\t\torganizationId,\n\t\t\t\t},\n\t\t\t\tctx,\n\t\t\t);\n\n\t\t\tif (!canDeleteMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"UNAUTHORIZED\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_DELETE_THIS_MEMBER,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (toBeRemovedMember?.organizationId !== organizationId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst organization = await adapter.findOrganizationById(organizationId);\n\t\t\tif (!organization) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst userBeingRemoved = await ctx.context.internalAdapter.findUserById(\n\t\t\t\ttoBeRemovedMember.userId,\n\t\t\t);\n\t\t\tif (!userBeingRemoved) {\n\t\t\t\tthrow APIError.fromStatus(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Run beforeRemoveMember hook\n\t\t\tif (options?.organizationHooks?.beforeRemoveMember) {\n\t\t\t\tawait options?.organizationHooks.beforeRemoveMember({\n\t\t\t\t\tmember: toBeRemovedMember,\n\t\t\t\t\tuser: userBeingRemoved,\n\t\t\t\t\torganization,\n\t\t\t\t});\n\t\t\t}\n\t\t\tawait adapter.deleteMember({\n\t\t\t\tmemberId: toBeRemovedMember.id,\n\t\t\t\torganizationId: organizationId,\n\t\t\t\tuserId: toBeRemovedMember.userId,\n\t\t\t});\n\t\t\tif (\n\t\t\t\tsession.user.id === toBeRemovedMember.userId &&\n\t\t\t\tsession.session.activeOrganizationId ===\n\t\t\t\t\ttoBeRemovedMember.organizationId\n\t\t\t) {\n\t\t\t\tawait adapter.setActiveOrganization(session.session.token, null, ctx);\n\t\t\t}\n\n\t\t\t// Run afterRemoveMember hook\n\t\t\tif (options?.organizationHooks?.afterRemoveMember) {\n\t\t\t\tawait options?.organizationHooks.afterRemoveMember({\n\t\t\t\t\tmember: toBeRemovedMember,\n\t\t\t\t\tuser: userBeingRemoved,\n\t\t\t\t\torganization,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn ctx.json({\n\t\t\t\tmember: toBeRemovedMember,\n\t\t\t});\n\t\t},\n\t);\n\nconst updateMemberRoleBodySchema = z.object({\n\trole: z.union([z.string(), z.array(z.string())]).meta({\n\t\tdescription:\n\t\t\t'The new role to be applied. This can be a string or array of strings representing the roles. Eg: [\"admin\", \"sale\"]',\n\t}),\n\tmemberId: z.string().meta({\n\t\tdescription: 'The member id to apply the role update to. Eg: \"member-id\"',\n\t}),\n\torganizationId: z\n\t\t.string()\n\t\t.meta({\n\t\t\tdescription:\n\t\t\t\t'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\"',\n\t\t})\n\t\t.optional(),\n});\n\nexport const updateMemberRole = <O extends OrganizationOptions>(option: O) =>\n\tcreateAuthEndpoint(\n\t\t\"/organization/update-member-role\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tbody: updateMemberRoleBodySchema,\n\t\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t\t\trequireHeaders: true,\n\t\t\tmetadata: {\n\t\t\t\t$Infer: {\n\t\t\t\t\tbody: {} as {\n\t\t\t\t\t\trole:\n\t\t\t\t\t\t\t| InferOrganizationRolesFromOption<O>\n\t\t\t\t\t\t\t| InferOrganizationRolesFromOption<O>[]\n\t\t\t\t\t\t\t| LiteralString\n\t\t\t\t\t\t\t| LiteralString[];\n\t\t\t\t\t\tmemberId: string;\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * If not provided, the active organization will be used\n\t\t\t\t\t\t */\n\t\t\t\t\t\torganizationId?: string | undefined;\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\topenapi: {\n\t\t\t\t\toperationId: \"updateOrganizationMemberRole\",\n\t\t\t\t\tdescription: \"Update the role of a member in an organization\",\n\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\"200\": {\n\t\t\t\t\t\t\tdescription: \"Success\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\tmember: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\tuserId: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\torganizationId: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\trole: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\trequired: [\"id\", \"userId\", \"organizationId\", \"role\"],\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\trequired: [\"member\"],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.context.session;\n\n\t\t\tif (!ctx.body.role) {\n\t\t\t\tthrow APIError.fromStatus(\"BAD_REQUEST\");\n\t\t\t}\n\n\t\t\tconst organizationId =\n\t\t\t\tctx.body.organizationId || session.session.activeOrganizationId;\n\n\t\t\tif (!organizationId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst adapter = getOrgAdapter(ctx.context, ctx.context.orgOptions);\n\t\t\tconst roleToSet: string[] = Array.isArray(ctx.body.role)\n\t\t\t\t? ctx.body.role\n\t\t\t\t: ctx.body.role\n\t\t\t\t\t? [ctx.body.role]\n\t\t\t\t\t: [];\n\n\t\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: session.user.id,\n\t\t\t\torganizationId: organizationId,\n\t\t\t});\n\n\t\t\tif (!member) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst toBeUpdatedMember =\n\t\t\t\tmember.id !== ctx.body.memberId\n\t\t\t\t\t? await adapter.findMemberById(ctx.body.memberId)\n\t\t\t\t\t: member;\n\n\t\t\tif (!toBeUpdatedMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst memberBelongsToOrganization =\n\t\t\t\ttoBeUpdatedMember.organizationId === organizationId;\n\n\t\t\tif (!memberBelongsToOrganization) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_MEMBER,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst creatorRole = ctx.context.orgOptions?.creatorRole || \"owner\";\n\n\t\t\tconst updatingMemberRoles = member.role.split(\",\");\n\t\t\tconst toBeUpdatedMemberRoles = toBeUpdatedMember.role.split(\",\");\n\n\t\t\tconst isUpdatingCreator = toBeUpdatedMemberRoles.includes(creatorRole);\n\t\t\tconst updaterIsCreator = updatingMemberRoles.includes(creatorRole);\n\n\t\t\tconst isSettingCreatorRole = roleToSet.includes(creatorRole);\n\n\t\t\tconst memberIsUpdatingThemselves = member.id === toBeUpdatedMember.id;\n\n\t\t\tif (\n\t\t\t\t(isUpdatingCreator && !updaterIsCreator) ||\n\t\t\t\t(isSettingCreatorRole && !updaterIsCreator)\n\t\t\t) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_MEMBER,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (updaterIsCreator && memberIsUpdatingThemselves) {\n\t\t\t\tconst members = await ctx.context.adapter.findMany<Member>({\n\t\t\t\t\tmodel: \"member\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"organizationId\",\n\t\t\t\t\t\t\tvalue: organizationId,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\tconst owners = members.filter((member: Member) => {\n\t\t\t\t\tconst roles = member.role.split(\",\");\n\t\t\t\t\treturn roles.includes(creatorRole);\n\t\t\t\t});\n\t\t\t\tif (owners.length <= 1 && !isSettingCreatorRole) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_CANNOT_LEAVE_THE_ORGANIZATION_WITHOUT_AN_OWNER,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst canUpdateMember = await hasPermission(\n\t\t\t\t{\n\t\t\t\t\trole: member.role,\n\t\t\t\t\toptions: ctx.context.orgOptions,\n\t\t\t\t\tpermissions: {\n\t\t\t\t\t\tmember: [\"update\"],\n\t\t\t\t\t},\n\t\t\t\t\tallowCreatorAllPermissions: true,\n\t\t\t\t\torganizationId,\n\t\t\t\t},\n\t\t\t\tctx,\n\t\t\t);\n\n\t\t\tif (!canUpdateMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_UPDATE_THIS_MEMBER,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst organization = await adapter.findOrganizationById(organizationId);\n\t\t\tif (!organization) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst userBeingUpdated = await ctx.context.internalAdapter.findUserById(\n\t\t\t\ttoBeUpdatedMember.userId,\n\t\t\t);\n\t\t\tif (!userBeingUpdated) {\n\t\t\t\tthrow APIError.fromStatus(\"BAD_REQUEST\", {\n\t\t\t\t\tmessage: \"User not found\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst previousRole = toBeUpdatedMember.role;\n\t\t\tconst newRole = parseRoles(ctx.body.role as string | string[]);\n\n\t\t\t// Run beforeUpdateMemberRole hook\n\t\t\tif (option?.organizationHooks?.beforeUpdateMemberRole) {\n\t\t\t\tconst response = await option?.organizationHooks.beforeUpdateMemberRole(\n\t\t\t\t\t{\n\t\t\t\t\t\tmember: toBeUpdatedMember,\n\t\t\t\t\t\tnewRole,\n\t\t\t\t\t\tuser: userBeingUpdated,\n\t\t\t\t\t\torganization,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (response && typeof response === \"object\" && \"data\" in response) {\n\t\t\t\t\t// Allow the hook to modify the role\n\t\t\t\t\tconst updatedMember = await adapter.updateMember(\n\t\t\t\t\t\tctx.body.memberId,\n\t\t\t\t\t\tresponse.data.role || newRole,\n\t\t\t\t\t);\n\t\t\t\t\tif (!updatedMember) {\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Run afterUpdateMemberRole hook\n\t\t\t\t\tif (option?.organizationHooks?.afterUpdateMemberRole) {\n\t\t\t\t\t\tawait option?.organizationHooks.afterUpdateMemberRole({\n\t\t\t\t\t\t\tmember: updatedMember,\n\t\t\t\t\t\t\tpreviousRole,\n\t\t\t\t\t\t\tuser: userBeingUpdated,\n\t\t\t\t\t\t\torganization,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ctx.json(updatedMember);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst updatedMember = await adapter.updateMember(\n\t\t\t\tctx.body.memberId,\n\t\t\t\tnewRole,\n\t\t\t);\n\t\t\tif (!updatedMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Run afterUpdateMemberRole hook\n\t\t\tif (option?.organizationHooks?.afterUpdateMemberRole) {\n\t\t\t\tawait option?.organizationHooks.afterUpdateMemberRole({\n\t\t\t\t\tmember: updatedMember,\n\t\t\t\t\tpreviousRole,\n\t\t\t\t\tuser: userBeingUpdated,\n\t\t\t\t\torganization,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn ctx.json(updatedMember);\n\t\t},\n\t);\n\nexport const getActiveMember = <O extends OrganizationOptions>(options: O) =>\n\tcreateAuthEndpoint(\n\t\t\"/organization/get-active-member\",\n\t\t{\n\t\t\tmethod: \"GET\",\n\t\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t\t\trequireHeaders: true,\n\t\t\tmetadata: {\n\t\t\t\topenapi: {\n\t\t\t\t\tdescription: \"Get the member details of the active organization\",\n\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\"200\": {\n\t\t\t\t\t\t\tdescription: \"Success\",\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\tuserId: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\torganizationId: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\trole: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\trequired: [\"id\", \"userId\", \"organizationId\", \"role\"],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.context.session;\n\t\t\tconst organizationId = session.session.activeOrganizationId;\n\t\t\tif (!organizationId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, options);\n\t\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: session.user.id,\n\t\t\t\torganizationId: organizationId,\n\t\t\t});\n\t\t\tif (!member) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn ctx.json(member);\n\t\t},\n\t);\n\nconst leaveOrganizationBodySchema = z.object({\n\torganizationId: z.string().meta({\n\t\tdescription:\n\t\t\t'The organization Id for the member to leave. Eg: \"organization-id\"',\n\t}),\n});\n\nexport const leaveOrganization = <O extends OrganizationOptions>(options: O) =>\n\tcreateAuthEndpoint(\n\t\t\"/organization/leave\",\n\t\t{\n\t\t\tmethod: \"POST\",\n\t\t\tbody: leaveOrganizationBodySchema,\n\t\t\trequireHeaders: true,\n\t\t\tuse: [sessionMiddleware, orgMiddleware],\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.context.session;\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, options);\n\t\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: session.user.id,\n\t\t\t\torganizationId: ctx.body.organizationId,\n\t\t\t});\n\n\t\t\tif (!member) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.MEMBER_NOT_FOUND,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst creatorRole = ctx.context.orgOptions?.creatorRole || \"owner\";\n\t\t\tconst isOwnerLeaving = member.role.split(\",\").includes(creatorRole);\n\t\t\tif (isOwnerLeaving) {\n\t\t\t\tconst members = await ctx.context.adapter.findMany<Member>({\n\t\t\t\t\tmodel: \"member\",\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfield: \"organizationId\",\n\t\t\t\t\t\t\tvalue: ctx.body.organizationId,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t\tconst owners = members.filter((member) =>\n\t\t\t\t\tmember.role.split(\",\").includes(creatorRole),\n\t\t\t\t);\n\t\t\t\tif (owners.length <= 1) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_CANNOT_LEAVE_THE_ORGANIZATION_AS_THE_ONLY_OWNER,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait adapter.deleteMember({\n\t\t\t\tmemberId: member.id,\n\t\t\t\torganizationId: ctx.body.organizationId,\n\t\t\t\tuserId: session.user.id,\n\t\t\t});\n\t\t\tif (session.session.activeOrganizationId === ctx.body.organizationId) {\n\t\t\t\tawait adapter.setActiveOrganization(session.session.token, null, ctx);\n\t\t\t}\n\t\t\treturn ctx.json(member);\n\t\t},\n\t);\n\nexport const listMembers = <O extends OrganizationOptions>(options: O) =>\n\tcreateAuthEndpoint(\n\t\t\"/organization/list-members\",\n\t\t{\n\t\t\tmethod: \"GET\",\n\t\t\tquery: z\n\t\t\t\t.object({\n\t\t\t\t\tlimit: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The number of users to return\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.or(z.number())\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\toffset: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The offset to start from\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.or(z.number())\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tsortBy: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The field to sort by\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tsortDirection: z\n\t\t\t\t\t\t.enum([\"asc\", \"desc\"])\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The direction to sort by\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tfilterField: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The field to filter by\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tfilterValue: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The value to filter by\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.or(z.number())\n\t\t\t\t\t\t.or(z.boolean())\n\t\t\t\t\t\t.or(z.array(z.string()))\n\t\t\t\t\t\t.or(z.array(z.number()))\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\tfilterOperator: z\n\t\t\t\t\t\t.enum(whereOperators)\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription: \"The operator to use for the filter\",\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\torganizationId: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t'The organization ID to list members for. If not provided, will default to the user\\'s active organization. Eg: \"organization-id\"',\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t\torganizationSlug: z\n\t\t\t\t\t\t.string()\n\t\t\t\t\t\t.meta({\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t'The organization slug to list members for. If not provided, will default to the user\\'s active organization. Eg: \"organization-slug\"',\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.optional(),\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t\trequireHeaders: true,\n\t\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.context.session;\n\t\t\tlet organizationId =\n\t\t\t\tctx.query?.organizationId || session.session.activeOrganizationId;\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, options);\n\t\t\tif (ctx.query?.organizationSlug) {\n\t\t\t\tconst organization = await adapter.findOrganizationBySlug(\n\t\t\t\t\tctx.query?.organizationSlug,\n\t\t\t\t);\n\t\t\t\tif (!organization) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\torganizationId = organization.id;\n\t\t\t}\n\t\t\tif (!organizationId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst isMember = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: session.user.id,\n\t\t\t\torganizationId,\n\t\t\t});\n\t\t\tif (!isMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_A_MEMBER_OF_THIS_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst { members, total } = await adapter.listMembers({\n\t\t\t\torganizationId,\n\t\t\t\tlimit: ctx.query?.limit ? Number(ctx.query.limit) : undefined,\n\t\t\t\toffset: ctx.query?.offset ? Number(ctx.query.offset) : undefined,\n\t\t\t\tsortBy: ctx.query?.sortBy,\n\t\t\t\tsortOrder: ctx.query?.sortDirection,\n\t\t\t\tfilter: ctx.query?.filterField\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tfield: ctx.query?.filterField,\n\t\t\t\t\t\t\toperator: ctx.query.filterOperator,\n\t\t\t\t\t\t\tvalue: ctx.query.filterValue,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t});\n\t\t\treturn ctx.json({\n\t\t\t\tmembers,\n\t\t\t\ttotal,\n\t\t\t});\n\t\t},\n\t);\n\nconst getActiveMemberRoleQuerySchema = z\n\t.object({\n\t\tuserId: z\n\t\t\t.string()\n\t\t\t.meta({\n\t\t\t\tdescription:\n\t\t\t\t\t\"The user ID to get the role for. If not provided, will default to the current user's\",\n\t\t\t})\n\t\t\t.optional(),\n\t\torganizationId: z\n\t\t\t.string()\n\t\t\t.meta({\n\t\t\t\tdescription:\n\t\t\t\t\t'The organization ID to list members for. If not provided, will default to the user\\'s active organization. Eg: \"organization-id\"',\n\t\t\t})\n\t\t\t.optional(),\n\t\torganizationSlug: z\n\t\t\t.string()\n\t\t\t.meta({\n\t\t\t\tdescription:\n\t\t\t\t\t'The organization slug to list members for. If not provided, will default to the user\\'s active organization. Eg: \"organization-slug\"',\n\t\t\t})\n\t\t\t.optional(),\n\t})\n\t.optional();\n\nexport const getActiveMemberRole = <O extends OrganizationOptions>(\n\toptions: O,\n) =>\n\tcreateAuthEndpoint(\n\t\t\"/organization/get-active-member-role\",\n\t\t{\n\t\t\tmethod: \"GET\",\n\t\t\tquery: getActiveMemberRoleQuerySchema,\n\t\t\trequireHeaders: true,\n\t\t\tuse: [orgMiddleware, orgSessionMiddleware],\n\t\t},\n\t\tasync (ctx) => {\n\t\t\tconst session = ctx.context.session;\n\t\t\tlet organizationId =\n\t\t\t\tctx.query?.organizationId || session.session.activeOrganizationId;\n\t\t\tconst adapter = getOrgAdapter<O>(ctx.context, options);\n\t\t\tif (ctx.query?.organizationSlug) {\n\t\t\t\tconst organization = await adapter.findOrganizationBySlug(\n\t\t\t\t\tctx.query?.organizationSlug,\n\t\t\t\t);\n\t\t\t\tif (!organization) {\n\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\tORGANIZATION_ERROR_CODES.ORGANIZATION_NOT_FOUND,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\torganizationId = organization.id;\n\t\t\t}\n\t\t\tif (!organizationId) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.NO_ACTIVE_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst isMember = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: session.user.id,\n\t\t\t\torganizationId,\n\t\t\t});\n\t\t\tif (!isMember) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_A_MEMBER_OF_THIS_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!ctx.query?.userId) {\n\t\t\t\treturn ctx.json({\n\t\t\t\t\trole: isMember.role,\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst userIdToGetRole = ctx.query?.userId;\n\t\t\tconst member = await adapter.findMemberByOrgId({\n\t\t\t\tuserId: userIdToGetRole,\n\t\t\t\torganizationId,\n\t\t\t});\n\t\t\tif (!member) {\n\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\"FORBIDDEN\",\n\t\t\t\t\tORGANIZATION_ERROR_CODES.YOU_ARE_NOT_A_MEMBER_OF_THIS_ORGANIZATION,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn ctx.json({\n\t\t\t\trole: member?.role,\n\t\t\t});\n\t\t},\n\t);\n"],"mappings":"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"}