@masheev/better-auth 0.0.0-stage → 1.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (465) hide show
  1. package/LICENSE.md +20 -0
  2. package/README.md +31 -2
  3. package/TYPE-PATCH-NOTICE.md +9 -0
  4. package/TYPE-PATCH-PROVENANCE.json +267 -0
  5. package/dist/_virtual/_rolldown/runtime.mjs +27 -0
  6. package/dist/adapters/drizzle-adapter/index.d.mts +1 -0
  7. package/dist/adapters/drizzle-adapter/index.mjs +2 -0
  8. package/dist/adapters/index.d.mts +26 -0
  9. package/dist/adapters/index.mjs +9 -0
  10. package/dist/adapters/kysely-adapter/index.d.mts +1 -0
  11. package/dist/adapters/kysely-adapter/index.mjs +2 -0
  12. package/dist/adapters/memory-adapter/index.d.mts +1 -0
  13. package/dist/adapters/memory-adapter/index.mjs +2 -0
  14. package/dist/adapters/mongodb-adapter/index.d.mts +1 -0
  15. package/dist/adapters/mongodb-adapter/index.mjs +2 -0
  16. package/dist/adapters/prisma-adapter/index.d.mts +1 -0
  17. package/dist/adapters/prisma-adapter/index.mjs +2 -0
  18. package/dist/api/dispatch.d.mts +34 -0
  19. package/dist/api/dispatch.mjs +275 -0
  20. package/dist/api/index.d.mts +4053 -0
  21. package/dist/api/index.mjs +220 -0
  22. package/dist/api/middlewares/authorization.d.mts +69 -0
  23. package/dist/api/middlewares/authorization.mjs +78 -0
  24. package/dist/api/middlewares/index.d.mts +2 -0
  25. package/dist/api/middlewares/origin-check.d.mts +17 -0
  26. package/dist/api/middlewares/origin-check.mjs +155 -0
  27. package/dist/api/rate-limiter/index.mjs +318 -0
  28. package/dist/api/routes/account.d.mts +413 -0
  29. package/dist/api/routes/account.mjs +619 -0
  30. package/dist/api/routes/callback.d.mts +32 -0
  31. package/dist/api/routes/callback.mjs +261 -0
  32. package/dist/api/routes/email-verification.d.mts +160 -0
  33. package/dist/api/routes/email-verification.mjs +324 -0
  34. package/dist/api/routes/error.d.mts +27 -0
  35. package/dist/api/routes/error.mjs +387 -0
  36. package/dist/api/routes/index.d.mts +12 -0
  37. package/dist/api/routes/ok.d.mts +35 -0
  38. package/dist/api/routes/ok.mjs +27 -0
  39. package/dist/api/routes/password.d.mts +182 -0
  40. package/dist/api/routes/password.mjs +206 -0
  41. package/dist/api/routes/session.d.mts +450 -0
  42. package/dist/api/routes/session.mjs +481 -0
  43. package/dist/api/routes/sign-in.d.mts +186 -0
  44. package/dist/api/routes/sign-in.mjs +368 -0
  45. package/dist/api/routes/sign-out.d.mts +51 -0
  46. package/dist/api/routes/sign-out.mjs +96 -0
  47. package/dist/api/routes/sign-up.d.mts +159 -0
  48. package/dist/api/routes/sign-up.mjs +275 -0
  49. package/dist/api/routes/update-session.d.mts +74 -0
  50. package/dist/api/routes/update-session.mjs +57 -0
  51. package/dist/api/routes/update-user.d.mts +428 -0
  52. package/dist/api/routes/update-user.mjs +522 -0
  53. package/dist/api/state/oauth.d.mts +53 -0
  54. package/dist/api/state/oauth.mjs +38 -0
  55. package/dist/api/state/should-session-refresh.d.mts +12 -0
  56. package/dist/api/state/should-session-refresh.mjs +13 -0
  57. package/dist/api/to-auth-endpoints.mjs +60 -0
  58. package/dist/auth/base.mjs +66 -0
  59. package/dist/auth/full.d.mts +28 -0
  60. package/dist/auth/full.mjs +29 -0
  61. package/dist/auth/minimal.d.mts +10 -0
  62. package/dist/auth/minimal.mjs +11 -0
  63. package/dist/auth/trusted-origins.mjs +106 -0
  64. package/dist/client/broadcast-channel.d.mts +19 -0
  65. package/dist/client/broadcast-channel.mjs +44 -0
  66. package/dist/client/config.d.mts +90 -0
  67. package/dist/client/config.mjs +113 -0
  68. package/dist/client/equality.d.mts +19 -0
  69. package/dist/client/equality.mjs +42 -0
  70. package/dist/client/fetch-plugins.mjs +17 -0
  71. package/dist/client/focus-manager.d.mts +10 -0
  72. package/dist/client/focus-manager.mjs +30 -0
  73. package/dist/client/index.d.mts +35 -0
  74. package/dist/client/index.mjs +22 -0
  75. package/dist/client/lynx/index.d.mts +43 -0
  76. package/dist/client/lynx/index.mjs +22 -0
  77. package/dist/client/lynx/lynx-store.d.mts +46 -0
  78. package/dist/client/lynx/lynx-store.mjs +44 -0
  79. package/dist/client/online-manager.d.mts +11 -0
  80. package/dist/client/online-manager.mjs +33 -0
  81. package/dist/client/parser.d.mts +10 -0
  82. package/dist/client/parser.mjs +70 -0
  83. package/dist/client/path-to-object.d.mts +113 -0
  84. package/dist/client/plugins/index.d.mts +44 -0
  85. package/dist/client/plugins/index.mjs +30 -0
  86. package/dist/client/plugins/infer-plugin.d.mts +16 -0
  87. package/dist/client/plugins/infer-plugin.mjs +11 -0
  88. package/dist/client/proxy.mjs +78 -0
  89. package/dist/client/query.d.mts +23 -0
  90. package/dist/client/query.mjs +124 -0
  91. package/dist/client/react/index.d.mts +44 -0
  92. package/dist/client/react/index.mjs +22 -0
  93. package/dist/client/react/react-store.d.mts +46 -0
  94. package/dist/client/react/react-store.mjs +44 -0
  95. package/dist/client/session-atom.d.mts +11 -0
  96. package/dist/client/session-atom.mjs +178 -0
  97. package/dist/client/session-refresh.d.mts +20 -0
  98. package/dist/client/session-refresh.mjs +131 -0
  99. package/dist/client/solid/index.d.mts +44 -0
  100. package/dist/client/solid/index.mjs +22 -0
  101. package/dist/client/solid/solid-store.mjs +21 -0
  102. package/dist/client/svelte/index.d.mts +44 -0
  103. package/dist/client/svelte/index.mjs +18 -0
  104. package/dist/client/types.d.mts +51 -0
  105. package/dist/client/vanilla.d.mts +42 -0
  106. package/dist/client/vanilla.mjs +18 -0
  107. package/dist/client/vue/index.d.mts +67 -0
  108. package/dist/client/vue/index.mjs +54 -0
  109. package/dist/client/vue/vue-store.mjs +23 -0
  110. package/dist/context/create-context.mjs +235 -0
  111. package/dist/context/helpers.mjs +158 -0
  112. package/dist/context/init-minimal.mjs +17 -0
  113. package/dist/context/init.mjs +19 -0
  114. package/dist/context/secret-utils.mjs +53 -0
  115. package/dist/context/store-capabilities.mjs +12 -0
  116. package/dist/cookies/cache.mjs +33 -0
  117. package/dist/cookies/cookie-utils.d.mts +72 -0
  118. package/dist/cookies/cookie-utils.mjs +203 -0
  119. package/dist/cookies/index.d.mts +124 -0
  120. package/dist/cookies/index.mjs +350 -0
  121. package/dist/cookies/jwt.mjs +44 -0
  122. package/dist/cookies/session-store.d.mts +32 -0
  123. package/dist/cookies/session-store.mjs +183 -0
  124. package/dist/crypto/buffer.d.mts +7 -0
  125. package/dist/crypto/buffer.mjs +16 -0
  126. package/dist/crypto/index.d.mts +32 -0
  127. package/dist/crypto/index.mjs +69 -0
  128. package/dist/crypto/jwt.d.mts +9 -0
  129. package/dist/crypto/jwt.mjs +141 -0
  130. package/dist/crypto/password.d.mts +13 -0
  131. package/dist/crypto/password.mjs +14 -0
  132. package/dist/crypto/random.d.mts +4 -0
  133. package/dist/crypto/random.mjs +5 -0
  134. package/dist/db/adapter-base.d.mts +7 -0
  135. package/dist/db/adapter-base.mjs +25 -0
  136. package/dist/db/adapter-kysely.d.mts +7 -0
  137. package/dist/db/adapter-kysely.mjs +17 -0
  138. package/dist/db/field-converter.d.mts +7 -0
  139. package/dist/db/field-converter.mjs +19 -0
  140. package/dist/db/field.d.mts +41 -0
  141. package/dist/db/get-migration.d.mts +56 -0
  142. package/dist/db/get-migration.mjs +685 -0
  143. package/dist/db/get-schema.d.mts +13 -0
  144. package/dist/db/get-schema.mjs +39 -0
  145. package/dist/db/index.d.mts +10 -0
  146. package/dist/db/index.mjs +35 -0
  147. package/dist/db/internal-adapter.d.mts +14 -0
  148. package/dist/db/internal-adapter.mjs +951 -0
  149. package/dist/db/revoke-unproven-account-access.d.mts +21 -0
  150. package/dist/db/revoke-unproven-account-access.mjs +58 -0
  151. package/dist/db/schema.d.mts +62 -0
  152. package/dist/db/schema.mjs +161 -0
  153. package/dist/db/to-zod.d.mts +35 -0
  154. package/dist/db/to-zod.mjs +23 -0
  155. package/dist/db/verification-token-storage.mjs +25 -0
  156. package/dist/db/with-hooks.d.mts +37 -0
  157. package/dist/db/with-hooks.mjs +255 -0
  158. package/dist/index.d.mts +30 -0
  159. package/dist/index.mjs +17 -0
  160. package/dist/integrations/cookie-plugin-guard.mjs +18 -0
  161. package/dist/integrations/next-js.d.mts +29 -0
  162. package/dist/integrations/next-js.mjs +105 -0
  163. package/dist/integrations/node.d.mts +11 -0
  164. package/dist/integrations/node.mjs +13 -0
  165. package/dist/integrations/solid-start.d.mts +22 -0
  166. package/dist/integrations/solid-start.mjs +15 -0
  167. package/dist/integrations/svelte-kit.d.mts +38 -0
  168. package/dist/integrations/svelte-kit.mjs +57 -0
  169. package/dist/integrations/tanstack-start-solid.d.mts +33 -0
  170. package/dist/integrations/tanstack-start-solid.mjs +57 -0
  171. package/dist/integrations/tanstack-start.d.mts +33 -0
  172. package/dist/integrations/tanstack-start.mjs +57 -0
  173. package/dist/oauth2/account-key.mjs +43 -0
  174. package/dist/oauth2/errors.mjs +49 -0
  175. package/dist/oauth2/index.d.mts +5 -0
  176. package/dist/oauth2/index.mjs +5 -0
  177. package/dist/oauth2/link-account.d.mts +96 -0
  178. package/dist/oauth2/link-account.mjs +329 -0
  179. package/dist/oauth2/state.d.mts +54 -0
  180. package/dist/oauth2/state.mjs +67 -0
  181. package/dist/oauth2/utils.d.mts +11 -0
  182. package/dist/oauth2/utils.mjs +33 -0
  183. package/dist/package.mjs +4 -0
  184. package/dist/plugins/access/access.d.mts +17 -0
  185. package/dist/plugins/access/access.mjs +78 -0
  186. package/dist/plugins/access/index.d.mts +3 -0
  187. package/dist/plugins/access/index.mjs +2 -0
  188. package/dist/plugins/access/types.d.mts +24 -0
  189. package/dist/plugins/additional-fields/client.d.mts +100 -0
  190. package/dist/plugins/additional-fields/client.mjs +11 -0
  191. package/dist/plugins/admin/access/index.d.mts +2 -0
  192. package/dist/plugins/admin/access/index.mjs +2 -0
  193. package/dist/plugins/admin/access/statement.d.mts +51 -0
  194. package/dist/plugins/admin/access/statement.mjs +52 -0
  195. package/dist/plugins/admin/admin.d.mts +911 -0
  196. package/dist/plugins/admin/admin.mjs +89 -0
  197. package/dist/plugins/admin/client.d.mts +81 -0
  198. package/dist/plugins/admin/client.mjs +39 -0
  199. package/dist/plugins/admin/error-codes.d.mts +30 -0
  200. package/dist/plugins/admin/error-codes.mjs +29 -0
  201. package/dist/plugins/admin/has-permission.mjs +12 -0
  202. package/dist/plugins/admin/index.d.mts +3 -0
  203. package/dist/plugins/admin/index.mjs +2 -0
  204. package/dist/plugins/admin/routes.mjs +919 -0
  205. package/dist/plugins/admin/schema.d.mts +40 -0
  206. package/dist/plugins/admin/schema.mjs +33 -0
  207. package/dist/plugins/admin/types.d.mts +88 -0
  208. package/dist/plugins/anonymous/client.d.mts +32 -0
  209. package/dist/plugins/anonymous/client.mjs +21 -0
  210. package/dist/plugins/anonymous/error-codes.d.mts +15 -0
  211. package/dist/plugins/anonymous/error-codes.mjs +14 -0
  212. package/dist/plugins/anonymous/index.d.mts +175 -0
  213. package/dist/plugins/anonymous/index.mjs +219 -0
  214. package/dist/plugins/anonymous/schema.d.mts +15 -0
  215. package/dist/plugins/anonymous/schema.mjs +9 -0
  216. package/dist/plugins/anonymous/types.d.mts +65 -0
  217. package/dist/plugins/bearer/index.d.mts +45 -0
  218. package/dist/plugins/bearer/index.mjs +74 -0
  219. package/dist/plugins/captcha/constants.d.mts +9 -0
  220. package/dist/plugins/captcha/constants.mjs +27 -0
  221. package/dist/plugins/captcha/error-codes.mjs +13 -0
  222. package/dist/plugins/captcha/index.d.mts +27 -0
  223. package/dist/plugins/captcha/index.mjs +79 -0
  224. package/dist/plugins/captcha/types.d.mts +52 -0
  225. package/dist/plugins/captcha/utils.mjs +9 -0
  226. package/dist/plugins/captcha/verify-handlers/captchafox.mjs +27 -0
  227. package/dist/plugins/captcha/verify-handlers/cloudflare-turnstile.mjs +47 -0
  228. package/dist/plugins/captcha/verify-handlers/google-recaptcha.mjs +32 -0
  229. package/dist/plugins/captcha/verify-handlers/h-captcha.mjs +27 -0
  230. package/dist/plugins/custom-session/client.d.mts +17 -0
  231. package/dist/plugins/custom-session/client.mjs +7 -0
  232. package/dist/plugins/custom-session/index.d.mts +73 -0
  233. package/dist/plugins/custom-session/index.mjs +65 -0
  234. package/dist/plugins/device-authorization/client.d.mts +17 -0
  235. package/dist/plugins/device-authorization/client.mjs +18 -0
  236. package/dist/plugins/device-authorization/error-codes.mjs +19 -0
  237. package/dist/plugins/device-authorization/index.d.mts +558 -0
  238. package/dist/plugins/device-authorization/index.mjs +87 -0
  239. package/dist/plugins/device-authorization/routes.d.mts +32 -0
  240. package/dist/plugins/device-authorization/routes.mjs +725 -0
  241. package/dist/plugins/device-authorization/schema.d.mts +18 -0
  242. package/dist/plugins/device-authorization/schema.mjs +63 -0
  243. package/dist/plugins/email-otp/client.d.mts +21 -0
  244. package/dist/plugins/email-otp/client.mjs +17 -0
  245. package/dist/plugins/email-otp/error-codes.d.mts +10 -0
  246. package/dist/plugins/email-otp/error-codes.mjs +9 -0
  247. package/dist/plugins/email-otp/index.d.mts +551 -0
  248. package/dist/plugins/email-otp/index.mjs +145 -0
  249. package/dist/plugins/email-otp/otp-token.mjs +55 -0
  250. package/dist/plugins/email-otp/routes.mjs +784 -0
  251. package/dist/plugins/email-otp/types.d.mts +109 -0
  252. package/dist/plugins/email-otp/utils.mjs +17 -0
  253. package/dist/plugins/generic-oauth/error-codes.mjs +8 -0
  254. package/dist/plugins/generic-oauth/index.d.mts +52 -0
  255. package/dist/plugins/generic-oauth/index.mjs +279 -0
  256. package/dist/plugins/generic-oauth/providers/auth0.d.mts +36 -0
  257. package/dist/plugins/generic-oauth/providers/auth0.mjs +49 -0
  258. package/dist/plugins/generic-oauth/providers/gumroad.d.mts +31 -0
  259. package/dist/plugins/generic-oauth/providers/gumroad.mjs +62 -0
  260. package/dist/plugins/generic-oauth/providers/hubspot.d.mts +36 -0
  261. package/dist/plugins/generic-oauth/providers/hubspot.mjs +62 -0
  262. package/dist/plugins/generic-oauth/providers/index.d.mts +10 -0
  263. package/dist/plugins/generic-oauth/providers/keycloak.d.mts +36 -0
  264. package/dist/plugins/generic-oauth/providers/keycloak.mjs +47 -0
  265. package/dist/plugins/generic-oauth/providers/line.d.mts +54 -0
  266. package/dist/plugins/generic-oauth/providers/line.mjs +93 -0
  267. package/dist/plugins/generic-oauth/providers/microsoft-entra-id.d.mts +39 -0
  268. package/dist/plugins/generic-oauth/providers/microsoft-entra-id.mjs +104 -0
  269. package/dist/plugins/generic-oauth/providers/okta.d.mts +36 -0
  270. package/dist/plugins/generic-oauth/providers/okta.mjs +47 -0
  271. package/dist/plugins/generic-oauth/providers/patreon.d.mts +29 -0
  272. package/dist/plugins/generic-oauth/providers/patreon.mjs +61 -0
  273. package/dist/plugins/generic-oauth/providers/slack.d.mts +29 -0
  274. package/dist/plugins/generic-oauth/providers/slack.mjs +63 -0
  275. package/dist/plugins/generic-oauth/providers/yandex.d.mts +29 -0
  276. package/dist/plugins/generic-oauth/providers/yandex.mjs +67 -0
  277. package/dist/plugins/generic-oauth/types.d.mts +268 -0
  278. package/dist/plugins/haveibeenpwned/index.d.mts +63 -0
  279. package/dist/plugins/haveibeenpwned/index.mjs +81 -0
  280. package/dist/plugins/index.d.mts +69 -0
  281. package/dist/plugins/index.mjs +49 -0
  282. package/dist/plugins/jwt/adapter.mjs +68 -0
  283. package/dist/plugins/jwt/client.d.mts +41 -0
  284. package/dist/plugins/jwt/client.mjs +19 -0
  285. package/dist/plugins/jwt/cookie-cache.mjs +77 -0
  286. package/dist/plugins/jwt/index.d.mts +246 -0
  287. package/dist/plugins/jwt/index.mjs +214 -0
  288. package/dist/plugins/jwt/schema.d.mts +33 -0
  289. package/dist/plugins/jwt/schema.mjs +29 -0
  290. package/dist/plugins/jwt/sign.d.mts +128 -0
  291. package/dist/plugins/jwt/sign.mjs +130 -0
  292. package/dist/plugins/jwt/types.d.mts +256 -0
  293. package/dist/plugins/jwt/utils.d.mts +41 -0
  294. package/dist/plugins/jwt/utils.mjs +64 -0
  295. package/dist/plugins/jwt/verify.d.mts +11 -0
  296. package/dist/plugins/jwt/verify.mjs +45 -0
  297. package/dist/plugins/last-login-method/client.d.mts +48 -0
  298. package/dist/plugins/last-login-method/client.mjs +48 -0
  299. package/dist/plugins/last-login-method/index.d.mts +127 -0
  300. package/dist/plugins/last-login-method/index.mjs +98 -0
  301. package/dist/plugins/magic-link/client.d.mts +10 -0
  302. package/dist/plugins/magic-link/client.mjs +11 -0
  303. package/dist/plugins/magic-link/index.d.mts +213 -0
  304. package/dist/plugins/magic-link/index.mjs +208 -0
  305. package/dist/plugins/magic-link/utils.mjs +9 -0
  306. package/dist/plugins/multi-session/client.d.mts +19 -0
  307. package/dist/plugins/multi-session/client.mjs +19 -0
  308. package/dist/plugins/multi-session/error-codes.d.mts +8 -0
  309. package/dist/plugins/multi-session/error-codes.mjs +5 -0
  310. package/dist/plugins/multi-session/index.d.mts +212 -0
  311. package/dist/plugins/multi-session/index.mjs +217 -0
  312. package/dist/plugins/oauth-popup/client.d.mts +82 -0
  313. package/dist/plugins/oauth-popup/client.mjs +203 -0
  314. package/dist/plugins/oauth-popup/constants.d.mts +11 -0
  315. package/dist/plugins/oauth-popup/constants.mjs +11 -0
  316. package/dist/plugins/oauth-popup/error-codes.d.mts +11 -0
  317. package/dist/plugins/oauth-popup/error-codes.mjs +10 -0
  318. package/dist/plugins/oauth-popup/index.d.mts +67 -0
  319. package/dist/plugins/oauth-popup/index.mjs +232 -0
  320. package/dist/plugins/oauth-popup/types.d.mts +30 -0
  321. package/dist/plugins/oauth-proxy/index.d.mts +130 -0
  322. package/dist/plugins/oauth-proxy/index.mjs +407 -0
  323. package/dist/plugins/oauth-proxy/utils.mjs +55 -0
  324. package/dist/plugins/one-tap/client.d.mts +174 -0
  325. package/dist/plugins/one-tap/client.mjs +208 -0
  326. package/dist/plugins/one-tap/index.d.mts +82 -0
  327. package/dist/plugins/one-tap/index.mjs +100 -0
  328. package/dist/plugins/one-time-token/client.d.mts +10 -0
  329. package/dist/plugins/one-time-token/client.mjs +11 -0
  330. package/dist/plugins/one-time-token/index.d.mts +132 -0
  331. package/dist/plugins/one-time-token/index.mjs +107 -0
  332. package/dist/plugins/one-time-token/utils.mjs +9 -0
  333. package/dist/plugins/open-api/generator.d.mts +126 -0
  334. package/dist/plugins/open-api/generator.mjs +557 -0
  335. package/dist/plugins/open-api/index.d.mts +97 -0
  336. package/dist/plugins/open-api/index.mjs +65 -0
  337. package/dist/plugins/open-api/logo.mjs +13 -0
  338. package/dist/plugins/organization/access/index.d.mts +2 -0
  339. package/dist/plugins/organization/access/index.mjs +2 -0
  340. package/dist/plugins/organization/access/statement.d.mts +113 -0
  341. package/dist/plugins/organization/access/statement.mjs +77 -0
  342. package/dist/plugins/organization/adapter.d.mts +815 -0
  343. package/dist/plugins/organization/adapter.mjs +813 -0
  344. package/dist/plugins/organization/call.mjs +15 -0
  345. package/dist/plugins/organization/client.d.mts +375 -0
  346. package/dist/plugins/organization/client.mjs +104 -0
  347. package/dist/plugins/organization/error-codes.d.mts +66 -0
  348. package/dist/plugins/organization/error-codes.mjs +65 -0
  349. package/dist/plugins/organization/has-permission.d.mts +17 -0
  350. package/dist/plugins/organization/has-permission.mjs +34 -0
  351. package/dist/plugins/organization/index.d.mts +6 -0
  352. package/dist/plugins/organization/index.mjs +4 -0
  353. package/dist/plugins/organization/organization.d.mts +420 -0
  354. package/dist/plugins/organization/organization.mjs +886 -0
  355. package/dist/plugins/organization/permission.d.mts +15 -0
  356. package/dist/plugins/organization/permission.mjs +14 -0
  357. package/dist/plugins/organization/routes/crud-access-control.d.mts +511 -0
  358. package/dist/plugins/organization/routes/crud-access-control.mjs +674 -0
  359. package/dist/plugins/organization/routes/crud-invites.d.mts +1154 -0
  360. package/dist/plugins/organization/routes/crud-invites.mjs +602 -0
  361. package/dist/plugins/organization/routes/crud-members.d.mts +1057 -0
  362. package/dist/plugins/organization/routes/crud-members.mjs +518 -0
  363. package/dist/plugins/organization/routes/crud-org.d.mts +918 -0
  364. package/dist/plugins/organization/routes/crud-org.mjs +455 -0
  365. package/dist/plugins/organization/routes/crud-team.d.mts +1238 -0
  366. package/dist/plugins/organization/routes/crud-team.mjs +766 -0
  367. package/dist/plugins/organization/schema.d.mts +390 -0
  368. package/dist/plugins/organization/schema.mjs +65 -0
  369. package/dist/plugins/organization/types.d.mts +691 -0
  370. package/dist/plugins/phone-number/client.d.mts +31 -0
  371. package/dist/plugins/phone-number/client.mjs +19 -0
  372. package/dist/plugins/phone-number/error-codes.d.mts +19 -0
  373. package/dist/plugins/phone-number/error-codes.mjs +18 -0
  374. package/dist/plugins/phone-number/index.d.mts +360 -0
  375. package/dist/plugins/phone-number/index.mjs +57 -0
  376. package/dist/plugins/phone-number/routes.mjs +529 -0
  377. package/dist/plugins/phone-number/schema.d.mts +22 -0
  378. package/dist/plugins/phone-number/schema.mjs +18 -0
  379. package/dist/plugins/phone-number/types.d.mts +116 -0
  380. package/dist/plugins/siwe/client.d.mts +14 -0
  381. package/dist/plugins/siwe/client.mjs +15 -0
  382. package/dist/plugins/siwe/index.d.mts +62 -0
  383. package/dist/plugins/siwe/index.mjs +272 -0
  384. package/dist/plugins/siwe/parse-message.mjs +60 -0
  385. package/dist/plugins/siwe/schema.d.mts +35 -0
  386. package/dist/plugins/siwe/schema.mjs +30 -0
  387. package/dist/plugins/siwe/types.d.mts +43 -0
  388. package/dist/plugins/test-utils/auth-helpers.mjs +33 -0
  389. package/dist/plugins/test-utils/cookie-builder.mjs +55 -0
  390. package/dist/plugins/test-utils/db-helpers.mjs +65 -0
  391. package/dist/plugins/test-utils/factories.mjs +38 -0
  392. package/dist/plugins/test-utils/index.d.mts +73 -0
  393. package/dist/plugins/test-utils/index.mjs +97 -0
  394. package/dist/plugins/test-utils/otp-sink.mjs +21 -0
  395. package/dist/plugins/test-utils/types.d.mts +51 -0
  396. package/dist/plugins/two-factor/backup-codes/index.d.mts +291 -0
  397. package/dist/plugins/two-factor/backup-codes/index.mjs +341 -0
  398. package/dist/plugins/two-factor/client.d.mts +76 -0
  399. package/dist/plugins/two-factor/client.mjs +41 -0
  400. package/dist/plugins/two-factor/constant.mjs +6 -0
  401. package/dist/plugins/two-factor/error-code.d.mts +20 -0
  402. package/dist/plugins/two-factor/error-code.mjs +19 -0
  403. package/dist/plugins/two-factor/index.d.mts +720 -0
  404. package/dist/plugins/two-factor/index.mjs +349 -0
  405. package/dist/plugins/two-factor/otp/index.d.mts +216 -0
  406. package/dist/plugins/two-factor/otp/index.mjs +252 -0
  407. package/dist/plugins/two-factor/schema.d.mts +59 -0
  408. package/dist/plugins/two-factor/schema.mjs +53 -0
  409. package/dist/plugins/two-factor/totp/index.d.mts +219 -0
  410. package/dist/plugins/two-factor/totp/index.mjs +230 -0
  411. package/dist/plugins/two-factor/types.d.mts +111 -0
  412. package/dist/plugins/two-factor/utils.mjs +9 -0
  413. package/dist/plugins/two-factor/verify-two-factor.mjs +205 -0
  414. package/dist/plugins/username/client.d.mts +38 -0
  415. package/dist/plugins/username/client.mjs +17 -0
  416. package/dist/plugins/username/error-codes.d.mts +16 -0
  417. package/dist/plugins/username/error-codes.mjs +15 -0
  418. package/dist/plugins/username/index.d.mts +326 -0
  419. package/dist/plugins/username/index.mjs +312 -0
  420. package/dist/plugins/username/schema.d.mts +50 -0
  421. package/dist/plugins/username/schema.mjs +25 -0
  422. package/dist/social-providers/index.d.mts +1 -0
  423. package/dist/social-providers/index.mjs +2 -0
  424. package/dist/state.d.mts +48 -0
  425. package/dist/state.mjs +149 -0
  426. package/dist/test-utils/headers.d.mts +8 -0
  427. package/dist/test-utils/headers.mjs +17 -0
  428. package/dist/test-utils/http-test-instance.d.mts +413 -0
  429. package/dist/test-utils/http-test-instance.mjs +107 -0
  430. package/dist/test-utils/index.d.mts +4 -0
  431. package/dist/test-utils/index.mjs +4 -0
  432. package/dist/test-utils/test-instance.d.mts +56 -0
  433. package/dist/test-utils/test-instance.mjs +242 -0
  434. package/dist/types/adapter.d.mts +2 -0
  435. package/dist/types/api.d.mts +28 -0
  436. package/dist/types/auth.d.mts +32 -0
  437. package/dist/types/helper.d.mts +26 -0
  438. package/dist/types/index.d.mts +10 -0
  439. package/dist/types/index.mjs +1 -0
  440. package/dist/types/models.d.mts +10 -0
  441. package/dist/types/plugins.d.mts +19 -0
  442. package/dist/utils/boolean.mjs +6 -0
  443. package/dist/utils/constants.mjs +4 -0
  444. package/dist/utils/date.mjs +6 -0
  445. package/dist/utils/hashing.mjs +18 -0
  446. package/dist/utils/hide-metadata.d.mts +6 -0
  447. package/dist/utils/hide-metadata.mjs +4 -0
  448. package/dist/utils/index.d.mts +4 -0
  449. package/dist/utils/is-api-error.d.mts +2 -0
  450. package/dist/utils/is-api-error.mjs +2 -0
  451. package/dist/utils/is-atom.mjs +6 -0
  452. package/dist/utils/is-promise.mjs +6 -0
  453. package/dist/utils/middleware-response.mjs +7 -0
  454. package/dist/utils/password.mjs +32 -0
  455. package/dist/utils/plugin-helper.mjs +14 -0
  456. package/dist/utils/request.mjs +23 -0
  457. package/dist/utils/shim.mjs +22 -0
  458. package/dist/utils/time.d.mts +48 -0
  459. package/dist/utils/time.mjs +98 -0
  460. package/dist/utils/url.d.mts +78 -0
  461. package/dist/utils/url.mjs +238 -0
  462. package/dist/utils/validate-user-info.mjs +44 -0
  463. package/dist/utils/wildcard.mjs +106 -0
  464. package/dist/version.mjs +5 -0
  465. package/package.json +595 -3
@@ -0,0 +1,65 @@
1
+ import { Session, User } from "../../types/models.mjs";
2
+ import { InferOptionSchema } from "../../types/plugins.mjs";
3
+ import { schema } from "./schema.mjs";
4
+ import { AuthContext, Awaitable, GenericEndpointContext } from "@better-auth/core";
5
+ import { EndpointContext } from "better-call";
6
+
7
+ //#region src/plugins/anonymous/types.d.ts
8
+ type AnonymousSession = {
9
+ session: Session;
10
+ user: User;
11
+ } & {
12
+ user: {
13
+ isAnonymous: boolean | null;
14
+ };
15
+ } & Record<string, any>;
16
+ interface UserWithAnonymous extends User {
17
+ isAnonymous: boolean;
18
+ }
19
+ interface AnonymousOptions {
20
+ /**
21
+ * Configure a custom domain for anonymous user email addresses.
22
+ * @default "anonymous.placeholder.invalid"
23
+ */
24
+ emailDomainName?: string | undefined;
25
+ /**
26
+ * A useful hook to run after an anonymous user
27
+ * is about to link their account.
28
+ */
29
+ onLinkAccount?: ((data: {
30
+ anonymousUser: {
31
+ user: UserWithAnonymous & Record<string, any>;
32
+ session: Session & Record<string, any>;
33
+ };
34
+ newUser: {
35
+ user: User & Record<string, any>;
36
+ session: Session & Record<string, any>;
37
+ };
38
+ ctx: GenericEndpointContext;
39
+ }) => Awaitable<void>) | undefined;
40
+ /**
41
+ * Disable deleting the anonymous user
42
+ */
43
+ disableDeleteAnonymousUser?: boolean | undefined;
44
+ /**
45
+ * A hook to generate a name for the anonymous user.
46
+ * Useful if you want to have random names for anonymous users, or if `name` is unique in your database.
47
+ * @returns The name for the anonymous user.
48
+ */
49
+ generateName?: ((ctx: EndpointContext<"/sign-in/anonymous", {
50
+ method: "POST";
51
+ }, AuthContext>) => Awaitable<string>) | undefined;
52
+ /**
53
+ * A custom random email generation function.
54
+ * Useful when you want to specify a temporary email in a different format from the default.
55
+ * You are responsible for ensuring the email is unique to avoid conflicts.
56
+ * @returns The email address for the anonymous user.
57
+ */
58
+ generateRandomEmail?: (() => Awaitable<string>) | undefined;
59
+ /**
60
+ * Custom schema for the anonymous plugin
61
+ */
62
+ schema?: InferOptionSchema<typeof schema> | undefined;
63
+ }
64
+ //#endregion
65
+ export { AnonymousOptions, AnonymousSession, UserWithAnonymous };
@@ -0,0 +1,45 @@
1
+ import * as _$_better_auth_core0 from "@better-auth/core";
2
+ import * as _$better_call0 from "better-call";
3
+
4
+ //#region src/plugins/bearer/index.d.ts
5
+ declare module "@better-auth/core" {
6
+ interface BetterAuthPluginRegistry<AuthOptions, Options> {
7
+ bearer: {
8
+ creator: typeof bearer;
9
+ };
10
+ }
11
+ }
12
+ interface BearerOptions {
13
+ /**
14
+ * If true, only signed tokens
15
+ * will be converted to session
16
+ * cookies
17
+ *
18
+ * @default false
19
+ */
20
+ requireSignature?: boolean | undefined;
21
+ }
22
+ /**
23
+ * Converts bearer token to session cookie
24
+ */
25
+ declare const bearer: (options?: BearerOptions | undefined) => {
26
+ id: "bearer";
27
+ version: string;
28
+ hooks: {
29
+ before: {
30
+ matcher(context: _$_better_auth_core0.HookEndpointContext): boolean;
31
+ handler: _$better_call0.Middleware<_$better_call0.MiddlewareOptions, (inputContext: _$better_call0.MiddlewareInputContext<_$better_call0.MiddlewareOptions>) => Promise<{
32
+ context: {
33
+ headers: Headers;
34
+ };
35
+ } | undefined>>;
36
+ }[];
37
+ after: {
38
+ matcher(context: _$_better_auth_core0.HookEndpointContext): true;
39
+ handler: _$better_call0.Middleware<_$better_call0.MiddlewareOptions, (inputContext: _$better_call0.MiddlewareInputContext<_$better_call0.MiddlewareOptions>) => Promise<void>>;
40
+ }[];
41
+ };
42
+ options: BearerOptions | undefined;
43
+ };
44
+ //#endregion
45
+ export { BearerOptions, bearer };
@@ -0,0 +1,74 @@
1
+ import { parseSetCookieHeader, setRequestCookie } from "../../cookies/cookie-utils.mjs";
2
+ import { PACKAGE_VERSION } from "../../version.mjs";
3
+ import { serializeSignedCookie } from "better-call";
4
+ import { createAuthMiddleware } from "@better-auth/core/api";
5
+ import { createHMAC } from "@better-auth/utils/hmac";
6
+ //#region src/plugins/bearer/index.ts
7
+ const BEARER_SCHEME = "bearer ";
8
+ function tryDecode(str) {
9
+ try {
10
+ return decodeURIComponent(str);
11
+ } catch {
12
+ return str;
13
+ }
14
+ }
15
+ /**
16
+ * Converts bearer token to session cookie
17
+ */
18
+ const bearer = (options) => {
19
+ return {
20
+ id: "bearer",
21
+ version: PACKAGE_VERSION,
22
+ hooks: {
23
+ before: [{
24
+ matcher(context) {
25
+ return Boolean(context.request?.headers.get("authorization") || context.headers?.get("authorization"));
26
+ },
27
+ handler: createAuthMiddleware(async (c) => {
28
+ const authHeader = c.request?.headers.get("authorization") || c.headers?.get("Authorization");
29
+ if (!authHeader) return;
30
+ if (authHeader.slice(0, 7).toLowerCase() !== BEARER_SCHEME) return;
31
+ const token = authHeader.slice(7).trim();
32
+ if (!token) return;
33
+ let decodedToken;
34
+ if (token.includes(".")) decodedToken = token.includes("%") ? tryDecode(token) : token;
35
+ else {
36
+ if (options?.requireSignature) return;
37
+ decodedToken = tryDecode((await serializeSignedCookie("", token, c.context.secret)).replace("=", ""));
38
+ }
39
+ try {
40
+ if (!await createHMAC("SHA-256", "base64urlnopad").verify(c.context.secret, decodedToken.split(".")[0], decodedToken.split(".")[1])) return;
41
+ } catch {
42
+ return;
43
+ }
44
+ const existingHeaders = c.request?.headers || c.headers;
45
+ const headers = new Headers({ ...Object.fromEntries(existingHeaders?.entries()) });
46
+ setRequestCookie(headers, c.context.authCookies.sessionToken.name, decodedToken);
47
+ return { context: { headers } };
48
+ })
49
+ }],
50
+ after: [{
51
+ matcher(context) {
52
+ return true;
53
+ },
54
+ handler: createAuthMiddleware(async (ctx) => {
55
+ const setCookie = ctx.context.responseHeaders?.get("set-cookie");
56
+ if (!setCookie) return;
57
+ const parsedCookies = parseSetCookieHeader(setCookie);
58
+ const cookieName = ctx.context.authCookies.sessionToken.name;
59
+ const sessionCookie = parsedCookies.get(cookieName);
60
+ if (!sessionCookie || !sessionCookie.value || sessionCookie["max-age"] === 0) return;
61
+ const token = sessionCookie.value;
62
+ const exposedHeaders = ctx.context.responseHeaders?.get("access-control-expose-headers") || "";
63
+ const headersSet = new Set(exposedHeaders.split(",").map((header) => header.trim()).filter(Boolean));
64
+ headersSet.add("set-auth-token");
65
+ ctx.setHeader("set-auth-token", token);
66
+ ctx.setHeader("Access-Control-Expose-Headers", Array.from(headersSet).join(", "));
67
+ })
68
+ }]
69
+ },
70
+ options
71
+ };
72
+ };
73
+ //#endregion
74
+ export { bearer };
@@ -0,0 +1,9 @@
1
+ //#region src/plugins/captcha/constants.d.ts
2
+ declare const Providers: {
3
+ readonly CLOUDFLARE_TURNSTILE: "cloudflare-turnstile";
4
+ readonly GOOGLE_RECAPTCHA: "google-recaptcha";
5
+ readonly HCAPTCHA: "hcaptcha";
6
+ readonly CAPTCHAFOX: "captchafox";
7
+ };
8
+ //#endregion
9
+ export { Providers };
@@ -0,0 +1,27 @@
1
+ //#region src/plugins/captcha/constants.ts
2
+ /**
3
+ * Upper bound (in milliseconds) for a single provider verification request.
4
+ * Without it, a hanging provider would tie up the request indefinitely before
5
+ * any rate limiting applies, so every verify handler aborts at this deadline
6
+ * and fails closed.
7
+ */
8
+ const CAPTCHA_VERIFY_TIMEOUT_MS = 1e4;
9
+ const defaultEndpoints = [
10
+ "/sign-up/email",
11
+ "/sign-in/email",
12
+ "/request-password-reset"
13
+ ];
14
+ const Providers = {
15
+ CLOUDFLARE_TURNSTILE: "cloudflare-turnstile",
16
+ GOOGLE_RECAPTCHA: "google-recaptcha",
17
+ HCAPTCHA: "hcaptcha",
18
+ CAPTCHAFOX: "captchafox"
19
+ };
20
+ const siteVerifyMap = {
21
+ [Providers.CLOUDFLARE_TURNSTILE]: "https://challenges.cloudflare.com/turnstile/v0/siteverify",
22
+ [Providers.GOOGLE_RECAPTCHA]: "https://www.google.com/recaptcha/api/siteverify",
23
+ [Providers.HCAPTCHA]: "https://api.hcaptcha.com/siteverify",
24
+ [Providers.CAPTCHAFOX]: "https://api.captchafox.com/siteverify"
25
+ };
26
+ //#endregion
27
+ export { CAPTCHA_VERIFY_TIMEOUT_MS, Providers, defaultEndpoints, siteVerifyMap };
@@ -0,0 +1,13 @@
1
+ import { defineErrorCodes } from "@better-auth/core/utils/error-codes";
2
+ //#region src/plugins/captcha/error-codes.ts
3
+ const EXTERNAL_ERROR_CODES = defineErrorCodes({
4
+ VERIFICATION_FAILED: "Captcha verification failed",
5
+ MISSING_RESPONSE: "Missing CAPTCHA response",
6
+ UNKNOWN_ERROR: "Something went wrong"
7
+ });
8
+ const INTERNAL_ERROR_CODES = defineErrorCodes({
9
+ MISSING_SECRET_KEY: "Missing secret key",
10
+ SERVICE_UNAVAILABLE: "CAPTCHA service unavailable"
11
+ });
12
+ //#endregion
13
+ export { EXTERNAL_ERROR_CODES, INTERNAL_ERROR_CODES };
@@ -0,0 +1,27 @@
1
+ import { BaseCaptchaOptions, CaptchaFoxOptions, CaptchaOptions, CloudflareTurnstileOptions, GoogleRecaptchaOptions, HCaptchaOptions, Provider } from "./types.mjs";
2
+ import * as _$_better_auth_core0 from "@better-auth/core";
3
+ import * as _$_better_auth_core_utils_error_codes0 from "@better-auth/core/utils/error-codes";
4
+
5
+ //#region src/plugins/captcha/index.d.ts
6
+ declare module "@better-auth/core" {
7
+ interface BetterAuthPluginRegistry<AuthOptions, Options> {
8
+ captcha: {
9
+ creator: typeof captcha;
10
+ };
11
+ }
12
+ }
13
+ declare const captcha: (options: CaptchaOptions) => {
14
+ id: "captcha";
15
+ version: string;
16
+ $ERROR_CODES: {
17
+ VERIFICATION_FAILED: _$_better_auth_core_utils_error_codes0.RawError<"VERIFICATION_FAILED">;
18
+ MISSING_RESPONSE: _$_better_auth_core_utils_error_codes0.RawError<"MISSING_RESPONSE">;
19
+ UNKNOWN_ERROR: _$_better_auth_core_utils_error_codes0.RawError<"UNKNOWN_ERROR">;
20
+ };
21
+ onRequest: (request: Request, ctx: _$_better_auth_core0.AuthContext) => Promise<{
22
+ response: Response;
23
+ } | undefined>;
24
+ options: CaptchaOptions;
25
+ };
26
+ //#endregion
27
+ export { BaseCaptchaOptions, CaptchaFoxOptions, CaptchaOptions, CloudflareTurnstileOptions, GoogleRecaptchaOptions, HCaptchaOptions, Provider, captcha };
@@ -0,0 +1,79 @@
1
+ import { wildcardMatch } from "../../utils/wildcard.mjs";
2
+ import { PACKAGE_VERSION } from "../../version.mjs";
3
+ import { middlewareResponse } from "../../utils/middleware-response.mjs";
4
+ import { Providers, defaultEndpoints, siteVerifyMap } from "./constants.mjs";
5
+ import { EXTERNAL_ERROR_CODES, INTERNAL_ERROR_CODES } from "./error-codes.mjs";
6
+ import { captchaFox } from "./verify-handlers/captchafox.mjs";
7
+ import { cloudflareTurnstile } from "./verify-handlers/cloudflare-turnstile.mjs";
8
+ import { googleRecaptcha } from "./verify-handlers/google-recaptcha.mjs";
9
+ import { hCaptcha } from "./verify-handlers/h-captcha.mjs";
10
+ import { getIP } from "@better-auth/core/utils/ip";
11
+ //#region src/plugins/captcha/index.ts
12
+ const normalizeEndpointPath = (pathname, basePath) => {
13
+ let normalizedPathname = (pathname.startsWith(basePath) ? pathname.slice(basePath.length) : pathname).replace(/\/{2,}/g, "/");
14
+ if (!normalizedPathname.startsWith("/")) normalizedPathname = `/${normalizedPathname}`;
15
+ if (normalizedPathname.length > 1 && normalizedPathname.endsWith("/")) normalizedPathname = normalizedPathname.slice(0, -1);
16
+ return normalizedPathname;
17
+ };
18
+ const captcha = (options) => ({
19
+ id: "captcha",
20
+ version: PACKAGE_VERSION,
21
+ $ERROR_CODES: EXTERNAL_ERROR_CODES,
22
+ onRequest: async (request, ctx) => {
23
+ try {
24
+ const endpoints = options.endpoints?.length ? options.endpoints : defaultEndpoints;
25
+ const url = new URL(request.url);
26
+ const basePath = ctx.options.basePath ?? "/api/auth";
27
+ const pathname = normalizeEndpointPath(url.pathname, basePath);
28
+ if (!endpoints.some((endpoint) => endpoint.includes("*") ? wildcardMatch(endpoint)(pathname) : endpoint === pathname)) return;
29
+ if (!options.secretKey) throw new Error(INTERNAL_ERROR_CODES.MISSING_SECRET_KEY.message);
30
+ const captchaResponse = request.headers.get("x-captcha-response");
31
+ const remoteUserIP = getIP(request, ctx.options) ?? void 0;
32
+ if (!captchaResponse) return middlewareResponse({
33
+ message: EXTERNAL_ERROR_CODES.MISSING_RESPONSE.message,
34
+ code: EXTERNAL_ERROR_CODES.MISSING_RESPONSE.code,
35
+ status: 400
36
+ });
37
+ const handlerParams = {
38
+ siteVerifyURL: options.siteVerifyURLOverride || siteVerifyMap[options.provider],
39
+ captchaResponse,
40
+ secretKey: options.secretKey,
41
+ remoteIP: remoteUserIP
42
+ };
43
+ if (options.provider === Providers.CLOUDFLARE_TURNSTILE) return await cloudflareTurnstile({
44
+ ...handlerParams,
45
+ logger: ctx.logger,
46
+ expectedAction: options.expectedAction,
47
+ allowedHostnames: options.allowedHostnames
48
+ });
49
+ if (options.provider === Providers.GOOGLE_RECAPTCHA) return await googleRecaptcha({
50
+ ...handlerParams,
51
+ minScore: options.minScore,
52
+ expectedAction: options.expectedAction,
53
+ allowedHostnames: options.allowedHostnames
54
+ });
55
+ if (options.provider === Providers.HCAPTCHA) return await hCaptcha({
56
+ ...handlerParams,
57
+ siteKey: options.siteKey
58
+ });
59
+ if (options.provider === Providers.CAPTCHAFOX) return await captchaFox({
60
+ ...handlerParams,
61
+ siteKey: options.siteKey
62
+ });
63
+ } catch (_error) {
64
+ const errorMessage = _error instanceof Error ? _error.message : void 0;
65
+ ctx.logger.error(errorMessage ?? "Unknown error", {
66
+ endpoint: request.url,
67
+ message: _error
68
+ });
69
+ return middlewareResponse({
70
+ message: EXTERNAL_ERROR_CODES.UNKNOWN_ERROR.message,
71
+ code: EXTERNAL_ERROR_CODES.UNKNOWN_ERROR.code,
72
+ status: 500
73
+ });
74
+ }
75
+ },
76
+ options
77
+ });
78
+ //#endregion
79
+ export { captcha };
@@ -0,0 +1,52 @@
1
+ import { Providers } from "./constants.mjs";
2
+
3
+ //#region src/plugins/captcha/types.d.ts
4
+ type Provider = (typeof Providers)[keyof typeof Providers];
5
+ interface BaseCaptchaOptions {
6
+ secretKey: string;
7
+ /**
8
+ * Paths where captcha verification is enforced. Paths match exactly unless
9
+ * they include wildcards, such as `/sign-in/*` or `/sign-in/**`.
10
+ */
11
+ endpoints?: string[] | undefined;
12
+ siteVerifyURLOverride?: string | undefined;
13
+ }
14
+ interface GoogleRecaptchaOptions extends BaseCaptchaOptions {
15
+ provider: typeof Providers.GOOGLE_RECAPTCHA;
16
+ minScore?: number | undefined;
17
+ /**
18
+ * Expected reCAPTCHA v3 `action`. When set, a verification whose action does
19
+ * not match is rejected, preventing a token minted for another action on the
20
+ * same site key from being replayed against this endpoint.
21
+ */
22
+ expectedAction?: string | undefined;
23
+ /**
24
+ * Allow-list of hostnames the token must have been issued for. When set, a
25
+ * verification reporting a different hostname is rejected.
26
+ */
27
+ allowedHostnames?: string[] | undefined;
28
+ }
29
+ interface CloudflareTurnstileOptions extends BaseCaptchaOptions {
30
+ provider: typeof Providers.CLOUDFLARE_TURNSTILE;
31
+ /**
32
+ * Expected Turnstile `action`. When set, a verification whose action does
33
+ * not match is rejected, preventing cross-context token reuse.
34
+ */
35
+ expectedAction?: string | undefined;
36
+ /**
37
+ * Allow-list of hostnames the token must have been issued for. When set, a
38
+ * verification reporting a different or missing hostname is rejected.
39
+ */
40
+ allowedHostnames?: string[] | undefined;
41
+ }
42
+ interface HCaptchaOptions extends BaseCaptchaOptions {
43
+ provider: typeof Providers.HCAPTCHA;
44
+ siteKey?: string | undefined;
45
+ }
46
+ interface CaptchaFoxOptions extends BaseCaptchaOptions {
47
+ provider: typeof Providers.CAPTCHAFOX;
48
+ siteKey?: string | undefined;
49
+ }
50
+ type CaptchaOptions = GoogleRecaptchaOptions | CloudflareTurnstileOptions | HCaptchaOptions | CaptchaFoxOptions;
51
+ //#endregion
52
+ export { BaseCaptchaOptions, CaptchaFoxOptions, CaptchaOptions, CloudflareTurnstileOptions, GoogleRecaptchaOptions, HCaptchaOptions, Provider };
@@ -0,0 +1,9 @@
1
+ //#region src/plugins/captcha/utils.ts
2
+ const encodeToURLParams = (obj) => {
3
+ if (typeof obj !== "object" || obj === null || Array.isArray(obj)) throw new Error("Input must be a non-null object.");
4
+ const params = new URLSearchParams();
5
+ for (const [key, value] of Object.entries(obj)) if (value !== void 0 && value !== null) params.append(key, String(value));
6
+ return params.toString();
7
+ };
8
+ //#endregion
9
+ export { encodeToURLParams };
@@ -0,0 +1,27 @@
1
+ import { middlewareResponse } from "../../../utils/middleware-response.mjs";
2
+ import { CAPTCHA_VERIFY_TIMEOUT_MS } from "../constants.mjs";
3
+ import { EXTERNAL_ERROR_CODES, INTERNAL_ERROR_CODES } from "../error-codes.mjs";
4
+ import { encodeToURLParams } from "../utils.mjs";
5
+ import { betterFetch } from "@better-fetch/fetch";
6
+ //#region src/plugins/captcha/verify-handlers/captchafox.ts
7
+ const captchaFox = async ({ siteVerifyURL, captchaResponse, secretKey, siteKey, remoteIP }) => {
8
+ const response = await betterFetch(siteVerifyURL, {
9
+ method: "POST",
10
+ timeout: CAPTCHA_VERIFY_TIMEOUT_MS,
11
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
12
+ body: encodeToURLParams({
13
+ secret: secretKey,
14
+ response: captchaResponse,
15
+ ...siteKey && { sitekey: siteKey },
16
+ ...remoteIP && { remoteIp: remoteIP }
17
+ })
18
+ });
19
+ if (!response.data || response.error) throw new Error(INTERNAL_ERROR_CODES.SERVICE_UNAVAILABLE.message);
20
+ if (!response.data.success) return middlewareResponse({
21
+ message: EXTERNAL_ERROR_CODES.VERIFICATION_FAILED.message,
22
+ code: EXTERNAL_ERROR_CODES.VERIFICATION_FAILED.code,
23
+ status: 403
24
+ });
25
+ };
26
+ //#endregion
27
+ export { captchaFox };
@@ -0,0 +1,47 @@
1
+ import { middlewareResponse } from "../../../utils/middleware-response.mjs";
2
+ import { CAPTCHA_VERIFY_TIMEOUT_MS } from "../constants.mjs";
3
+ import { EXTERNAL_ERROR_CODES, INTERNAL_ERROR_CODES } from "../error-codes.mjs";
4
+ import { betterFetch } from "@better-fetch/fetch";
5
+ //#region src/plugins/captcha/verify-handlers/cloudflare-turnstile.ts
6
+ const cloudflareTurnstile = async ({ siteVerifyURL, captchaResponse, secretKey, logger, remoteIP, expectedAction, allowedHostnames }) => {
7
+ const response = await betterFetch(siteVerifyURL, {
8
+ method: "POST",
9
+ timeout: CAPTCHA_VERIFY_TIMEOUT_MS,
10
+ headers: { "Content-Type": "application/json" },
11
+ body: JSON.stringify({
12
+ secret: secretKey,
13
+ response: captchaResponse,
14
+ ...remoteIP && { remoteip: remoteIP }
15
+ })
16
+ });
17
+ if (!response.data || response.error) throw new Error(INTERNAL_ERROR_CODES.SERVICE_UNAVAILABLE.message);
18
+ const verificationFailed = (details) => {
19
+ logger.warn("Cloudflare Turnstile verification failed", {
20
+ provider: "cloudflare-turnstile",
21
+ ...details
22
+ });
23
+ return middlewareResponse({
24
+ message: EXTERNAL_ERROR_CODES.VERIFICATION_FAILED.message,
25
+ code: EXTERNAL_ERROR_CODES.VERIFICATION_FAILED.code,
26
+ status: 403
27
+ });
28
+ };
29
+ if (!response.data.success) return verificationFailed({
30
+ reason: "siteverify_rejected",
31
+ errorCodes: response.data["error-codes"] ?? [],
32
+ ...response.data.hostname && { hostname: response.data.hostname },
33
+ ...response.data.action && { action: response.data.action }
34
+ });
35
+ if (expectedAction && response.data.action !== expectedAction) return verificationFailed({
36
+ reason: "action_mismatch",
37
+ expectedAction,
38
+ actualAction: response.data.action
39
+ });
40
+ if (allowedHostnames && allowedHostnames.length > 0 && !(response.data.hostname && allowedHostnames.includes(response.data.hostname))) return verificationFailed({
41
+ reason: "hostname_mismatch",
42
+ allowedHostnames,
43
+ actualHostname: response.data.hostname
44
+ });
45
+ };
46
+ //#endregion
47
+ export { cloudflareTurnstile };
@@ -0,0 +1,32 @@
1
+ import { middlewareResponse } from "../../../utils/middleware-response.mjs";
2
+ import { CAPTCHA_VERIFY_TIMEOUT_MS } from "../constants.mjs";
3
+ import { EXTERNAL_ERROR_CODES, INTERNAL_ERROR_CODES } from "../error-codes.mjs";
4
+ import { encodeToURLParams } from "../utils.mjs";
5
+ import { betterFetch } from "@better-fetch/fetch";
6
+ //#region src/plugins/captcha/verify-handlers/google-recaptcha.ts
7
+ const isV3 = (response) => {
8
+ return "score" in response && typeof response.score === "number";
9
+ };
10
+ const googleRecaptcha = async ({ siteVerifyURL, captchaResponse, secretKey, minScore = .5, remoteIP, expectedAction, allowedHostnames }) => {
11
+ const response = await betterFetch(siteVerifyURL, {
12
+ method: "POST",
13
+ timeout: CAPTCHA_VERIFY_TIMEOUT_MS,
14
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
15
+ body: encodeToURLParams({
16
+ secret: secretKey,
17
+ response: captchaResponse,
18
+ ...remoteIP && { remoteip: remoteIP }
19
+ })
20
+ });
21
+ if (!response.data || response.error) throw new Error(INTERNAL_ERROR_CODES.SERVICE_UNAVAILABLE.message);
22
+ const verificationFailed = () => middlewareResponse({
23
+ message: EXTERNAL_ERROR_CODES.VERIFICATION_FAILED.message,
24
+ code: EXTERNAL_ERROR_CODES.VERIFICATION_FAILED.code,
25
+ status: 403
26
+ });
27
+ if (!response.data.success || isV3(response.data) && response.data.score < minScore) return verificationFailed();
28
+ if (expectedAction && response.data.action !== expectedAction) return verificationFailed();
29
+ if (allowedHostnames && allowedHostnames.length > 0 && !allowedHostnames.includes(response.data.hostname)) return verificationFailed();
30
+ };
31
+ //#endregion
32
+ export { googleRecaptcha };
@@ -0,0 +1,27 @@
1
+ import { middlewareResponse } from "../../../utils/middleware-response.mjs";
2
+ import { CAPTCHA_VERIFY_TIMEOUT_MS } from "../constants.mjs";
3
+ import { EXTERNAL_ERROR_CODES, INTERNAL_ERROR_CODES } from "../error-codes.mjs";
4
+ import { encodeToURLParams } from "../utils.mjs";
5
+ import { betterFetch } from "@better-fetch/fetch";
6
+ //#region src/plugins/captcha/verify-handlers/h-captcha.ts
7
+ const hCaptcha = async ({ siteVerifyURL, captchaResponse, secretKey, siteKey, remoteIP }) => {
8
+ const response = await betterFetch(siteVerifyURL, {
9
+ method: "POST",
10
+ timeout: CAPTCHA_VERIFY_TIMEOUT_MS,
11
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
12
+ body: encodeToURLParams({
13
+ secret: secretKey,
14
+ response: captchaResponse,
15
+ ...siteKey && { sitekey: siteKey },
16
+ ...remoteIP && { remoteip: remoteIP }
17
+ })
18
+ });
19
+ if (!response.data || response.error) throw new Error(INTERNAL_ERROR_CODES.SERVICE_UNAVAILABLE.message);
20
+ if (!response.data.success) return middlewareResponse({
21
+ message: EXTERNAL_ERROR_CODES.VERIFICATION_FAILED.message,
22
+ code: EXTERNAL_ERROR_CODES.VERIFICATION_FAILED.code,
23
+ status: 403
24
+ });
25
+ };
26
+ //#endregion
27
+ export { hCaptcha };
@@ -0,0 +1,17 @@
1
+ import { BetterAuthOptions } from "../../types/index.mjs";
2
+ import { Auth } from "better-auth";
3
+
4
+ //#region src/plugins/custom-session/client.d.ts
5
+ declare const customSessionClient: <A extends Auth | {
6
+ options: BetterAuthOptions;
7
+ }>() => {
8
+ id: "infer-server-plugin";
9
+ version: string;
10
+ $InferServerPlugin: (A extends {
11
+ options: infer O;
12
+ } ? O : A)["plugins"] extends (infer P)[] ? P extends {
13
+ id: "custom-session";
14
+ } ? P : never : never;
15
+ };
16
+ //#endregion
17
+ export { customSessionClient };
@@ -0,0 +1,7 @@
1
+ import { InferServerPlugin } from "../../client/plugins/infer-plugin.mjs";
2
+ //#region src/plugins/custom-session/client.ts
3
+ const customSessionClient = () => {
4
+ return InferServerPlugin();
5
+ };
6
+ //#endregion
7
+ export { customSessionClient };
@@ -0,0 +1,73 @@
1
+ import * as _$_better_auth_core0 from "@better-auth/core";
2
+ import { BetterAuthOptions, GenericEndpointContext } from "@better-auth/core";
3
+ import { Session, User } from "@better-auth/core/db";
4
+ import * as _$better_call0 from "better-call";
5
+ import * as _$zod from "zod";
6
+ import * as _$zod_v4_core0 from "zod/v4/core";
7
+
8
+ //#region src/plugins/custom-session/index.d.ts
9
+ declare module "@better-auth/core" {
10
+ interface BetterAuthPluginRegistry<AuthOptions, Options> {
11
+ "custom-session": {
12
+ creator: typeof customSession;
13
+ };
14
+ }
15
+ }
16
+ type CustomSessionPluginOptions = {
17
+ /**
18
+ * This option is used to determine if the list-device-sessions endpoint should be mutated to the custom session data.
19
+ * @default false
20
+ */
21
+ shouldMutateListDeviceSessionsEndpoint?: boolean | undefined;
22
+ };
23
+ declare const customSession: <Returns extends Record<string, any>, O extends BetterAuthOptions = BetterAuthOptions>(fn: (session: {
24
+ user: User<O["user"], O["plugins"]>;
25
+ session: Session<O["session"], O["plugins"]>;
26
+ }, ctx: GenericEndpointContext) => Promise<Returns>, options?: O | undefined, pluginOptions?: CustomSessionPluginOptions | undefined) => {
27
+ id: "custom-session";
28
+ version: string;
29
+ hooks: {
30
+ after: {
31
+ matcher: (ctx: _$_better_auth_core0.HookEndpointContext) => boolean;
32
+ handler: _$better_call0.Middleware<_$better_call0.MiddlewareOptions, (inputContext: _$better_call0.MiddlewareInputContext<_$better_call0.MiddlewareOptions>) => Promise<Awaited<Returns>[] | undefined>>;
33
+ }[];
34
+ };
35
+ endpoints: {
36
+ getSession: _$better_call0.StrictEndpoint<"/get-session", {
37
+ method: "GET";
38
+ query: _$zod.ZodOptional<_$zod.ZodObject<{
39
+ disableCookieCache: _$zod.ZodOptional<_$zod.ZodCoercedBoolean<unknown>>;
40
+ disableRefresh: _$zod.ZodOptional<_$zod.ZodCoercedBoolean<unknown>>;
41
+ }, _$zod_v4_core0.$strip>>;
42
+ metadata: {
43
+ CUSTOM_SESSION: boolean;
44
+ openapi: {
45
+ description: string;
46
+ responses: {
47
+ "200": {
48
+ description: string;
49
+ content: {
50
+ "application/json": {
51
+ schema: {
52
+ type: "array";
53
+ nullable: boolean;
54
+ items: {
55
+ $ref: string;
56
+ };
57
+ };
58
+ };
59
+ };
60
+ };
61
+ };
62
+ };
63
+ };
64
+ requireHeaders: true;
65
+ }, Returns | null>;
66
+ };
67
+ $Infer: {
68
+ Session: Awaited<ReturnType<typeof fn>>;
69
+ };
70
+ options: CustomSessionPluginOptions | undefined;
71
+ };
72
+ //#endregion
73
+ export { CustomSessionPluginOptions, customSession };