better-auth 1.2.6-beta.7 → 1.2.7-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/dist/adapters/drizzle-adapter/index.cjs +186 -249
  2. package/dist/adapters/drizzle-adapter/index.d.cts +11 -49
  3. package/dist/adapters/drizzle-adapter/index.d.mts +11 -49
  4. package/dist/adapters/drizzle-adapter/index.d.ts +11 -49
  5. package/dist/adapters/drizzle-adapter/index.mjs +186 -249
  6. package/dist/adapters/index.cjs +26 -0
  7. package/dist/adapters/index.d.cts +17 -0
  8. package/dist/adapters/index.d.mts +17 -0
  9. package/dist/adapters/index.d.ts +17 -0
  10. package/dist/adapters/index.mjs +20 -0
  11. package/dist/adapters/kysely-adapter/index.cjs +7 -7
  12. package/dist/adapters/kysely-adapter/index.d.cts +17 -49
  13. package/dist/adapters/kysely-adapter/index.d.mts +17 -49
  14. package/dist/adapters/kysely-adapter/index.d.ts +17 -49
  15. package/dist/adapters/kysely-adapter/index.mjs +8 -8
  16. package/dist/adapters/memory-adapter/index.cjs +7 -8
  17. package/dist/adapters/memory-adapter/index.d.cts +9 -49
  18. package/dist/adapters/memory-adapter/index.d.mts +9 -49
  19. package/dist/adapters/memory-adapter/index.d.ts +9 -49
  20. package/dist/adapters/memory-adapter/index.mjs +8 -9
  21. package/dist/adapters/mongodb-adapter/index.cjs +2 -2
  22. package/dist/adapters/mongodb-adapter/index.d.cts +4 -4
  23. package/dist/adapters/mongodb-adapter/index.d.mts +4 -4
  24. package/dist/adapters/mongodb-adapter/index.d.ts +4 -4
  25. package/dist/adapters/mongodb-adapter/index.mjs +3 -3
  26. package/dist/adapters/prisma-adapter/index.cjs +130 -203
  27. package/dist/adapters/prisma-adapter/index.d.cts +17 -49
  28. package/dist/adapters/prisma-adapter/index.d.mts +17 -49
  29. package/dist/adapters/prisma-adapter/index.d.ts +17 -49
  30. package/dist/adapters/prisma-adapter/index.mjs +131 -204
  31. package/dist/adapters/test.cjs +710 -377
  32. package/dist/adapters/test.d.cts +64 -5
  33. package/dist/adapters/test.d.mts +64 -5
  34. package/dist/adapters/test.d.ts +64 -5
  35. package/dist/adapters/test.mjs +712 -380
  36. package/dist/api/index.cjs +61 -25
  37. package/dist/api/index.d.cts +3 -3
  38. package/dist/api/index.d.mts +3 -3
  39. package/dist/api/index.d.ts +3 -3
  40. package/dist/api/index.mjs +63 -27
  41. package/dist/client/index.d.cts +3 -3
  42. package/dist/client/index.d.mts +3 -3
  43. package/dist/client/index.d.ts +3 -3
  44. package/dist/client/plugins/index.cjs +13 -15
  45. package/dist/client/plugins/index.d.cts +80 -19
  46. package/dist/client/plugins/index.d.mts +80 -19
  47. package/dist/client/plugins/index.d.ts +80 -19
  48. package/dist/client/plugins/index.mjs +13 -16
  49. package/dist/client/react/index.cjs +4 -4
  50. package/dist/client/react/index.d.cts +3 -3
  51. package/dist/client/react/index.d.mts +3 -3
  52. package/dist/client/react/index.d.ts +3 -3
  53. package/dist/client/solid/index.d.cts +3 -3
  54. package/dist/client/solid/index.d.mts +3 -3
  55. package/dist/client/solid/index.d.ts +3 -3
  56. package/dist/client/svelte/index.d.cts +3 -3
  57. package/dist/client/svelte/index.d.mts +3 -3
  58. package/dist/client/svelte/index.d.ts +3 -3
  59. package/dist/client/vue/index.d.cts +3 -3
  60. package/dist/client/vue/index.d.mts +3 -3
  61. package/dist/client/vue/index.d.ts +3 -3
  62. package/dist/cookies/index.cjs +13 -2
  63. package/dist/cookies/index.d.cts +3 -3
  64. package/dist/cookies/index.d.mts +3 -3
  65. package/dist/cookies/index.d.ts +3 -3
  66. package/dist/cookies/index.mjs +13 -2
  67. package/dist/db/index.cjs +6 -5
  68. package/dist/db/index.d.cts +4 -4
  69. package/dist/db/index.d.mts +4 -4
  70. package/dist/db/index.d.ts +4 -4
  71. package/dist/db/index.mjs +7 -6
  72. package/dist/index.cjs +11 -7
  73. package/dist/index.d.cts +4 -4
  74. package/dist/index.d.mts +4 -4
  75. package/dist/index.d.ts +4 -4
  76. package/dist/index.mjs +14 -10
  77. package/dist/integrations/next-js.cjs +4 -5
  78. package/dist/integrations/next-js.d.cts +3 -3
  79. package/dist/integrations/next-js.d.mts +3 -3
  80. package/dist/integrations/next-js.d.ts +3 -3
  81. package/dist/integrations/next-js.mjs +5 -6
  82. package/dist/integrations/node.d.cts +3 -3
  83. package/dist/integrations/node.d.mts +3 -3
  84. package/dist/integrations/node.d.ts +3 -3
  85. package/dist/integrations/react-start.cjs +5 -6
  86. package/dist/integrations/react-start.d.cts +3 -3
  87. package/dist/integrations/react-start.d.mts +3 -3
  88. package/dist/integrations/react-start.d.ts +3 -3
  89. package/dist/integrations/react-start.mjs +6 -7
  90. package/dist/integrations/svelte-kit.d.cts +3 -3
  91. package/dist/integrations/svelte-kit.d.mts +3 -3
  92. package/dist/integrations/svelte-kit.d.ts +3 -3
  93. package/dist/oauth2/index.d.cts +5 -5
  94. package/dist/oauth2/index.d.mts +5 -5
  95. package/dist/oauth2/index.d.ts +5 -5
  96. package/dist/plugins/access/index.d.cts +1 -1
  97. package/dist/plugins/access/index.d.mts +1 -1
  98. package/dist/plugins/access/index.d.ts +1 -1
  99. package/dist/plugins/admin/access/index.d.cts +1 -1
  100. package/dist/plugins/admin/access/index.d.mts +1 -1
  101. package/dist/plugins/admin/access/index.d.ts +1 -1
  102. package/dist/plugins/admin/index.cjs +4 -4
  103. package/dist/plugins/admin/index.d.cts +74 -14
  104. package/dist/plugins/admin/index.d.mts +74 -14
  105. package/dist/plugins/admin/index.d.ts +74 -14
  106. package/dist/plugins/admin/index.mjs +5 -5
  107. package/dist/plugins/anonymous/index.cjs +4 -5
  108. package/dist/plugins/anonymous/index.d.cts +3 -3
  109. package/dist/plugins/anonymous/index.d.mts +3 -3
  110. package/dist/plugins/anonymous/index.d.ts +3 -3
  111. package/dist/plugins/anonymous/index.mjs +5 -6
  112. package/dist/plugins/bearer/index.cjs +2 -2
  113. package/dist/plugins/bearer/index.d.cts +3 -3
  114. package/dist/plugins/bearer/index.d.mts +3 -3
  115. package/dist/plugins/bearer/index.d.ts +3 -3
  116. package/dist/plugins/bearer/index.mjs +3 -3
  117. package/dist/plugins/captcha/index.cjs +110 -45
  118. package/dist/plugins/captcha/index.d.cts +26 -6
  119. package/dist/plugins/captcha/index.d.mts +26 -6
  120. package/dist/plugins/captcha/index.d.ts +26 -6
  121. package/dist/plugins/captcha/index.mjs +110 -45
  122. package/dist/plugins/custom-session/index.cjs +24 -5
  123. package/dist/plugins/custom-session/index.d.cts +25 -6
  124. package/dist/plugins/custom-session/index.d.mts +25 -6
  125. package/dist/plugins/custom-session/index.d.ts +25 -6
  126. package/dist/plugins/custom-session/index.mjs +25 -6
  127. package/dist/plugins/email-otp/index.cjs +96 -30
  128. package/dist/plugins/email-otp/index.d.cts +33 -10
  129. package/dist/plugins/email-otp/index.d.mts +33 -10
  130. package/dist/plugins/email-otp/index.d.ts +33 -10
  131. package/dist/plugins/email-otp/index.mjs +97 -31
  132. package/dist/plugins/generic-oauth/index.cjs +81 -20
  133. package/dist/plugins/generic-oauth/index.d.cts +46 -3
  134. package/dist/plugins/generic-oauth/index.d.mts +46 -3
  135. package/dist/plugins/generic-oauth/index.d.ts +46 -3
  136. package/dist/plugins/generic-oauth/index.mjs +82 -21
  137. package/dist/plugins/haveibeenpwned/index.cjs +98 -0
  138. package/dist/plugins/haveibeenpwned/index.d.cts +36 -0
  139. package/dist/plugins/haveibeenpwned/index.d.mts +36 -0
  140. package/dist/plugins/haveibeenpwned/index.d.ts +36 -0
  141. package/dist/plugins/haveibeenpwned/index.mjs +96 -0
  142. package/dist/plugins/index.cjs +583 -19
  143. package/dist/plugins/index.d.cts +7 -5
  144. package/dist/plugins/index.d.mts +7 -5
  145. package/dist/plugins/index.d.ts +7 -5
  146. package/dist/plugins/index.mjs +583 -21
  147. package/dist/plugins/jwt/index.cjs +45 -21
  148. package/dist/plugins/jwt/index.d.cts +52 -6
  149. package/dist/plugins/jwt/index.d.mts +52 -6
  150. package/dist/plugins/jwt/index.d.ts +52 -6
  151. package/dist/plugins/jwt/index.mjs +46 -22
  152. package/dist/plugins/magic-link/index.cjs +3 -3
  153. package/dist/plugins/magic-link/index.mjs +4 -4
  154. package/dist/plugins/multi-session/index.cjs +3 -3
  155. package/dist/plugins/multi-session/index.d.cts +3 -3
  156. package/dist/plugins/multi-session/index.d.mts +3 -3
  157. package/dist/plugins/multi-session/index.d.ts +3 -3
  158. package/dist/plugins/multi-session/index.mjs +4 -4
  159. package/dist/plugins/oauth-proxy/index.cjs +4 -4
  160. package/dist/plugins/oauth-proxy/index.d.cts +3 -3
  161. package/dist/plugins/oauth-proxy/index.d.mts +3 -3
  162. package/dist/plugins/oauth-proxy/index.d.ts +3 -3
  163. package/dist/plugins/oauth-proxy/index.mjs +5 -5
  164. package/dist/plugins/oidc-provider/index.cjs +227 -8
  165. package/dist/plugins/oidc-provider/index.d.cts +215 -3
  166. package/dist/plugins/oidc-provider/index.d.mts +215 -3
  167. package/dist/plugins/oidc-provider/index.d.ts +215 -3
  168. package/dist/plugins/oidc-provider/index.mjs +228 -9
  169. package/dist/plugins/one-tap/index.cjs +5 -5
  170. package/dist/plugins/one-tap/index.mjs +6 -6
  171. package/dist/plugins/one-time-token/index.cjs +119 -0
  172. package/dist/plugins/one-time-token/index.d.cts +134 -0
  173. package/dist/plugins/one-time-token/index.d.mts +134 -0
  174. package/dist/plugins/one-time-token/index.d.ts +134 -0
  175. package/dist/plugins/one-time-token/index.mjs +117 -0
  176. package/dist/plugins/open-api/index.cjs +3 -3
  177. package/dist/plugins/open-api/index.d.cts +3 -3
  178. package/dist/plugins/open-api/index.d.mts +3 -3
  179. package/dist/plugins/open-api/index.d.ts +3 -3
  180. package/dist/plugins/open-api/index.mjs +4 -4
  181. package/dist/plugins/organization/access/index.d.cts +1 -1
  182. package/dist/plugins/organization/access/index.d.mts +1 -1
  183. package/dist/plugins/organization/access/index.d.ts +1 -1
  184. package/dist/plugins/organization/index.cjs +4 -4
  185. package/dist/plugins/organization/index.d.cts +708 -55
  186. package/dist/plugins/organization/index.d.mts +708 -55
  187. package/dist/plugins/organization/index.d.ts +708 -55
  188. package/dist/plugins/organization/index.mjs +5 -5
  189. package/dist/plugins/passkey/index.cjs +82 -8
  190. package/dist/plugins/passkey/index.d.cts +72 -3
  191. package/dist/plugins/passkey/index.d.mts +72 -3
  192. package/dist/plugins/passkey/index.d.ts +72 -3
  193. package/dist/plugins/passkey/index.mjs +83 -9
  194. package/dist/plugins/phone-number/index.cjs +194 -26
  195. package/dist/plugins/phone-number/index.d.cts +132 -8
  196. package/dist/plugins/phone-number/index.d.mts +132 -8
  197. package/dist/plugins/phone-number/index.d.ts +132 -8
  198. package/dist/plugins/phone-number/index.mjs +195 -27
  199. package/dist/plugins/sso/index.cjs +190 -7
  200. package/dist/plugins/sso/index.d.cts +181 -15
  201. package/dist/plugins/sso/index.d.mts +181 -15
  202. package/dist/plugins/sso/index.d.ts +181 -15
  203. package/dist/plugins/sso/index.mjs +191 -8
  204. package/dist/plugins/two-factor/index.cjs +443 -92
  205. package/dist/plugins/two-factor/index.d.cts +230 -396
  206. package/dist/plugins/two-factor/index.d.mts +230 -396
  207. package/dist/plugins/two-factor/index.d.ts +230 -396
  208. package/dist/plugins/two-factor/index.mjs +431 -80
  209. package/dist/plugins/username/index.cjs +34 -31
  210. package/dist/plugins/username/index.d.cts +15 -12
  211. package/dist/plugins/username/index.d.mts +15 -12
  212. package/dist/plugins/username/index.d.ts +15 -12
  213. package/dist/plugins/username/index.mjs +35 -32
  214. package/dist/shared/better-auth.1DR6suCQ.mjs +307 -0
  215. package/dist/shared/{better-auth.BSsp73pg.cjs → better-auth.B7cZ2juS.cjs} +15 -14
  216. package/dist/shared/{better-auth.bKwabe3I.d.mts → better-auth.B88xucNq.d.mts} +529 -39
  217. package/dist/shared/{better-auth.CApEjVDP.cjs → better-auth.BW8BpneG.cjs} +4 -1
  218. package/dist/shared/{better-auth.BiQsvaIP.d.cts → better-auth.BcU1Kjyq.d.cts} +2051 -518
  219. package/dist/shared/better-auth.BfG24BjZ.cjs +118 -0
  220. package/dist/shared/{better-auth.A3TjrU8G.mjs → better-auth.Bk5IMdhM.mjs} +32 -12
  221. package/dist/shared/{better-auth.D9VnBkRI.mjs → better-auth.Bm9HxIzE.mjs} +47 -24
  222. package/dist/shared/{better-auth.BRf6Iynu.d.ts → better-auth.Bwc-6kOr.d.ts} +1 -1
  223. package/dist/shared/{better-auth.D-oLmHIj.d.mts → better-auth.CA2hFK4N.d.ts} +2051 -518
  224. package/dist/shared/{better-auth.Dmhe30iW.d.mts → better-auth.CGukGrxT.d.cts} +1 -1
  225. package/dist/shared/{better-auth.CsSpq0zL.cjs → better-auth.CHUzBidy.cjs} +46 -23
  226. package/dist/shared/{better-auth.DWRligF8.d.cts → better-auth.CT9J6rD-.d.cts} +539 -7
  227. package/dist/shared/better-auth.CVCo5Z2T.cjs +310 -0
  228. package/dist/shared/{better-auth.D4jH-sJA.mjs → better-auth.CWwVo_61.mjs} +458 -118
  229. package/dist/shared/{better-auth.Bi8FQwDD.d.cts → better-auth.CYegVoq1.d.cts} +1 -1
  230. package/dist/shared/{better-auth.Bi8FQwDD.d.mts → better-auth.CYegVoq1.d.mts} +1 -1
  231. package/dist/shared/{better-auth.Bi8FQwDD.d.ts → better-auth.CYegVoq1.d.ts} +1 -1
  232. package/dist/shared/{better-auth.CepcSj5H.mjs → better-auth.Cc72UxUH.mjs} +1 -2
  233. package/dist/shared/{better-auth.BWp5dztg.d.ts → better-auth.CmN4mlPh.d.ts} +539 -7
  234. package/dist/shared/{better-auth.DH3YjMQH.mjs → better-auth.Cqykj82J.mjs} +1 -1
  235. package/dist/shared/{better-auth.wcdMj2cT.d.mts → better-auth.DIt2e3lu.d.mts} +539 -7
  236. package/dist/shared/{better-auth.BANAxdkL.d.ts → better-auth.DNTAFSt1.d.ts} +529 -39
  237. package/dist/shared/{better-auth.DU2QNVc_.d.ts → better-auth.DQ7OSJbI.d.mts} +2051 -518
  238. package/dist/shared/{better-auth.DLTzKoOS.cjs → better-auth.DSVbLSt7.cjs} +4 -1
  239. package/dist/shared/{better-auth.B2Fw1vhH.d.cts → better-auth.DTiSPWEk.d.cts} +529 -39
  240. package/dist/shared/better-auth.DURsStt9.mjs +116 -0
  241. package/dist/shared/{better-auth.BIjcZ_vt.cjs → better-auth.DYoLD99C.cjs} +31 -11
  242. package/dist/shared/{better-auth.CV1L7TPV.cjs → better-auth.D_ZIX1O8.cjs} +317 -47
  243. package/dist/shared/{better-auth.C5H9XEzZ.cjs → better-auth.DcWKCjjf.cjs} +1 -2
  244. package/dist/shared/{better-auth.BDYXUcLv.cjs → better-auth.Dg0siV5C.cjs} +457 -117
  245. package/dist/shared/better-auth.DjryM8pE.cjs +760 -0
  246. package/dist/shared/{better-auth.DPBQN9Fs.mjs → better-auth.Dn_Ms1Uf.mjs} +318 -48
  247. package/dist/shared/{better-auth.DiG4KL2x.mjs → better-auth.OuYYTHC7.mjs} +4 -1
  248. package/dist/shared/{better-auth.DtC8i3pf.d.cts → better-auth.S1jimRbX.d.mts} +1 -1
  249. package/dist/shared/better-auth.SPmq4a4z.d.mts +344 -0
  250. package/dist/shared/{better-auth.cOCrlspr.mjs → better-auth.bkwPl2G4.mjs} +4 -1
  251. package/dist/shared/better-auth.cp2rC2iM.d.ts +344 -0
  252. package/dist/shared/better-auth.eVy4DZvP.d.cts +344 -0
  253. package/dist/shared/{better-auth.BrOpzmqo.mjs → better-auth.iKoUsdFE.mjs} +15 -14
  254. package/dist/shared/better-auth.rSYJCd3o.mjs +758 -0
  255. package/dist/social-providers/index.cjs +75 -3
  256. package/dist/social-providers/index.d.cts +2 -2
  257. package/dist/social-providers/index.d.mts +2 -2
  258. package/dist/social-providers/index.d.ts +2 -2
  259. package/dist/social-providers/index.mjs +77 -6
  260. package/dist/types/index.d.cts +4 -4
  261. package/dist/types/index.d.mts +4 -4
  262. package/dist/types/index.d.ts +4 -4
  263. package/package.json +42 -5
  264. package/dist/chunks/server.cjs +0 -905
  265. package/dist/chunks/server.mjs +0 -895
  266. package/dist/shared/better-auth.BcoSd9tC.mjs +0 -10
  267. package/dist/shared/better-auth.BnRFp-t0.mjs +0 -405
  268. package/dist/shared/better-auth.C1-vpKly.cjs +0 -12
  269. package/dist/shared/better-auth.ClTSOgiD.mjs +0 -140
  270. package/dist/shared/better-auth.DC8JQbiE.mjs +0 -173
  271. package/dist/shared/better-auth.DWHWPllD.cjs +0 -175
  272. package/dist/shared/better-auth.DqLjzBlO.cjs +0 -408
  273. package/dist/shared/better-auth.m575EIBC.cjs +0 -144
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
3
  const zod = require('zod');
4
- const refreshToken = require('../../shared/better-auth.BDYXUcLv.cjs');
4
+ const refreshToken = require('../../shared/better-auth.Dg0siV5C.cjs');
5
5
  const betterCall = require('better-call');
6
- const schema$1 = require('../../shared/better-auth.C5H9XEzZ.cjs');
6
+ const schema$1 = require('../../shared/better-auth.DcWKCjjf.cjs');
7
7
  const random = require('../../shared/better-auth.CYeOI8C-.cjs');
8
8
  const cookies_index = require('../../cookies/index.cjs');
9
9
  require('../../shared/better-auth.DiSjtgs9.cjs');
@@ -26,14 +26,25 @@ require('@noble/hashes/utils');
26
26
  require('../../shared/better-auth.ANpbi45u.cjs');
27
27
  require('@better-auth/utils/random');
28
28
  require('../../shared/better-auth.QbbyHMYf.cjs');
29
+ require('../../shared/better-auth.D3mtHEZg.cjs');
29
30
  require('../../shared/better-auth.Bg6iw3ig.cjs');
30
31
  require('@better-auth/utils/hmac');
31
32
  require('../../shared/better-auth.BMYo0QR-.cjs');
32
33
  require('../../shared/better-auth.C-R0J0n1.cjs');
33
34
  require('jose/errors');
34
- require('../../shared/better-auth.D3mtHEZg.cjs');
35
35
  require('@better-auth/utils/binary');
36
36
 
37
+ const ERROR_CODES = {
38
+ INVALID_PHONE_NUMBER: "Invalid phone number",
39
+ PHONE_NUMBER_EXIST: "Phone number already exist",
40
+ INVALID_PHONE_NUMBER_OR_PASSWORD: "Invalid phone number or password",
41
+ UNEXPECTED_ERROR: "Unexpected error",
42
+ OTP_NOT_FOUND: "OTP not found",
43
+ OTP_EXPIRED: "OTP expired",
44
+ INVALID_OTP: "Invalid OTP",
45
+ PHONE_NUMBER_NOT_VERIFIED: "Phone number not verified"
46
+ };
47
+
37
48
  function generateOTP(size) {
38
49
  return random.generateRandomString(size, "0-9");
39
50
  }
@@ -47,15 +58,6 @@ const phoneNumber = (options) => {
47
58
  code: "code",
48
59
  createdAt: "createdAt"
49
60
  };
50
- const ERROR_CODES = {
51
- INVALID_PHONE_NUMBER: "Invalid phone number",
52
- PHONE_NUMBER_EXIST: "Phone number already exist",
53
- INVALID_PHONE_NUMBER_OR_PASSWORD: "Invalid phone number or password",
54
- UNEXPECTED_ERROR: "Unexpected error",
55
- OTP_NOT_FOUND: "OTP not found",
56
- OTP_EXPIRED: "OTP expired",
57
- INVALID_OTP: "Invalid OTP"
58
- };
59
61
  return {
60
62
  id: "phone-number",
61
63
  endpoints: {
@@ -130,6 +132,23 @@ const phoneNumber = (options) => {
130
132
  message: ERROR_CODES.INVALID_PHONE_NUMBER_OR_PASSWORD
131
133
  });
132
134
  }
135
+ if (opts.requireVerification) {
136
+ if (!user.phoneNumberVerified) {
137
+ const otp = generateOTP(opts.otpLength);
138
+ await ctx.context.internalAdapter.createVerificationValue({
139
+ value: otp,
140
+ identifier: phoneNumber2,
141
+ expiresAt: date.getDate(opts.expiresIn, "sec")
142
+ });
143
+ await opts.sendOTP?.({
144
+ phoneNumber: phoneNumber2,
145
+ code: otp
146
+ });
147
+ throw new betterCall.APIError("UNAUTHORIZED", {
148
+ message: ERROR_CODES.PHONE_NUMBER_NOT_VERIFIED
149
+ });
150
+ }
151
+ }
133
152
  const accounts = await ctx.context.internalAdapter.findAccountByUserId(user.id);
134
153
  const credentialAccount = accounts.find(
135
154
  (a) => a.providerId === "credential"
@@ -246,7 +265,7 @@ const phoneNumber = (options) => {
246
265
  }
247
266
  const code = generateOTP(opts.otpLength);
248
267
  await ctx.context.internalAdapter.createVerificationValue({
249
- value: code,
268
+ value: `${code}:0`,
250
269
  identifier: ctx.body.phoneNumber,
251
270
  expiresAt: date.getDate(opts.expiresIn, "sec")
252
271
  });
@@ -298,20 +317,83 @@ const phoneNumber = (options) => {
298
317
  summary: "Verify phone number",
299
318
  description: "Use this endpoint to verify phone number",
300
319
  responses: {
301
- 200: {
302
- description: "Success",
320
+ "200": {
321
+ description: "Phone number verified successfully",
303
322
  content: {
304
323
  "application/json": {
305
324
  schema: {
306
325
  type: "object",
307
326
  properties: {
308
- user: {
309
- $ref: "#/components/schemas/User"
327
+ status: {
328
+ type: "boolean",
329
+ description: "Indicates if the verification was successful",
330
+ enum: [true]
310
331
  },
311
- session: {
312
- $ref: "#/components/schemas/Session"
332
+ token: {
333
+ type: "string",
334
+ nullable: true,
335
+ description: "Session token if session is created, null if disableSession is true or no session is created"
336
+ },
337
+ user: {
338
+ type: "object",
339
+ nullable: true,
340
+ properties: {
341
+ id: {
342
+ type: "string",
343
+ description: "Unique identifier of the user"
344
+ },
345
+ email: {
346
+ type: "string",
347
+ format: "email",
348
+ nullable: true,
349
+ description: "User's email address"
350
+ },
351
+ emailVerified: {
352
+ type: "boolean",
353
+ nullable: true,
354
+ description: "Whether the email is verified"
355
+ },
356
+ name: {
357
+ type: "string",
358
+ nullable: true,
359
+ description: "User's name"
360
+ },
361
+ image: {
362
+ type: "string",
363
+ format: "uri",
364
+ nullable: true,
365
+ description: "User's profile image URL"
366
+ },
367
+ phoneNumber: {
368
+ type: "string",
369
+ description: "User's phone number"
370
+ },
371
+ phoneNumberVerified: {
372
+ type: "boolean",
373
+ description: "Whether the phone number is verified"
374
+ },
375
+ createdAt: {
376
+ type: "string",
377
+ format: "date-time",
378
+ description: "Timestamp when the user was created"
379
+ },
380
+ updatedAt: {
381
+ type: "string",
382
+ format: "date-time",
383
+ description: "Timestamp when the user was last updated"
384
+ }
385
+ },
386
+ required: [
387
+ "id",
388
+ "phoneNumber",
389
+ "phoneNumberVerified",
390
+ "createdAt",
391
+ "updatedAt"
392
+ ],
393
+ description: "User object with phone number details, null if no user is created or found"
313
394
  }
314
- }
395
+ },
396
+ required: ["status"]
315
397
  }
316
398
  }
317
399
  }
@@ -337,7 +419,18 @@ const phoneNumber = (options) => {
337
419
  message: ERROR_CODES.OTP_NOT_FOUND
338
420
  });
339
421
  }
340
- if (otp.value !== ctx.body.code) {
422
+ const [otpValue, attempts] = otp.value.split(":");
423
+ const allowedAttempts = options?.allowedAttempts || 3;
424
+ if (attempts && parseInt(attempts) >= allowedAttempts) {
425
+ await ctx.context.internalAdapter.deleteVerificationValue(otp.id);
426
+ throw new betterCall.APIError("FORBIDDEN", {
427
+ message: "Too many attempts"
428
+ });
429
+ }
430
+ if (otpValue !== ctx.body.code) {
431
+ await ctx.context.internalAdapter.updateVerificationValue(otp.id, {
432
+ value: `${otpValue}:${parseInt(attempts || "0") + 1}`
433
+ });
341
434
  throw new betterCall.APIError("BAD_REQUEST", {
342
435
  message: "Invalid OTP"
343
436
  });
@@ -445,7 +538,7 @@ const phoneNumber = (options) => {
445
538
  if (!ctx.body.disableSession) {
446
539
  const session = await ctx.context.internalAdapter.createSession(
447
540
  user.id,
448
- ctx.request
541
+ ctx.headers
449
542
  );
450
543
  if (!session) {
451
544
  throw new betterCall.APIError("INTERNAL_SERVER_ERROR", {
@@ -495,7 +588,32 @@ const phoneNumber = (options) => {
495
588
  method: "POST",
496
589
  body: zod.z.object({
497
590
  phoneNumber: zod.z.string()
498
- })
591
+ }),
592
+ metadata: {
593
+ openapi: {
594
+ description: "Request OTP for password reset via phone number",
595
+ responses: {
596
+ "200": {
597
+ description: "OTP sent successfully for password reset",
598
+ content: {
599
+ "application/json": {
600
+ schema: {
601
+ type: "object",
602
+ properties: {
603
+ status: {
604
+ type: "boolean",
605
+ description: "Indicates if the OTP was sent successfully",
606
+ enum: [true]
607
+ }
608
+ },
609
+ required: ["status"]
610
+ }
611
+ }
612
+ }
613
+ }
614
+ }
615
+ }
616
+ }
499
617
  },
500
618
  async (ctx) => {
501
619
  const user = await ctx.context.adapter.findOne({
@@ -514,7 +632,7 @@ const phoneNumber = (options) => {
514
632
  }
515
633
  const code = generateOTP(opts.otpLength);
516
634
  await ctx.context.internalAdapter.createVerificationValue({
517
- value: code,
635
+ value: `${code}:0`,
518
636
  identifier: `${ctx.body.phoneNumber}-forget-password`,
519
637
  expiresAt: date.getDate(opts.expiresIn, "sec")
520
638
  });
@@ -538,7 +656,32 @@ const phoneNumber = (options) => {
538
656
  otp: zod.z.string(),
539
657
  phoneNumber: zod.z.string(),
540
658
  newPassword: zod.z.string()
541
- })
659
+ }),
660
+ metadata: {
661
+ openapi: {
662
+ description: "Reset password using phone number OTP",
663
+ responses: {
664
+ "200": {
665
+ description: "Password reset successfully",
666
+ content: {
667
+ "application/json": {
668
+ schema: {
669
+ type: "object",
670
+ properties: {
671
+ status: {
672
+ type: "boolean",
673
+ description: "Indicates if the password was reset successfully",
674
+ enum: [true]
675
+ }
676
+ },
677
+ required: ["status"]
678
+ }
679
+ }
680
+ }
681
+ }
682
+ }
683
+ }
684
+ }
542
685
  },
543
686
  async (ctx) => {
544
687
  const verification = await ctx.context.internalAdapter.findVerificationValue(
@@ -554,7 +697,23 @@ const phoneNumber = (options) => {
554
697
  message: ERROR_CODES.OTP_EXPIRED
555
698
  });
556
699
  }
557
- if (verification.value !== ctx.body.otp) {
700
+ const [otpValue, attempts] = verification.value.split(":");
701
+ const allowedAttempts = options?.allowedAttempts || 3;
702
+ if (attempts && parseInt(attempts) >= allowedAttempts) {
703
+ await ctx.context.internalAdapter.deleteVerificationValue(
704
+ verification.id
705
+ );
706
+ throw new betterCall.APIError("FORBIDDEN", {
707
+ message: "Too many attempts"
708
+ });
709
+ }
710
+ if (ctx.body.otp !== otpValue) {
711
+ await ctx.context.internalAdapter.updateVerificationValue(
712
+ verification.id,
713
+ {
714
+ value: `${otpValue}:${parseInt(attempts || "0") + 1}`
715
+ }
716
+ );
558
717
  throw new betterCall.APIError("BAD_REQUEST", {
559
718
  message: ERROR_CODES.INVALID_OTP
560
719
  });
@@ -587,6 +746,15 @@ const phoneNumber = (options) => {
587
746
  )
588
747
  },
589
748
  schema: schema$1.mergeSchema(schema, options?.schema),
749
+ rateLimit: [
750
+ {
751
+ pathMatcher(path) {
752
+ return path.startsWith("/phone-number");
753
+ },
754
+ window: 60 * 1e3,
755
+ max: 10
756
+ }
757
+ ],
590
758
  $ERROR_CODES: ERROR_CODES
591
759
  };
592
760
  };
@@ -1,8 +1,8 @@
1
1
  import * as better_call from 'better-call';
2
2
  import { z } from 'zod';
3
- import { U as User, I as InferOptionSchema } from '../../shared/better-auth.BiQsvaIP.cjs';
4
- import '../../shared/better-auth.Bi8FQwDD.cjs';
5
- import '../../shared/better-auth.B2Fw1vhH.cjs';
3
+ import { U as User, I as InferOptionSchema } from '../../shared/better-auth.BcU1Kjyq.cjs';
4
+ import '../../shared/better-auth.CYegVoq1.cjs';
5
+ import '../../shared/better-auth.DTiSPWEk.cjs';
6
6
  import 'jose';
7
7
  import 'kysely';
8
8
  import 'better-sqlite3';
@@ -50,6 +50,12 @@ interface PhoneNumberOptions {
50
50
  * by default any string is accepted
51
51
  */
52
52
  phoneNumberValidator?: (phoneNumber: string) => boolean | Promise<boolean>;
53
+ /**
54
+ * Require a phone number verification before signing in
55
+ *
56
+ * @default false
57
+ */
58
+ requireVerification?: boolean;
53
59
  /**
54
60
  * Callback when phone number is verified
55
61
  */
@@ -89,6 +95,11 @@ interface PhoneNumberOptions {
89
95
  * Custom schema for the admin plugin
90
96
  */
91
97
  schema?: InferOptionSchema<typeof schema>;
98
+ /**
99
+ * Allowed attempts for the OTP code
100
+ * @default 3
101
+ */
102
+ allowedAttempts?: number;
92
103
  }
93
104
  declare const phoneNumber: (options?: PhoneNumberOptions) => {
94
105
  id: "phone-number";
@@ -329,20 +340,77 @@ declare const phoneNumber: (options?: PhoneNumberOptions) => {
329
340
  summary: string;
330
341
  description: string;
331
342
  responses: {
332
- 200: {
343
+ "200": {
333
344
  description: string;
334
345
  content: {
335
346
  "application/json": {
336
347
  schema: {
337
348
  type: "object";
338
349
  properties: {
339
- user: {
340
- $ref: string;
350
+ status: {
351
+ type: string;
352
+ description: string;
353
+ enum: boolean[];
341
354
  };
342
- session: {
343
- $ref: string;
355
+ token: {
356
+ type: string;
357
+ nullable: boolean;
358
+ description: string;
359
+ };
360
+ user: {
361
+ type: string;
362
+ nullable: boolean;
363
+ properties: {
364
+ id: {
365
+ type: string;
366
+ description: string;
367
+ };
368
+ email: {
369
+ type: string;
370
+ format: string;
371
+ nullable: boolean;
372
+ description: string;
373
+ };
374
+ emailVerified: {
375
+ type: string;
376
+ nullable: boolean;
377
+ description: string;
378
+ };
379
+ name: {
380
+ type: string;
381
+ nullable: boolean;
382
+ description: string;
383
+ };
384
+ image: {
385
+ type: string;
386
+ format: string;
387
+ nullable: boolean;
388
+ description: string;
389
+ };
390
+ phoneNumber: {
391
+ type: string;
392
+ description: string;
393
+ };
394
+ phoneNumberVerified: {
395
+ type: string;
396
+ description: string;
397
+ };
398
+ createdAt: {
399
+ type: string;
400
+ format: string;
401
+ description: string;
402
+ };
403
+ updatedAt: {
404
+ type: string;
405
+ format: string;
406
+ description: string;
407
+ };
408
+ };
409
+ required: string[];
410
+ description: string;
344
411
  };
345
412
  };
413
+ required: string[];
346
414
  };
347
415
  };
348
416
  };
@@ -398,6 +466,31 @@ declare const phoneNumber: (options?: PhoneNumberOptions) => {
398
466
  }, {
399
467
  phoneNumber: string;
400
468
  }>;
469
+ metadata: {
470
+ openapi: {
471
+ description: string;
472
+ responses: {
473
+ "200": {
474
+ description: string;
475
+ content: {
476
+ "application/json": {
477
+ schema: {
478
+ type: "object";
479
+ properties: {
480
+ status: {
481
+ type: string;
482
+ description: string;
483
+ enum: boolean[];
484
+ };
485
+ };
486
+ required: string[];
487
+ };
488
+ };
489
+ };
490
+ };
491
+ };
492
+ };
493
+ };
401
494
  } & {
402
495
  use: any[];
403
496
  };
@@ -451,6 +544,31 @@ declare const phoneNumber: (options?: PhoneNumberOptions) => {
451
544
  otp: string;
452
545
  phoneNumber: string;
453
546
  }>;
547
+ metadata: {
548
+ openapi: {
549
+ description: string;
550
+ responses: {
551
+ "200": {
552
+ description: string;
553
+ content: {
554
+ "application/json": {
555
+ schema: {
556
+ type: "object";
557
+ properties: {
558
+ status: {
559
+ type: string;
560
+ description: string;
561
+ enum: boolean[];
562
+ };
563
+ };
564
+ required: string[];
565
+ };
566
+ };
567
+ };
568
+ };
569
+ };
570
+ };
571
+ };
454
572
  } & {
455
573
  use: any[];
456
574
  };
@@ -476,6 +594,11 @@ declare const phoneNumber: (options?: PhoneNumberOptions) => {
476
594
  };
477
595
  };
478
596
  };
597
+ rateLimit: {
598
+ pathMatcher(path: string): boolean;
599
+ window: number;
600
+ max: number;
601
+ }[];
479
602
  $ERROR_CODES: {
480
603
  readonly INVALID_PHONE_NUMBER: "Invalid phone number";
481
604
  readonly PHONE_NUMBER_EXIST: "Phone number already exist";
@@ -484,6 +607,7 @@ declare const phoneNumber: (options?: PhoneNumberOptions) => {
484
607
  readonly OTP_NOT_FOUND: "OTP not found";
485
608
  readonly OTP_EXPIRED: "OTP expired";
486
609
  readonly INVALID_OTP: "Invalid OTP";
610
+ readonly PHONE_NUMBER_NOT_VERIFIED: "Phone number not verified";
487
611
  };
488
612
  };
489
613
  declare const schema: {