@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,256 @@
1
+ import { Session, User } from "../../types/models.mjs";
2
+ import { InferOptionSchema } from "../../types/plugins.mjs";
3
+ import { schema } from "./schema.mjs";
4
+ import { Awaitable, GenericEndpointContext } from "@better-auth/core";
5
+ import { JWTPayload } from "jose";
6
+
7
+ //#region src/plugins/jwt/types.d.ts
8
+ interface JwtOptions {
9
+ /**
10
+ * Use the JWT plugin's locally managed signing keys for JWT session cookie
11
+ * cache values.
12
+ *
13
+ * Requires `session.cookieCache.strategy` to be set to `"jwt"`.
14
+ *
15
+ * @default false
16
+ */
17
+ sessionCookieCache?: boolean | undefined;
18
+ jwks?: {
19
+ /**
20
+ * Disables the /jwks endpoint and uses this endpoint in discovery.
21
+ *
22
+ * Useful if jwks are not managed at /jwks or
23
+ * if your jwks are signed with a certificate and placed on your CDN.
24
+ */
25
+ remoteUrl?: string | undefined;
26
+ /**
27
+ * Key pair configuration
28
+ * @description A subset of the options available for the generateKeyPair function
29
+ *
30
+ * @see https://github.com/panva/jose/blob/main/src/runtime/node/generate.ts
31
+ *
32
+ * @default { alg: 'EdDSA', crv: 'Ed25519' }
33
+ */
34
+ keyPairConfig?: JWKOptions | undefined;
35
+ /**
36
+ * Additional key pair configurations to provision so per-resource
37
+ * `signingAlgorithm` overrides (see the OAuth provider plugin's
38
+ * resource entity) can resolve a key for algorithms other than
39
+ * {@link keyPairConfig}.
40
+ *
41
+ * Lazily minted: the first `signJWT` call that pins an algorithm
42
+ * present here mints the row on demand. Subsequent calls reuse it.
43
+ * This avoids needing to coordinate with migration ordering at
44
+ * plugin init — entries here are only materialized after the
45
+ * `jwks` table exists.
46
+ *
47
+ * Algorithms not present in either {@link keyPairConfig} or this
48
+ * list will throw with a descriptive error message identifying
49
+ * the configured default, so misconfiguration is diagnosable.
50
+ *
51
+ * @example
52
+ * ```ts
53
+ * jwt({
54
+ * jwks: {
55
+ * keyPairConfig: { alg: "EdDSA" },
56
+ * keyPairConfigs: [{ alg: "ES256" }, { alg: "RS256" }],
57
+ * },
58
+ * })
59
+ * ```
60
+ */
61
+ keyPairConfigs?: readonly JWKOptions[] | undefined;
62
+ /**
63
+ * Disable private key encryption
64
+ * @description Disable the encryption of the private key in the database
65
+ *
66
+ * @default false
67
+ */
68
+ disablePrivateKeyEncryption?: boolean | undefined;
69
+ /**
70
+ * The key rotation interval in seconds.
71
+ *
72
+ * @default undefined (disabled)
73
+ */
74
+ rotationInterval?: number | undefined;
75
+ /**
76
+ * The grace period in seconds.
77
+ *
78
+ * @default 2592000 (30 days)
79
+ */
80
+ gracePeriod?: number | undefined;
81
+ /**
82
+ * The path of the endpoint exposing the JWKS.
83
+ * When set, this replaces the default /jwks endpoint.
84
+ * The old endpoint will return 404.
85
+ *
86
+ * @default /jwks
87
+ * @example "/.well-known/jwks.json"
88
+ */
89
+ jwksPath?: string | undefined;
90
+ } | undefined;
91
+ jwt?: {
92
+ /**
93
+ * The issuer of the JWT
94
+ */
95
+ issuer?: string | undefined;
96
+ /**
97
+ * The audience of the JWT
98
+ */
99
+ audience?: string | string[] | undefined;
100
+ /**
101
+ * Set the "exp" (Expiration Time) Claim.
102
+ *
103
+ * - If a `number` is passed as an argument it is used as the claim directly.
104
+ * - If a `Date` instance is passed as an argument it is converted to unix timestamp and used as the
105
+ * claim.
106
+ * - If a `string` is passed as an argument it is resolved to a time span, and then added to the
107
+ * current unix timestamp and used as the claim.
108
+ *
109
+ * Format used for time span should be a number followed by a unit, such as "5 minutes" or "1
110
+ * day".
111
+ *
112
+ * Valid units are: "sec", "secs", "second", "seconds", "s", "minute", "minutes", "min", "mins",
113
+ * "m", "hour", "hours", "hr", "hrs", "h", "day", "days", "d", "week", "weeks", "w", "year",
114
+ * "years", "yr", "yrs", and "y". It is not possible to specify months. 365.25 days is used as an
115
+ * alias for a year.
116
+ *
117
+ * If the string is suffixed with "ago", or prefixed with a "-", the resulting time span gets
118
+ * subtracted from the current unix timestamp. A "from now" suffix can also be used for
119
+ * readability when adding to the current unix timestamp.
120
+ *
121
+ * @default 15m
122
+ */
123
+ expirationTime?: number | string | Date | undefined;
124
+ /**
125
+ * A function that is called to define the payload of the JWT
126
+ */
127
+ definePayload?: (session: {
128
+ user: User & Record<string, any>;
129
+ session: Session & Record<string, any>;
130
+ }) => Awaitable<Record<string, any>> | undefined;
131
+ /**
132
+ * A function that is called to get the subject of the JWT
133
+ *
134
+ * @default session.user.id
135
+ */
136
+ getSubject?: (session: {
137
+ user: User & Record<string, any>;
138
+ session: Session & Record<string, any>;
139
+ }) => Awaitable<string> | undefined;
140
+ /**
141
+ * A custom function to remote sign the jwt payload.
142
+ *
143
+ * All headers, such as `alg` and `kid`,
144
+ * MUST be defined within this function.
145
+ * You can safely define the header `typ: 'JWT'`.
146
+ *
147
+ * The optional `header` argument carries extra protected-header
148
+ * parameters the caller requires (e.g. `typ: "logout+jwt"` for
149
+ * OIDC Back-Channel Logout). Merge them into the signed header so
150
+ * such profiles stay conformant; `alg`/`kid` remain yours to set.
151
+ *
152
+ * The optional `signingConfig` third argument carries the
153
+ * per-call signing overrides (e.g. an OAuth protected resource pinned
154
+ * to a specific kid/alg). Implementations are free to ignore
155
+ * it for backward compatibility, but remote KMS integrations
156
+ * SHOULD honor it so per-resource pinning works end-to-end.
157
+ *
158
+ * @requires jwks.remoteUrl
159
+ * @invalidates other jwt.* options
160
+ */
161
+ sign?: ((payload: JWTPayload, header?: {
162
+ typ?: string;
163
+ cty?: string;
164
+ }, signingConfig?: {
165
+ signingKeyId?: string | undefined;
166
+ signingAlgorithm?: JWSAlgorithms | undefined;
167
+ }) => Awaitable<string>) | undefined;
168
+ } | undefined;
169
+ /**
170
+ * Disables setting JWTs through middleware.
171
+ *
172
+ * Recommended to set `true` when using an oAuth provider plugin
173
+ * like OIDC or MCP where session payloads should not be signed.
174
+ *
175
+ * @default false
176
+ */
177
+ disableSettingJwtHeader?: boolean | undefined;
178
+ /**
179
+ * Custom schema for the admin plugin
180
+ */
181
+ schema?: InferOptionSchema<typeof schema> | undefined;
182
+ /**
183
+ * Custom adapter for the jwt plugin
184
+ *
185
+ * This will override the default adapter
186
+ *
187
+ * @default adapter from the database
188
+ */
189
+ adapter?: {
190
+ /**
191
+ * A custom function to get the JWKS from the database or
192
+ * other source
193
+ *
194
+ * This will override the default getJwks from the database
195
+ *
196
+ * @param ctx - The context of the request
197
+ * @returns The JWKS
198
+ */
199
+ getJwks?: (ctx: GenericEndpointContext) => Promise<Jwk[] | null | undefined>;
200
+ /**
201
+ * A custom function to create a new key in the database or
202
+ * other source
203
+ *
204
+ * This will override the default createJwk from the database
205
+ *
206
+ * @param data - The key to create
207
+ * @returns The created key
208
+ */
209
+ createJwk?: (data: Omit<Jwk, "id">, ctx: GenericEndpointContext) => Promise<Jwk>;
210
+ };
211
+ }
212
+ /**
213
+ * Asymmetric (JWS) Supported.
214
+ *
215
+ * @see https://github.com/panva/jose/issues/210
216
+ */
217
+ type JWKOptions = {
218
+ alg: "EdDSA";
219
+ crv?: "Ed25519" | undefined;
220
+ } | {
221
+ alg: "ES256";
222
+ crv?: never | undefined;
223
+ } | {
224
+ alg: "ES512";
225
+ crv?: never | undefined;
226
+ } | {
227
+ alg: "PS256";
228
+ modulusLength?: number | undefined;
229
+ } | {
230
+ alg: "RS256";
231
+ modulusLength?: number | undefined;
232
+ };
233
+ type JWSAlgorithms = JWKOptions["alg"];
234
+ interface Jwk {
235
+ id: string;
236
+ publicKey: string;
237
+ privateKey: string;
238
+ createdAt: Date;
239
+ expiresAt?: Date;
240
+ alg?: JWSAlgorithms | undefined;
241
+ crv?: ("Ed25519" | "P-256" | "P-521") | undefined;
242
+ }
243
+ /**
244
+ * A fully resolved signing key ready for JWT signing.
245
+ * Produced by `resolveSigningKey`, consumed by `signJWT`.
246
+ * Separates key resolution from signing so callers can
247
+ * read the `alg` before constructing the JWT payload
248
+ * (required for OIDC hash claims like at_hash).
249
+ */
250
+ interface ResolvedSigningKey {
251
+ alg: string;
252
+ kid: string;
253
+ privateKey: CryptoKey | Uint8Array;
254
+ }
255
+ //#endregion
256
+ export { JWKOptions, JWSAlgorithms, Jwk, JwtOptions, ResolvedSigningKey };
@@ -0,0 +1,41 @@
1
+ import { Jwk, JwtOptions } from "./types.mjs";
2
+ import { GenericEndpointContext } from "@better-auth/core";
3
+ import * as _$jose from "jose";
4
+
5
+ //#region src/plugins/jwt/utils.d.ts
6
+ /**
7
+ * Converts an expirationTime to ISO seconds expiration time (the format of JWT exp)
8
+ *
9
+ * See https://github.com/panva/jose/blob/main/src/lib/jwt_claims_set.ts#L245
10
+ *
11
+ * @param expirationTime - see options.jwt.expirationTime
12
+ * @param iat - the iat time to consolidate on
13
+ * @returns
14
+ */
15
+ declare function toExpJWT(expirationTime: number | Date | string, iat: number): number;
16
+ declare function generateExportedKeyPair(options?: JwtOptions | undefined): Promise<{
17
+ publicWebKey: _$jose.JWK;
18
+ privateWebKey: _$jose.JWK;
19
+ alg: "EdDSA" | "ES256" | "ES512" | "PS256" | "RS256";
20
+ cfg: {
21
+ crv?: "Ed25519" | undefined;
22
+ } | {
23
+ crv?: never | undefined;
24
+ } | {
25
+ crv?: never | undefined;
26
+ } | {
27
+ modulusLength?: number | undefined;
28
+ } | {
29
+ modulusLength?: number | undefined;
30
+ };
31
+ }>;
32
+ /**
33
+ * Creates a Jwk on the database
34
+ *
35
+ * @param ctx
36
+ * @param options
37
+ * @returns
38
+ */
39
+ declare function createJwk(ctx: GenericEndpointContext, options?: JwtOptions | undefined): Promise<Jwk>;
40
+ //#endregion
41
+ export { createJwk, generateExportedKeyPair, toExpJWT };
@@ -0,0 +1,64 @@
1
+ import { sec } from "../../utils/time.mjs";
2
+ import { symmetricEncrypt } from "../../crypto/index.mjs";
3
+ import { getJwksAdapter } from "./adapter.mjs";
4
+ import { exportJWK, generateKeyPair } from "jose";
5
+ //#region src/plugins/jwt/utils.ts
6
+ /**
7
+ * Converts an expirationTime to ISO seconds expiration time (the format of JWT exp)
8
+ *
9
+ * See https://github.com/panva/jose/blob/main/src/lib/jwt_claims_set.ts#L245
10
+ *
11
+ * @param expirationTime - see options.jwt.expirationTime
12
+ * @param iat - the iat time to consolidate on
13
+ * @returns
14
+ */
15
+ function toExpJWT(expirationTime, iat) {
16
+ if (typeof expirationTime === "number") return expirationTime;
17
+ else if (expirationTime instanceof Date) return Math.floor(expirationTime.getTime() / 1e3);
18
+ else return iat + sec(expirationTime);
19
+ }
20
+ async function generateExportedKeyPair(options) {
21
+ const { alg, ...cfg } = options?.jwks?.keyPairConfig ?? {
22
+ alg: "EdDSA",
23
+ crv: "Ed25519"
24
+ };
25
+ const { publicKey, privateKey } = await generateKeyPair(alg, {
26
+ ...cfg,
27
+ extractable: true
28
+ });
29
+ return {
30
+ publicWebKey: await exportJWK(publicKey),
31
+ privateWebKey: await exportJWK(privateKey),
32
+ alg,
33
+ cfg
34
+ };
35
+ }
36
+ /**
37
+ * Creates a Jwk on the database
38
+ *
39
+ * @param ctx
40
+ * @param options
41
+ * @returns
42
+ */
43
+ async function createJwk(ctx, options) {
44
+ const { publicWebKey, privateWebKey, alg, cfg } = await generateExportedKeyPair(options);
45
+ const explicitCrv = cfg && "crv" in cfg ? cfg.crv : void 0;
46
+ const derivedCrv = typeof publicWebKey.crv === "string" ? publicWebKey.crv : void 0;
47
+ const crv = explicitCrv ?? derivedCrv;
48
+ const stringifiedPrivateWebKey = JSON.stringify(privateWebKey);
49
+ const privateKeyEncryptionEnabled = !options?.jwks?.disablePrivateKeyEncryption;
50
+ const jwk = {
51
+ alg,
52
+ ...crv ? { crv } : {},
53
+ publicKey: JSON.stringify(publicWebKey),
54
+ privateKey: privateKeyEncryptionEnabled ? JSON.stringify(await symmetricEncrypt({
55
+ key: ctx.context.secretConfig,
56
+ data: stringifiedPrivateWebKey
57
+ })) : stringifiedPrivateWebKey,
58
+ createdAt: /* @__PURE__ */ new Date(),
59
+ ...options?.jwks?.rotationInterval ? { expiresAt: new Date(Date.now() + options.jwks.rotationInterval * 1e3) } : {}
60
+ };
61
+ return await getJwksAdapter(ctx.context.adapter, options).createJwk(ctx, jwk);
62
+ }
63
+ //#endregion
64
+ export { createJwk, generateExportedKeyPair, toExpJWT };
@@ -0,0 +1,11 @@
1
+ import { JwtOptions } from "./types.mjs";
2
+ import { JWTPayload } from "jose";
3
+
4
+ //#region src/plugins/jwt/verify.d.ts
5
+ /**
6
+ * Verify a JWT token using the JWKS public keys
7
+ * Returns the payload if valid, null otherwise
8
+ */
9
+ declare function verifyJWT<T extends JWTPayload = JWTPayload>(token: string, options?: JwtOptions): Promise<(T & Required<Pick<JWTPayload, "sub" | "aud">>) | null>;
10
+ //#endregion
11
+ export { verifyJWT };
@@ -0,0 +1,45 @@
1
+ import { getJwksAdapter } from "./adapter.mjs";
2
+ import { getCurrentAuthEndpointContext } from "@better-auth/core/context";
3
+ import { base64 } from "@better-auth/utils/base64";
4
+ import { importJWK, jwtVerify } from "jose";
5
+ //#region src/plugins/jwt/verify.ts
6
+ /**
7
+ * Verify a JWT token using the JWKS public keys
8
+ * Returns the payload if valid, null otherwise
9
+ */
10
+ async function verifyJWT(token, options) {
11
+ const ctx = getCurrentAuthEndpointContext();
12
+ try {
13
+ const parts = token.split(".");
14
+ if (parts.length !== 3) return null;
15
+ const headerStr = new TextDecoder().decode(base64.decode(parts[0]));
16
+ const kid = JSON.parse(headerStr).kid;
17
+ if (!kid) {
18
+ ctx.context.logger.debug("JWT missing kid in header");
19
+ return null;
20
+ }
21
+ const keys = await getJwksAdapter(ctx.context.adapter, options).getAllKeys(ctx);
22
+ if (!keys || keys.length === 0) {
23
+ ctx.context.logger.debug("No JWKS keys available");
24
+ return null;
25
+ }
26
+ const key = keys.find((k) => k.id === kid);
27
+ if (!key) {
28
+ ctx.context.logger.debug(`No JWKS key found for kid: ${kid}`);
29
+ return null;
30
+ }
31
+ const cryptoKey = await importJWK(JSON.parse(key.publicKey), key.alg ?? options?.jwks?.keyPairConfig?.alg ?? "EdDSA");
32
+ const baseURLOrigin = typeof ctx.context.options.baseURL === "string" ? ctx.context.options.baseURL : void 0;
33
+ const { payload } = await jwtVerify(token, cryptoKey, {
34
+ issuer: options?.jwt?.issuer ?? baseURLOrigin,
35
+ audience: options?.jwt?.audience ?? baseURLOrigin
36
+ });
37
+ if (!payload.sub || !payload.aud) return null;
38
+ return payload;
39
+ } catch (error) {
40
+ ctx.context.logger.debug("JWT verification failed", error);
41
+ return null;
42
+ }
43
+ }
44
+ //#endregion
45
+ export { verifyJWT };
@@ -0,0 +1,48 @@
1
+ //#region src/plugins/last-login-method/client.d.ts
2
+ /**
3
+ * Configuration for the client-side last login method plugin
4
+ */
5
+ interface LastLoginMethodClientConfig {
6
+ /**
7
+ * Name of the cookie to read the last login method from
8
+ * @default "better-auth.last_used_login_method"
9
+ */
10
+ cookieName?: string | undefined;
11
+ /**
12
+ * Domain for the cookie. Required when using cross-subdomain cookies
13
+ * so the client can properly clear the cookie set by the server.
14
+ *
15
+ * Should match the `domain` value in your server's
16
+ * `crossSubDomainCookies` configuration.
17
+ *
18
+ * @example ".example.com"
19
+ */
20
+ domain?: string | undefined;
21
+ }
22
+ /**
23
+ * Client-side plugin to retrieve the last used login method
24
+ */
25
+ declare const lastLoginMethodClient: (config?: LastLoginMethodClientConfig) => {
26
+ id: "last-login-method-client";
27
+ version: string;
28
+ getActions(): {
29
+ /**
30
+ * Get the last used login method from cookies
31
+ * @returns The last used login method or null if not found
32
+ */
33
+ getLastUsedLoginMethod: () => string | null;
34
+ /**
35
+ * Clear the last used login method cookie
36
+ * This sets the cookie with an expiration date in the past
37
+ */
38
+ clearLastUsedLoginMethod: () => void;
39
+ /**
40
+ * Check if a specific login method was the last used
41
+ * @param method The method to check
42
+ * @returns True if the method was the last used, false otherwise
43
+ */
44
+ isLastUsedLoginMethod: (method: string) => boolean;
45
+ };
46
+ };
47
+ //#endregion
48
+ export { LastLoginMethodClientConfig, lastLoginMethodClient };
@@ -0,0 +1,48 @@
1
+ import { parseCookies } from "../../cookies/cookie-utils.mjs";
2
+ import { PACKAGE_VERSION } from "../../version.mjs";
3
+ //#region src/plugins/last-login-method/client.ts
4
+ function getCookieValue(name) {
5
+ if (typeof document === "undefined") return null;
6
+ return parseCookies(document.cookie).get(name) ?? null;
7
+ }
8
+ /**
9
+ * Client-side plugin to retrieve the last used login method
10
+ */
11
+ const lastLoginMethodClient = (config = {}) => {
12
+ const cookieName = config.cookieName || "better-auth.last_used_login_method";
13
+ return {
14
+ id: "last-login-method-client",
15
+ version: PACKAGE_VERSION,
16
+ getActions() {
17
+ return {
18
+ /**
19
+ * Get the last used login method from cookies
20
+ * @returns The last used login method or null if not found
21
+ */
22
+ getLastUsedLoginMethod: () => {
23
+ return getCookieValue(cookieName);
24
+ },
25
+ /**
26
+ * Clear the last used login method cookie
27
+ * This sets the cookie with an expiration date in the past
28
+ */
29
+ clearLastUsedLoginMethod: () => {
30
+ if (typeof document !== "undefined") {
31
+ const domainPart = config.domain ? ` domain=${config.domain};` : "";
32
+ document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;${domainPart}`;
33
+ }
34
+ },
35
+ /**
36
+ * Check if a specific login method was the last used
37
+ * @param method The method to check
38
+ * @returns True if the method was the last used, false otherwise
39
+ */
40
+ isLastUsedLoginMethod: (method) => {
41
+ return getCookieValue(cookieName) === method;
42
+ }
43
+ };
44
+ }
45
+ };
46
+ };
47
+ //#endregion
48
+ export { lastLoginMethodClient };
@@ -0,0 +1,127 @@
1
+ import * as _$_better_auth_core0 from "@better-auth/core";
2
+ import { GenericEndpointContext } from "@better-auth/core";
3
+ import * as _$better_call0 from "better-call";
4
+
5
+ //#region src/plugins/last-login-method/index.d.ts
6
+ declare module "@better-auth/core" {
7
+ interface BetterAuthPluginRegistry<AuthOptions, Options> {
8
+ "last-login-method": {
9
+ creator: typeof lastLoginMethod;
10
+ };
11
+ }
12
+ }
13
+ /**
14
+ * Configuration for tracking different authentication methods
15
+ */
16
+ interface LastLoginMethodOptions {
17
+ /**
18
+ * Name of the cookie to store the last login method
19
+ * @default "better-auth.last_used_login_method"
20
+ */
21
+ cookieName?: string | undefined;
22
+ /**
23
+ * Cookie expiration time in seconds
24
+ * @default 2592000 (30 days)
25
+ */
26
+ maxAge?: number | undefined;
27
+ /**
28
+ * Custom method to resolve the last login method
29
+ * @param ctx - The context from the hook
30
+ * @returns The last login method
31
+ */
32
+ customResolveMethod?: ((ctx: GenericEndpointContext) => string | null) | undefined;
33
+ /**
34
+ * Store the last login method in the database. This will create a new field in the user table.
35
+ * @default false
36
+ */
37
+ storeInDatabase?: boolean | undefined;
38
+ /**
39
+ * A hook to run before the last login method is stored in the cookie.
40
+ * Useful if you are required to follow GDPR or other regulations to ensure that you're allowed to store the last login method in the cookie.
41
+ *
42
+ * @param ctx - The context from the hook
43
+ * @param lastUsedLoginMethod - The last login method
44
+ * @returns `true` to store the cookie, `false` to skip storing it (authentication continues either way)
45
+ */
46
+ beforeStoreCookie?: ((ctx: GenericEndpointContext, lastUsedLoginMethod: string) => Promise<boolean> | boolean) | undefined;
47
+ /**
48
+ * Custom schema for the plugin
49
+ * @default undefined
50
+ */
51
+ schema?: {
52
+ user?: {
53
+ lastLoginMethod?: string;
54
+ };
55
+ } | undefined;
56
+ }
57
+ /**
58
+ * Plugin to track the last used login method
59
+ */
60
+ declare const lastLoginMethod: <O extends LastLoginMethodOptions>(userConfig?: O | undefined) => {
61
+ id: "last-login-method";
62
+ version: string;
63
+ init(ctx: _$_better_auth_core0.AuthContext): {
64
+ options: {
65
+ databaseHooks: {
66
+ user: {
67
+ create: {
68
+ before(user: {
69
+ id: string;
70
+ createdAt: Date;
71
+ updatedAt: Date;
72
+ email: string;
73
+ emailVerified: boolean;
74
+ name: string;
75
+ image?: string | null | undefined;
76
+ } & Record<string, unknown>, context: GenericEndpointContext | null): Promise<{
77
+ data: {
78
+ lastLoginMethod: string;
79
+ id: string;
80
+ createdAt: Date;
81
+ updatedAt: Date;
82
+ email: string;
83
+ emailVerified: boolean;
84
+ name: string;
85
+ image?: string | null | undefined;
86
+ };
87
+ } | undefined>;
88
+ };
89
+ };
90
+ session: {
91
+ create: {
92
+ after(session: {
93
+ id: string;
94
+ createdAt: Date;
95
+ updatedAt: Date;
96
+ userId: string;
97
+ expiresAt: Date;
98
+ token: string;
99
+ ipAddress?: string | null | undefined;
100
+ userAgent?: string | null | undefined;
101
+ } & Record<string, unknown>, context: GenericEndpointContext | null): Promise<void>;
102
+ };
103
+ };
104
+ };
105
+ };
106
+ };
107
+ hooks: {
108
+ after: {
109
+ matcher(): true;
110
+ handler: _$better_call0.Middleware<_$better_call0.MiddlewareOptions, (inputContext: _$better_call0.MiddlewareInputContext<_$better_call0.MiddlewareOptions>) => Promise<void>>;
111
+ }[];
112
+ };
113
+ schema: O["storeInDatabase"] extends true ? {
114
+ user: {
115
+ fields: {
116
+ lastLoginMethod: {
117
+ type: "string";
118
+ required: false;
119
+ input: false;
120
+ };
121
+ };
122
+ };
123
+ } : undefined;
124
+ options: NoInfer<O>;
125
+ };
126
+ //#endregion
127
+ export { LastLoginMethodOptions, lastLoginMethod };