@hammadj/better-auth 1.5.0-beta.9

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 (688) hide show
  1. package/LICENSE.md +20 -0
  2. package/README.md +33 -0
  3. package/dist/_virtual/rolldown_runtime.mjs +36 -0
  4. package/dist/adapters/drizzle-adapter/index.d.mts +1 -0
  5. package/dist/adapters/drizzle-adapter/index.mjs +3 -0
  6. package/dist/adapters/index.d.mts +23 -0
  7. package/dist/adapters/index.mjs +13 -0
  8. package/dist/adapters/index.mjs.map +1 -0
  9. package/dist/adapters/kysely-adapter/index.d.mts +1 -0
  10. package/dist/adapters/kysely-adapter/index.mjs +3 -0
  11. package/dist/adapters/memory-adapter/index.d.mts +1 -0
  12. package/dist/adapters/memory-adapter/index.mjs +3 -0
  13. package/dist/adapters/mongodb-adapter/index.d.mts +1 -0
  14. package/dist/adapters/mongodb-adapter/index.mjs +3 -0
  15. package/dist/adapters/prisma-adapter/index.d.mts +1 -0
  16. package/dist/adapters/prisma-adapter/index.mjs +3 -0
  17. package/dist/api/index.d.mts +40 -0
  18. package/dist/api/index.mjs +205 -0
  19. package/dist/api/index.mjs.map +1 -0
  20. package/dist/api/middlewares/index.d.mts +1 -0
  21. package/dist/api/middlewares/index.mjs +3 -0
  22. package/dist/api/middlewares/origin-check.d.mts +17 -0
  23. package/dist/api/middlewares/origin-check.mjs +140 -0
  24. package/dist/api/middlewares/origin-check.mjs.map +1 -0
  25. package/dist/api/rate-limiter/index.mjs +177 -0
  26. package/dist/api/rate-limiter/index.mjs.map +1 -0
  27. package/dist/api/routes/account.d.mts +10 -0
  28. package/dist/api/routes/account.mjs +493 -0
  29. package/dist/api/routes/account.mjs.map +1 -0
  30. package/dist/api/routes/callback.d.mts +5 -0
  31. package/dist/api/routes/callback.mjs +178 -0
  32. package/dist/api/routes/callback.mjs.map +1 -0
  33. package/dist/api/routes/email-verification.d.mts +29 -0
  34. package/dist/api/routes/email-verification.mjs +301 -0
  35. package/dist/api/routes/email-verification.mjs.map +1 -0
  36. package/dist/api/routes/error.d.mts +5 -0
  37. package/dist/api/routes/error.mjs +386 -0
  38. package/dist/api/routes/error.mjs.map +1 -0
  39. package/dist/api/routes/index.d.mts +11 -0
  40. package/dist/api/routes/index.mjs +13 -0
  41. package/dist/api/routes/ok.d.mts +5 -0
  42. package/dist/api/routes/ok.mjs +30 -0
  43. package/dist/api/routes/ok.mjs.map +1 -0
  44. package/dist/api/routes/password.d.mts +8 -0
  45. package/dist/api/routes/password.mjs +198 -0
  46. package/dist/api/routes/password.mjs.map +1 -0
  47. package/dist/api/routes/session.d.mts +52 -0
  48. package/dist/api/routes/session.mjs +478 -0
  49. package/dist/api/routes/session.mjs.map +1 -0
  50. package/dist/api/routes/sign-in.d.mts +8 -0
  51. package/dist/api/routes/sign-in.mjs +262 -0
  52. package/dist/api/routes/sign-in.mjs.map +1 -0
  53. package/dist/api/routes/sign-out.d.mts +5 -0
  54. package/dist/api/routes/sign-out.mjs +33 -0
  55. package/dist/api/routes/sign-out.mjs.map +1 -0
  56. package/dist/api/routes/sign-up.d.mts +7 -0
  57. package/dist/api/routes/sign-up.mjs +227 -0
  58. package/dist/api/routes/sign-up.mjs.map +1 -0
  59. package/dist/api/routes/update-user.d.mts +12 -0
  60. package/dist/api/routes/update-user.mjs +493 -0
  61. package/dist/api/routes/update-user.mjs.map +1 -0
  62. package/dist/api/state/oauth.d.mts +5 -0
  63. package/dist/api/state/oauth.mjs +8 -0
  64. package/dist/api/state/oauth.mjs.map +1 -0
  65. package/dist/api/state/should-session-refresh.d.mts +13 -0
  66. package/dist/api/state/should-session-refresh.mjs +16 -0
  67. package/dist/api/state/should-session-refresh.mjs.map +1 -0
  68. package/dist/api/to-auth-endpoints.mjs +197 -0
  69. package/dist/api/to-auth-endpoints.mjs.map +1 -0
  70. package/dist/auth/base.mjs +44 -0
  71. package/dist/auth/base.mjs.map +1 -0
  72. package/dist/auth/full.d.mts +30 -0
  73. package/dist/auth/full.mjs +32 -0
  74. package/dist/auth/full.mjs.map +1 -0
  75. package/dist/auth/minimal.d.mts +12 -0
  76. package/dist/auth/minimal.mjs +14 -0
  77. package/dist/auth/minimal.mjs.map +1 -0
  78. package/dist/auth/trusted-origins.mjs +31 -0
  79. package/dist/auth/trusted-origins.mjs.map +1 -0
  80. package/dist/client/broadcast-channel.d.mts +20 -0
  81. package/dist/client/broadcast-channel.mjs +46 -0
  82. package/dist/client/broadcast-channel.mjs.map +1 -0
  83. package/dist/client/config.mjs +90 -0
  84. package/dist/client/config.mjs.map +1 -0
  85. package/dist/client/fetch-plugins.mjs +18 -0
  86. package/dist/client/fetch-plugins.mjs.map +1 -0
  87. package/dist/client/focus-manager.d.mts +11 -0
  88. package/dist/client/focus-manager.mjs +32 -0
  89. package/dist/client/focus-manager.mjs.map +1 -0
  90. package/dist/client/index.d.mts +30 -0
  91. package/dist/client/index.mjs +21 -0
  92. package/dist/client/index.mjs.map +1 -0
  93. package/dist/client/lynx/index.d.mts +62 -0
  94. package/dist/client/lynx/index.mjs +24 -0
  95. package/dist/client/lynx/index.mjs.map +1 -0
  96. package/dist/client/lynx/lynx-store.d.mts +47 -0
  97. package/dist/client/lynx/lynx-store.mjs +47 -0
  98. package/dist/client/lynx/lynx-store.mjs.map +1 -0
  99. package/dist/client/online-manager.d.mts +12 -0
  100. package/dist/client/online-manager.mjs +35 -0
  101. package/dist/client/online-manager.mjs.map +1 -0
  102. package/dist/client/parser.mjs +73 -0
  103. package/dist/client/parser.mjs.map +1 -0
  104. package/dist/client/path-to-object.d.mts +57 -0
  105. package/dist/client/plugins/index.d.mts +58 -0
  106. package/dist/client/plugins/index.mjs +33 -0
  107. package/dist/client/plugins/infer-plugin.d.mts +9 -0
  108. package/dist/client/plugins/infer-plugin.mjs +11 -0
  109. package/dist/client/plugins/infer-plugin.mjs.map +1 -0
  110. package/dist/client/proxy.mjs +79 -0
  111. package/dist/client/proxy.mjs.map +1 -0
  112. package/dist/client/query.d.mts +23 -0
  113. package/dist/client/query.mjs +98 -0
  114. package/dist/client/query.mjs.map +1 -0
  115. package/dist/client/react/index.d.mts +63 -0
  116. package/dist/client/react/index.mjs +24 -0
  117. package/dist/client/react/index.mjs.map +1 -0
  118. package/dist/client/react/react-store.d.mts +47 -0
  119. package/dist/client/react/react-store.mjs +47 -0
  120. package/dist/client/react/react-store.mjs.map +1 -0
  121. package/dist/client/session-atom.mjs +29 -0
  122. package/dist/client/session-atom.mjs.map +1 -0
  123. package/dist/client/session-refresh.d.mts +28 -0
  124. package/dist/client/session-refresh.mjs +140 -0
  125. package/dist/client/session-refresh.mjs.map +1 -0
  126. package/dist/client/solid/index.d.mts +57 -0
  127. package/dist/client/solid/index.mjs +22 -0
  128. package/dist/client/solid/index.mjs.map +1 -0
  129. package/dist/client/solid/solid-store.mjs +24 -0
  130. package/dist/client/solid/solid-store.mjs.map +1 -0
  131. package/dist/client/svelte/index.d.mts +63 -0
  132. package/dist/client/svelte/index.mjs +20 -0
  133. package/dist/client/svelte/index.mjs.map +1 -0
  134. package/dist/client/types.d.mts +58 -0
  135. package/dist/client/vanilla.d.mts +62 -0
  136. package/dist/client/vanilla.mjs +20 -0
  137. package/dist/client/vanilla.mjs.map +1 -0
  138. package/dist/client/vue/index.d.mts +86 -0
  139. package/dist/client/vue/index.mjs +38 -0
  140. package/dist/client/vue/index.mjs.map +1 -0
  141. package/dist/client/vue/vue-store.mjs +26 -0
  142. package/dist/client/vue/vue-store.mjs.map +1 -0
  143. package/dist/context/create-context.mjs +211 -0
  144. package/dist/context/create-context.mjs.map +1 -0
  145. package/dist/context/helpers.mjs +62 -0
  146. package/dist/context/helpers.mjs.map +1 -0
  147. package/dist/context/init-minimal.mjs +20 -0
  148. package/dist/context/init-minimal.mjs.map +1 -0
  149. package/dist/context/init.mjs +22 -0
  150. package/dist/context/init.mjs.map +1 -0
  151. package/dist/cookies/cookie-utils.d.mts +29 -0
  152. package/dist/cookies/cookie-utils.mjs +105 -0
  153. package/dist/cookies/cookie-utils.mjs.map +1 -0
  154. package/dist/cookies/index.d.mts +67 -0
  155. package/dist/cookies/index.mjs +264 -0
  156. package/dist/cookies/index.mjs.map +1 -0
  157. package/dist/cookies/session-store.d.mts +36 -0
  158. package/dist/cookies/session-store.mjs +200 -0
  159. package/dist/cookies/session-store.mjs.map +1 -0
  160. package/dist/crypto/buffer.d.mts +8 -0
  161. package/dist/crypto/buffer.mjs +18 -0
  162. package/dist/crypto/buffer.mjs.map +1 -0
  163. package/dist/crypto/index.d.mts +27 -0
  164. package/dist/crypto/index.mjs +38 -0
  165. package/dist/crypto/index.mjs.map +1 -0
  166. package/dist/crypto/jwt.d.mts +8 -0
  167. package/dist/crypto/jwt.mjs +95 -0
  168. package/dist/crypto/jwt.mjs.map +1 -0
  169. package/dist/crypto/password.d.mts +12 -0
  170. package/dist/crypto/password.mjs +36 -0
  171. package/dist/crypto/password.mjs.map +1 -0
  172. package/dist/crypto/random.d.mts +5 -0
  173. package/dist/crypto/random.mjs +8 -0
  174. package/dist/crypto/random.mjs.map +1 -0
  175. package/dist/db/adapter-base.d.mts +8 -0
  176. package/dist/db/adapter-base.mjs +28 -0
  177. package/dist/db/adapter-base.mjs.map +1 -0
  178. package/dist/db/adapter-kysely.d.mts +8 -0
  179. package/dist/db/adapter-kysely.mjs +21 -0
  180. package/dist/db/adapter-kysely.mjs.map +1 -0
  181. package/dist/db/field-converter.d.mts +8 -0
  182. package/dist/db/field-converter.mjs +21 -0
  183. package/dist/db/field-converter.mjs.map +1 -0
  184. package/dist/db/field.d.mts +55 -0
  185. package/dist/db/field.mjs +11 -0
  186. package/dist/db/field.mjs.map +1 -0
  187. package/dist/db/get-migration.d.mts +23 -0
  188. package/dist/db/get-migration.mjs +339 -0
  189. package/dist/db/get-migration.mjs.map +1 -0
  190. package/dist/db/get-schema.d.mts +11 -0
  191. package/dist/db/get-schema.mjs +39 -0
  192. package/dist/db/get-schema.mjs.map +1 -0
  193. package/dist/db/index.d.mts +9 -0
  194. package/dist/db/index.mjs +36 -0
  195. package/dist/db/index.mjs.map +1 -0
  196. package/dist/db/internal-adapter.d.mts +14 -0
  197. package/dist/db/internal-adapter.mjs +616 -0
  198. package/dist/db/internal-adapter.mjs.map +1 -0
  199. package/dist/db/schema.d.mts +26 -0
  200. package/dist/db/schema.mjs +118 -0
  201. package/dist/db/schema.mjs.map +1 -0
  202. package/dist/db/to-zod.d.mts +36 -0
  203. package/dist/db/to-zod.mjs +26 -0
  204. package/dist/db/to-zod.mjs.map +1 -0
  205. package/dist/db/verification-token-storage.mjs +28 -0
  206. package/dist/db/verification-token-storage.mjs.map +1 -0
  207. package/dist/db/with-hooks.d.mts +33 -0
  208. package/dist/db/with-hooks.mjs +159 -0
  209. package/dist/db/with-hooks.mjs.map +1 -0
  210. package/dist/index.d.mts +52 -0
  211. package/dist/index.mjs +26 -0
  212. package/dist/integrations/next-js.d.mts +14 -0
  213. package/dist/integrations/next-js.mjs +78 -0
  214. package/dist/integrations/next-js.mjs.map +1 -0
  215. package/dist/integrations/node.d.mts +13 -0
  216. package/dist/integrations/node.mjs +16 -0
  217. package/dist/integrations/node.mjs.map +1 -0
  218. package/dist/integrations/solid-start.d.mts +23 -0
  219. package/dist/integrations/solid-start.mjs +17 -0
  220. package/dist/integrations/solid-start.mjs.map +1 -0
  221. package/dist/integrations/svelte-kit.d.mts +29 -0
  222. package/dist/integrations/svelte-kit.mjs +57 -0
  223. package/dist/integrations/svelte-kit.mjs.map +1 -0
  224. package/dist/integrations/tanstack-start-solid.d.mts +22 -0
  225. package/dist/integrations/tanstack-start-solid.mjs +61 -0
  226. package/dist/integrations/tanstack-start-solid.mjs.map +1 -0
  227. package/dist/integrations/tanstack-start.d.mts +22 -0
  228. package/dist/integrations/tanstack-start.mjs +61 -0
  229. package/dist/integrations/tanstack-start.mjs.map +1 -0
  230. package/dist/oauth2/index.d.mts +5 -0
  231. package/dist/oauth2/index.mjs +7 -0
  232. package/dist/oauth2/link-account.d.mts +31 -0
  233. package/dist/oauth2/link-account.mjs +144 -0
  234. package/dist/oauth2/link-account.mjs.map +1 -0
  235. package/dist/oauth2/state.d.mts +26 -0
  236. package/dist/oauth2/state.mjs +51 -0
  237. package/dist/oauth2/state.mjs.map +1 -0
  238. package/dist/oauth2/utils.d.mts +8 -0
  239. package/dist/oauth2/utils.mjs +31 -0
  240. package/dist/oauth2/utils.mjs.map +1 -0
  241. package/dist/plugins/access/access.d.mts +30 -0
  242. package/dist/plugins/access/access.mjs +46 -0
  243. package/dist/plugins/access/access.mjs.map +1 -0
  244. package/dist/plugins/access/index.d.mts +3 -0
  245. package/dist/plugins/access/index.mjs +3 -0
  246. package/dist/plugins/access/types.d.mts +17 -0
  247. package/dist/plugins/additional-fields/client.d.mts +14 -0
  248. package/dist/plugins/additional-fields/client.mjs +11 -0
  249. package/dist/plugins/additional-fields/client.mjs.map +1 -0
  250. package/dist/plugins/admin/access/index.d.mts +2 -0
  251. package/dist/plugins/admin/access/index.mjs +3 -0
  252. package/dist/plugins/admin/access/statement.d.mts +118 -0
  253. package/dist/plugins/admin/access/statement.mjs +53 -0
  254. package/dist/plugins/admin/access/statement.mjs.map +1 -0
  255. package/dist/plugins/admin/admin.d.mts +14 -0
  256. package/dist/plugins/admin/admin.mjs +95 -0
  257. package/dist/plugins/admin/admin.mjs.map +1 -0
  258. package/dist/plugins/admin/client.d.mts +14 -0
  259. package/dist/plugins/admin/client.mjs +36 -0
  260. package/dist/plugins/admin/client.mjs.map +1 -0
  261. package/dist/plugins/admin/error-codes.d.mts +5 -0
  262. package/dist/plugins/admin/error-codes.mjs +30 -0
  263. package/dist/plugins/admin/error-codes.mjs.map +1 -0
  264. package/dist/plugins/admin/has-permission.mjs +16 -0
  265. package/dist/plugins/admin/has-permission.mjs.map +1 -0
  266. package/dist/plugins/admin/index.d.mts +3 -0
  267. package/dist/plugins/admin/index.mjs +3 -0
  268. package/dist/plugins/admin/routes.mjs +855 -0
  269. package/dist/plugins/admin/routes.mjs.map +1 -0
  270. package/dist/plugins/admin/schema.d.mts +6 -0
  271. package/dist/plugins/admin/schema.mjs +34 -0
  272. package/dist/plugins/admin/schema.mjs.map +1 -0
  273. package/dist/plugins/admin/types.d.mts +89 -0
  274. package/dist/plugins/anonymous/client.d.mts +9 -0
  275. package/dist/plugins/anonymous/client.mjs +22 -0
  276. package/dist/plugins/anonymous/client.mjs.map +1 -0
  277. package/dist/plugins/anonymous/error-codes.d.mts +5 -0
  278. package/dist/plugins/anonymous/error-codes.mjs +16 -0
  279. package/dist/plugins/anonymous/error-codes.mjs.map +1 -0
  280. package/dist/plugins/anonymous/index.d.mts +14 -0
  281. package/dist/plugins/anonymous/index.mjs +163 -0
  282. package/dist/plugins/anonymous/index.mjs.map +1 -0
  283. package/dist/plugins/anonymous/schema.d.mts +5 -0
  284. package/dist/plugins/anonymous/schema.mjs +11 -0
  285. package/dist/plugins/anonymous/schema.mjs.map +1 -0
  286. package/dist/plugins/anonymous/types.d.mts +68 -0
  287. package/dist/plugins/api-key/adapter.mjs +468 -0
  288. package/dist/plugins/api-key/adapter.mjs.map +1 -0
  289. package/dist/plugins/api-key/client.d.mts +9 -0
  290. package/dist/plugins/api-key/client.mjs +19 -0
  291. package/dist/plugins/api-key/client.mjs.map +1 -0
  292. package/dist/plugins/api-key/error-codes.d.mts +5 -0
  293. package/dist/plugins/api-key/error-codes.mjs +34 -0
  294. package/dist/plugins/api-key/error-codes.mjs.map +1 -0
  295. package/dist/plugins/api-key/index.d.mts +17 -0
  296. package/dist/plugins/api-key/index.mjs +134 -0
  297. package/dist/plugins/api-key/index.mjs.map +1 -0
  298. package/dist/plugins/api-key/rate-limit.mjs +74 -0
  299. package/dist/plugins/api-key/rate-limit.mjs.map +1 -0
  300. package/dist/plugins/api-key/routes/create-api-key.mjs +252 -0
  301. package/dist/plugins/api-key/routes/create-api-key.mjs.map +1 -0
  302. package/dist/plugins/api-key/routes/delete-all-expired-api-keys.mjs +24 -0
  303. package/dist/plugins/api-key/routes/delete-all-expired-api-keys.mjs.map +1 -0
  304. package/dist/plugins/api-key/routes/delete-api-key.mjs +74 -0
  305. package/dist/plugins/api-key/routes/delete-api-key.mjs.map +1 -0
  306. package/dist/plugins/api-key/routes/get-api-key.mjs +158 -0
  307. package/dist/plugins/api-key/routes/get-api-key.mjs.map +1 -0
  308. package/dist/plugins/api-key/routes/index.mjs +71 -0
  309. package/dist/plugins/api-key/routes/index.mjs.map +1 -0
  310. package/dist/plugins/api-key/routes/list-api-keys.mjs +194 -0
  311. package/dist/plugins/api-key/routes/list-api-keys.mjs.map +1 -0
  312. package/dist/plugins/api-key/routes/update-api-key.mjs +248 -0
  313. package/dist/plugins/api-key/routes/update-api-key.mjs.map +1 -0
  314. package/dist/plugins/api-key/routes/verify-api-key.mjs +223 -0
  315. package/dist/plugins/api-key/routes/verify-api-key.mjs.map +1 -0
  316. package/dist/plugins/api-key/schema.d.mts +11 -0
  317. package/dist/plugins/api-key/schema.mjs +130 -0
  318. package/dist/plugins/api-key/schema.mjs.map +1 -0
  319. package/dist/plugins/api-key/types.d.mts +346 -0
  320. package/dist/plugins/bearer/index.d.mts +25 -0
  321. package/dist/plugins/bearer/index.mjs +66 -0
  322. package/dist/plugins/bearer/index.mjs.map +1 -0
  323. package/dist/plugins/captcha/constants.d.mts +10 -0
  324. package/dist/plugins/captcha/constants.mjs +22 -0
  325. package/dist/plugins/captcha/constants.mjs.map +1 -0
  326. package/dist/plugins/captcha/error-codes.mjs +16 -0
  327. package/dist/plugins/captcha/error-codes.mjs.map +1 -0
  328. package/dist/plugins/captcha/index.d.mts +14 -0
  329. package/dist/plugins/captcha/index.mjs +60 -0
  330. package/dist/plugins/captcha/index.mjs.map +1 -0
  331. package/dist/plugins/captcha/types.d.mts +28 -0
  332. package/dist/plugins/captcha/utils.mjs +11 -0
  333. package/dist/plugins/captcha/utils.mjs.map +1 -0
  334. package/dist/plugins/captcha/verify-handlers/captchafox.mjs +27 -0
  335. package/dist/plugins/captcha/verify-handlers/captchafox.mjs.map +1 -0
  336. package/dist/plugins/captcha/verify-handlers/cloudflare-turnstile.mjs +25 -0
  337. package/dist/plugins/captcha/verify-handlers/cloudflare-turnstile.mjs.map +1 -0
  338. package/dist/plugins/captcha/verify-handlers/google-recaptcha.mjs +29 -0
  339. package/dist/plugins/captcha/verify-handlers/google-recaptcha.mjs.map +1 -0
  340. package/dist/plugins/captcha/verify-handlers/h-captcha.mjs +27 -0
  341. package/dist/plugins/captcha/verify-handlers/h-captcha.mjs.map +1 -0
  342. package/dist/plugins/captcha/verify-handlers/index.mjs +6 -0
  343. package/dist/plugins/custom-session/client.d.mts +10 -0
  344. package/dist/plugins/custom-session/client.mjs +11 -0
  345. package/dist/plugins/custom-session/client.mjs.map +1 -0
  346. package/dist/plugins/custom-session/index.d.mts +26 -0
  347. package/dist/plugins/custom-session/index.mjs +70 -0
  348. package/dist/plugins/custom-session/index.mjs.map +1 -0
  349. package/dist/plugins/device-authorization/client.d.mts +5 -0
  350. package/dist/plugins/device-authorization/client.mjs +18 -0
  351. package/dist/plugins/device-authorization/client.mjs.map +1 -0
  352. package/dist/plugins/device-authorization/error-codes.mjs +21 -0
  353. package/dist/plugins/device-authorization/error-codes.mjs.map +1 -0
  354. package/dist/plugins/device-authorization/index.d.mts +28 -0
  355. package/dist/plugins/device-authorization/index.mjs +50 -0
  356. package/dist/plugins/device-authorization/index.mjs.map +1 -0
  357. package/dist/plugins/device-authorization/routes.mjs +510 -0
  358. package/dist/plugins/device-authorization/routes.mjs.map +1 -0
  359. package/dist/plugins/device-authorization/schema.mjs +57 -0
  360. package/dist/plugins/device-authorization/schema.mjs.map +1 -0
  361. package/dist/plugins/email-otp/client.d.mts +7 -0
  362. package/dist/plugins/email-otp/client.mjs +18 -0
  363. package/dist/plugins/email-otp/client.mjs.map +1 -0
  364. package/dist/plugins/email-otp/error-codes.d.mts +5 -0
  365. package/dist/plugins/email-otp/error-codes.mjs +12 -0
  366. package/dist/plugins/email-otp/error-codes.mjs.map +1 -0
  367. package/dist/plugins/email-otp/index.d.mts +14 -0
  368. package/dist/plugins/email-otp/index.mjs +108 -0
  369. package/dist/plugins/email-otp/index.mjs.map +1 -0
  370. package/dist/plugins/email-otp/otp-token.mjs +29 -0
  371. package/dist/plugins/email-otp/otp-token.mjs.map +1 -0
  372. package/dist/plugins/email-otp/routes.mjs +564 -0
  373. package/dist/plugins/email-otp/routes.mjs.map +1 -0
  374. package/dist/plugins/email-otp/types.d.mts +74 -0
  375. package/dist/plugins/email-otp/utils.mjs +17 -0
  376. package/dist/plugins/email-otp/utils.mjs.map +1 -0
  377. package/dist/plugins/generic-oauth/client.d.mts +19 -0
  378. package/dist/plugins/generic-oauth/client.mjs +14 -0
  379. package/dist/plugins/generic-oauth/client.mjs.map +1 -0
  380. package/dist/plugins/generic-oauth/error-codes.d.mts +5 -0
  381. package/dist/plugins/generic-oauth/error-codes.mjs +15 -0
  382. package/dist/plugins/generic-oauth/error-codes.mjs.map +1 -0
  383. package/dist/plugins/generic-oauth/index.d.mts +34 -0
  384. package/dist/plugins/generic-oauth/index.mjs +137 -0
  385. package/dist/plugins/generic-oauth/index.mjs.map +1 -0
  386. package/dist/plugins/generic-oauth/providers/auth0.d.mts +37 -0
  387. package/dist/plugins/generic-oauth/providers/auth0.mjs +62 -0
  388. package/dist/plugins/generic-oauth/providers/auth0.mjs.map +1 -0
  389. package/dist/plugins/generic-oauth/providers/gumroad.d.mts +32 -0
  390. package/dist/plugins/generic-oauth/providers/gumroad.mjs +60 -0
  391. package/dist/plugins/generic-oauth/providers/gumroad.mjs.map +1 -0
  392. package/dist/plugins/generic-oauth/providers/hubspot.d.mts +37 -0
  393. package/dist/plugins/generic-oauth/providers/hubspot.mjs +60 -0
  394. package/dist/plugins/generic-oauth/providers/hubspot.mjs.map +1 -0
  395. package/dist/plugins/generic-oauth/providers/index.d.mts +9 -0
  396. package/dist/plugins/generic-oauth/providers/index.mjs +11 -0
  397. package/dist/plugins/generic-oauth/providers/keycloak.d.mts +37 -0
  398. package/dist/plugins/generic-oauth/providers/keycloak.mjs +62 -0
  399. package/dist/plugins/generic-oauth/providers/keycloak.mjs.map +1 -0
  400. package/dist/plugins/generic-oauth/providers/line.d.mts +55 -0
  401. package/dist/plugins/generic-oauth/providers/line.mjs +91 -0
  402. package/dist/plugins/generic-oauth/providers/line.mjs.map +1 -0
  403. package/dist/plugins/generic-oauth/providers/microsoft-entra-id.d.mts +37 -0
  404. package/dist/plugins/generic-oauth/providers/microsoft-entra-id.mjs +66 -0
  405. package/dist/plugins/generic-oauth/providers/microsoft-entra-id.mjs.map +1 -0
  406. package/dist/plugins/generic-oauth/providers/okta.d.mts +37 -0
  407. package/dist/plugins/generic-oauth/providers/okta.mjs +62 -0
  408. package/dist/plugins/generic-oauth/providers/okta.mjs.map +1 -0
  409. package/dist/plugins/generic-oauth/providers/patreon.d.mts +30 -0
  410. package/dist/plugins/generic-oauth/providers/patreon.mjs +59 -0
  411. package/dist/plugins/generic-oauth/providers/patreon.mjs.map +1 -0
  412. package/dist/plugins/generic-oauth/providers/slack.d.mts +30 -0
  413. package/dist/plugins/generic-oauth/providers/slack.mjs +61 -0
  414. package/dist/plugins/generic-oauth/providers/slack.mjs.map +1 -0
  415. package/dist/plugins/generic-oauth/routes.mjs +394 -0
  416. package/dist/plugins/generic-oauth/routes.mjs.map +1 -0
  417. package/dist/plugins/generic-oauth/types.d.mts +145 -0
  418. package/dist/plugins/haveibeenpwned/index.d.mts +21 -0
  419. package/dist/plugins/haveibeenpwned/index.mjs +56 -0
  420. package/dist/plugins/haveibeenpwned/index.mjs.map +1 -0
  421. package/dist/plugins/index.d.mts +68 -0
  422. package/dist/plugins/index.mjs +51 -0
  423. package/dist/plugins/jwt/adapter.mjs +27 -0
  424. package/dist/plugins/jwt/adapter.mjs.map +1 -0
  425. package/dist/plugins/jwt/client.d.mts +18 -0
  426. package/dist/plugins/jwt/client.mjs +19 -0
  427. package/dist/plugins/jwt/client.mjs.map +1 -0
  428. package/dist/plugins/jwt/index.d.mts +17 -0
  429. package/dist/plugins/jwt/index.mjs +202 -0
  430. package/dist/plugins/jwt/index.mjs.map +1 -0
  431. package/dist/plugins/jwt/schema.d.mts +5 -0
  432. package/dist/plugins/jwt/schema.mjs +23 -0
  433. package/dist/plugins/jwt/schema.mjs.map +1 -0
  434. package/dist/plugins/jwt/sign.d.mts +57 -0
  435. package/dist/plugins/jwt/sign.mjs +66 -0
  436. package/dist/plugins/jwt/sign.mjs.map +1 -0
  437. package/dist/plugins/jwt/types.d.mts +194 -0
  438. package/dist/plugins/jwt/utils.d.mts +42 -0
  439. package/dist/plugins/jwt/utils.mjs +64 -0
  440. package/dist/plugins/jwt/utils.mjs.map +1 -0
  441. package/dist/plugins/jwt/verify.d.mts +12 -0
  442. package/dist/plugins/jwt/verify.mjs +46 -0
  443. package/dist/plugins/jwt/verify.mjs.map +1 -0
  444. package/dist/plugins/last-login-method/client.d.mts +18 -0
  445. package/dist/plugins/last-login-method/client.mjs +32 -0
  446. package/dist/plugins/last-login-method/client.mjs.map +1 -0
  447. package/dist/plugins/last-login-method/index.d.mts +52 -0
  448. package/dist/plugins/last-login-method/index.mjs +77 -0
  449. package/dist/plugins/last-login-method/index.mjs.map +1 -0
  450. package/dist/plugins/magic-link/client.d.mts +5 -0
  451. package/dist/plugins/magic-link/client.mjs +11 -0
  452. package/dist/plugins/magic-link/client.mjs.map +1 -0
  453. package/dist/plugins/magic-link/index.d.mts +61 -0
  454. package/dist/plugins/magic-link/index.mjs +167 -0
  455. package/dist/plugins/magic-link/index.mjs.map +1 -0
  456. package/dist/plugins/magic-link/utils.mjs +12 -0
  457. package/dist/plugins/magic-link/utils.mjs.map +1 -0
  458. package/dist/plugins/mcp/authorize.mjs +133 -0
  459. package/dist/plugins/mcp/authorize.mjs.map +1 -0
  460. package/dist/plugins/mcp/index.d.mts +46 -0
  461. package/dist/plugins/mcp/index.mjs +717 -0
  462. package/dist/plugins/mcp/index.mjs.map +1 -0
  463. package/dist/plugins/multi-session/client.d.mts +8 -0
  464. package/dist/plugins/multi-session/client.mjs +20 -0
  465. package/dist/plugins/multi-session/client.mjs.map +1 -0
  466. package/dist/plugins/multi-session/error-codes.d.mts +5 -0
  467. package/dist/plugins/multi-session/error-codes.mjs +8 -0
  468. package/dist/plugins/multi-session/error-codes.mjs.map +1 -0
  469. package/dist/plugins/multi-session/index.d.mts +22 -0
  470. package/dist/plugins/multi-session/index.mjs +172 -0
  471. package/dist/plugins/multi-session/index.mjs.map +1 -0
  472. package/dist/plugins/oauth-proxy/index.d.mts +39 -0
  473. package/dist/plugins/oauth-proxy/index.mjs +305 -0
  474. package/dist/plugins/oauth-proxy/index.mjs.map +1 -0
  475. package/dist/plugins/oauth-proxy/utils.mjs +44 -0
  476. package/dist/plugins/oauth-proxy/utils.mjs.map +1 -0
  477. package/dist/plugins/oidc-provider/authorize.mjs +194 -0
  478. package/dist/plugins/oidc-provider/authorize.mjs.map +1 -0
  479. package/dist/plugins/oidc-provider/client.d.mts +8 -0
  480. package/dist/plugins/oidc-provider/client.mjs +11 -0
  481. package/dist/plugins/oidc-provider/client.mjs.map +1 -0
  482. package/dist/plugins/oidc-provider/error.mjs +17 -0
  483. package/dist/plugins/oidc-provider/error.mjs.map +1 -0
  484. package/dist/plugins/oidc-provider/index.d.mts +32 -0
  485. package/dist/plugins/oidc-provider/index.mjs +1093 -0
  486. package/dist/plugins/oidc-provider/index.mjs.map +1 -0
  487. package/dist/plugins/oidc-provider/schema.d.mts +26 -0
  488. package/dist/plugins/oidc-provider/schema.mjs +132 -0
  489. package/dist/plugins/oidc-provider/schema.mjs.map +1 -0
  490. package/dist/plugins/oidc-provider/types.d.mts +517 -0
  491. package/dist/plugins/oidc-provider/utils/prompt.mjs +19 -0
  492. package/dist/plugins/oidc-provider/utils/prompt.mjs.map +1 -0
  493. package/dist/plugins/oidc-provider/utils.mjs +15 -0
  494. package/dist/plugins/oidc-provider/utils.mjs.map +1 -0
  495. package/dist/plugins/one-tap/client.d.mts +159 -0
  496. package/dist/plugins/one-tap/client.mjs +214 -0
  497. package/dist/plugins/one-tap/client.mjs.map +1 -0
  498. package/dist/plugins/one-tap/index.d.mts +27 -0
  499. package/dist/plugins/one-tap/index.mjs +96 -0
  500. package/dist/plugins/one-tap/index.mjs.map +1 -0
  501. package/dist/plugins/one-time-token/client.d.mts +7 -0
  502. package/dist/plugins/one-time-token/client.mjs +11 -0
  503. package/dist/plugins/one-time-token/client.mjs.map +1 -0
  504. package/dist/plugins/one-time-token/index.d.mts +53 -0
  505. package/dist/plugins/one-time-token/index.mjs +82 -0
  506. package/dist/plugins/one-time-token/index.mjs.map +1 -0
  507. package/dist/plugins/one-time-token/utils.mjs +12 -0
  508. package/dist/plugins/one-time-token/utils.mjs.map +1 -0
  509. package/dist/plugins/open-api/generator.d.mts +115 -0
  510. package/dist/plugins/open-api/generator.mjs +315 -0
  511. package/dist/plugins/open-api/generator.mjs.map +1 -0
  512. package/dist/plugins/open-api/index.d.mts +45 -0
  513. package/dist/plugins/open-api/index.mjs +67 -0
  514. package/dist/plugins/open-api/index.mjs.map +1 -0
  515. package/dist/plugins/open-api/logo.mjs +15 -0
  516. package/dist/plugins/open-api/logo.mjs.map +1 -0
  517. package/dist/plugins/organization/access/index.d.mts +2 -0
  518. package/dist/plugins/organization/access/index.mjs +3 -0
  519. package/dist/plugins/organization/access/statement.d.mts +249 -0
  520. package/dist/plugins/organization/access/statement.mjs +81 -0
  521. package/dist/plugins/organization/access/statement.mjs.map +1 -0
  522. package/dist/plugins/organization/adapter.d.mts +205 -0
  523. package/dist/plugins/organization/adapter.mjs +624 -0
  524. package/dist/plugins/organization/adapter.mjs.map +1 -0
  525. package/dist/plugins/organization/call.mjs +19 -0
  526. package/dist/plugins/organization/call.mjs.map +1 -0
  527. package/dist/plugins/organization/client.d.mts +151 -0
  528. package/dist/plugins/organization/client.mjs +107 -0
  529. package/dist/plugins/organization/client.mjs.map +1 -0
  530. package/dist/plugins/organization/error-codes.d.mts +5 -0
  531. package/dist/plugins/organization/error-codes.mjs +65 -0
  532. package/dist/plugins/organization/error-codes.mjs.map +1 -0
  533. package/dist/plugins/organization/has-permission.mjs +35 -0
  534. package/dist/plugins/organization/has-permission.mjs.map +1 -0
  535. package/dist/plugins/organization/index.d.mts +5 -0
  536. package/dist/plugins/organization/index.mjs +4 -0
  537. package/dist/plugins/organization/organization.d.mts +252 -0
  538. package/dist/plugins/organization/organization.mjs +428 -0
  539. package/dist/plugins/organization/organization.mjs.map +1 -0
  540. package/dist/plugins/organization/permission.d.mts +26 -0
  541. package/dist/plugins/organization/permission.mjs +16 -0
  542. package/dist/plugins/organization/permission.mjs.map +1 -0
  543. package/dist/plugins/organization/routes/crud-access-control.d.mts +11 -0
  544. package/dist/plugins/organization/routes/crud-access-control.mjs +656 -0
  545. package/dist/plugins/organization/routes/crud-access-control.mjs.map +1 -0
  546. package/dist/plugins/organization/routes/crud-invites.d.mts +16 -0
  547. package/dist/plugins/organization/routes/crud-invites.mjs +555 -0
  548. package/dist/plugins/organization/routes/crud-invites.mjs.map +1 -0
  549. package/dist/plugins/organization/routes/crud-members.d.mts +13 -0
  550. package/dist/plugins/organization/routes/crud-members.mjs +473 -0
  551. package/dist/plugins/organization/routes/crud-members.mjs.map +1 -0
  552. package/dist/plugins/organization/routes/crud-org.d.mts +13 -0
  553. package/dist/plugins/organization/routes/crud-org.mjs +447 -0
  554. package/dist/plugins/organization/routes/crud-org.mjs.map +1 -0
  555. package/dist/plugins/organization/routes/crud-team.d.mts +15 -0
  556. package/dist/plugins/organization/routes/crud-team.mjs +676 -0
  557. package/dist/plugins/organization/routes/crud-team.mjs.map +1 -0
  558. package/dist/plugins/organization/schema.d.mts +376 -0
  559. package/dist/plugins/organization/schema.mjs +68 -0
  560. package/dist/plugins/organization/schema.mjs.map +1 -0
  561. package/dist/plugins/organization/types.d.mts +733 -0
  562. package/dist/plugins/phone-number/client.d.mts +8 -0
  563. package/dist/plugins/phone-number/client.mjs +20 -0
  564. package/dist/plugins/phone-number/client.mjs.map +1 -0
  565. package/dist/plugins/phone-number/error-codes.d.mts +5 -0
  566. package/dist/plugins/phone-number/error-codes.mjs +21 -0
  567. package/dist/plugins/phone-number/error-codes.mjs.map +1 -0
  568. package/dist/plugins/phone-number/index.d.mts +14 -0
  569. package/dist/plugins/phone-number/index.mjs +49 -0
  570. package/dist/plugins/phone-number/index.mjs.map +1 -0
  571. package/dist/plugins/phone-number/routes.mjs +459 -0
  572. package/dist/plugins/phone-number/routes.mjs.map +1 -0
  573. package/dist/plugins/phone-number/schema.d.mts +5 -0
  574. package/dist/plugins/phone-number/schema.mjs +20 -0
  575. package/dist/plugins/phone-number/schema.mjs.map +1 -0
  576. package/dist/plugins/phone-number/types.d.mts +118 -0
  577. package/dist/plugins/siwe/client.d.mts +5 -0
  578. package/dist/plugins/siwe/client.mjs +11 -0
  579. package/dist/plugins/siwe/client.mjs.map +1 -0
  580. package/dist/plugins/siwe/error-codes.mjs +13 -0
  581. package/dist/plugins/siwe/error-codes.mjs.map +1 -0
  582. package/dist/plugins/siwe/index.d.mts +26 -0
  583. package/dist/plugins/siwe/index.mjs +261 -0
  584. package/dist/plugins/siwe/index.mjs.map +1 -0
  585. package/dist/plugins/siwe/schema.d.mts +5 -0
  586. package/dist/plugins/siwe/schema.mjs +32 -0
  587. package/dist/plugins/siwe/schema.mjs.map +1 -0
  588. package/dist/plugins/siwe/types.d.mts +44 -0
  589. package/dist/plugins/two-factor/backup-codes/index.d.mts +91 -0
  590. package/dist/plugins/two-factor/backup-codes/index.mjs +277 -0
  591. package/dist/plugins/two-factor/backup-codes/index.mjs.map +1 -0
  592. package/dist/plugins/two-factor/client.d.mts +17 -0
  593. package/dist/plugins/two-factor/client.mjs +37 -0
  594. package/dist/plugins/two-factor/client.mjs.map +1 -0
  595. package/dist/plugins/two-factor/constant.mjs +8 -0
  596. package/dist/plugins/two-factor/constant.mjs.map +1 -0
  597. package/dist/plugins/two-factor/error-code.d.mts +5 -0
  598. package/dist/plugins/two-factor/error-code.mjs +18 -0
  599. package/dist/plugins/two-factor/error-code.mjs.map +1 -0
  600. package/dist/plugins/two-factor/index.d.mts +19 -0
  601. package/dist/plugins/two-factor/index.mjs +207 -0
  602. package/dist/plugins/two-factor/index.mjs.map +1 -0
  603. package/dist/plugins/two-factor/otp/index.d.mts +96 -0
  604. package/dist/plugins/two-factor/otp/index.mjs +199 -0
  605. package/dist/plugins/two-factor/otp/index.mjs.map +1 -0
  606. package/dist/plugins/two-factor/schema.d.mts +5 -0
  607. package/dist/plugins/two-factor/schema.mjs +36 -0
  608. package/dist/plugins/two-factor/schema.mjs.map +1 -0
  609. package/dist/plugins/two-factor/totp/index.d.mts +81 -0
  610. package/dist/plugins/two-factor/totp/index.mjs +157 -0
  611. package/dist/plugins/two-factor/totp/index.mjs.map +1 -0
  612. package/dist/plugins/two-factor/types.d.mts +65 -0
  613. package/dist/plugins/two-factor/utils.mjs +12 -0
  614. package/dist/plugins/two-factor/utils.mjs.map +1 -0
  615. package/dist/plugins/two-factor/verify-two-factor.mjs +76 -0
  616. package/dist/plugins/two-factor/verify-two-factor.mjs.map +1 -0
  617. package/dist/plugins/username/client.d.mts +7 -0
  618. package/dist/plugins/username/client.mjs +18 -0
  619. package/dist/plugins/username/client.mjs.map +1 -0
  620. package/dist/plugins/username/error-codes.d.mts +5 -0
  621. package/dist/plugins/username/error-codes.mjs +17 -0
  622. package/dist/plugins/username/error-codes.mjs.map +1 -0
  623. package/dist/plugins/username/index.d.mts +74 -0
  624. package/dist/plugins/username/index.mjs +237 -0
  625. package/dist/plugins/username/index.mjs.map +1 -0
  626. package/dist/plugins/username/schema.d.mts +9 -0
  627. package/dist/plugins/username/schema.mjs +26 -0
  628. package/dist/plugins/username/schema.mjs.map +1 -0
  629. package/dist/social-providers/index.d.mts +1 -0
  630. package/dist/social-providers/index.mjs +3 -0
  631. package/dist/state.d.mts +42 -0
  632. package/dist/state.mjs +107 -0
  633. package/dist/state.mjs.map +1 -0
  634. package/dist/test-utils/headers.d.mts +9 -0
  635. package/dist/test-utils/headers.mjs +24 -0
  636. package/dist/test-utils/headers.mjs.map +1 -0
  637. package/dist/test-utils/index.d.mts +3 -0
  638. package/dist/test-utils/index.mjs +4 -0
  639. package/dist/test-utils/test-instance.d.mts +181 -0
  640. package/dist/test-utils/test-instance.mjs +210 -0
  641. package/dist/test-utils/test-instance.mjs.map +1 -0
  642. package/dist/types/adapter.d.mts +24 -0
  643. package/dist/types/api.d.mts +29 -0
  644. package/dist/types/auth.d.mts +30 -0
  645. package/dist/types/helper.d.mts +21 -0
  646. package/dist/types/index.d.mts +11 -0
  647. package/dist/types/index.mjs +1 -0
  648. package/dist/types/models.d.mts +17 -0
  649. package/dist/types/plugins.d.mts +16 -0
  650. package/dist/utils/boolean.mjs +8 -0
  651. package/dist/utils/boolean.mjs.map +1 -0
  652. package/dist/utils/constants.mjs +6 -0
  653. package/dist/utils/constants.mjs.map +1 -0
  654. package/dist/utils/date.mjs +8 -0
  655. package/dist/utils/date.mjs.map +1 -0
  656. package/dist/utils/get-request-ip.d.mts +7 -0
  657. package/dist/utils/get-request-ip.mjs +23 -0
  658. package/dist/utils/get-request-ip.mjs.map +1 -0
  659. package/dist/utils/hashing.mjs +21 -0
  660. package/dist/utils/hashing.mjs.map +1 -0
  661. package/dist/utils/hide-metadata.d.mts +7 -0
  662. package/dist/utils/hide-metadata.mjs +6 -0
  663. package/dist/utils/hide-metadata.mjs.map +1 -0
  664. package/dist/utils/index.d.mts +3 -0
  665. package/dist/utils/index.mjs +5 -0
  666. package/dist/utils/is-api-error.d.mts +7 -0
  667. package/dist/utils/is-api-error.mjs +11 -0
  668. package/dist/utils/is-api-error.mjs.map +1 -0
  669. package/dist/utils/is-atom.mjs +8 -0
  670. package/dist/utils/is-atom.mjs.map +1 -0
  671. package/dist/utils/is-promise.mjs +8 -0
  672. package/dist/utils/is-promise.mjs.map +1 -0
  673. package/dist/utils/middleware-response.mjs +6 -0
  674. package/dist/utils/middleware-response.mjs.map +1 -0
  675. package/dist/utils/password.mjs +26 -0
  676. package/dist/utils/password.mjs.map +1 -0
  677. package/dist/utils/plugin-helper.mjs +17 -0
  678. package/dist/utils/plugin-helper.mjs.map +1 -0
  679. package/dist/utils/shim.mjs +24 -0
  680. package/dist/utils/shim.mjs.map +1 -0
  681. package/dist/utils/time.d.mts +49 -0
  682. package/dist/utils/time.mjs +100 -0
  683. package/dist/utils/time.mjs.map +1 -0
  684. package/dist/utils/url.mjs +92 -0
  685. package/dist/utils/url.mjs.map +1 -0
  686. package/dist/utils/wildcard.mjs +108 -0
  687. package/dist/utils/wildcard.mjs.map +1 -0
  688. package/package.json +601 -0
@@ -0,0 +1,237 @@
1
+ import { mergeSchema, parseUserOutput } from "../../db/schema.mjs";
2
+ import { setSessionCookie } from "../../cookies/index.mjs";
3
+ import "../../db/index.mjs";
4
+ import { createEmailVerificationToken } from "../../api/routes/email-verification.mjs";
5
+ import "../../api/index.mjs";
6
+ import { USERNAME_ERROR_CODES } from "./error-codes.mjs";
7
+ import { getSchema } from "./schema.mjs";
8
+ import { APIError, BASE_ERROR_CODES } from "@better-auth/core/error";
9
+ import { createAuthEndpoint, createAuthMiddleware } from "@better-auth/core/api";
10
+ import * as z from "zod";
11
+
12
+ //#region src/plugins/username/index.ts
13
+ function defaultUsernameValidator(username) {
14
+ return /^[a-zA-Z0-9_.]+$/.test(username);
15
+ }
16
+ const signInUsernameBodySchema = z.object({
17
+ username: z.string().meta({ description: "The username of the user" }),
18
+ password: z.string().meta({ description: "The password of the user" }),
19
+ rememberMe: z.boolean().meta({ description: "Remember the user session" }).optional(),
20
+ callbackURL: z.string().meta({ description: "The URL to redirect to after email verification" }).optional()
21
+ });
22
+ const isUsernameAvailableBodySchema = z.object({ username: z.string().meta({ description: "The username to check" }) });
23
+ const username = (options) => {
24
+ const normalizer = (username) => {
25
+ if (options?.usernameNormalization === false) return username;
26
+ if (options?.usernameNormalization) return options.usernameNormalization(username);
27
+ return username.toLowerCase();
28
+ };
29
+ const displayUsernameNormalizer = (displayUsername) => {
30
+ return options?.displayUsernameNormalization ? options.displayUsernameNormalization(displayUsername) : displayUsername;
31
+ };
32
+ return {
33
+ id: "username",
34
+ init(ctx) {
35
+ return { options: { databaseHooks: { user: {
36
+ create: { async before(user, context) {
37
+ const username = "username" in user ? user.username : null;
38
+ const displayUsername = "displayUsername" in user ? user.displayUsername : null;
39
+ return { data: {
40
+ ...user,
41
+ ...username ? { username: normalizer(username) } : {},
42
+ ...displayUsername ? { displayUsername: displayUsernameNormalizer(displayUsername) } : {}
43
+ } };
44
+ } },
45
+ update: { async before(user, context) {
46
+ const username = "username" in user ? user.username : null;
47
+ const displayUsername = "displayUsername" in user ? user.displayUsername : null;
48
+ return { data: {
49
+ ...user,
50
+ ...username ? { username: normalizer(username) } : {},
51
+ ...displayUsername ? { displayUsername: displayUsernameNormalizer(displayUsername) } : {}
52
+ } };
53
+ } }
54
+ } } } };
55
+ },
56
+ endpoints: {
57
+ signInUsername: createAuthEndpoint("/sign-in/username", {
58
+ method: "POST",
59
+ body: signInUsernameBodySchema,
60
+ metadata: { openapi: {
61
+ summary: "Sign in with username",
62
+ description: "Sign in with username",
63
+ responses: {
64
+ 200: {
65
+ description: "Success",
66
+ content: { "application/json": { schema: {
67
+ type: "object",
68
+ properties: {
69
+ token: {
70
+ type: "string",
71
+ description: "Session token for the authenticated session"
72
+ },
73
+ user: { $ref: "#/components/schemas/User" }
74
+ },
75
+ required: ["token", "user"]
76
+ } } }
77
+ },
78
+ 422: {
79
+ description: "Unprocessable Entity. Validation error",
80
+ content: { "application/json": { schema: {
81
+ type: "object",
82
+ properties: { message: { type: "string" } }
83
+ } } }
84
+ }
85
+ }
86
+ } }
87
+ }, async (ctx) => {
88
+ if (!ctx.body.username || !ctx.body.password) {
89
+ ctx.context.logger.error("Username or password not found");
90
+ throw APIError.from("UNAUTHORIZED", USERNAME_ERROR_CODES.INVALID_USERNAME_OR_PASSWORD);
91
+ }
92
+ const username = options?.validationOrder?.username === "pre-normalization" ? normalizer(ctx.body.username) : ctx.body.username;
93
+ const minUsernameLength = options?.minUsernameLength || 3;
94
+ const maxUsernameLength = options?.maxUsernameLength || 30;
95
+ if (username.length < minUsernameLength) {
96
+ ctx.context.logger.error("Username too short", { username });
97
+ throw APIError.from("UNPROCESSABLE_ENTITY", USERNAME_ERROR_CODES.USERNAME_TOO_SHORT);
98
+ }
99
+ if (username.length > maxUsernameLength) {
100
+ ctx.context.logger.error("Username too long", { username });
101
+ throw APIError.from("UNPROCESSABLE_ENTITY", USERNAME_ERROR_CODES.USERNAME_TOO_LONG);
102
+ }
103
+ if (!await (options?.usernameValidator || defaultUsernameValidator)(username)) throw APIError.from("UNPROCESSABLE_ENTITY", USERNAME_ERROR_CODES.INVALID_USERNAME);
104
+ const user = await ctx.context.adapter.findOne({
105
+ model: "user",
106
+ where: [{
107
+ field: "username",
108
+ value: normalizer(username)
109
+ }]
110
+ });
111
+ if (!user) {
112
+ await ctx.context.password.hash(ctx.body.password);
113
+ ctx.context.logger.error("User not found", { username });
114
+ throw APIError.from("UNAUTHORIZED", USERNAME_ERROR_CODES.INVALID_USERNAME_OR_PASSWORD);
115
+ }
116
+ const account = await ctx.context.adapter.findOne({
117
+ model: "account",
118
+ where: [{
119
+ field: "userId",
120
+ value: user.id
121
+ }, {
122
+ field: "providerId",
123
+ value: "credential"
124
+ }]
125
+ });
126
+ if (!account) throw APIError.from("UNAUTHORIZED", USERNAME_ERROR_CODES.INVALID_USERNAME_OR_PASSWORD);
127
+ const currentPassword = account?.password;
128
+ if (!currentPassword) {
129
+ ctx.context.logger.error("Password not found", { username });
130
+ throw APIError.from("UNAUTHORIZED", USERNAME_ERROR_CODES.INVALID_USERNAME_OR_PASSWORD);
131
+ }
132
+ if (!await ctx.context.password.verify({
133
+ hash: currentPassword,
134
+ password: ctx.body.password
135
+ })) {
136
+ ctx.context.logger.error("Invalid password");
137
+ throw APIError.from("UNAUTHORIZED", USERNAME_ERROR_CODES.INVALID_USERNAME_OR_PASSWORD);
138
+ }
139
+ if (ctx.context.options?.emailAndPassword?.requireEmailVerification && !user.emailVerified) {
140
+ if (!ctx.context.options?.emailVerification?.sendVerificationEmail) throw APIError.from("FORBIDDEN", USERNAME_ERROR_CODES.EMAIL_NOT_VERIFIED);
141
+ if (ctx.context.options?.emailVerification?.sendOnSignIn) {
142
+ const token = await createEmailVerificationToken(ctx.context.secret, user.email, void 0, ctx.context.options.emailVerification?.expiresIn);
143
+ const url = `${ctx.context.baseURL}/verify-email?token=${token}&callbackURL=${ctx.body.callbackURL || "/"}`;
144
+ await ctx.context.runInBackgroundOrAwait(ctx.context.options.emailVerification.sendVerificationEmail({
145
+ user,
146
+ url,
147
+ token
148
+ }, ctx.request));
149
+ }
150
+ throw APIError.from("FORBIDDEN", USERNAME_ERROR_CODES.EMAIL_NOT_VERIFIED);
151
+ }
152
+ const session = await ctx.context.internalAdapter.createSession(user.id, ctx.body.rememberMe === false);
153
+ if (!session) return ctx.json(null, {
154
+ status: 500,
155
+ body: { message: BASE_ERROR_CODES.FAILED_TO_CREATE_SESSION.message }
156
+ });
157
+ await setSessionCookie(ctx, {
158
+ session,
159
+ user
160
+ }, ctx.body.rememberMe === false);
161
+ return ctx.json({
162
+ token: session.token,
163
+ user: parseUserOutput(ctx.context.options, user)
164
+ });
165
+ }),
166
+ isUsernameAvailable: createAuthEndpoint("/is-username-available", {
167
+ method: "POST",
168
+ body: isUsernameAvailableBodySchema
169
+ }, async (ctx) => {
170
+ const username = ctx.body.username;
171
+ if (!username) throw APIError.from("UNPROCESSABLE_ENTITY", USERNAME_ERROR_CODES.INVALID_USERNAME);
172
+ const minUsernameLength = options?.minUsernameLength || 3;
173
+ const maxUsernameLength = options?.maxUsernameLength || 30;
174
+ if (username.length < minUsernameLength) throw APIError.from("UNPROCESSABLE_ENTITY", USERNAME_ERROR_CODES.USERNAME_TOO_SHORT);
175
+ if (username.length > maxUsernameLength) throw APIError.from("UNPROCESSABLE_ENTITY", USERNAME_ERROR_CODES.USERNAME_TOO_LONG);
176
+ if (!await (options?.usernameValidator || defaultUsernameValidator)(username)) throw APIError.from("UNPROCESSABLE_ENTITY", USERNAME_ERROR_CODES.INVALID_USERNAME);
177
+ if (await ctx.context.adapter.findOne({
178
+ model: "user",
179
+ where: [{
180
+ field: "username",
181
+ value: normalizer(username)
182
+ }]
183
+ })) return ctx.json({ available: false });
184
+ return ctx.json({ available: true });
185
+ })
186
+ },
187
+ schema: mergeSchema(getSchema({
188
+ username: normalizer,
189
+ displayUsername: displayUsernameNormalizer
190
+ }), options?.schema),
191
+ hooks: { before: [{
192
+ matcher(context) {
193
+ return context.path === "/sign-up/email" || context.path === "/update-user";
194
+ },
195
+ handler: createAuthMiddleware(async (ctx) => {
196
+ const username = typeof ctx.body.username === "string" && options?.validationOrder?.username === "post-normalization" ? normalizer(ctx.body.username) : ctx.body.username;
197
+ if (username !== void 0 && typeof username === "string") {
198
+ const minUsernameLength = options?.minUsernameLength || 3;
199
+ const maxUsernameLength = options?.maxUsernameLength || 30;
200
+ if (username.length < minUsernameLength) throw APIError.from("BAD_REQUEST", USERNAME_ERROR_CODES.USERNAME_TOO_SHORT);
201
+ if (username.length > maxUsernameLength) throw APIError.from("BAD_REQUEST", USERNAME_ERROR_CODES.USERNAME_TOO_LONG);
202
+ if (!await (options?.usernameValidator || defaultUsernameValidator)(username)) throw APIError.from("BAD_REQUEST", USERNAME_ERROR_CODES.INVALID_USERNAME);
203
+ const user = await ctx.context.adapter.findOne({
204
+ model: "user",
205
+ where: [{
206
+ field: "username",
207
+ value: username
208
+ }]
209
+ });
210
+ const blockChangeSignUp = ctx.path === "/sign-up/email" && user;
211
+ const blockChangeUpdateUser = ctx.path === "/update-user" && user && ctx.context.session && user.id !== ctx.context.session.session.userId;
212
+ if (blockChangeSignUp || blockChangeUpdateUser) throw APIError.from("BAD_REQUEST", USERNAME_ERROR_CODES.USERNAME_IS_ALREADY_TAKEN);
213
+ }
214
+ const displayUsername = typeof ctx.body.displayUsername === "string" && options?.validationOrder?.displayUsername === "post-normalization" ? displayUsernameNormalizer(ctx.body.displayUsername) : ctx.body.displayUsername;
215
+ if (displayUsername !== void 0 && typeof displayUsername === "string") {
216
+ if (options?.displayUsernameValidator) {
217
+ if (!await options.displayUsernameValidator(displayUsername)) throw APIError.from("BAD_REQUEST", USERNAME_ERROR_CODES.INVALID_DISPLAY_USERNAME);
218
+ }
219
+ }
220
+ })
221
+ }, {
222
+ matcher(context) {
223
+ return context.path === "/sign-up/email" || context.path === "/update-user";
224
+ },
225
+ handler: createAuthMiddleware(async (ctx) => {
226
+ if (ctx.body.username && !ctx.body.displayUsername) ctx.body.displayUsername = ctx.body.username;
227
+ if (ctx.body.displayUsername && !ctx.body.username) ctx.body.username = ctx.body.displayUsername;
228
+ })
229
+ }] },
230
+ options,
231
+ $ERROR_CODES: USERNAME_ERROR_CODES
232
+ };
233
+ };
234
+
235
+ //#endregion
236
+ export { USERNAME_ERROR_CODES, username };
237
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["ERROR_CODES"],"sources":["../../../src/plugins/username/index.ts"],"sourcesContent":["import type { BetterAuthPlugin } from \"@better-auth/core\";\nimport {\n\tcreateAuthEndpoint,\n\tcreateAuthMiddleware,\n} from \"@better-auth/core/api\";\nimport type { Account, User } from \"@better-auth/core/db\";\nimport { APIError, BASE_ERROR_CODES } from \"@better-auth/core/error\";\nimport * as z from \"zod\";\nimport { createEmailVerificationToken } from \"../../api\";\nimport { setSessionCookie } from \"../../cookies\";\nimport { mergeSchema, parseUserOutput } from \"../../db\";\nimport type { InferOptionSchema } from \"../../types/plugins\";\nimport { USERNAME_ERROR_CODES as ERROR_CODES } from \"./error-codes\";\nimport type { UsernameSchema } from \"./schema\";\nimport { getSchema } from \"./schema\";\n\nexport { USERNAME_ERROR_CODES } from \"./error-codes\";\n\ndeclare module \"@better-auth/core\" {\n\tinterface BetterAuthPluginRegistry<AuthOptions, Options> {\n\t\tusername: {\n\t\t\tcreator: typeof username;\n\t\t};\n\t}\n}\n\nexport type UsernameOptions = {\n\tschema?: InferOptionSchema<UsernameSchema> | undefined;\n\t/**\n\t * The minimum length of the username\n\t *\n\t * @default 3\n\t */\n\tminUsernameLength?: number | undefined;\n\t/**\n\t * The maximum length of the username\n\t *\n\t * @default 30\n\t */\n\tmaxUsernameLength?: number | undefined;\n\t/**\n\t * A function to validate the username\n\t *\n\t * By default, the username should only contain alphanumeric characters and underscores\n\t */\n\tusernameValidator?:\n\t\t| ((username: string) => boolean | Promise<boolean>)\n\t\t| undefined;\n\t/**\n\t * A function to validate the display username\n\t *\n\t * By default, no validation is applied to display username\n\t */\n\tdisplayUsernameValidator?:\n\t\t| ((displayUsername: string) => boolean | Promise<boolean>)\n\t\t| undefined;\n\t/**\n\t * A function to normalize the username\n\t *\n\t * @default (username) => username.toLowerCase()\n\t */\n\tusernameNormalization?: (((username: string) => string) | false) | undefined;\n\t/**\n\t * A function to normalize the display username\n\t *\n\t * @default false\n\t */\n\tdisplayUsernameNormalization?:\n\t\t| (((displayUsername: string) => string) | false)\n\t\t| undefined;\n\t/**\n\t * The order of validation\n\t *\n\t * @default { username: \"pre-normalization\", displayUsername: \"pre-normalization\" }\n\t */\n\tvalidationOrder?:\n\t\t| {\n\t\t\t\t/**\n\t\t\t\t * The order of username validation\n\t\t\t\t *\n\t\t\t\t * @default \"pre-normalization\"\n\t\t\t\t */\n\t\t\t\tusername?: \"pre-normalization\" | \"post-normalization\";\n\t\t\t\t/**\n\t\t\t\t * The order of display username validation\n\t\t\t\t *\n\t\t\t\t * @default \"pre-normalization\"\n\t\t\t\t */\n\t\t\t\tdisplayUsername?: \"pre-normalization\" | \"post-normalization\";\n\t\t }\n\t\t| undefined;\n};\n\nfunction defaultUsernameValidator(username: string) {\n\treturn /^[a-zA-Z0-9_.]+$/.test(username);\n}\n\nconst signInUsernameBodySchema = z.object({\n\tusername: z.string().meta({ description: \"The username of the user\" }),\n\tpassword: z.string().meta({ description: \"The password of the user\" }),\n\trememberMe: z\n\t\t.boolean()\n\t\t.meta({\n\t\t\tdescription: \"Remember the user session\",\n\t\t})\n\t\t.optional(),\n\tcallbackURL: z\n\t\t.string()\n\t\t.meta({\n\t\t\tdescription: \"The URL to redirect to after email verification\",\n\t\t})\n\t\t.optional(),\n});\n\nconst isUsernameAvailableBodySchema = z.object({\n\tusername: z.string().meta({\n\t\tdescription: \"The username to check\",\n\t}),\n});\n\nexport const username = (options?: UsernameOptions | undefined) => {\n\tconst normalizer = (username: string) => {\n\t\tif (options?.usernameNormalization === false) {\n\t\t\treturn username;\n\t\t}\n\t\tif (options?.usernameNormalization) {\n\t\t\treturn options.usernameNormalization(username);\n\t\t}\n\t\treturn username.toLowerCase();\n\t};\n\n\tconst displayUsernameNormalizer = (displayUsername: string) => {\n\t\treturn options?.displayUsernameNormalization\n\t\t\t? options.displayUsernameNormalization(displayUsername)\n\t\t\t: displayUsername;\n\t};\n\n\treturn {\n\t\tid: \"username\",\n\t\tinit(ctx) {\n\t\t\treturn {\n\t\t\t\toptions: {\n\t\t\t\t\tdatabaseHooks: {\n\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\tcreate: {\n\t\t\t\t\t\t\t\tasync before(user, context) {\n\t\t\t\t\t\t\t\t\tconst username =\n\t\t\t\t\t\t\t\t\t\t\"username\" in user ? (user.username as string) : null;\n\t\t\t\t\t\t\t\t\tconst displayUsername =\n\t\t\t\t\t\t\t\t\t\t\"displayUsername\" in user\n\t\t\t\t\t\t\t\t\t\t\t? (user.displayUsername as string)\n\t\t\t\t\t\t\t\t\t\t\t: null;\n\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t\t...user,\n\t\t\t\t\t\t\t\t\t\t\t...(username ? { username: normalizer(username) } : {}),\n\t\t\t\t\t\t\t\t\t\t\t...(displayUsername\n\t\t\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplayUsername:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplayUsernameNormalizer(displayUsername),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tupdate: {\n\t\t\t\t\t\t\t\tasync before(user, context) {\n\t\t\t\t\t\t\t\t\tconst username =\n\t\t\t\t\t\t\t\t\t\t\"username\" in user ? (user.username as string) : null;\n\t\t\t\t\t\t\t\t\tconst displayUsername =\n\t\t\t\t\t\t\t\t\t\t\"displayUsername\" in user\n\t\t\t\t\t\t\t\t\t\t\t? (user.displayUsername as string)\n\t\t\t\t\t\t\t\t\t\t\t: null;\n\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t\t...user,\n\t\t\t\t\t\t\t\t\t\t\t...(username ? { username: normalizer(username) } : {}),\n\t\t\t\t\t\t\t\t\t\t\t...(displayUsername\n\t\t\t\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplayUsername:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplayUsernameNormalizer(displayUsername),\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t};\n\t\t},\n\t\tendpoints: {\n\t\t\tsignInUsername: createAuthEndpoint(\n\t\t\t\t\"/sign-in/username\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: signInUsernameBodySchema,\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\topenapi: {\n\t\t\t\t\t\t\tsummary: \"Sign in with username\",\n\t\t\t\t\t\t\tdescription: \"Sign in with username\",\n\t\t\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\t\t200: {\n\t\t\t\t\t\t\t\t\tdescription: \"Success\",\n\t\t\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttoken: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"Session token for the authenticated session\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$ref: \"#/components/schemas/User\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\trequired: [\"token\", \"user\"],\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t422: {\n\t\t\t\t\t\t\t\t\tdescription: \"Unprocessable Entity. Validation error\",\n\t\t\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t\t\t\t\t\t\tproperties: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tmessage: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tif (!ctx.body.username || !ctx.body.password) {\n\t\t\t\t\t\tctx.context.logger.error(\"Username or password not found\");\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNAUTHORIZED\",\n\t\t\t\t\t\t\tERROR_CODES.INVALID_USERNAME_OR_PASSWORD,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst username =\n\t\t\t\t\t\toptions?.validationOrder?.username === \"pre-normalization\"\n\t\t\t\t\t\t\t? normalizer(ctx.body.username)\n\t\t\t\t\t\t\t: ctx.body.username;\n\n\t\t\t\t\tconst minUsernameLength = options?.minUsernameLength || 3;\n\t\t\t\t\tconst maxUsernameLength = options?.maxUsernameLength || 30;\n\n\t\t\t\t\tif (username.length < minUsernameLength) {\n\t\t\t\t\t\tctx.context.logger.error(\"Username too short\", {\n\t\t\t\t\t\t\tusername,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNPROCESSABLE_ENTITY\",\n\t\t\t\t\t\t\tERROR_CODES.USERNAME_TOO_SHORT,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (username.length > maxUsernameLength) {\n\t\t\t\t\t\tctx.context.logger.error(\"Username too long\", {\n\t\t\t\t\t\t\tusername,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNPROCESSABLE_ENTITY\",\n\t\t\t\t\t\t\tERROR_CODES.USERNAME_TOO_LONG,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst validator =\n\t\t\t\t\t\toptions?.usernameValidator || defaultUsernameValidator;\n\n\t\t\t\t\tconst valid = await validator(username);\n\t\t\t\t\tif (!valid) {\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNPROCESSABLE_ENTITY\",\n\t\t\t\t\t\t\tERROR_CODES.INVALID_USERNAME,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst user = await ctx.context.adapter.findOne<\n\t\t\t\t\t\tUser & { username: string; displayUsername: string }\n\t\t\t\t\t>({\n\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"username\",\n\t\t\t\t\t\t\t\tvalue: normalizer(username),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t\tif (!user) {\n\t\t\t\t\t\t// Hash password to prevent timing attacks from revealing valid usernames\n\t\t\t\t\t\t// By hashing passwords for invalid usernames, we ensure consistent response times\n\t\t\t\t\t\tawait ctx.context.password.hash(ctx.body.password);\n\t\t\t\t\t\tctx.context.logger.error(\"User not found\", {\n\t\t\t\t\t\t\tusername,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNAUTHORIZED\",\n\t\t\t\t\t\t\tERROR_CODES.INVALID_USERNAME_OR_PASSWORD,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst account = await ctx.context.adapter.findOne<Account>({\n\t\t\t\t\t\tmodel: \"account\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"userId\",\n\t\t\t\t\t\t\t\tvalue: user.id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"providerId\",\n\t\t\t\t\t\t\t\tvalue: \"credential\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t\tif (!account) {\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNAUTHORIZED\",\n\t\t\t\t\t\t\tERROR_CODES.INVALID_USERNAME_OR_PASSWORD,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst currentPassword = account?.password;\n\t\t\t\t\tif (!currentPassword) {\n\t\t\t\t\t\tctx.context.logger.error(\"Password not found\", {\n\t\t\t\t\t\t\tusername,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNAUTHORIZED\",\n\t\t\t\t\t\t\tERROR_CODES.INVALID_USERNAME_OR_PASSWORD,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst validPassword = await ctx.context.password.verify({\n\t\t\t\t\t\thash: currentPassword,\n\t\t\t\t\t\tpassword: ctx.body.password,\n\t\t\t\t\t});\n\t\t\t\t\tif (!validPassword) {\n\t\t\t\t\t\tctx.context.logger.error(\"Invalid password\");\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNAUTHORIZED\",\n\t\t\t\t\t\t\tERROR_CODES.INVALID_USERNAME_OR_PASSWORD,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tctx.context.options?.emailAndPassword?.requireEmailVerification &&\n\t\t\t\t\t\t!user.emailVerified\n\t\t\t\t\t) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!ctx.context.options?.emailVerification?.sendVerificationEmail\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tthrow APIError.from(\"FORBIDDEN\", ERROR_CODES.EMAIL_NOT_VERIFIED);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (ctx.context.options?.emailVerification?.sendOnSignIn) {\n\t\t\t\t\t\t\tconst token = await createEmailVerificationToken(\n\t\t\t\t\t\t\t\tctx.context.secret,\n\t\t\t\t\t\t\t\tuser.email,\n\t\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t\tctx.context.options.emailVerification?.expiresIn,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst url = `${ctx.context.baseURL}/verify-email?token=${token}&callbackURL=${\n\t\t\t\t\t\t\t\tctx.body.callbackURL || \"/\"\n\t\t\t\t\t\t\t}`;\n\t\t\t\t\t\t\tawait ctx.context.runInBackgroundOrAwait(\n\t\t\t\t\t\t\t\tctx.context.options.emailVerification.sendVerificationEmail(\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tuser: user,\n\t\t\t\t\t\t\t\t\t\turl,\n\t\t\t\t\t\t\t\t\t\ttoken,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tctx.request,\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthrow APIError.from(\"FORBIDDEN\", ERROR_CODES.EMAIL_NOT_VERIFIED);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst session = await ctx.context.internalAdapter.createSession(\n\t\t\t\t\t\tuser.id,\n\t\t\t\t\t\tctx.body.rememberMe === false,\n\t\t\t\t\t);\n\t\t\t\t\tif (!session) {\n\t\t\t\t\t\treturn ctx.json(null, {\n\t\t\t\t\t\t\tstatus: 500,\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\tmessage: BASE_ERROR_CODES.FAILED_TO_CREATE_SESSION.message,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tawait setSessionCookie(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\t{ session, user },\n\t\t\t\t\t\tctx.body.rememberMe === false,\n\t\t\t\t\t);\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\ttoken: session.token,\n\t\t\t\t\t\tuser: parseUserOutput(ctx.context.options, user),\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t\tisUsernameAvailable: createAuthEndpoint(\n\t\t\t\t\"/is-username-available\",\n\t\t\t\t{\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tbody: isUsernameAvailableBodySchema,\n\t\t\t\t},\n\t\t\t\tasync (ctx) => {\n\t\t\t\t\tconst username = ctx.body.username;\n\t\t\t\t\tif (!username) {\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNPROCESSABLE_ENTITY\",\n\t\t\t\t\t\t\tERROR_CODES.INVALID_USERNAME,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst minUsernameLength = options?.minUsernameLength || 3;\n\t\t\t\t\tconst maxUsernameLength = options?.maxUsernameLength || 30;\n\n\t\t\t\t\tif (username.length < minUsernameLength) {\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNPROCESSABLE_ENTITY\",\n\t\t\t\t\t\t\tERROR_CODES.USERNAME_TOO_SHORT,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (username.length > maxUsernameLength) {\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNPROCESSABLE_ENTITY\",\n\t\t\t\t\t\t\tERROR_CODES.USERNAME_TOO_LONG,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst validator =\n\t\t\t\t\t\toptions?.usernameValidator || defaultUsernameValidator;\n\n\t\t\t\t\tconst valid = await validator(username);\n\t\t\t\t\tif (!valid) {\n\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\"UNPROCESSABLE_ENTITY\",\n\t\t\t\t\t\t\tERROR_CODES.INVALID_USERNAME,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst user = await ctx.context.adapter.findOne<User>({\n\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfield: \"username\",\n\t\t\t\t\t\t\t\tvalue: normalizer(username),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t});\n\t\t\t\t\tif (user) {\n\t\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\t\tavailable: false,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn ctx.json({\n\t\t\t\t\t\tavailable: true,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t),\n\t\t},\n\t\tschema: mergeSchema(\n\t\t\tgetSchema({\n\t\t\t\tusername: normalizer,\n\t\t\t\tdisplayUsername: displayUsernameNormalizer,\n\t\t\t}),\n\t\t\toptions?.schema,\n\t\t),\n\t\thooks: {\n\t\t\tbefore: [\n\t\t\t\t{\n\t\t\t\t\tmatcher(context) {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tcontext.path === \"/sign-up/email\" ||\n\t\t\t\t\t\t\tcontext.path === \"/update-user\"\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\thandler: createAuthMiddleware(async (ctx) => {\n\t\t\t\t\t\tconst username =\n\t\t\t\t\t\t\ttypeof ctx.body.username === \"string\" &&\n\t\t\t\t\t\t\toptions?.validationOrder?.username === \"post-normalization\"\n\t\t\t\t\t\t\t\t? normalizer(ctx.body.username)\n\t\t\t\t\t\t\t\t: ctx.body.username;\n\n\t\t\t\t\t\tif (username !== undefined && typeof username === \"string\") {\n\t\t\t\t\t\t\tconst minUsernameLength = options?.minUsernameLength || 3;\n\t\t\t\t\t\t\tconst maxUsernameLength = options?.maxUsernameLength || 30;\n\t\t\t\t\t\t\tif (username.length < minUsernameLength) {\n\t\t\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\t\t\t\tERROR_CODES.USERNAME_TOO_SHORT,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (username.length > maxUsernameLength) {\n\t\t\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\t\t\t\tERROR_CODES.USERNAME_TOO_LONG,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst validator =\n\t\t\t\t\t\t\t\toptions?.usernameValidator || defaultUsernameValidator;\n\n\t\t\t\t\t\t\tconst valid = await validator(username);\n\t\t\t\t\t\t\tif (!valid) {\n\t\t\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\t\t\t\tERROR_CODES.INVALID_USERNAME,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst user = await ctx.context.adapter.findOne<User>({\n\t\t\t\t\t\t\t\tmodel: \"user\",\n\t\t\t\t\t\t\t\twhere: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tfield: \"username\",\n\t\t\t\t\t\t\t\t\t\tvalue: username,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst blockChangeSignUp = ctx.path === \"/sign-up/email\" && user;\n\t\t\t\t\t\t\tconst blockChangeUpdateUser =\n\t\t\t\t\t\t\t\tctx.path === \"/update-user\" &&\n\t\t\t\t\t\t\t\tuser &&\n\t\t\t\t\t\t\t\tctx.context.session &&\n\t\t\t\t\t\t\t\tuser.id !== ctx.context.session.session.userId;\n\t\t\t\t\t\t\tif (blockChangeSignUp || blockChangeUpdateUser) {\n\t\t\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\t\t\t\tERROR_CODES.USERNAME_IS_ALREADY_TAKEN,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst displayUsername =\n\t\t\t\t\t\t\ttypeof ctx.body.displayUsername === \"string\" &&\n\t\t\t\t\t\t\toptions?.validationOrder?.displayUsername === \"post-normalization\"\n\t\t\t\t\t\t\t\t? displayUsernameNormalizer(ctx.body.displayUsername)\n\t\t\t\t\t\t\t\t: ctx.body.displayUsername;\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tdisplayUsername !== undefined &&\n\t\t\t\t\t\t\ttypeof displayUsername === \"string\"\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (options?.displayUsernameValidator) {\n\t\t\t\t\t\t\t\tconst valid =\n\t\t\t\t\t\t\t\t\tawait options.displayUsernameValidator(displayUsername);\n\t\t\t\t\t\t\t\tif (!valid) {\n\t\t\t\t\t\t\t\t\tthrow APIError.from(\n\t\t\t\t\t\t\t\t\t\t\"BAD_REQUEST\",\n\t\t\t\t\t\t\t\t\t\tERROR_CODES.INVALID_DISPLAY_USERNAME,\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tmatcher(context) {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tcontext.path === \"/sign-up/email\" ||\n\t\t\t\t\t\t\tcontext.path === \"/update-user\"\n\t\t\t\t\t\t);\n\t\t\t\t\t},\n\t\t\t\t\thandler: createAuthMiddleware(async (ctx) => {\n\t\t\t\t\t\tif (ctx.body.username && !ctx.body.displayUsername) {\n\t\t\t\t\t\t\tctx.body.displayUsername = ctx.body.username;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (ctx.body.displayUsername && !ctx.body.username) {\n\t\t\t\t\t\t\tctx.body.username = ctx.body.displayUsername;\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\toptions,\n\t\t$ERROR_CODES: ERROR_CODES,\n\t} satisfies BetterAuthPlugin;\n};\n"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ //#region src/plugins/username/schema.d.ts
2
+ declare const getSchema: (normalizer: {
3
+ username: (username: string) => string;
4
+ displayUsername: (displayUsername: string) => string;
5
+ }) => BetterAuthPluginDBSchema;
6
+ type UsernameSchema = ReturnType<typeof getSchema>;
7
+ //#endregion
8
+ export { UsernameSchema };
9
+ //# sourceMappingURL=schema.d.mts.map
@@ -0,0 +1,26 @@
1
+ //#region src/plugins/username/schema.ts
2
+ const getSchema = (normalizer) => {
3
+ return { user: { fields: {
4
+ username: {
5
+ type: "string",
6
+ required: false,
7
+ sortable: true,
8
+ unique: true,
9
+ returned: true,
10
+ transform: { input(value) {
11
+ return typeof value !== "string" ? value : normalizer.username(value);
12
+ } }
13
+ },
14
+ displayUsername: {
15
+ type: "string",
16
+ required: false,
17
+ transform: { input(value) {
18
+ return typeof value !== "string" ? value : normalizer.displayUsername(value);
19
+ } }
20
+ }
21
+ } } };
22
+ };
23
+
24
+ //#endregion
25
+ export { getSchema };
26
+ //# sourceMappingURL=schema.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.mjs","names":[],"sources":["../../../src/plugins/username/schema.ts"],"sourcesContent":["import type { BetterAuthPluginDBSchema } from \"@better-auth/core/db\";\n\nexport const getSchema = (normalizer: {\n\tusername: (username: string) => string;\n\tdisplayUsername: (displayUsername: string) => string;\n}) => {\n\treturn {\n\t\tuser: {\n\t\t\tfields: {\n\t\t\t\tusername: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t\tsortable: true,\n\t\t\t\t\tunique: true,\n\t\t\t\t\treturned: true,\n\t\t\t\t\ttransform: {\n\t\t\t\t\t\tinput(value) {\n\t\t\t\t\t\t\treturn typeof value !== \"string\"\n\t\t\t\t\t\t\t\t? value\n\t\t\t\t\t\t\t\t: normalizer.username(value as string);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tdisplayUsername: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\trequired: false,\n\t\t\t\t\ttransform: {\n\t\t\t\t\t\tinput(value) {\n\t\t\t\t\t\t\treturn typeof value !== \"string\"\n\t\t\t\t\t\t\t\t? value\n\t\t\t\t\t\t\t\t: normalizer.displayUsername(value as string);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t} satisfies BetterAuthPluginDBSchema;\n};\n\nexport type UsernameSchema = ReturnType<typeof getSchema>;\n"],"mappings":";AAEA,MAAa,aAAa,eAGpB;AACL,QAAO,EACN,MAAM,EACL,QAAQ;EACP,UAAU;GACT,MAAM;GACN,UAAU;GACV,UAAU;GACV,QAAQ;GACR,UAAU;GACV,WAAW,EACV,MAAM,OAAO;AACZ,WAAO,OAAO,UAAU,WACrB,QACA,WAAW,SAAS,MAAgB;MAExC;GACD;EACD,iBAAiB;GAChB,MAAM;GACN,UAAU;GACV,WAAW,EACV,MAAM,OAAO;AACZ,WAAO,OAAO,UAAU,WACrB,QACA,WAAW,gBAAgB,MAAgB;MAE/C;GACD;EACD,EACD,EACD"}
@@ -0,0 +1 @@
1
+ export * from "@better-auth/core/social-providers";
@@ -0,0 +1,3 @@
1
+ export * from "@better-auth/core/social-providers"
2
+
3
+ export { };
@@ -0,0 +1,42 @@
1
+ import { GenericEndpointContext } from "@better-auth/core";
2
+ import { BetterAuthError } from "@better-auth/core/error";
3
+ import * as z from "zod";
4
+
5
+ //#region src/state.d.ts
6
+ declare const stateDataSchema: z.ZodObject<{
7
+ callbackURL: z.ZodString;
8
+ codeVerifier: z.ZodString;
9
+ errorURL: z.ZodOptional<z.ZodString>;
10
+ newUserURL: z.ZodOptional<z.ZodString>;
11
+ expiresAt: z.ZodNumber;
12
+ link: z.ZodOptional<z.ZodObject<{
13
+ email: z.ZodString;
14
+ userId: z.ZodCoercedString<unknown>;
15
+ }, z.core.$strip>>;
16
+ requestSignUp: z.ZodOptional<z.ZodBoolean>;
17
+ }, z.core.$loose>;
18
+ type StateData = z.infer<typeof stateDataSchema>;
19
+ declare function generateGenericState(c: GenericEndpointContext, stateData: StateData, settings?: {
20
+ cookieName: string;
21
+ }): Promise<{
22
+ state: any;
23
+ codeVerifier: string;
24
+ }>;
25
+ declare function parseGenericState(c: GenericEndpointContext, state: string, settings?: {
26
+ cookieName: string;
27
+ }): Promise<{
28
+ [x: string]: unknown;
29
+ callbackURL: string;
30
+ codeVerifier: string;
31
+ expiresAt: number;
32
+ errorURL?: string | undefined;
33
+ newUserURL?: string | undefined;
34
+ link?: {
35
+ email: string;
36
+ userId: string;
37
+ } | undefined;
38
+ requestSignUp?: boolean | undefined;
39
+ }>;
40
+ //#endregion
41
+ export { StateData, generateGenericState, parseGenericState };
42
+ //# sourceMappingURL=state.d.mts.map
package/dist/state.mjs ADDED
@@ -0,0 +1,107 @@
1
+ import { generateRandomString } from "./crypto/random.mjs";
2
+ import { symmetricDecrypt, symmetricEncrypt } from "./crypto/index.mjs";
3
+ import { expireCookie } from "./cookies/index.mjs";
4
+ import { BetterAuthError } from "@better-auth/core/error";
5
+ import * as z from "zod";
6
+
7
+ //#region src/state.ts
8
+ const stateDataSchema = z.looseObject({
9
+ callbackURL: z.string(),
10
+ codeVerifier: z.string(),
11
+ errorURL: z.string().optional(),
12
+ newUserURL: z.string().optional(),
13
+ expiresAt: z.number(),
14
+ link: z.object({
15
+ email: z.string(),
16
+ userId: z.coerce.string()
17
+ }).optional(),
18
+ requestSignUp: z.boolean().optional()
19
+ });
20
+ var StateError = class extends BetterAuthError {
21
+ code;
22
+ details;
23
+ constructor(message, options) {
24
+ super(message, options);
25
+ this.code = options.code;
26
+ this.details = options.details;
27
+ }
28
+ };
29
+ async function generateGenericState(c, stateData, settings) {
30
+ const state = generateRandomString(32);
31
+ if (c.context.oauthConfig.storeStateStrategy === "cookie") {
32
+ const encryptedData = await symmetricEncrypt({
33
+ key: c.context.secret,
34
+ data: JSON.stringify(stateData)
35
+ });
36
+ const stateCookie = c.context.createAuthCookie(settings?.cookieName ?? "oauth_state", { maxAge: 600 * 1e3 });
37
+ c.setCookie(stateCookie.name, encryptedData, stateCookie.attributes);
38
+ return {
39
+ state,
40
+ codeVerifier: stateData.codeVerifier
41
+ };
42
+ }
43
+ const stateCookie = c.context.createAuthCookie(settings?.cookieName ?? "state", { maxAge: 300 * 1e3 });
44
+ await c.setSignedCookie(stateCookie.name, state, c.context.secret, stateCookie.attributes);
45
+ const expiresAt = /* @__PURE__ */ new Date();
46
+ expiresAt.setMinutes(expiresAt.getMinutes() + 10);
47
+ const verification = await c.context.internalAdapter.createVerificationValue({
48
+ value: JSON.stringify(stateData),
49
+ identifier: state,
50
+ expiresAt
51
+ });
52
+ if (!verification) throw new StateError("Unable to create verification. Make sure the database adapter is properly working and there is a verification table in the database", { code: "state_generation_error" });
53
+ return {
54
+ state: verification.identifier,
55
+ codeVerifier: stateData.codeVerifier
56
+ };
57
+ }
58
+ async function parseGenericState(c, state, settings) {
59
+ const storeStateStrategy = c.context.oauthConfig.storeStateStrategy;
60
+ let parsedData;
61
+ if (storeStateStrategy === "cookie") {
62
+ const stateCookie = c.context.createAuthCookie(settings?.cookieName ?? "oauth_state");
63
+ const encryptedData = c.getCookie(stateCookie.name);
64
+ if (!encryptedData) throw new StateError("State mismatch: auth state cookie not found", {
65
+ code: "state_mismatch",
66
+ details: { state }
67
+ });
68
+ try {
69
+ const decryptedData = await symmetricDecrypt({
70
+ key: c.context.secret,
71
+ data: encryptedData
72
+ });
73
+ parsedData = stateDataSchema.parse(JSON.parse(decryptedData));
74
+ } catch (error) {
75
+ throw new StateError("State invalid: Failed to decrypt or parse auth state", {
76
+ code: "state_invalid",
77
+ details: { state },
78
+ cause: error
79
+ });
80
+ }
81
+ expireCookie(c, stateCookie);
82
+ } else {
83
+ const data = await c.context.internalAdapter.findVerificationValue(state);
84
+ if (!data) throw new StateError("State mismatch: verification not found", {
85
+ code: "state_mismatch",
86
+ details: { state }
87
+ });
88
+ parsedData = stateDataSchema.parse(JSON.parse(data.value));
89
+ const stateCookie = c.context.createAuthCookie(settings?.cookieName ?? "state");
90
+ const stateCookieValue = await c.getSignedCookie(stateCookie.name, c.context.secret);
91
+ if (!c.context.oauthConfig.skipStateCookieCheck && (!stateCookieValue || stateCookieValue !== state)) throw new StateError("State mismatch: State not persisted correctly", {
92
+ code: "state_security_mismatch",
93
+ details: { state }
94
+ });
95
+ expireCookie(c, stateCookie);
96
+ await c.context.internalAdapter.deleteVerificationValue(data.id);
97
+ }
98
+ if (parsedData.expiresAt < Date.now()) throw new StateError("Invalid state: request expired", {
99
+ code: "state_mismatch",
100
+ details: { expiresAt: parsedData.expiresAt }
101
+ });
102
+ return parsedData;
103
+ }
104
+
105
+ //#endregion
106
+ export { StateError, generateGenericState, parseGenericState };
107
+ //# sourceMappingURL=state.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.mjs","names":[],"sources":["../src/state.ts"],"sourcesContent":["import type { GenericEndpointContext } from \"@better-auth/core\";\nimport { BetterAuthError } from \"@better-auth/core/error\";\nimport * as z from \"zod\";\nimport { expireCookie } from \"./cookies\";\nimport {\n\tgenerateRandomString,\n\tsymmetricDecrypt,\n\tsymmetricEncrypt,\n} from \"./crypto\";\n\nconst stateDataSchema = z.looseObject({\n\tcallbackURL: z.string(),\n\tcodeVerifier: z.string(),\n\terrorURL: z.string().optional(),\n\tnewUserURL: z.string().optional(),\n\texpiresAt: z.number(),\n\tlink: z\n\t\t.object({\n\t\t\temail: z.string(),\n\t\t\tuserId: z.coerce.string(),\n\t\t})\n\t\t.optional(),\n\trequestSignUp: z.boolean().optional(),\n});\n\nexport type StateData = z.infer<typeof stateDataSchema>;\n\nexport type StateErrorCode =\n\t| \"state_generation_error\"\n\t| \"state_invalid\"\n\t| \"state_mismatch\"\n\t| \"state_security_mismatch\";\n\nexport class StateError extends BetterAuthError {\n\tcode: string;\n\tdetails?: Record<string, any>;\n\n\tconstructor(\n\t\tmessage: string,\n\t\toptions: ErrorOptions & {\n\t\t\tcode: StateErrorCode;\n\t\t\tdetails?: Record<string, any>;\n\t\t},\n\t) {\n\t\tsuper(message, options);\n\t\tthis.code = options.code;\n\t\tthis.details = options.details;\n\t}\n}\n\nexport async function generateGenericState(\n\tc: GenericEndpointContext,\n\tstateData: StateData,\n\tsettings?: { cookieName: string },\n) {\n\tconst state = generateRandomString(32);\n\tconst storeStateStrategy = c.context.oauthConfig.storeStateStrategy;\n\n\tif (storeStateStrategy === \"cookie\") {\n\t\t// Store state data in an encrypted cookie\n\n\t\tconst encryptedData = await symmetricEncrypt({\n\t\t\tkey: c.context.secret,\n\t\t\tdata: JSON.stringify(stateData),\n\t\t});\n\n\t\tconst stateCookie = c.context.createAuthCookie(\n\t\t\tsettings?.cookieName ?? \"oauth_state\",\n\t\t\t{\n\t\t\t\tmaxAge: 10 * 60 * 1000, // 10 minutes\n\t\t\t},\n\t\t);\n\n\t\tc.setCookie(stateCookie.name, encryptedData, stateCookie.attributes);\n\n\t\treturn {\n\t\t\tstate,\n\t\t\tcodeVerifier: stateData.codeVerifier,\n\t\t};\n\t}\n\n\t// Default: database strategy\n\n\tconst stateCookie = c.context.createAuthCookie(\n\t\tsettings?.cookieName ?? \"state\",\n\t\t{\n\t\t\tmaxAge: 5 * 60 * 1000, // 5 minutes\n\t\t},\n\t);\n\n\tawait c.setSignedCookie(\n\t\tstateCookie.name,\n\t\tstate,\n\t\tc.context.secret,\n\t\tstateCookie.attributes,\n\t);\n\n\tconst expiresAt = new Date();\n\texpiresAt.setMinutes(expiresAt.getMinutes() + 10);\n\n\tconst verification = await c.context.internalAdapter.createVerificationValue({\n\t\tvalue: JSON.stringify(stateData),\n\t\tidentifier: state,\n\t\texpiresAt,\n\t});\n\n\tif (!verification) {\n\t\tthrow new StateError(\n\t\t\t\"Unable to create verification. Make sure the database adapter is properly working and there is a verification table in the database\",\n\t\t\t{\n\t\t\t\tcode: \"state_generation_error\",\n\t\t\t},\n\t\t);\n\t}\n\n\treturn {\n\t\tstate: verification.identifier,\n\t\tcodeVerifier: stateData.codeVerifier,\n\t};\n}\n\nexport async function parseGenericState(\n\tc: GenericEndpointContext,\n\tstate: string,\n\tsettings?: { cookieName: string },\n) {\n\tconst storeStateStrategy = c.context.oauthConfig.storeStateStrategy;\n\tlet parsedData: StateData;\n\n\tif (storeStateStrategy === \"cookie\") {\n\t\t// Retrieve state data from encrypted cookie\n\t\tconst stateCookie = c.context.createAuthCookie(\n\t\t\tsettings?.cookieName ?? \"oauth_state\",\n\t\t);\n\t\tconst encryptedData = c.getCookie(stateCookie.name);\n\n\t\tif (!encryptedData) {\n\t\t\tthrow new StateError(\"State mismatch: auth state cookie not found\", {\n\t\t\t\tcode: \"state_mismatch\",\n\t\t\t\tdetails: { state },\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst decryptedData = await symmetricDecrypt({\n\t\t\t\tkey: c.context.secret,\n\t\t\t\tdata: encryptedData,\n\t\t\t});\n\n\t\t\tparsedData = stateDataSchema.parse(JSON.parse(decryptedData));\n\t\t} catch (error) {\n\t\t\tthrow new StateError(\n\t\t\t\t\"State invalid: Failed to decrypt or parse auth state\",\n\t\t\t\t{\n\t\t\t\t\tcode: \"state_invalid\",\n\t\t\t\t\tdetails: { state },\n\t\t\t\t\tcause: error,\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\t// Clear the cookie after successful parsing\n\t\texpireCookie(c, stateCookie);\n\t} else {\n\t\t// Default: database strategy\n\t\tconst data = await c.context.internalAdapter.findVerificationValue(state);\n\t\tif (!data) {\n\t\t\tthrow new StateError(\"State mismatch: verification not found\", {\n\t\t\t\tcode: \"state_mismatch\",\n\t\t\t\tdetails: { state },\n\t\t\t});\n\t\t}\n\n\t\tparsedData = stateDataSchema.parse(JSON.parse(data.value));\n\n\t\tconst stateCookie = c.context.createAuthCookie(\n\t\t\tsettings?.cookieName ?? \"state\",\n\t\t);\n\n\t\tconst stateCookieValue = await c.getSignedCookie(\n\t\t\tstateCookie.name,\n\t\t\tc.context.secret,\n\t\t);\n\n\t\t/**\n\t\t * This is generally cause security issue and should only be used in\n\t\t * dev or staging environments. It's currently used by the oauth-proxy\n\t\t * plugin\n\t\t */\n\t\tconst skipStateCookieCheck = c.context.oauthConfig.skipStateCookieCheck;\n\t\tif (\n\t\t\t!skipStateCookieCheck &&\n\t\t\t(!stateCookieValue || stateCookieValue !== state)\n\t\t) {\n\t\t\tthrow new StateError(\"State mismatch: State not persisted correctly\", {\n\t\t\t\tcode: \"state_security_mismatch\",\n\t\t\t\tdetails: { state },\n\t\t\t});\n\t\t}\n\n\t\texpireCookie(c, stateCookie);\n\n\t\t// Delete verification value after retrieval\n\t\tawait c.context.internalAdapter.deleteVerificationValue(data.id);\n\t}\n\n\t// Check expiration\n\tif (parsedData.expiresAt < Date.now()) {\n\t\tthrow new StateError(\"Invalid state: request expired\", {\n\t\t\tcode: \"state_mismatch\",\n\t\t\tdetails: {\n\t\t\t\texpiresAt: parsedData.expiresAt,\n\t\t\t},\n\t\t});\n\t}\n\n\treturn parsedData;\n}\n"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ //#region src/test-utils/headers.d.ts
2
+ /**
3
+ * converts set cookie containing headers to
4
+ * cookie containing headers
5
+ */
6
+ declare function convertSetCookieToCookie(headers: Headers): Headers;
7
+ //#endregion
8
+ export { convertSetCookieToCookie };
9
+ //# sourceMappingURL=headers.d.mts.map
@@ -0,0 +1,24 @@
1
+ //#region src/test-utils/headers.ts
2
+ /**
3
+ * converts set cookie containing headers to
4
+ * cookie containing headers
5
+ */
6
+ function convertSetCookieToCookie(headers) {
7
+ const setCookieHeaders = [];
8
+ headers.forEach((value, name) => {
9
+ if (name.toLowerCase() === "set-cookie") setCookieHeaders.push(value);
10
+ });
11
+ if (setCookieHeaders.length === 0) return headers;
12
+ const existingCookies = headers.get("cookie") || "";
13
+ const cookies = existingCookies ? existingCookies.split("; ") : [];
14
+ setCookieHeaders.forEach((setCookie) => {
15
+ const cookiePair = setCookie.split(";")[0];
16
+ cookies.push(cookiePair.trim());
17
+ });
18
+ headers.set("cookie", cookies.join("; "));
19
+ return headers;
20
+ }
21
+
22
+ //#endregion
23
+ export { convertSetCookieToCookie };
24
+ //# sourceMappingURL=headers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.mjs","names":[],"sources":["../../src/test-utils/headers.ts"],"sourcesContent":["/**\n * converts set cookie containing headers to\n * cookie containing headers\n */\nexport function convertSetCookieToCookie(headers: Headers): Headers {\n\tconst setCookieHeaders: string[] = [];\n\theaders.forEach((value, name) => {\n\t\tif (name.toLowerCase() === \"set-cookie\") {\n\t\t\tsetCookieHeaders.push(value);\n\t\t}\n\t});\n\n\tif (setCookieHeaders.length === 0) {\n\t\treturn headers;\n\t}\n\n\tconst existingCookies = headers.get(\"cookie\") || \"\";\n\tconst cookies = existingCookies ? existingCookies.split(\"; \") : [];\n\n\tsetCookieHeaders.forEach((setCookie) => {\n\t\tconst cookiePair = setCookie.split(\";\")[0]!;\n\t\tcookies.push(cookiePair.trim());\n\t});\n\n\theaders.set(\"cookie\", cookies.join(\"; \"));\n\n\treturn headers;\n}\n"],"mappings":";;;;;AAIA,SAAgB,yBAAyB,SAA2B;CACnE,MAAM,mBAA6B,EAAE;AACrC,SAAQ,SAAS,OAAO,SAAS;AAChC,MAAI,KAAK,aAAa,KAAK,aAC1B,kBAAiB,KAAK,MAAM;GAE5B;AAEF,KAAI,iBAAiB,WAAW,EAC/B,QAAO;CAGR,MAAM,kBAAkB,QAAQ,IAAI,SAAS,IAAI;CACjD,MAAM,UAAU,kBAAkB,gBAAgB,MAAM,KAAK,GAAG,EAAE;AAElE,kBAAiB,SAAS,cAAc;EACvC,MAAM,aAAa,UAAU,MAAM,IAAI,CAAC;AACxC,UAAQ,KAAK,WAAW,MAAM,CAAC;GAC9B;AAEF,SAAQ,IAAI,UAAU,QAAQ,KAAK,KAAK,CAAC;AAEzC,QAAO"}
@@ -0,0 +1,3 @@
1
+ import { convertSetCookieToCookie } from "./headers.mjs";
2
+ import { getTestInstance } from "./test-instance.mjs";
3
+ export { convertSetCookieToCookie, getTestInstance };
@@ -0,0 +1,4 @@
1
+ import { convertSetCookieToCookie } from "./headers.mjs";
2
+ import { getTestInstance } from "./test-instance.mjs";
3
+
4
+ export { convertSetCookieToCookie, getTestInstance };