@gatwech/auth 1.0.0-beta.18

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 (422) hide show
  1. package/README.md +31 -0
  2. package/dist/access-BO2g7QVe.mjs +45 -0
  3. package/dist/access-C6O_osEz.mjs +79 -0
  4. package/dist/access-DT1f6l5k.mjs +51 -0
  5. package/dist/adapter-factory-BZ2Qiqpn.mjs +640 -0
  6. package/dist/adapters/drizzle-adapter/index.d.mts +47 -0
  7. package/dist/adapters/drizzle-adapter/index.mjs +208 -0
  8. package/dist/adapters/index.d.mts +132 -0
  9. package/dist/adapters/index.mjs +18 -0
  10. package/dist/adapters/kysely-adapter/index.d.mts +47 -0
  11. package/dist/adapters/kysely-adapter/index.mjs +11 -0
  12. package/dist/adapters/memory-adapter/index.d.mts +14 -0
  13. package/dist/adapters/memory-adapter/index.mjs +154 -0
  14. package/dist/adapters/mongodb-adapter/index.d.mts +35 -0
  15. package/dist/adapters/mongodb-adapter/index.mjs +315 -0
  16. package/dist/adapters/prisma-adapter/index.d.mts +34 -0
  17. package/dist/adapters/prisma-adapter/index.mjs +159 -0
  18. package/dist/adapters/test.d.mts +81 -0
  19. package/dist/adapters/test.mjs +793 -0
  20. package/dist/admin-Bcq53Nwj.mjs +743 -0
  21. package/dist/admin-DtfO1PLg.d.mts +1689 -0
  22. package/dist/anonymous-CRt1imBW.mjs +107 -0
  23. package/dist/api/index.d.mts +6 -0
  24. package/dist/api/index.mjs +17 -0
  25. package/dist/api-0pR_I-Nx.mjs +3139 -0
  26. package/dist/auth-CBUoBX6o.mjs +233 -0
  27. package/dist/bearer-Djf_awfo.mjs +63 -0
  28. package/dist/bun-sqlite-dialect-CeNvMaZz.mjs +155 -0
  29. package/dist/captcha-BqaMxlKC.mjs +178 -0
  30. package/dist/chunk-BK_LfMhE.mjs +40 -0
  31. package/dist/client/index.d.mts +186 -0
  32. package/dist/client/index.mjs +7 -0
  33. package/dist/client/plugins/index.d.mts +949 -0
  34. package/dist/client/plugins/index.mjs +539 -0
  35. package/dist/client/react/index.d.mts +179 -0
  36. package/dist/client/react/index.mjs +69 -0
  37. package/dist/client-BOX93C3d.d.mts +1250 -0
  38. package/dist/client-CNY0tn9g.d.mts +628 -0
  39. package/dist/client-CygJhqeB.mjs +29 -0
  40. package/dist/client-WiN43tAS.mjs +17 -0
  41. package/dist/client-aExCkfwm.mjs +30 -0
  42. package/dist/cookies/index.d.mts +7 -0
  43. package/dist/cookies/index.mjs +7 -0
  44. package/dist/cookies-cJObLwn1.mjs +597 -0
  45. package/dist/crypto/index.d.mts +44 -0
  46. package/dist/crypto/index.mjs +4 -0
  47. package/dist/crypto-Bb42eMrH.mjs +70 -0
  48. package/dist/custom-session-L3t7ecsd.mjs +67 -0
  49. package/dist/date-Cx2yCiC4.mjs +115 -0
  50. package/dist/db/index.d.mts +7 -0
  51. package/dist/db/index.mjs +15 -0
  52. package/dist/db-BrstmDhc.mjs +1124 -0
  53. package/dist/device-authorization-V4s3h4Mj.mjs +557 -0
  54. package/dist/dialect-CeddeGHf.mjs +72 -0
  55. package/dist/email-otp-BtDHSw14.mjs +592 -0
  56. package/dist/esm-C-QicDNz.mjs +4090 -0
  57. package/dist/generic-oauth-CL5X27ZI.mjs +445 -0
  58. package/dist/get-request-ip-DSjrEpGo.mjs +27 -0
  59. package/dist/get-tables-BQP7YW9c.mjs +249 -0
  60. package/dist/has-permission-BpAr7uCn.mjs +14 -0
  61. package/dist/haveibeenpwned-cMpJvmzI.mjs +43 -0
  62. package/dist/helper-tmxW3BHj.d.mts +21 -0
  63. package/dist/index-34ONrP8l.d.mts +503 -0
  64. package/dist/index-65G5U5DB-DSdjzreF.d.mts +2543 -0
  65. package/dist/index-B-XKqFvY.d.mts +30 -0
  66. package/dist/index-B3n8e37d.d.mts +165 -0
  67. package/dist/index-BBm8nQ9Q.d.mts +42 -0
  68. package/dist/index-BHoQlf7a.d.mts +7699 -0
  69. package/dist/index-BYMI9r_d.d.mts +257 -0
  70. package/dist/index-BqhKCbPH.d.mts +36 -0
  71. package/dist/index-Buhn3hkR.d.mts +433 -0
  72. package/dist/index-C-u1h_WX.d.mts +174 -0
  73. package/dist/index-C7fQuk-V.d.mts +41 -0
  74. package/dist/index-CM-CFWwr.d.mts +1919 -0
  75. package/dist/index-CuFzhoS6.d.mts +359 -0
  76. package/dist/index-Cxi7TbLE.d.mts +11347 -0
  77. package/dist/index-DB7t8whN.d.mts +1 -0
  78. package/dist/index-DKNNV1kb.d.mts +626 -0
  79. package/dist/index-DR0xXno9.d.mts +113 -0
  80. package/dist/index-D_k662QG.d.mts +833 -0
  81. package/dist/index-DaBcikv9.d.mts +118 -0
  82. package/dist/index-DlaMq1nb.d.mts +955 -0
  83. package/dist/index-DoXZYQpq.d.mts +290 -0
  84. package/dist/index-G6V0Z_Mn.d.mts +125 -0
  85. package/dist/index-z0KSvE5i.d.mts +246 -0
  86. package/dist/index-zjjNBRY2.d.mts +95 -0
  87. package/dist/index.d.mts +12 -0
  88. package/dist/index.mjs +33 -0
  89. package/dist/integrations/next-js.d.mts +21 -0
  90. package/dist/integrations/next-js.mjs +62 -0
  91. package/dist/integrations/node.d.mts +15 -0
  92. package/dist/integrations/node.mjs +15 -0
  93. package/dist/integrations/react-start.d.mts +15 -0
  94. package/dist/integrations/react-start.mjs +46 -0
  95. package/dist/json-D0TBLy4q.mjs +24 -0
  96. package/dist/jwt-CmxZAGe2.mjs +94 -0
  97. package/dist/jwt-lHV4QHpD.mjs +387 -0
  98. package/dist/kysely-adapter-DpzYO8Yf.mjs +181 -0
  99. package/dist/magic-link-Bk-ueorR.mjs +176 -0
  100. package/dist/misc-beA1w3XV.mjs +7 -0
  101. package/dist/multi-session-DRrLKrg9.mjs +144 -0
  102. package/dist/node-sqlite-dialect-BcKxBQnm.mjs +155 -0
  103. package/dist/oauth-proxy-D1sWh9B_.mjs +133 -0
  104. package/dist/oauth2/index.d.mts +60 -0
  105. package/dist/oauth2/index.mjs +19 -0
  106. package/dist/one-tap-DMswkTEc.mjs +113 -0
  107. package/dist/organization-BArHO_5v.mjs +3857 -0
  108. package/dist/parser-DcrIEuXE.mjs +73 -0
  109. package/dist/passkey-CcD4CnhM.mjs +558 -0
  110. package/dist/password-sVC4nePO.mjs +25 -0
  111. package/dist/permission-DLYUF3cW.mjs +15 -0
  112. package/dist/phone-number-rHDIlh-2.mjs +485 -0
  113. package/dist/plugin-helper-4L-lzsjZ.mjs +16 -0
  114. package/dist/plugins/access/index.d.mts +3 -0
  115. package/dist/plugins/access/index.mjs +3 -0
  116. package/dist/plugins/admin/access/index.d.mts +116 -0
  117. package/dist/plugins/admin/access/index.mjs +4 -0
  118. package/dist/plugins/admin/index.d.mts +9 -0
  119. package/dist/plugins/admin/index.mjs +22 -0
  120. package/dist/plugins/anonymous/index.d.mts +7 -0
  121. package/dist/plugins/anonymous/index.mjs +18 -0
  122. package/dist/plugins/bearer/index.d.mts +2 -0
  123. package/dist/plugins/bearer/index.mjs +8 -0
  124. package/dist/plugins/captcha/index.d.mts +2 -0
  125. package/dist/plugins/captcha/index.mjs +4 -0
  126. package/dist/plugins/custom-session/index.d.mts +7 -0
  127. package/dist/plugins/custom-session/index.mjs +19 -0
  128. package/dist/plugins/device-authorization/index.d.mts +4 -0
  129. package/dist/plugins/device-authorization/index.mjs +18 -0
  130. package/dist/plugins/email-otp/index.d.mts +3 -0
  131. package/dist/plugins/email-otp/index.mjs +19 -0
  132. package/dist/plugins/generic-oauth/index.d.mts +7 -0
  133. package/dist/plugins/generic-oauth/index.mjs +18 -0
  134. package/dist/plugins/haveibeenpwned/index.d.mts +2 -0
  135. package/dist/plugins/haveibeenpwned/index.mjs +18 -0
  136. package/dist/plugins/index.d.mts +139 -0
  137. package/dist/plugins/index.mjs +47 -0
  138. package/dist/plugins/jwt/index.d.mts +7 -0
  139. package/dist/plugins/jwt/index.mjs +18 -0
  140. package/dist/plugins/magic-link/index.d.mts +2 -0
  141. package/dist/plugins/magic-link/index.mjs +18 -0
  142. package/dist/plugins/multi-session/index.d.mts +3 -0
  143. package/dist/plugins/multi-session/index.mjs +18 -0
  144. package/dist/plugins/oauth-proxy/index.d.mts +2 -0
  145. package/dist/plugins/oauth-proxy/index.mjs +18 -0
  146. package/dist/plugins/one-tap/index.d.mts +2 -0
  147. package/dist/plugins/one-tap/index.mjs +18 -0
  148. package/dist/plugins/one-time-token/index.d.mts +7 -0
  149. package/dist/plugins/one-time-token/index.mjs +47 -0
  150. package/dist/plugins/organization/access/index.d.mts +4 -0
  151. package/dist/plugins/organization/access/index.mjs +4 -0
  152. package/dist/plugins/organization/index.d.mts +9 -0
  153. package/dist/plugins/organization/index.mjs +22 -0
  154. package/dist/plugins/passkey/index.d.mts +7 -0
  155. package/dist/plugins/passkey/index.mjs +18 -0
  156. package/dist/plugins/phone-number/index.d.mts +7 -0
  157. package/dist/plugins/phone-number/index.mjs +18 -0
  158. package/dist/plugins/two-factor/index.d.mts +7 -0
  159. package/dist/plugins/two-factor/index.mjs +20 -0
  160. package/dist/plugins/username/index.d.mts +4 -0
  161. package/dist/plugins/username/index.mjs +18 -0
  162. package/dist/plugins-3jfNste3.mjs +1544 -0
  163. package/dist/plugins-hFZT3hmK.d.mts +14 -0
  164. package/dist/promise-8rrEHRXd.mjs +23154 -0
  165. package/dist/proxy-CL9PZXJA.mjs +441 -0
  166. package/dist/session-Dgp133Yt.mjs +413 -0
  167. package/dist/social-providers/index.d.mts +1 -0
  168. package/dist/social-providers/index.mjs +3 -0
  169. package/dist/src/adapters/adapter-factory/index.d.ts +10 -0
  170. package/dist/src/adapters/adapter-factory/types.d.ts +124 -0
  171. package/dist/src/adapters/create-test-suite.d.ts +97 -0
  172. package/dist/src/adapters/drizzle-adapter/drizzle-adapter.d.ts +43 -0
  173. package/dist/src/adapters/drizzle-adapter/index.d.ts +1 -0
  174. package/dist/src/adapters/drizzle-adapter/test/generate-schema.d.ts +12 -0
  175. package/dist/src/adapters/index.d.ts +21 -0
  176. package/dist/src/adapters/kysely-adapter/bun-sqlite-dialect.d.ts +58 -0
  177. package/dist/src/adapters/kysely-adapter/dialect.d.ts +13 -0
  178. package/dist/src/adapters/kysely-adapter/index.d.ts +3 -0
  179. package/dist/src/adapters/kysely-adapter/kysely-adapter.d.ts +32 -0
  180. package/dist/src/adapters/kysely-adapter/node-sqlite-dialect.d.ts +58 -0
  181. package/dist/src/adapters/kysely-adapter/types.d.ts +1 -0
  182. package/dist/src/adapters/memory-adapter/index.d.ts +1 -0
  183. package/dist/src/adapters/memory-adapter/memory-adapter.d.ts +9 -0
  184. package/dist/src/adapters/mongodb-adapter/index.d.ts +1 -0
  185. package/dist/src/adapters/mongodb-adapter/mongodb-adapter.d.ts +31 -0
  186. package/dist/src/adapters/prisma-adapter/index.d.ts +1 -0
  187. package/dist/src/adapters/prisma-adapter/prisma-adapter.d.ts +32 -0
  188. package/dist/src/adapters/prisma-adapter/test/auth.d.ts +3 -0
  189. package/dist/src/adapters/prisma-adapter/test/generate-auth-config.d.ts +2 -0
  190. package/dist/src/adapters/prisma-adapter/test/generate-prisma-schema.d.ts +3 -0
  191. package/dist/src/adapters/prisma-adapter/test/get-prisma-client.d.ts +7 -0
  192. package/dist/src/adapters/prisma-adapter/test/push-prisma-schema.d.ts +1 -0
  193. package/dist/src/adapters/test-adapter.d.ts +61 -0
  194. package/dist/src/adapters/test.d.ts +78 -0
  195. package/dist/src/adapters/tests/auth-flow.d.ts +22 -0
  196. package/dist/src/adapters/tests/index.d.ts +5 -0
  197. package/dist/src/adapters/tests/normal.d.ts +87 -0
  198. package/dist/src/adapters/tests/number-id.d.ts +17 -0
  199. package/dist/src/adapters/tests/performance.d.ts +24 -0
  200. package/dist/src/adapters/tests/transactions.d.ts +20 -0
  201. package/dist/src/adapters/utils.d.ts +3 -0
  202. package/dist/src/api/index.d.ts +7150 -0
  203. package/dist/src/api/middlewares/index.d.ts +2 -0
  204. package/dist/src/api/middlewares/oauth.d.ts +15 -0
  205. package/dist/src/api/middlewares/origin-check.d.ts +8 -0
  206. package/dist/src/api/rate-limiter/index.d.ts +13 -0
  207. package/dist/src/api/routes/account.d.ts +623 -0
  208. package/dist/src/api/routes/callback.d.ts +68 -0
  209. package/dist/src/api/routes/email-verification.d.ts +266 -0
  210. package/dist/src/api/routes/error.d.ts +51 -0
  211. package/dist/src/api/routes/index.d.ts +11 -0
  212. package/dist/src/api/routes/ok.d.ts +61 -0
  213. package/dist/src/api/routes/reset-password.d.ts +203 -0
  214. package/dist/src/api/routes/session.d.ts +586 -0
  215. package/dist/src/api/routes/sign-in.d.ts +298 -0
  216. package/dist/src/api/routes/sign-out.d.ts +59 -0
  217. package/dist/src/api/routes/sign-up.d.ts +625 -0
  218. package/dist/src/api/routes/update-user.d.ts +862 -0
  219. package/dist/src/api/to-auth-endpoints.d.ts +3 -0
  220. package/dist/src/auth.d.ts +25 -0
  221. package/dist/src/client/broadcast-channel.d.ts +12 -0
  222. package/dist/src/client/config.d.ts +85 -0
  223. package/dist/src/client/fetch-plugins.d.ts +14 -0
  224. package/dist/src/client/index.d.ts +15 -0
  225. package/dist/src/client/parser.d.ts +12 -0
  226. package/dist/src/client/path-to-object.d.ts +63 -0
  227. package/dist/src/client/plugins/index.d.ts +21 -0
  228. package/dist/src/client/plugins/infer-plugin.d.ts +11 -0
  229. package/dist/src/client/proxy.d.ts +8 -0
  230. package/dist/src/client/query.d.ts +16 -0
  231. package/dist/src/client/react/index.d.ts +130 -0
  232. package/dist/src/client/react/react-store.d.ts +43 -0
  233. package/dist/src/client/session-atom.d.ts +18 -0
  234. package/dist/src/client/session-refresh.d.ts +17 -0
  235. package/dist/src/client/test-plugin.d.ts +147 -0
  236. package/dist/src/client/types.d.ts +49 -0
  237. package/dist/src/client/vanilla.d.ts +124 -0
  238. package/dist/src/cookies/check-cookies.d.ts +4 -0
  239. package/dist/src/cookies/cookie-utils.d.ts +16 -0
  240. package/dist/src/cookies/index.d.ts +56 -0
  241. package/dist/src/cookies/session-store.d.ts +43 -0
  242. package/dist/src/crypto/buffer.d.ts +4 -0
  243. package/dist/src/crypto/index.d.ts +14 -0
  244. package/dist/src/crypto/jwt.d.ts +4 -0
  245. package/dist/src/crypto/password.d.ts +5 -0
  246. package/dist/src/crypto/random.d.ts +1 -0
  247. package/dist/src/db/field.d.ts +97 -0
  248. package/dist/src/db/get-migration.d.ts +18 -0
  249. package/dist/src/db/get-schema.d.ts +6 -0
  250. package/dist/src/db/get-tables.d.ts +3 -0
  251. package/dist/src/db/index.d.ts +10 -0
  252. package/dist/src/db/internal-adapter.d.ts +9 -0
  253. package/dist/src/db/schema.d.ts +76 -0
  254. package/dist/src/db/to-zod.d.ts +31 -0
  255. package/dist/src/db/utils.d.ts +6 -0
  256. package/dist/src/db/with-hooks.d.ts +27 -0
  257. package/dist/src/index.d.ts +14 -0
  258. package/dist/src/init.d.ts +2 -0
  259. package/dist/src/integrations/next-js.d.ts +15 -0
  260. package/dist/src/integrations/node.d.ts +6 -0
  261. package/dist/src/integrations/react-start.d.ts +9 -0
  262. package/dist/src/oauth2/index.d.ts +4 -0
  263. package/dist/src/oauth2/link-account.d.ts +41 -0
  264. package/dist/src/oauth2/state.d.ts +21 -0
  265. package/dist/src/oauth2/utils.d.ts +3 -0
  266. package/dist/src/plugins/access/access.d.ts +25 -0
  267. package/dist/src/plugins/access/index.d.ts +2 -0
  268. package/dist/src/plugins/access/types.d.ts +14 -0
  269. package/dist/src/plugins/additional-fields/client.d.ts +91 -0
  270. package/dist/src/plugins/admin/access/index.d.ts +1 -0
  271. package/dist/src/plugins/admin/access/statement.d.ts +110 -0
  272. package/dist/src/plugins/admin/admin.d.ts +1570 -0
  273. package/dist/src/plugins/admin/client.d.ts +62 -0
  274. package/dist/src/plugins/admin/error-codes.d.ts +21 -0
  275. package/dist/src/plugins/admin/has-permission.d.ts +21 -0
  276. package/dist/src/plugins/admin/index.d.ts +2 -0
  277. package/dist/src/plugins/admin/schema.d.ts +36 -0
  278. package/dist/src/plugins/admin/types.d.ts +77 -0
  279. package/dist/src/plugins/anonymous/client.d.ts +8 -0
  280. package/dist/src/plugins/anonymous/index.d.ts +159 -0
  281. package/dist/src/plugins/api-key/client.d.ts +11 -0
  282. package/dist/src/plugins/api-key/index.d.ts +1431 -0
  283. package/dist/src/plugins/api-key/rate-limit.d.ts +20 -0
  284. package/dist/src/plugins/api-key/routes/create-api-key.d.ts +244 -0
  285. package/dist/src/plugins/api-key/routes/delete-all-expired-api-keys.d.ts +45 -0
  286. package/dist/src/plugins/api-key/routes/delete-api-key.d.ts +112 -0
  287. package/dist/src/plugins/api-key/routes/get-api-key.d.ts +234 -0
  288. package/dist/src/plugins/api-key/routes/index.d.ts +1136 -0
  289. package/dist/src/plugins/api-key/routes/list-api-keys.d.ts +231 -0
  290. package/dist/src/plugins/api-key/routes/update-api-key.d.ts +235 -0
  291. package/dist/src/plugins/api-key/routes/verify-api-key.d.ts +80 -0
  292. package/dist/src/plugins/api-key/schema.d.ts +188 -0
  293. package/dist/src/plugins/api-key/types.d.ts +285 -0
  294. package/dist/src/plugins/bearer/index.d.ts +31 -0
  295. package/dist/src/plugins/captcha/constants.d.ts +9 -0
  296. package/dist/src/plugins/captcha/error-codes.d.ts +9 -0
  297. package/dist/src/plugins/captcha/index.d.ts +7 -0
  298. package/dist/src/plugins/captcha/types.d.ts +23 -0
  299. package/dist/src/plugins/captcha/utils.d.ts +1 -0
  300. package/dist/src/plugins/captcha/verify-handlers/captchafox.d.ts +11 -0
  301. package/dist/src/plugins/captcha/verify-handlers/cloudflare-turnstile.d.ts +10 -0
  302. package/dist/src/plugins/captcha/verify-handlers/google-recaptcha.d.ts +11 -0
  303. package/dist/src/plugins/captcha/verify-handlers/h-captcha.d.ts +11 -0
  304. package/dist/src/plugins/captcha/verify-handlers/index.d.ts +4 -0
  305. package/dist/src/plugins/custom-session/client.d.ts +12 -0
  306. package/dist/src/plugins/custom-session/index.d.ts +89 -0
  307. package/dist/src/plugins/device-authorization/client.d.ts +12 -0
  308. package/dist/src/plugins/device-authorization/index.d.ts +568 -0
  309. package/dist/src/plugins/device-authorization/schema.d.ts +56 -0
  310. package/dist/src/plugins/email-otp/client.d.ts +9 -0
  311. package/dist/src/plugins/email-otp/index.d.ts +826 -0
  312. package/dist/src/plugins/email-otp/utils.d.ts +2 -0
  313. package/dist/src/plugins/generic-oauth/client.d.ts +5 -0
  314. package/dist/src/plugins/generic-oauth/index.d.ts +428 -0
  315. package/dist/src/plugins/haveibeenpwned/index.d.ts +25 -0
  316. package/dist/src/plugins/index.d.ts +28 -0
  317. package/dist/src/plugins/jwt/adapter.d.ts +8 -0
  318. package/dist/src/plugins/jwt/client.d.ts +5 -0
  319. package/dist/src/plugins/jwt/index.d.ts +276 -0
  320. package/dist/src/plugins/jwt/schema.d.ts +18 -0
  321. package/dist/src/plugins/jwt/sign.d.ts +8 -0
  322. package/dist/src/plugins/jwt/types.d.ts +175 -0
  323. package/dist/src/plugins/jwt/utils.d.ts +46 -0
  324. package/dist/src/plugins/last-login-method/client.d.ts +34 -0
  325. package/dist/src/plugins/last-login-method/index.d.ts +103 -0
  326. package/dist/src/plugins/magic-link/client.d.ts +5 -0
  327. package/dist/src/plugins/magic-link/index.d.ts +253 -0
  328. package/dist/src/plugins/magic-link/utils.d.ts +1 -0
  329. package/dist/src/plugins/multi-session/client.d.ts +9 -0
  330. package/dist/src/plugins/multi-session/index.d.ts +284 -0
  331. package/dist/src/plugins/oauth-proxy/index.d.ts +119 -0
  332. package/dist/src/plugins/one-tap/client.d.ts +81 -0
  333. package/dist/src/plugins/one-tap/index.d.ts +114 -0
  334. package/dist/src/plugins/one-time-token/client.d.ts +5 -0
  335. package/dist/src/plugins/one-time-token/index.d.ts +170 -0
  336. package/dist/src/plugins/one-time-token/utils.d.ts +1 -0
  337. package/dist/src/plugins/organization/access/index.d.ts +1 -0
  338. package/dist/src/plugins/organization/access/statement.d.ts +241 -0
  339. package/dist/src/plugins/organization/adapter.d.ts +685 -0
  340. package/dist/src/plugins/organization/call.d.ts +55 -0
  341. package/dist/src/plugins/organization/client.d.ts +344 -0
  342. package/dist/src/plugins/organization/error-codes.d.ts +58 -0
  343. package/dist/src/plugins/organization/has-permission.d.ts +13 -0
  344. package/dist/src/plugins/organization/index.d.ts +4 -0
  345. package/dist/src/plugins/organization/organization.d.ts +412 -0
  346. package/dist/src/plugins/organization/permission.d.ts +27 -0
  347. package/dist/src/plugins/organization/routes/crud-access-control.d.ts +701 -0
  348. package/dist/src/plugins/organization/routes/crud-invites.d.ts +1522 -0
  349. package/dist/src/plugins/organization/routes/crud-members.d.ts +1220 -0
  350. package/dist/src/plugins/organization/routes/crud-org.d.ts +1399 -0
  351. package/dist/src/plugins/organization/routes/crud-team.d.ts +1323 -0
  352. package/dist/src/plugins/organization/schema.d.ts +366 -0
  353. package/dist/src/plugins/organization/types.d.ts +737 -0
  354. package/dist/src/plugins/passkey/client.d.ts +190 -0
  355. package/dist/src/plugins/passkey/error-codes.d.ts +9 -0
  356. package/dist/src/plugins/passkey/index.d.ts +838 -0
  357. package/dist/src/plugins/passkey/schema.d.ts +50 -0
  358. package/dist/src/plugins/passkey/types.d.ts +69 -0
  359. package/dist/src/plugins/passkey/utils.d.ts +2 -0
  360. package/dist/src/plugins/phone-number/client.d.ts +9 -0
  361. package/dist/src/plugins/phone-number/index.d.ts +622 -0
  362. package/dist/src/plugins/phone-number/phone-number-error.d.ts +10 -0
  363. package/dist/src/plugins/two-factor/backup-codes/index.d.ts +387 -0
  364. package/dist/src/plugins/two-factor/client.d.ts +28 -0
  365. package/dist/src/plugins/two-factor/constant.d.ts +2 -0
  366. package/dist/src/plugins/two-factor/error-code.d.ts +11 -0
  367. package/dist/src/plugins/two-factor/index.d.ts +1014 -0
  368. package/dist/src/plugins/two-factor/otp/index.d.ts +282 -0
  369. package/dist/src/plugins/two-factor/schema.d.ts +35 -0
  370. package/dist/src/plugins/two-factor/totp/index.d.ts +298 -0
  371. package/dist/src/plugins/two-factor/types.d.ts +50 -0
  372. package/dist/src/plugins/two-factor/utils.d.ts +1 -0
  373. package/dist/src/plugins/two-factor/verify-two-factor.d.ts +59 -0
  374. package/dist/src/plugins/username/client.d.ts +5 -0
  375. package/dist/src/plugins/username/error-codes.d.ts +10 -0
  376. package/dist/src/plugins/username/index.d.ts +313 -0
  377. package/dist/src/plugins/username/schema.d.ts +27 -0
  378. package/dist/src/social-providers/index.d.ts +1 -0
  379. package/dist/src/test-utils/headers.d.ts +5 -0
  380. package/dist/src/test-utils/index.d.ts +2 -0
  381. package/dist/src/test-utils/test-instance.d.ts +17849 -0
  382. package/dist/src/types/adapter.d.ts +21 -0
  383. package/dist/src/types/api.d.ts +29 -0
  384. package/dist/src/types/helper.d.ts +32 -0
  385. package/dist/src/types/index.d.ts +7 -0
  386. package/dist/src/types/models.d.ts +13 -0
  387. package/dist/src/types/plugins.d.ts +14 -0
  388. package/dist/src/utils/await-object.d.ts +3 -0
  389. package/dist/src/utils/boolean.d.ts +1 -0
  390. package/dist/src/utils/clone.d.ts +1 -0
  391. package/dist/src/utils/constants.d.ts +1 -0
  392. package/dist/src/utils/date.d.ts +1 -0
  393. package/dist/src/utils/ensure-utc.d.ts +1 -0
  394. package/dist/src/utils/get-request-ip.d.ts +2 -0
  395. package/dist/src/utils/hashing.d.ts +6 -0
  396. package/dist/src/utils/hide-metadata.d.ts +3 -0
  397. package/dist/src/utils/id.d.ts +1 -0
  398. package/dist/src/utils/import-util.d.ts +1 -0
  399. package/dist/src/utils/index.d.ts +5 -0
  400. package/dist/src/utils/is-atom.d.ts +2 -0
  401. package/dist/src/utils/is-promise.d.ts +1 -0
  402. package/dist/src/utils/json.d.ts +1 -0
  403. package/dist/src/utils/merger.d.ts +1 -0
  404. package/dist/src/utils/middleware-response.d.ts +8 -0
  405. package/dist/src/utils/misc.d.ts +1 -0
  406. package/dist/src/utils/password.d.ts +6 -0
  407. package/dist/src/utils/plugin-helper.d.ts +5 -0
  408. package/dist/src/utils/shim.d.ts +3 -0
  409. package/dist/src/utils/time.d.ts +4 -0
  410. package/dist/src/utils/url.d.ts +4 -0
  411. package/dist/src/utils/wildcard.d.ts +45 -0
  412. package/dist/test-utils/index.d.mts +17870 -0
  413. package/dist/test-utils/index.mjs +272 -0
  414. package/dist/two-factor-ClUXxom2.mjs +914 -0
  415. package/dist/types/index.d.mts +6 -0
  416. package/dist/types/index.mjs +3 -0
  417. package/dist/types-B1OL7hyf.d.mts +4 -0
  418. package/dist/types-Bjn15Uy6.mjs +1 -0
  419. package/dist/url-VB2gAbTI.mjs +59 -0
  420. package/dist/username-DiGklOGl.mjs +278 -0
  421. package/dist/utils-SOMB4Px5.mjs +132 -0
  422. package/package.json +447 -0
@@ -0,0 +1,743 @@
1
+ import { t as APIError } from "./api-0pR_I-Nx.mjs";
2
+ import { c as setSessionCookie, n as deleteSessionCookie } from "./cookies-cJObLwn1.mjs";
3
+ import { n as mergeSchema, t as getDate, u as parseUserOutput } from "./date-Cx2yCiC4.mjs";
4
+ import { r as getSessionFromCtx } from "./session-Dgp133Yt.mjs";
5
+ import { t as getEndpointResponse } from "./plugin-helper-4L-lzsjZ.mjs";
6
+ import { t as hasPermission } from "./has-permission-BpAr7uCn.mjs";
7
+ import { BASE_ERROR_CODES } from "@gatwech/core/error";
8
+ import { defineErrorCodes } from "@gatwech/core/utils";
9
+ import { createAuthEndpoint, createAuthMiddleware } from "@gatwech/core/api";
10
+ import * as z$1 from "zod";
11
+ import "@gatwech/core/db";
12
+
13
+ //#region src/plugins/admin/error-codes.ts
14
+ const ADMIN_ERROR_CODES = defineErrorCodes({
15
+ FAILED_TO_CREATE_USER: "Failed to create user",
16
+ USER_ALREADY_EXISTS: "User already exists.",
17
+ USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL: "User already exists. Use another email.",
18
+ YOU_CANNOT_BAN_YOURSELF: "You cannot ban yourself",
19
+ YOU_ARE_NOT_ALLOWED_TO_CHANGE_USERS_ROLE: "You are not allowed to change users role",
20
+ YOU_ARE_NOT_ALLOWED_TO_CREATE_USERS: "You are not allowed to create users",
21
+ YOU_ARE_NOT_ALLOWED_TO_LIST_USERS: "You are not allowed to list users",
22
+ YOU_ARE_NOT_ALLOWED_TO_LIST_USERS_SESSIONS: "You are not allowed to list users sessions",
23
+ YOU_ARE_NOT_ALLOWED_TO_BAN_USERS: "You are not allowed to ban users",
24
+ YOU_ARE_NOT_ALLOWED_TO_IMPERSONATE_USERS: "You are not allowed to impersonate users",
25
+ YOU_ARE_NOT_ALLOWED_TO_REVOKE_USERS_SESSIONS: "You are not allowed to revoke users sessions",
26
+ YOU_ARE_NOT_ALLOWED_TO_DELETE_USERS: "You are not allowed to delete users",
27
+ YOU_ARE_NOT_ALLOWED_TO_SET_USERS_PASSWORD: "You are not allowed to set users password",
28
+ BANNED_USER: "You have been banned from this application",
29
+ YOU_ARE_NOT_ALLOWED_TO_GET_USER: "You are not allowed to get user",
30
+ NO_DATA_TO_UPDATE: "No data to update",
31
+ YOU_ARE_NOT_ALLOWED_TO_UPDATE_USERS: "You are not allowed to update users",
32
+ YOU_CANNOT_REMOVE_YOURSELF: "You cannot remove yourself",
33
+ YOU_ARE_NOT_ALLOWED_TO_SET_NON_EXISTENT_VALUE: "You are not allowed to set a non-existent role value"
34
+ });
35
+
36
+ //#endregion
37
+ //#region src/plugins/admin/schema.ts
38
+ const schema = {
39
+ user: { fields: {
40
+ role: {
41
+ type: "string",
42
+ required: false,
43
+ input: false
44
+ },
45
+ banned: {
46
+ type: "boolean",
47
+ defaultValue: false,
48
+ required: false,
49
+ input: false
50
+ },
51
+ banReason: {
52
+ type: "string",
53
+ required: false,
54
+ input: false
55
+ },
56
+ banExpires: {
57
+ type: "date",
58
+ required: false,
59
+ input: false
60
+ }
61
+ } },
62
+ session: { fields: { impersonatedBy: {
63
+ type: "string",
64
+ required: false
65
+ } } }
66
+ };
67
+
68
+ //#endregion
69
+ //#region src/plugins/admin/admin.ts
70
+ function parseRoles(roles) {
71
+ return Array.isArray(roles) ? roles.join(",") : roles;
72
+ }
73
+ const admin = (options) => {
74
+ const opts = {
75
+ defaultRole: options?.defaultRole ?? "user",
76
+ adminRoles: options?.adminRoles ?? ["admin"],
77
+ bannedUserMessage: options?.bannedUserMessage ?? "You have been banned from this application. Please contact support if you believe this is an error.",
78
+ ...options
79
+ };
80
+ /**
81
+ * Ensures a valid session, if not will throw.
82
+ * Will also provide additional types on the user to include role types.
83
+ */
84
+ const adminMiddleware = createAuthMiddleware(async (ctx) => {
85
+ const session = await getSessionFromCtx(ctx);
86
+ if (!session) throw new APIError("UNAUTHORIZED");
87
+ return { session };
88
+ });
89
+ return {
90
+ id: "admin",
91
+ init() {
92
+ return { options: { databaseHooks: {
93
+ user: { create: { async before(user) {
94
+ return { data: {
95
+ role: options?.defaultRole ?? "user",
96
+ ...user
97
+ } };
98
+ } } },
99
+ session: { create: { async before(session, ctx) {
100
+ if (!ctx) return;
101
+ const user = await ctx.context.internalAdapter.findUserById(session.userId);
102
+ if (user.banned) {
103
+ if (user.banExpires && new Date(user.banExpires).getTime() < Date.now()) {
104
+ await ctx.context.internalAdapter.updateUser(session.userId, {
105
+ banned: false,
106
+ banReason: null,
107
+ banExpires: null
108
+ });
109
+ return;
110
+ }
111
+ if (ctx && (ctx.path.startsWith("/callback") || ctx.path.startsWith("/oauth2/callback"))) {
112
+ const redirectURI = ctx.context.options.onAPIError?.errorURL || `${ctx.context.baseURL}/error`;
113
+ throw ctx.redirect(`${redirectURI}?error=banned&error_description=${opts.bannedUserMessage}`);
114
+ }
115
+ throw new APIError("FORBIDDEN", {
116
+ message: opts.bannedUserMessage,
117
+ code: "BANNED_USER"
118
+ });
119
+ }
120
+ } } }
121
+ } } };
122
+ },
123
+ hooks: { after: [{
124
+ matcher(context) {
125
+ return context.path === "/list-sessions";
126
+ },
127
+ handler: createAuthMiddleware(async (ctx) => {
128
+ const response = await getEndpointResponse(ctx);
129
+ if (!response) return;
130
+ const newJson = response.filter((session) => {
131
+ return !session.impersonatedBy;
132
+ });
133
+ return ctx.json(newJson);
134
+ })
135
+ }] },
136
+ endpoints: {
137
+ setRole: createAuthEndpoint("/admin/set-role", {
138
+ method: "POST",
139
+ body: z$1.object({
140
+ userId: z$1.coerce.string().meta({ description: "The user id" }),
141
+ role: z$1.union([z$1.string().meta({ description: "The role to set. `admin` or `user` by default" }), z$1.array(z$1.string().meta({ description: "The roles to set. `admin` or `user` by default" }))]).meta({ description: "The role to set, this can be a string or an array of strings. Eg: `admin` or `[admin, user]`" })
142
+ }),
143
+ requireHeaders: true,
144
+ use: [adminMiddleware],
145
+ metadata: {
146
+ openapi: {
147
+ operationId: "setRole",
148
+ summary: "Set the role of a user",
149
+ description: "Set the role of a user",
150
+ responses: { 200: {
151
+ description: "User role updated",
152
+ content: { "application/json": { schema: {
153
+ type: "object",
154
+ properties: { user: { $ref: "#/components/schemas/User" } }
155
+ } } }
156
+ } }
157
+ },
158
+ $Infer: { body: {} }
159
+ }
160
+ }, async (ctx) => {
161
+ if (!hasPermission({
162
+ userId: ctx.context.session.user.id,
163
+ role: ctx.context.session.user.role,
164
+ options: opts,
165
+ permissions: { user: ["set-role"] }
166
+ })) throw new APIError("FORBIDDEN", { message: ADMIN_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_CHANGE_USERS_ROLE });
167
+ const roles = opts.roles;
168
+ if (roles) {
169
+ const inputRoles = Array.isArray(ctx.body.role) ? ctx.body.role : [ctx.body.role];
170
+ for (const role of inputRoles) if (!roles[role]) throw new APIError("BAD_REQUEST", { message: ADMIN_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_SET_NON_EXISTENT_VALUE });
171
+ }
172
+ const updatedUser = await ctx.context.internalAdapter.updateUser(ctx.body.userId, { role: parseRoles(ctx.body.role) });
173
+ return ctx.json({ user: updatedUser });
174
+ }),
175
+ getUser: createAuthEndpoint("/admin/get-user", {
176
+ method: "GET",
177
+ query: z$1.object({ id: z$1.string().meta({ description: "The id of the User" }) }),
178
+ use: [adminMiddleware],
179
+ metadata: { openapi: {
180
+ operationId: "getUser",
181
+ summary: "Get an existing user",
182
+ description: "Get an existing user",
183
+ responses: { 200: {
184
+ description: "User",
185
+ content: { "application/json": { schema: {
186
+ type: "object",
187
+ properties: { user: { $ref: "#/components/schemas/User" } }
188
+ } } }
189
+ } }
190
+ } }
191
+ }, async (ctx) => {
192
+ const { id } = ctx.query;
193
+ if (!hasPermission({
194
+ userId: ctx.context.session.user.id,
195
+ role: ctx.context.session.user.role,
196
+ options: opts,
197
+ permissions: { user: ["get"] }
198
+ })) throw ctx.error("FORBIDDEN", {
199
+ message: ADMIN_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_GET_USER,
200
+ code: "YOU_ARE_NOT_ALLOWED_TO_GET_USER"
201
+ });
202
+ const user = await ctx.context.internalAdapter.findUserById(id);
203
+ if (!user) throw new APIError("NOT_FOUND", { message: BASE_ERROR_CODES.USER_NOT_FOUND });
204
+ return parseUserOutput(ctx.context.options, user);
205
+ }),
206
+ createUser: createAuthEndpoint("/admin/create-user", {
207
+ method: "POST",
208
+ body: z$1.object({
209
+ email: z$1.string().meta({ description: "The email of the user" }),
210
+ password: z$1.string().meta({ description: "The password of the user" }),
211
+ name: z$1.string().meta({ description: "The name of the user" }),
212
+ role: z$1.union([z$1.string().meta({ description: "The role of the user" }), z$1.array(z$1.string().meta({ description: "The roles of user" }))]).optional().meta({ description: `A string or array of strings representing the roles to apply to the new user. Eg: \"user\"` }),
213
+ data: z$1.record(z$1.string(), z$1.any()).optional().meta({ description: "Extra fields for the user. Including custom additional fields." })
214
+ }),
215
+ metadata: {
216
+ openapi: {
217
+ operationId: "createUser",
218
+ summary: "Create a new user",
219
+ description: "Create a new user",
220
+ responses: { 200: {
221
+ description: "User created",
222
+ content: { "application/json": { schema: {
223
+ type: "object",
224
+ properties: { user: { $ref: "#/components/schemas/User" } }
225
+ } } }
226
+ } }
227
+ },
228
+ $Infer: { body: {} }
229
+ }
230
+ }, async (ctx) => {
231
+ const session = await getSessionFromCtx(ctx);
232
+ if (!session && (ctx.request || ctx.headers)) throw ctx.error("UNAUTHORIZED");
233
+ if (session) {
234
+ if (!hasPermission({
235
+ userId: session.user.id,
236
+ role: session.user.role,
237
+ options: opts,
238
+ permissions: { user: ["create"] }
239
+ })) throw new APIError("FORBIDDEN", { message: ADMIN_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_CREATE_USERS });
240
+ }
241
+ const email = ctx.body.email.toLowerCase();
242
+ if (!z$1.string().email().safeParse(email).success) throw new APIError("BAD_REQUEST", { message: BASE_ERROR_CODES.INVALID_EMAIL });
243
+ if (await ctx.context.internalAdapter.findUserByEmail(email)) throw new APIError("BAD_REQUEST", { message: ADMIN_ERROR_CODES.USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL });
244
+ const user = await ctx.context.internalAdapter.createUser({
245
+ email,
246
+ name: ctx.body.name,
247
+ role: (ctx.body.role && parseRoles(ctx.body.role)) ?? options?.defaultRole ?? "user",
248
+ ...ctx.body.data
249
+ });
250
+ if (!user) throw new APIError("INTERNAL_SERVER_ERROR", { message: ADMIN_ERROR_CODES.FAILED_TO_CREATE_USER });
251
+ const hashedPassword = await ctx.context.password.hash(ctx.body.password);
252
+ await ctx.context.internalAdapter.linkAccount({
253
+ accountId: user.id,
254
+ providerId: "credential",
255
+ password: hashedPassword,
256
+ userId: user.id
257
+ });
258
+ return ctx.json({ user });
259
+ }),
260
+ adminUpdateUser: createAuthEndpoint("/admin/update-user", {
261
+ method: "POST",
262
+ body: z$1.object({
263
+ userId: z$1.coerce.string().meta({ description: "The user id" }),
264
+ data: z$1.record(z$1.any(), z$1.any()).meta({ description: "The user data to update" })
265
+ }),
266
+ use: [adminMiddleware],
267
+ metadata: { openapi: {
268
+ operationId: "updateUser",
269
+ summary: "Update a user",
270
+ description: "Update a user's details",
271
+ responses: { 200: {
272
+ description: "User updated",
273
+ content: { "application/json": { schema: {
274
+ type: "object",
275
+ properties: { user: { $ref: "#/components/schemas/User" } }
276
+ } } }
277
+ } }
278
+ } }
279
+ }, async (ctx) => {
280
+ if (!hasPermission({
281
+ userId: ctx.context.session.user.id,
282
+ role: ctx.context.session.user.role,
283
+ options: opts,
284
+ permissions: { user: ["update"] }
285
+ })) throw ctx.error("FORBIDDEN", {
286
+ message: ADMIN_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_UPDATE_USERS,
287
+ code: "YOU_ARE_NOT_ALLOWED_TO_UPDATE_USERS"
288
+ });
289
+ if (Object.keys(ctx.body.data).length === 0) throw new APIError("BAD_REQUEST", { message: ADMIN_ERROR_CODES.NO_DATA_TO_UPDATE });
290
+ if (ctx.body.data?.role) ctx.body.data.role = parseRoles(ctx.body.data.role);
291
+ const updatedUser = await ctx.context.internalAdapter.updateUser(ctx.body.userId, ctx.body.data);
292
+ return ctx.json(updatedUser);
293
+ }),
294
+ listUsers: createAuthEndpoint("/admin/list-users", {
295
+ method: "GET",
296
+ use: [adminMiddleware],
297
+ query: z$1.object({
298
+ searchValue: z$1.string().optional().meta({ description: "The value to search for. Eg: \"some name\"" }),
299
+ searchField: z$1.enum(["email", "name"]).meta({ description: "The field to search in, defaults to email. Can be `email` or `name`. Eg: \"name\"" }).optional(),
300
+ searchOperator: z$1.enum([
301
+ "contains",
302
+ "starts_with",
303
+ "ends_with"
304
+ ]).meta({ description: "The operator to use for the search. Can be `contains`, `starts_with` or `ends_with`. Eg: \"contains\"" }).optional(),
305
+ limit: z$1.string().meta({ description: "The number of users to return" }).or(z$1.number()).optional(),
306
+ offset: z$1.string().meta({ description: "The offset to start from" }).or(z$1.number()).optional(),
307
+ sortBy: z$1.string().meta({ description: "The field to sort by" }).optional(),
308
+ sortDirection: z$1.enum(["asc", "desc"]).meta({ description: "The direction to sort by" }).optional(),
309
+ filterField: z$1.string().meta({ description: "The field to filter by" }).optional(),
310
+ filterValue: z$1.string().meta({ description: "The value to filter by" }).or(z$1.number()).or(z$1.boolean()).optional(),
311
+ filterOperator: z$1.enum([
312
+ "eq",
313
+ "ne",
314
+ "lt",
315
+ "lte",
316
+ "gt",
317
+ "gte",
318
+ "contains"
319
+ ]).meta({ description: "The operator to use for the filter" }).optional()
320
+ }),
321
+ metadata: { openapi: {
322
+ operationId: "listUsers",
323
+ summary: "List users",
324
+ description: "List users",
325
+ responses: { 200: {
326
+ description: "List of users",
327
+ content: { "application/json": { schema: {
328
+ type: "object",
329
+ properties: {
330
+ users: {
331
+ type: "array",
332
+ items: { $ref: "#/components/schemas/User" }
333
+ },
334
+ total: { type: "number" },
335
+ limit: { type: "number" },
336
+ offset: { type: "number" }
337
+ },
338
+ required: ["users", "total"]
339
+ } } }
340
+ } }
341
+ } }
342
+ }, async (ctx) => {
343
+ const session = ctx.context.session;
344
+ if (!hasPermission({
345
+ userId: ctx.context.session.user.id,
346
+ role: session.user.role,
347
+ options: opts,
348
+ permissions: { user: ["list"] }
349
+ })) throw new APIError("FORBIDDEN", { message: ADMIN_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_LIST_USERS });
350
+ const where = [];
351
+ if (ctx.query?.searchValue) where.push({
352
+ field: ctx.query.searchField || "email",
353
+ operator: ctx.query.searchOperator || "contains",
354
+ value: ctx.query.searchValue
355
+ });
356
+ if (ctx.query?.filterValue) where.push({
357
+ field: ctx.query.filterField || "email",
358
+ operator: ctx.query.filterOperator || "eq",
359
+ value: ctx.query.filterValue
360
+ });
361
+ try {
362
+ const users = await ctx.context.internalAdapter.listUsers(Number(ctx.query?.limit) || void 0, Number(ctx.query?.offset) || void 0, ctx.query?.sortBy ? {
363
+ field: ctx.query.sortBy,
364
+ direction: ctx.query.sortDirection || "asc"
365
+ } : void 0, where.length ? where : void 0);
366
+ const total = await ctx.context.internalAdapter.countTotalUsers(where.length ? where : void 0);
367
+ return ctx.json({
368
+ users,
369
+ total,
370
+ limit: Number(ctx.query?.limit) || void 0,
371
+ offset: Number(ctx.query?.offset) || void 0
372
+ });
373
+ } catch (e) {
374
+ return ctx.json({
375
+ users: [],
376
+ total: 0
377
+ });
378
+ }
379
+ }),
380
+ listUserSessions: createAuthEndpoint("/admin/list-user-sessions", {
381
+ method: "POST",
382
+ use: [adminMiddleware],
383
+ body: z$1.object({ userId: z$1.coerce.string().meta({ description: "The user id" }) }),
384
+ metadata: { openapi: {
385
+ operationId: "listUserSessions",
386
+ summary: "List user sessions",
387
+ description: "List user sessions",
388
+ responses: { 200: {
389
+ description: "List of user sessions",
390
+ content: { "application/json": { schema: {
391
+ type: "object",
392
+ properties: { sessions: {
393
+ type: "array",
394
+ items: { $ref: "#/components/schemas/Session" }
395
+ } }
396
+ } } }
397
+ } }
398
+ } }
399
+ }, async (ctx) => {
400
+ const session = ctx.context.session;
401
+ if (!hasPermission({
402
+ userId: ctx.context.session.user.id,
403
+ role: session.user.role,
404
+ options: opts,
405
+ permissions: { session: ["list"] }
406
+ })) throw new APIError("FORBIDDEN", { message: ADMIN_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_LIST_USERS_SESSIONS });
407
+ return { sessions: await ctx.context.internalAdapter.listSessions(ctx.body.userId) };
408
+ }),
409
+ unbanUser: createAuthEndpoint("/admin/unban-user", {
410
+ method: "POST",
411
+ body: z$1.object({ userId: z$1.coerce.string().meta({ description: "The user id" }) }),
412
+ use: [adminMiddleware],
413
+ metadata: { openapi: {
414
+ operationId: "unbanUser",
415
+ summary: "Unban a user",
416
+ description: "Unban a user",
417
+ responses: { 200: {
418
+ description: "User unbanned",
419
+ content: { "application/json": { schema: {
420
+ type: "object",
421
+ properties: { user: { $ref: "#/components/schemas/User" } }
422
+ } } }
423
+ } }
424
+ } }
425
+ }, async (ctx) => {
426
+ const session = ctx.context.session;
427
+ if (!hasPermission({
428
+ userId: ctx.context.session.user.id,
429
+ role: session.user.role,
430
+ options: opts,
431
+ permissions: { user: ["ban"] }
432
+ })) throw new APIError("FORBIDDEN", { message: ADMIN_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_BAN_USERS });
433
+ const user = await ctx.context.internalAdapter.updateUser(ctx.body.userId, {
434
+ banned: false,
435
+ banExpires: null,
436
+ banReason: null,
437
+ updatedAt: /* @__PURE__ */ new Date()
438
+ });
439
+ return ctx.json({ user });
440
+ }),
441
+ banUser: createAuthEndpoint("/admin/ban-user", {
442
+ method: "POST",
443
+ body: z$1.object({
444
+ userId: z$1.coerce.string().meta({ description: "The user id" }),
445
+ banReason: z$1.string().meta({ description: "The reason for the ban" }).optional(),
446
+ banExpiresIn: z$1.number().meta({ description: "The number of seconds until the ban expires" }).optional()
447
+ }),
448
+ use: [adminMiddleware],
449
+ metadata: { openapi: {
450
+ operationId: "banUser",
451
+ summary: "Ban a user",
452
+ description: "Ban a user",
453
+ responses: { 200: {
454
+ description: "User banned",
455
+ content: { "application/json": { schema: {
456
+ type: "object",
457
+ properties: { user: { $ref: "#/components/schemas/User" } }
458
+ } } }
459
+ } }
460
+ } }
461
+ }, async (ctx) => {
462
+ const session = ctx.context.session;
463
+ if (!hasPermission({
464
+ userId: ctx.context.session.user.id,
465
+ role: session.user.role,
466
+ options: opts,
467
+ permissions: { user: ["ban"] }
468
+ })) throw new APIError("FORBIDDEN", { message: ADMIN_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_BAN_USERS });
469
+ if (!await ctx.context.internalAdapter.findUserById(ctx.body.userId)) throw new APIError("NOT_FOUND", { message: BASE_ERROR_CODES.USER_NOT_FOUND });
470
+ if (ctx.body.userId === ctx.context.session.user.id) throw new APIError("BAD_REQUEST", { message: ADMIN_ERROR_CODES.YOU_CANNOT_BAN_YOURSELF });
471
+ const user = await ctx.context.internalAdapter.updateUser(ctx.body.userId, {
472
+ banned: true,
473
+ banReason: ctx.body.banReason || options?.defaultBanReason || "No reason",
474
+ banExpires: ctx.body.banExpiresIn ? getDate(ctx.body.banExpiresIn, "sec") : options?.defaultBanExpiresIn ? getDate(options.defaultBanExpiresIn, "sec") : void 0,
475
+ updatedAt: /* @__PURE__ */ new Date()
476
+ });
477
+ await ctx.context.internalAdapter.deleteSessions(ctx.body.userId);
478
+ return ctx.json({ user });
479
+ }),
480
+ impersonateUser: createAuthEndpoint("/admin/impersonate-user", {
481
+ method: "POST",
482
+ body: z$1.object({ userId: z$1.coerce.string().meta({ description: "The user id" }) }),
483
+ use: [adminMiddleware],
484
+ metadata: { openapi: {
485
+ operationId: "impersonateUser",
486
+ summary: "Impersonate a user",
487
+ description: "Impersonate a user",
488
+ responses: { 200: {
489
+ description: "Impersonation session created",
490
+ content: { "application/json": { schema: {
491
+ type: "object",
492
+ properties: {
493
+ session: { $ref: "#/components/schemas/Session" },
494
+ user: { $ref: "#/components/schemas/User" }
495
+ }
496
+ } } }
497
+ } }
498
+ } }
499
+ }, async (ctx) => {
500
+ if (!hasPermission({
501
+ userId: ctx.context.session.user.id,
502
+ role: ctx.context.session.user.role,
503
+ options: opts,
504
+ permissions: { user: ["impersonate"] }
505
+ })) throw new APIError("FORBIDDEN", { message: ADMIN_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_IMPERSONATE_USERS });
506
+ const targetUser = await ctx.context.internalAdapter.findUserById(ctx.body.userId);
507
+ if (!targetUser) throw new APIError("NOT_FOUND", { message: "User not found" });
508
+ const session = await ctx.context.internalAdapter.createSession(targetUser.id, true, {
509
+ impersonatedBy: ctx.context.session.user.id,
510
+ expiresAt: options?.impersonationSessionDuration ? getDate(options.impersonationSessionDuration, "sec") : getDate(3600, "sec")
511
+ }, true);
512
+ if (!session) throw new APIError("INTERNAL_SERVER_ERROR", { message: ADMIN_ERROR_CODES.FAILED_TO_CREATE_USER });
513
+ const authCookies = ctx.context.authCookies;
514
+ deleteSessionCookie(ctx);
515
+ const dontRememberMeCookie = await ctx.getSignedCookie(ctx.context.authCookies.dontRememberToken.name, ctx.context.secret);
516
+ const adminCookieProp = ctx.context.createAuthCookie("admin_session");
517
+ await ctx.setSignedCookie(adminCookieProp.name, `${ctx.context.session.session.token}:${dontRememberMeCookie || ""}`, ctx.context.secret, authCookies.sessionToken.options);
518
+ await setSessionCookie(ctx, {
519
+ session,
520
+ user: targetUser
521
+ }, true);
522
+ return ctx.json({
523
+ session,
524
+ user: targetUser
525
+ });
526
+ }),
527
+ stopImpersonating: createAuthEndpoint("/admin/stop-impersonating", {
528
+ method: "POST",
529
+ requireHeaders: true
530
+ }, async (ctx) => {
531
+ const session = await getSessionFromCtx(ctx);
532
+ if (!session) throw new APIError("UNAUTHORIZED");
533
+ if (!session.session.impersonatedBy) throw new APIError("BAD_REQUEST", { message: "You are not impersonating anyone" });
534
+ const user = await ctx.context.internalAdapter.findUserById(session.session.impersonatedBy);
535
+ if (!user) throw new APIError("INTERNAL_SERVER_ERROR", { message: "Failed to find user" });
536
+ const adminCookieName = ctx.context.createAuthCookie("admin_session").name;
537
+ const adminCookie = await ctx.getSignedCookie(adminCookieName, ctx.context.secret);
538
+ if (!adminCookie) throw new APIError("INTERNAL_SERVER_ERROR", { message: "Failed to find admin session" });
539
+ const [adminSessionToken, dontRememberMeCookie] = adminCookie?.split(":");
540
+ const adminSession = await ctx.context.internalAdapter.findSession(adminSessionToken);
541
+ if (!adminSession || adminSession.session.userId !== user.id) throw new APIError("INTERNAL_SERVER_ERROR", { message: "Failed to find admin session" });
542
+ await ctx.context.internalAdapter.deleteSession(session.session.token);
543
+ await setSessionCookie(ctx, adminSession, !!dontRememberMeCookie);
544
+ return ctx.json(adminSession);
545
+ }),
546
+ revokeUserSession: createAuthEndpoint("/admin/revoke-user-session", {
547
+ method: "POST",
548
+ body: z$1.object({ sessionToken: z$1.string().meta({ description: "The session token" }) }),
549
+ use: [adminMiddleware],
550
+ metadata: { openapi: {
551
+ operationId: "revokeUserSession",
552
+ summary: "Revoke a user session",
553
+ description: "Revoke a user session",
554
+ responses: { 200: {
555
+ description: "Session revoked",
556
+ content: { "application/json": { schema: {
557
+ type: "object",
558
+ properties: { success: { type: "boolean" } }
559
+ } } }
560
+ } }
561
+ } }
562
+ }, async (ctx) => {
563
+ const session = ctx.context.session;
564
+ if (!hasPermission({
565
+ userId: ctx.context.session.user.id,
566
+ role: session.user.role,
567
+ options: opts,
568
+ permissions: { session: ["revoke"] }
569
+ })) throw new APIError("FORBIDDEN", { message: ADMIN_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_REVOKE_USERS_SESSIONS });
570
+ await ctx.context.internalAdapter.deleteSession(ctx.body.sessionToken);
571
+ return ctx.json({ success: true });
572
+ }),
573
+ revokeUserSessions: createAuthEndpoint("/admin/revoke-user-sessions", {
574
+ method: "POST",
575
+ body: z$1.object({ userId: z$1.coerce.string().meta({ description: "The user id" }) }),
576
+ use: [adminMiddleware],
577
+ metadata: { openapi: {
578
+ operationId: "revokeUserSessions",
579
+ summary: "Revoke all user sessions",
580
+ description: "Revoke all user sessions",
581
+ responses: { 200: {
582
+ description: "Sessions revoked",
583
+ content: { "application/json": { schema: {
584
+ type: "object",
585
+ properties: { success: { type: "boolean" } }
586
+ } } }
587
+ } }
588
+ } }
589
+ }, async (ctx) => {
590
+ const session = ctx.context.session;
591
+ if (!hasPermission({
592
+ userId: ctx.context.session.user.id,
593
+ role: session.user.role,
594
+ options: opts,
595
+ permissions: { session: ["revoke"] }
596
+ })) throw new APIError("FORBIDDEN", { message: ADMIN_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_REVOKE_USERS_SESSIONS });
597
+ await ctx.context.internalAdapter.deleteSessions(ctx.body.userId);
598
+ return ctx.json({ success: true });
599
+ }),
600
+ removeUser: createAuthEndpoint("/admin/remove-user", {
601
+ method: "POST",
602
+ body: z$1.object({ userId: z$1.coerce.string().meta({ description: "The user id" }) }),
603
+ use: [adminMiddleware],
604
+ metadata: { openapi: {
605
+ operationId: "removeUser",
606
+ summary: "Remove a user",
607
+ description: "Delete a user and all their sessions and accounts. Cannot be undone.",
608
+ responses: { 200: {
609
+ description: "User removed",
610
+ content: { "application/json": { schema: {
611
+ type: "object",
612
+ properties: { success: { type: "boolean" } }
613
+ } } }
614
+ } }
615
+ } }
616
+ }, async (ctx) => {
617
+ const session = ctx.context.session;
618
+ if (!hasPermission({
619
+ userId: ctx.context.session.user.id,
620
+ role: session.user.role,
621
+ options: opts,
622
+ permissions: { user: ["delete"] }
623
+ })) throw new APIError("FORBIDDEN", { message: ADMIN_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_DELETE_USERS });
624
+ if (ctx.body.userId === ctx.context.session.user.id) throw new APIError("BAD_REQUEST", { message: ADMIN_ERROR_CODES.YOU_CANNOT_REMOVE_YOURSELF });
625
+ if (!await ctx.context.internalAdapter.findUserById(ctx.body.userId)) throw new APIError("NOT_FOUND", { message: "User not found" });
626
+ await ctx.context.internalAdapter.deleteUser(ctx.body.userId);
627
+ return ctx.json({ success: true });
628
+ }),
629
+ setUserPassword: createAuthEndpoint("/admin/set-user-password", {
630
+ method: "POST",
631
+ body: z$1.object({
632
+ newPassword: z$1.string().nonempty("newPassword cannot be empty").meta({ description: "The new password" }),
633
+ userId: z$1.coerce.string().nonempty("userId cannot be empty").meta({ description: "The user id" })
634
+ }),
635
+ use: [adminMiddleware],
636
+ metadata: { openapi: {
637
+ operationId: "setUserPassword",
638
+ summary: "Set a user's password",
639
+ description: "Set a user's password",
640
+ responses: { 200: {
641
+ description: "Password set",
642
+ content: { "application/json": { schema: {
643
+ type: "object",
644
+ properties: { status: { type: "boolean" } }
645
+ } } }
646
+ } }
647
+ } }
648
+ }, async (ctx) => {
649
+ if (!hasPermission({
650
+ userId: ctx.context.session.user.id,
651
+ role: ctx.context.session.user.role,
652
+ options: opts,
653
+ permissions: { user: ["set-password"] }
654
+ })) throw new APIError("FORBIDDEN", { message: ADMIN_ERROR_CODES.YOU_ARE_NOT_ALLOWED_TO_SET_USERS_PASSWORD });
655
+ const { newPassword, userId } = ctx.body;
656
+ const minPasswordLength = ctx.context.password.config.minPasswordLength;
657
+ if (newPassword.length < minPasswordLength) {
658
+ ctx.context.logger.error("Password is too short");
659
+ throw new APIError("BAD_REQUEST", { message: BASE_ERROR_CODES.PASSWORD_TOO_SHORT });
660
+ }
661
+ const maxPasswordLength = ctx.context.password.config.maxPasswordLength;
662
+ if (newPassword.length > maxPasswordLength) {
663
+ ctx.context.logger.error("Password is too long");
664
+ throw new APIError("BAD_REQUEST", { message: BASE_ERROR_CODES.PASSWORD_TOO_LONG });
665
+ }
666
+ const hashedPassword = await ctx.context.password.hash(newPassword);
667
+ await ctx.context.internalAdapter.updatePassword(userId, hashedPassword);
668
+ return ctx.json({ status: true });
669
+ }),
670
+ userHasPermission: createAuthEndpoint("/admin/has-permission", {
671
+ method: "POST",
672
+ body: z$1.object({
673
+ userId: z$1.coerce.string().optional().meta({ description: `The user id. Eg: "user-id"` }),
674
+ role: z$1.string().optional().meta({ description: `The role to check permission for. Eg: "admin"` })
675
+ }).and(z$1.union([z$1.object({
676
+ permission: z$1.record(z$1.string(), z$1.array(z$1.string())),
677
+ permissions: z$1.undefined()
678
+ }), z$1.object({
679
+ permission: z$1.undefined(),
680
+ permissions: z$1.record(z$1.string(), z$1.array(z$1.string()))
681
+ })])),
682
+ metadata: {
683
+ openapi: {
684
+ description: "Check if the user has permission",
685
+ requestBody: { content: { "application/json": { schema: {
686
+ type: "object",
687
+ properties: {
688
+ permission: {
689
+ type: "object",
690
+ description: "The permission to check",
691
+ deprecated: true
692
+ },
693
+ permissions: {
694
+ type: "object",
695
+ description: "The permission to check"
696
+ }
697
+ },
698
+ required: ["permissions"]
699
+ } } } },
700
+ responses: { "200": {
701
+ description: "Success",
702
+ content: { "application/json": { schema: {
703
+ type: "object",
704
+ properties: {
705
+ error: { type: "string" },
706
+ success: { type: "boolean" }
707
+ },
708
+ required: ["success"]
709
+ } } }
710
+ } }
711
+ },
712
+ $Infer: { body: {} }
713
+ }
714
+ }, async (ctx) => {
715
+ if (!ctx.body?.permission && !ctx.body?.permissions) throw new APIError("BAD_REQUEST", { message: "invalid permission check. no permission(s) were passed." });
716
+ const session = await getSessionFromCtx(ctx);
717
+ if (!session && (ctx.request || ctx.headers)) throw new APIError("UNAUTHORIZED");
718
+ if (!session && !ctx.body.userId && !ctx.body.role) throw new APIError("BAD_REQUEST", { message: "user id or role is required" });
719
+ const user = session?.user || (ctx.body.role ? {
720
+ id: ctx.body.userId || "",
721
+ role: ctx.body.role
722
+ } : null) || await ctx.context.internalAdapter.findUserById(ctx.body.userId);
723
+ if (!user) throw new APIError("BAD_REQUEST", { message: "user not found" });
724
+ const result = hasPermission({
725
+ userId: user.id,
726
+ role: user.role,
727
+ options,
728
+ permissions: ctx.body.permissions ?? ctx.body.permission
729
+ });
730
+ return ctx.json({
731
+ error: null,
732
+ success: result
733
+ });
734
+ })
735
+ },
736
+ $ERROR_CODES: ADMIN_ERROR_CODES,
737
+ schema: mergeSchema(schema, opts.schema),
738
+ options
739
+ };
740
+ };
741
+
742
+ //#endregion
743
+ export { admin as t };