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,8 +1,8 @@
1
1
  import { z } from 'zod';
2
2
  import * as better_call from 'better-call';
3
- import { H as HookEndpointContext } from '../../shared/better-auth.D-oLmHIj.mjs';
4
- import '../../shared/better-auth.Bi8FQwDD.mjs';
5
- import '../../shared/better-auth.bKwabe3I.mjs';
3
+ import { H as HookEndpointContext } from '../../shared/better-auth.DQ7OSJbI.mjs';
4
+ import '../../shared/better-auth.CYegVoq1.mjs';
5
+ import '../../shared/better-auth.B88xucNq.mjs';
6
6
  import 'jose';
7
7
  import 'kysely';
8
8
  import 'better-sqlite3';
@@ -48,6 +48,11 @@ interface EmailOTPOptions {
48
48
  * @Default false
49
49
  */
50
50
  disableSignUp?: boolean;
51
+ /**
52
+ * Allowed attempts for the OTP code
53
+ * @default 3
54
+ */
55
+ allowedAttempts?: number;
51
56
  }
52
57
  declare const emailOTP: (options: EmailOTPOptions) => {
53
58
  id: "email-otp";
@@ -239,7 +244,7 @@ declare const emailOTP: (options: EmailOTPOptions) => {
239
244
  openapi: {
240
245
  description: string;
241
246
  responses: {
242
- 200: {
247
+ "200": {
243
248
  description: string;
244
249
  content: {
245
250
  "application/json": {
@@ -248,8 +253,11 @@ declare const emailOTP: (options: EmailOTPOptions) => {
248
253
  properties: {
249
254
  otp: {
250
255
  type: string;
256
+ nullable: boolean;
257
+ description: string;
251
258
  };
252
259
  };
260
+ required: string[];
253
261
  };
254
262
  };
255
263
  };
@@ -361,9 +369,20 @@ declare const emailOTP: (options: EmailOTPOptions) => {
361
369
  schema: {
362
370
  type: "object";
363
371
  properties: {
372
+ status: {
373
+ type: string;
374
+ description: string;
375
+ enum: boolean[];
376
+ };
377
+ token: {
378
+ type: string;
379
+ nullable: boolean;
380
+ description: string;
381
+ };
364
382
  user: {
365
383
  $ref: string;
366
384
  };
385
+ required: string[];
367
386
  };
368
387
  };
369
388
  };
@@ -450,13 +469,15 @@ declare const emailOTP: (options: EmailOTPOptions) => {
450
469
  schema: {
451
470
  type: "object";
452
471
  properties: {
453
- user: {
454
- $ref: string;
472
+ token: {
473
+ type: string;
474
+ description: string;
455
475
  };
456
- session: {
476
+ user: {
457
477
  $ref: string;
458
478
  };
459
479
  };
480
+ required: string[];
460
481
  };
461
482
  };
462
483
  };
@@ -522,6 +543,7 @@ declare const emailOTP: (options: EmailOTPOptions) => {
522
543
  properties: {
523
544
  success: {
524
545
  type: string;
546
+ description: string;
525
547
  };
526
548
  };
527
549
  };
@@ -620,9 +642,10 @@ declare const emailOTP: (options: EmailOTPOptions) => {
620
642
  };
621
643
  $ERROR_CODES: {
622
644
  readonly OTP_EXPIRED: "otp expired";
623
- readonly INVALID_OTP: "invalid otp";
624
- readonly INVALID_EMAIL: "invalid email";
625
- readonly USER_NOT_FOUND: "user not found";
645
+ readonly INVALID_OTP: "Invalid OTP";
646
+ readonly INVALID_EMAIL: "Invalid email";
647
+ readonly USER_NOT_FOUND: "User not found";
648
+ readonly TOO_MANY_ATTEMPTS: "Too many attempts";
626
649
  };
627
650
  rateLimit: ({
628
651
  pathMatcher(path: string): path is "/email-otp/send-verification-otp";
@@ -1,8 +1,8 @@
1
1
  import { z } from 'zod';
2
2
  import * as better_call from 'better-call';
3
- import { H as HookEndpointContext } from '../../shared/better-auth.DU2QNVc_.js';
4
- import '../../shared/better-auth.Bi8FQwDD.js';
5
- import '../../shared/better-auth.BANAxdkL.js';
3
+ import { H as HookEndpointContext } from '../../shared/better-auth.CA2hFK4N.js';
4
+ import '../../shared/better-auth.CYegVoq1.js';
5
+ import '../../shared/better-auth.DNTAFSt1.js';
6
6
  import 'jose';
7
7
  import 'kysely';
8
8
  import 'better-sqlite3';
@@ -48,6 +48,11 @@ interface EmailOTPOptions {
48
48
  * @Default false
49
49
  */
50
50
  disableSignUp?: boolean;
51
+ /**
52
+ * Allowed attempts for the OTP code
53
+ * @default 3
54
+ */
55
+ allowedAttempts?: number;
51
56
  }
52
57
  declare const emailOTP: (options: EmailOTPOptions) => {
53
58
  id: "email-otp";
@@ -239,7 +244,7 @@ declare const emailOTP: (options: EmailOTPOptions) => {
239
244
  openapi: {
240
245
  description: string;
241
246
  responses: {
242
- 200: {
247
+ "200": {
243
248
  description: string;
244
249
  content: {
245
250
  "application/json": {
@@ -248,8 +253,11 @@ declare const emailOTP: (options: EmailOTPOptions) => {
248
253
  properties: {
249
254
  otp: {
250
255
  type: string;
256
+ nullable: boolean;
257
+ description: string;
251
258
  };
252
259
  };
260
+ required: string[];
253
261
  };
254
262
  };
255
263
  };
@@ -361,9 +369,20 @@ declare const emailOTP: (options: EmailOTPOptions) => {
361
369
  schema: {
362
370
  type: "object";
363
371
  properties: {
372
+ status: {
373
+ type: string;
374
+ description: string;
375
+ enum: boolean[];
376
+ };
377
+ token: {
378
+ type: string;
379
+ nullable: boolean;
380
+ description: string;
381
+ };
364
382
  user: {
365
383
  $ref: string;
366
384
  };
385
+ required: string[];
367
386
  };
368
387
  };
369
388
  };
@@ -450,13 +469,15 @@ declare const emailOTP: (options: EmailOTPOptions) => {
450
469
  schema: {
451
470
  type: "object";
452
471
  properties: {
453
- user: {
454
- $ref: string;
472
+ token: {
473
+ type: string;
474
+ description: string;
455
475
  };
456
- session: {
476
+ user: {
457
477
  $ref: string;
458
478
  };
459
479
  };
480
+ required: string[];
460
481
  };
461
482
  };
462
483
  };
@@ -522,6 +543,7 @@ declare const emailOTP: (options: EmailOTPOptions) => {
522
543
  properties: {
523
544
  success: {
524
545
  type: string;
546
+ description: string;
525
547
  };
526
548
  };
527
549
  };
@@ -620,9 +642,10 @@ declare const emailOTP: (options: EmailOTPOptions) => {
620
642
  };
621
643
  $ERROR_CODES: {
622
644
  readonly OTP_EXPIRED: "otp expired";
623
- readonly INVALID_OTP: "invalid otp";
624
- readonly INVALID_EMAIL: "invalid email";
625
- readonly USER_NOT_FOUND: "user not found";
645
+ readonly INVALID_OTP: "Invalid OTP";
646
+ readonly INVALID_EMAIL: "Invalid email";
647
+ readonly USER_NOT_FOUND: "User not found";
648
+ readonly TOO_MANY_ATTEMPTS: "Too many attempts";
626
649
  };
627
650
  rateLimit: ({
628
651
  pathMatcher(path: string): path is "/email-otp/send-verification-otp";
@@ -1,10 +1,10 @@
1
1
  import { z } from 'zod';
2
2
  import { APIError } from 'better-call';
3
- import { c as createAuthMiddleware, a as createAuthEndpoint } from '../../shared/better-auth.D4jH-sJA.mjs';
3
+ import { c as createAuthMiddleware, a as createAuthEndpoint } from '../../shared/better-auth.CWwVo_61.mjs';
4
4
  import { setSessionCookie } from '../../cookies/index.mjs';
5
- import '../../shared/better-auth.CepcSj5H.mjs';
5
+ import '../../shared/better-auth.Cc72UxUH.mjs';
6
6
  import '../../shared/better-auth.8zoxzg-F.mjs';
7
- import '../../shared/better-auth.DH3YjMQH.mjs';
7
+ import '../../shared/better-auth.Cqykj82J.mjs';
8
8
  import 'defu';
9
9
  import '@better-auth/utils/hash';
10
10
  import '@noble/ciphers/chacha';
@@ -25,12 +25,12 @@ import '../../shared/better-auth.DCVeP5-W.mjs';
25
25
  import '../../shared/better-auth.DdzSJf-n.mjs';
26
26
  import '@better-auth/utils/random';
27
27
  import '../../shared/better-auth.BdyOG_p4.mjs';
28
+ import '../../shared/better-auth.tB5eU6EY.mjs';
28
29
  import '../../shared/better-auth.BUPPRXfK.mjs';
29
30
  import '@better-auth/utils/hmac';
30
31
  import '../../shared/better-auth.DDEbWX-S.mjs';
31
32
  import '../../shared/better-auth.VTXNLFMT.mjs';
32
33
  import 'jose/errors';
33
- import '../../shared/better-auth.tB5eU6EY.mjs';
34
34
  import '@better-auth/utils/binary';
35
35
 
36
36
  const types = ["email-verification", "sign-in", "forget-password"];
@@ -42,9 +42,10 @@ const emailOTP = (options) => {
42
42
  };
43
43
  const ERROR_CODES = {
44
44
  OTP_EXPIRED: "otp expired",
45
- INVALID_OTP: "invalid otp",
46
- INVALID_EMAIL: "invalid email",
47
- USER_NOT_FOUND: "user not found"
45
+ INVALID_OTP: "Invalid OTP",
46
+ INVALID_EMAIL: "Invalid email",
47
+ USER_NOT_FOUND: "User not found",
48
+ TOO_MANY_ATTEMPTS: "Too many attempts"
48
49
  };
49
50
  return {
50
51
  id: "email-otp",
@@ -113,7 +114,7 @@ const emailOTP = (options) => {
113
114
  ctx.request
114
115
  );
115
116
  await ctx.context.internalAdapter.createVerificationValue({
116
- value: otp,
117
+ value: `${otp}:0`,
117
118
  identifier: `${ctx.body.type}-otp-${email}`,
118
119
  expiresAt: getDate(opts.expiresIn, "sec")
119
120
  }).catch(async (error) => {
@@ -121,7 +122,7 @@ const emailOTP = (options) => {
121
122
  `${ctx.body.type}-otp-${email}`
122
123
  );
123
124
  await ctx.context.internalAdapter.createVerificationValue({
124
- value: otp,
125
+ value: `${otp}:0`,
125
126
  identifier: `${ctx.body.type}-otp-${email}`,
126
127
  expiresAt: getDate(opts.expiresIn, "sec")
127
128
  });
@@ -177,7 +178,7 @@ const emailOTP = (options) => {
177
178
  ctx.request
178
179
  );
179
180
  await ctx.context.internalAdapter.createVerificationValue({
180
- value: otp,
181
+ value: `${otp}:0`,
181
182
  identifier: `${ctx.body.type}-otp-${email}`,
182
183
  expiresAt: getDate(opts.expiresIn, "sec")
183
184
  });
@@ -199,17 +200,20 @@ const emailOTP = (options) => {
199
200
  openapi: {
200
201
  description: "Get verification OTP",
201
202
  responses: {
202
- 200: {
203
- description: "Success",
203
+ "200": {
204
+ description: "OTP retrieved successfully or not found/expired",
204
205
  content: {
205
206
  "application/json": {
206
207
  schema: {
207
208
  type: "object",
208
209
  properties: {
209
210
  otp: {
210
- type: "string"
211
+ type: "string",
212
+ nullable: true,
213
+ description: "The stored OTP, or null if not found or expired"
211
214
  }
212
- }
215
+ },
216
+ required: ["otp"]
213
217
  }
214
218
  }
215
219
  }
@@ -256,9 +260,20 @@ const emailOTP = (options) => {
256
260
  schema: {
257
261
  type: "object",
258
262
  properties: {
263
+ status: {
264
+ type: "boolean",
265
+ description: "Indicates if the verification was successful",
266
+ enum: [true]
267
+ },
268
+ token: {
269
+ type: "string",
270
+ nullable: true,
271
+ description: "Session token if autoSignInAfterVerification is enabled, otherwise null"
272
+ },
259
273
  user: {
260
274
  $ref: "#/components/schemas/User"
261
- }
275
+ },
276
+ required: ["status", "token", "user"]
262
277
  }
263
278
  }
264
279
  }
@@ -289,8 +304,23 @@ const emailOTP = (options) => {
289
304
  message: ERROR_CODES.OTP_EXPIRED
290
305
  });
291
306
  }
292
- const otp = ctx.body.otp;
293
- if (verificationValue.value !== otp) {
307
+ const [otpValue, attempts] = verificationValue.value.split(":");
308
+ const allowedAttempts = options?.allowedAttempts || 3;
309
+ if (attempts && parseInt(attempts) >= allowedAttempts) {
310
+ await ctx.context.internalAdapter.deleteVerificationValue(
311
+ verificationValue.id
312
+ );
313
+ throw new APIError("FORBIDDEN", {
314
+ message: ERROR_CODES.TOO_MANY_ATTEMPTS
315
+ });
316
+ }
317
+ if (ctx.body.otp !== otpValue) {
318
+ await ctx.context.internalAdapter.updateVerificationValue(
319
+ verificationValue.id,
320
+ {
321
+ value: `${otpValue}:${parseInt(attempts || "0") + 1}`
322
+ }
323
+ );
294
324
  throw new APIError("BAD_REQUEST", {
295
325
  message: ERROR_CODES.INVALID_OTP
296
326
  });
@@ -315,7 +345,7 @@ const emailOTP = (options) => {
315
345
  if (ctx.context.options.emailVerification?.autoSignInAfterVerification) {
316
346
  const session = await ctx.context.internalAdapter.createSession(
317
347
  updatedUser.id,
318
- ctx.request
348
+ ctx.headers
319
349
  );
320
350
  await setSessionCookie(ctx, {
321
351
  session,
@@ -373,13 +403,15 @@ const emailOTP = (options) => {
373
403
  schema: {
374
404
  type: "object",
375
405
  properties: {
406
+ token: {
407
+ type: "string",
408
+ description: "Session token for the authenticated session"
409
+ },
376
410
  user: {
377
411
  $ref: "#/components/schemas/User"
378
- },
379
- session: {
380
- $ref: "#/components/schemas/Session"
381
412
  }
382
- }
413
+ },
414
+ required: ["token", "user"]
383
415
  }
384
416
  }
385
417
  }
@@ -403,8 +435,23 @@ const emailOTP = (options) => {
403
435
  message: ERROR_CODES.OTP_EXPIRED
404
436
  });
405
437
  }
406
- const otp = ctx.body.otp;
407
- if (verificationValue.value !== otp) {
438
+ const [otpValue, attempts] = verificationValue.value.split(":");
439
+ const allowedAttempts = options?.allowedAttempts || 3;
440
+ if (attempts && parseInt(attempts) >= allowedAttempts) {
441
+ await ctx.context.internalAdapter.deleteVerificationValue(
442
+ verificationValue.id
443
+ );
444
+ throw new APIError("FORBIDDEN", {
445
+ message: ERROR_CODES.TOO_MANY_ATTEMPTS
446
+ });
447
+ }
448
+ if (ctx.body.otp !== otpValue) {
449
+ await ctx.context.internalAdapter.updateVerificationValue(
450
+ verificationValue.id,
451
+ {
452
+ value: `${otpValue}:${parseInt(attempts || "0") + 1}`
453
+ }
454
+ );
408
455
  throw new APIError("BAD_REQUEST", {
409
456
  message: ERROR_CODES.INVALID_OTP
410
457
  });
@@ -429,7 +476,7 @@ const emailOTP = (options) => {
429
476
  );
430
477
  const session2 = await ctx.context.internalAdapter.createSession(
431
478
  newUser.id,
432
- ctx.request
479
+ ctx.headers
433
480
  );
434
481
  await setSessionCookie(ctx, {
435
482
  session: session2,
@@ -459,7 +506,7 @@ const emailOTP = (options) => {
459
506
  }
460
507
  const session = await ctx.context.internalAdapter.createSession(
461
508
  user.user.id,
462
- ctx.request
509
+ ctx.headers
463
510
  );
464
511
  await setSessionCookie(ctx, {
465
512
  session,
@@ -500,7 +547,8 @@ const emailOTP = (options) => {
500
547
  type: "object",
501
548
  properties: {
502
549
  success: {
503
- type: "boolean"
550
+ type: "boolean",
551
+ description: "Indicates if the OTP was sent successfully"
504
552
  }
505
553
  }
506
554
  }
@@ -524,7 +572,7 @@ const emailOTP = (options) => {
524
572
  ctx.request
525
573
  );
526
574
  await ctx.context.internalAdapter.createVerificationValue({
527
- value: otp,
575
+ value: `${otp}:0`,
528
576
  identifier: `forget-password-otp-${email}`,
529
577
  expiresAt: getDate(opts.expiresIn, "sec")
530
578
  });
@@ -601,12 +649,30 @@ const emailOTP = (options) => {
601
649
  });
602
650
  }
603
651
  if (verificationValue.expiresAt < /* @__PURE__ */ new Date()) {
652
+ await ctx.context.internalAdapter.deleteVerificationValue(
653
+ verificationValue.id
654
+ );
604
655
  throw new APIError("BAD_REQUEST", {
605
656
  message: ERROR_CODES.OTP_EXPIRED
606
657
  });
607
658
  }
608
- const otp = ctx.body.otp;
609
- if (verificationValue.value !== otp) {
659
+ const [otpValue, attempts] = verificationValue.value.split(":");
660
+ const allowedAttempts = options?.allowedAttempts || 3;
661
+ if (attempts && parseInt(attempts) >= allowedAttempts) {
662
+ await ctx.context.internalAdapter.deleteVerificationValue(
663
+ verificationValue.id
664
+ );
665
+ throw new APIError("FORBIDDEN", {
666
+ message: ERROR_CODES.TOO_MANY_ATTEMPTS
667
+ });
668
+ }
669
+ if (ctx.body.otp !== otpValue) {
670
+ await ctx.context.internalAdapter.updateVerificationValue(
671
+ verificationValue.id,
672
+ {
673
+ value: `${otpValue}:${parseInt(attempts || "0") + 1}`
674
+ }
675
+ );
610
676
  throw new APIError("BAD_REQUEST", {
611
677
  message: ERROR_CODES.INVALID_OTP
612
678
  });
@@ -658,7 +724,7 @@ const emailOTP = (options) => {
658
724
  ctx.request
659
725
  );
660
726
  await ctx.context.internalAdapter.createVerificationValue({
661
- value: otp,
727
+ value: `${otp}:0`,
662
728
  identifier: `email-verification-otp-${email}`,
663
729
  expiresAt: getDate(opts.expiresIn, "sec")
664
730
  });
@@ -3,9 +3,9 @@
3
3
  const fetch = require('@better-fetch/fetch');
4
4
  const betterCall = require('better-call');
5
5
  const zod = require('zod');
6
- const refreshToken = require('../../shared/better-auth.BDYXUcLv.cjs');
6
+ const refreshToken = require('../../shared/better-auth.Dg0siV5C.cjs');
7
7
  const cookies_index = require('../../cookies/index.cjs');
8
- require('../../shared/better-auth.C5H9XEzZ.cjs');
8
+ require('../../shared/better-auth.DcWKCjjf.cjs');
9
9
  require('../../shared/better-auth.DiSjtgs9.cjs');
10
10
  require('../../shared/better-auth.GpOOav9x.cjs');
11
11
  require('defu');
@@ -25,13 +25,13 @@ require('@noble/hashes/utils');
25
25
  require('../../shared/better-auth.CYeOI8C-.cjs');
26
26
  require('@better-auth/utils/random');
27
27
  require('../../shared/better-auth.ANpbi45u.cjs');
28
+ require('../../shared/better-auth.D3mtHEZg.cjs');
28
29
  require('../../shared/better-auth.C1hdVENX.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
37
  async function getUserInfo(tokens, finalUserInfoUrl) {
@@ -97,7 +97,8 @@ const genericOAuth = (options) => {
97
97
  let finalTokenUrl = c.tokenUrl;
98
98
  if (c.discoveryUrl) {
99
99
  const discovery = await fetch.betterFetch(c.discoveryUrl, {
100
- method: "GET"
100
+ method: "GET",
101
+ headers: c.discoveryHeaders
101
102
  });
102
103
  if (discovery.data) {
103
104
  finalTokenUrl = discovery.data.token_endpoint;
@@ -125,7 +126,8 @@ const genericOAuth = (options) => {
125
126
  let finalTokenUrl = c.tokenUrl;
126
127
  if (c.discoveryUrl) {
127
128
  const discovery = await fetch.betterFetch(c.discoveryUrl, {
128
- method: "GET"
129
+ method: "GET",
130
+ headers: c.discoveryHeaders
129
131
  });
130
132
  if (discovery.data) {
131
133
  finalTokenUrl = discovery.data.token_endpoint;
@@ -142,6 +144,7 @@ const genericOAuth = (options) => {
142
144
  clientId: c.clientId,
143
145
  clientSecret: c.clientSecret
144
146
  },
147
+ authentication: c.authentication,
145
148
  tokenEndpoint: finalTokenUrl
146
149
  });
147
150
  },
@@ -257,6 +260,8 @@ const genericOAuth = (options) => {
257
260
  let finalTokenUrl = tokenUrl;
258
261
  if (discoveryUrl) {
259
262
  const discovery = await fetch.betterFetch(discoveryUrl, {
263
+ method: "GET",
264
+ headers: config.discoveryHeaders,
260
265
  onError(context) {
261
266
  ctx.context.logger.error(context.error.message, context.error, {
262
267
  discoveryUrl
@@ -381,7 +386,8 @@ const genericOAuth = (options) => {
381
386
  let finalUserInfoUrl = provider.userInfoUrl;
382
387
  if (provider.discoveryUrl) {
383
388
  const discovery = await fetch.betterFetch(provider.discoveryUrl, {
384
- method: "GET"
389
+ method: "GET",
390
+ headers: provider.discoveryHeaders
385
391
  });
386
392
  if (discovery.data) {
387
393
  finalTokenUrl = discovery.data.token_endpoint;
@@ -431,18 +437,40 @@ const genericOAuth = (options) => {
431
437
  if (ctx.context.options.account?.accountLinking?.allowDifferentEmails !== true && link.email !== mapUser.email.toLowerCase()) {
432
438
  return redirectOnError("email_doesn't_match");
433
439
  }
434
- const newAccount = await ctx.context.internalAdapter.createAccount({
435
- userId: link.userId,
436
- providerId: provider.providerId,
437
- accountId: userInfo.id,
438
- accessToken: tokens.accessToken,
439
- refreshToken: tokens.refreshToken,
440
- accessTokenExpiresAt: tokens.accessTokenExpiresAt,
441
- refreshTokenExpiresAt: tokens.refreshTokenExpiresAt,
442
- scope: tokens.scopes?.join(",")
443
- });
444
- if (!newAccount) {
445
- return redirectOnError("unable_to_link_account");
440
+ const existingAccount = await ctx.context.internalAdapter.findAccount(userInfo.id);
441
+ if (existingAccount) {
442
+ if (existingAccount.userId !== link.userId) {
443
+ return redirectOnError(
444
+ "account_already_linked_to_different_user"
445
+ );
446
+ }
447
+ const updateData = Object.fromEntries(
448
+ Object.entries({
449
+ accessToken: tokens.accessToken,
450
+ idToken: tokens.idToken,
451
+ refreshToken: tokens.refreshToken,
452
+ accessTokenExpiresAt: tokens.accessTokenExpiresAt,
453
+ refreshTokenExpiresAt: tokens.refreshTokenExpiresAt,
454
+ scope: tokens.scopes?.join(",")
455
+ }).filter(([_, value]) => value !== void 0)
456
+ );
457
+ await ctx.context.internalAdapter.updateAccount(
458
+ existingAccount.id,
459
+ updateData
460
+ );
461
+ } else {
462
+ const newAccount = await ctx.context.internalAdapter.createAccount({
463
+ userId: link.userId,
464
+ providerId: provider.providerId,
465
+ accountId: userInfo.id,
466
+ accessToken: tokens.accessToken,
467
+ accessTokenExpiresAt: tokens.accessTokenExpiresAt,
468
+ refreshTokenExpiresAt: tokens.refreshTokenExpiresAt,
469
+ scope: tokens.scopes?.join(",")
470
+ });
471
+ if (!newAccount) {
472
+ return redirectOnError("unable_to_link_account");
473
+ }
446
474
  }
447
475
  let toRedirectTo2;
448
476
  try {
@@ -464,7 +492,8 @@ const genericOAuth = (options) => {
464
492
  ...tokens,
465
493
  scope: tokens.scopes?.join(",")
466
494
  },
467
- disableSignUp: provider.disableImplicitSignUp && !requestSignUp || provider.disableSignUp
495
+ disableSignUp: provider.disableImplicitSignUp && !requestSignUp || provider.disableSignUp,
496
+ overrideUserInfo: provider.overrideUserInfo
468
497
  });
469
498
  if (result.error) {
470
499
  return redirectOnError(result.error.split(" ").join("_"));
@@ -492,7 +521,37 @@ const genericOAuth = (options) => {
492
521
  providerId: zod.z.string(),
493
522
  callbackURL: zod.z.string()
494
523
  }),
495
- use: [refreshToken.sessionMiddleware]
524
+ use: [refreshToken.sessionMiddleware],
525
+ metadata: {
526
+ openapi: {
527
+ description: "Link an OAuth2 account to the current user session",
528
+ responses: {
529
+ "200": {
530
+ description: "Authorization URL generated successfully for linking an OAuth2 account",
531
+ content: {
532
+ "application/json": {
533
+ schema: {
534
+ type: "object",
535
+ properties: {
536
+ url: {
537
+ type: "string",
538
+ format: "uri",
539
+ description: "The authorization URL to redirect the user to for linking the OAuth2 account"
540
+ },
541
+ redirect: {
542
+ type: "boolean",
543
+ description: "Indicates that the client should redirect to the provided URL",
544
+ enum: [true]
545
+ }
546
+ },
547
+ required: ["url", "redirect"]
548
+ }
549
+ }
550
+ }
551
+ }
552
+ }
553
+ }
554
+ }
496
555
  },
497
556
  async (c) => {
498
557
  const session = c.context.session;
@@ -536,6 +595,8 @@ const genericOAuth = (options) => {
536
595
  });
537
596
  }
538
597
  const discovery = await fetch.betterFetch(discoveryUrl, {
598
+ method: "GET",
599
+ headers: provider.discoveryHeaders,
539
600
  onError(context) {
540
601
  c.context.logger.error(context.error.message, context.error, {
541
602
  discoveryUrl