@masheev/better-auth 0.0.0-stage → 1.7.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (465) hide show
  1. package/LICENSE.md +20 -0
  2. package/README.md +31 -2
  3. package/TYPE-PATCH-NOTICE.md +9 -0
  4. package/TYPE-PATCH-PROVENANCE.json +267 -0
  5. package/dist/_virtual/_rolldown/runtime.mjs +27 -0
  6. package/dist/adapters/drizzle-adapter/index.d.mts +1 -0
  7. package/dist/adapters/drizzle-adapter/index.mjs +2 -0
  8. package/dist/adapters/index.d.mts +26 -0
  9. package/dist/adapters/index.mjs +9 -0
  10. package/dist/adapters/kysely-adapter/index.d.mts +1 -0
  11. package/dist/adapters/kysely-adapter/index.mjs +2 -0
  12. package/dist/adapters/memory-adapter/index.d.mts +1 -0
  13. package/dist/adapters/memory-adapter/index.mjs +2 -0
  14. package/dist/adapters/mongodb-adapter/index.d.mts +1 -0
  15. package/dist/adapters/mongodb-adapter/index.mjs +2 -0
  16. package/dist/adapters/prisma-adapter/index.d.mts +1 -0
  17. package/dist/adapters/prisma-adapter/index.mjs +2 -0
  18. package/dist/api/dispatch.d.mts +34 -0
  19. package/dist/api/dispatch.mjs +275 -0
  20. package/dist/api/index.d.mts +4053 -0
  21. package/dist/api/index.mjs +220 -0
  22. package/dist/api/middlewares/authorization.d.mts +69 -0
  23. package/dist/api/middlewares/authorization.mjs +78 -0
  24. package/dist/api/middlewares/index.d.mts +2 -0
  25. package/dist/api/middlewares/origin-check.d.mts +17 -0
  26. package/dist/api/middlewares/origin-check.mjs +155 -0
  27. package/dist/api/rate-limiter/index.mjs +318 -0
  28. package/dist/api/routes/account.d.mts +413 -0
  29. package/dist/api/routes/account.mjs +619 -0
  30. package/dist/api/routes/callback.d.mts +32 -0
  31. package/dist/api/routes/callback.mjs +261 -0
  32. package/dist/api/routes/email-verification.d.mts +160 -0
  33. package/dist/api/routes/email-verification.mjs +324 -0
  34. package/dist/api/routes/error.d.mts +27 -0
  35. package/dist/api/routes/error.mjs +387 -0
  36. package/dist/api/routes/index.d.mts +12 -0
  37. package/dist/api/routes/ok.d.mts +35 -0
  38. package/dist/api/routes/ok.mjs +27 -0
  39. package/dist/api/routes/password.d.mts +182 -0
  40. package/dist/api/routes/password.mjs +206 -0
  41. package/dist/api/routes/session.d.mts +450 -0
  42. package/dist/api/routes/session.mjs +481 -0
  43. package/dist/api/routes/sign-in.d.mts +186 -0
  44. package/dist/api/routes/sign-in.mjs +368 -0
  45. package/dist/api/routes/sign-out.d.mts +51 -0
  46. package/dist/api/routes/sign-out.mjs +96 -0
  47. package/dist/api/routes/sign-up.d.mts +159 -0
  48. package/dist/api/routes/sign-up.mjs +275 -0
  49. package/dist/api/routes/update-session.d.mts +74 -0
  50. package/dist/api/routes/update-session.mjs +57 -0
  51. package/dist/api/routes/update-user.d.mts +428 -0
  52. package/dist/api/routes/update-user.mjs +522 -0
  53. package/dist/api/state/oauth.d.mts +53 -0
  54. package/dist/api/state/oauth.mjs +38 -0
  55. package/dist/api/state/should-session-refresh.d.mts +12 -0
  56. package/dist/api/state/should-session-refresh.mjs +13 -0
  57. package/dist/api/to-auth-endpoints.mjs +60 -0
  58. package/dist/auth/base.mjs +66 -0
  59. package/dist/auth/full.d.mts +28 -0
  60. package/dist/auth/full.mjs +29 -0
  61. package/dist/auth/minimal.d.mts +10 -0
  62. package/dist/auth/minimal.mjs +11 -0
  63. package/dist/auth/trusted-origins.mjs +106 -0
  64. package/dist/client/broadcast-channel.d.mts +19 -0
  65. package/dist/client/broadcast-channel.mjs +44 -0
  66. package/dist/client/config.d.mts +90 -0
  67. package/dist/client/config.mjs +113 -0
  68. package/dist/client/equality.d.mts +19 -0
  69. package/dist/client/equality.mjs +42 -0
  70. package/dist/client/fetch-plugins.mjs +17 -0
  71. package/dist/client/focus-manager.d.mts +10 -0
  72. package/dist/client/focus-manager.mjs +30 -0
  73. package/dist/client/index.d.mts +35 -0
  74. package/dist/client/index.mjs +22 -0
  75. package/dist/client/lynx/index.d.mts +43 -0
  76. package/dist/client/lynx/index.mjs +22 -0
  77. package/dist/client/lynx/lynx-store.d.mts +46 -0
  78. package/dist/client/lynx/lynx-store.mjs +44 -0
  79. package/dist/client/online-manager.d.mts +11 -0
  80. package/dist/client/online-manager.mjs +33 -0
  81. package/dist/client/parser.d.mts +10 -0
  82. package/dist/client/parser.mjs +70 -0
  83. package/dist/client/path-to-object.d.mts +113 -0
  84. package/dist/client/plugins/index.d.mts +44 -0
  85. package/dist/client/plugins/index.mjs +30 -0
  86. package/dist/client/plugins/infer-plugin.d.mts +16 -0
  87. package/dist/client/plugins/infer-plugin.mjs +11 -0
  88. package/dist/client/proxy.mjs +78 -0
  89. package/dist/client/query.d.mts +23 -0
  90. package/dist/client/query.mjs +124 -0
  91. package/dist/client/react/index.d.mts +44 -0
  92. package/dist/client/react/index.mjs +22 -0
  93. package/dist/client/react/react-store.d.mts +46 -0
  94. package/dist/client/react/react-store.mjs +44 -0
  95. package/dist/client/session-atom.d.mts +11 -0
  96. package/dist/client/session-atom.mjs +178 -0
  97. package/dist/client/session-refresh.d.mts +20 -0
  98. package/dist/client/session-refresh.mjs +131 -0
  99. package/dist/client/solid/index.d.mts +44 -0
  100. package/dist/client/solid/index.mjs +22 -0
  101. package/dist/client/solid/solid-store.mjs +21 -0
  102. package/dist/client/svelte/index.d.mts +44 -0
  103. package/dist/client/svelte/index.mjs +18 -0
  104. package/dist/client/types.d.mts +51 -0
  105. package/dist/client/vanilla.d.mts +42 -0
  106. package/dist/client/vanilla.mjs +18 -0
  107. package/dist/client/vue/index.d.mts +67 -0
  108. package/dist/client/vue/index.mjs +54 -0
  109. package/dist/client/vue/vue-store.mjs +23 -0
  110. package/dist/context/create-context.mjs +235 -0
  111. package/dist/context/helpers.mjs +158 -0
  112. package/dist/context/init-minimal.mjs +17 -0
  113. package/dist/context/init.mjs +19 -0
  114. package/dist/context/secret-utils.mjs +53 -0
  115. package/dist/context/store-capabilities.mjs +12 -0
  116. package/dist/cookies/cache.mjs +33 -0
  117. package/dist/cookies/cookie-utils.d.mts +72 -0
  118. package/dist/cookies/cookie-utils.mjs +203 -0
  119. package/dist/cookies/index.d.mts +124 -0
  120. package/dist/cookies/index.mjs +350 -0
  121. package/dist/cookies/jwt.mjs +44 -0
  122. package/dist/cookies/session-store.d.mts +32 -0
  123. package/dist/cookies/session-store.mjs +183 -0
  124. package/dist/crypto/buffer.d.mts +7 -0
  125. package/dist/crypto/buffer.mjs +16 -0
  126. package/dist/crypto/index.d.mts +32 -0
  127. package/dist/crypto/index.mjs +69 -0
  128. package/dist/crypto/jwt.d.mts +9 -0
  129. package/dist/crypto/jwt.mjs +141 -0
  130. package/dist/crypto/password.d.mts +13 -0
  131. package/dist/crypto/password.mjs +14 -0
  132. package/dist/crypto/random.d.mts +4 -0
  133. package/dist/crypto/random.mjs +5 -0
  134. package/dist/db/adapter-base.d.mts +7 -0
  135. package/dist/db/adapter-base.mjs +25 -0
  136. package/dist/db/adapter-kysely.d.mts +7 -0
  137. package/dist/db/adapter-kysely.mjs +17 -0
  138. package/dist/db/field-converter.d.mts +7 -0
  139. package/dist/db/field-converter.mjs +19 -0
  140. package/dist/db/field.d.mts +41 -0
  141. package/dist/db/get-migration.d.mts +56 -0
  142. package/dist/db/get-migration.mjs +685 -0
  143. package/dist/db/get-schema.d.mts +13 -0
  144. package/dist/db/get-schema.mjs +39 -0
  145. package/dist/db/index.d.mts +10 -0
  146. package/dist/db/index.mjs +35 -0
  147. package/dist/db/internal-adapter.d.mts +14 -0
  148. package/dist/db/internal-adapter.mjs +951 -0
  149. package/dist/db/revoke-unproven-account-access.d.mts +21 -0
  150. package/dist/db/revoke-unproven-account-access.mjs +58 -0
  151. package/dist/db/schema.d.mts +62 -0
  152. package/dist/db/schema.mjs +161 -0
  153. package/dist/db/to-zod.d.mts +35 -0
  154. package/dist/db/to-zod.mjs +23 -0
  155. package/dist/db/verification-token-storage.mjs +25 -0
  156. package/dist/db/with-hooks.d.mts +37 -0
  157. package/dist/db/with-hooks.mjs +255 -0
  158. package/dist/index.d.mts +30 -0
  159. package/dist/index.mjs +17 -0
  160. package/dist/integrations/cookie-plugin-guard.mjs +18 -0
  161. package/dist/integrations/next-js.d.mts +29 -0
  162. package/dist/integrations/next-js.mjs +105 -0
  163. package/dist/integrations/node.d.mts +11 -0
  164. package/dist/integrations/node.mjs +13 -0
  165. package/dist/integrations/solid-start.d.mts +22 -0
  166. package/dist/integrations/solid-start.mjs +15 -0
  167. package/dist/integrations/svelte-kit.d.mts +38 -0
  168. package/dist/integrations/svelte-kit.mjs +57 -0
  169. package/dist/integrations/tanstack-start-solid.d.mts +33 -0
  170. package/dist/integrations/tanstack-start-solid.mjs +57 -0
  171. package/dist/integrations/tanstack-start.d.mts +33 -0
  172. package/dist/integrations/tanstack-start.mjs +57 -0
  173. package/dist/oauth2/account-key.mjs +43 -0
  174. package/dist/oauth2/errors.mjs +49 -0
  175. package/dist/oauth2/index.d.mts +5 -0
  176. package/dist/oauth2/index.mjs +5 -0
  177. package/dist/oauth2/link-account.d.mts +96 -0
  178. package/dist/oauth2/link-account.mjs +329 -0
  179. package/dist/oauth2/state.d.mts +54 -0
  180. package/dist/oauth2/state.mjs +67 -0
  181. package/dist/oauth2/utils.d.mts +11 -0
  182. package/dist/oauth2/utils.mjs +33 -0
  183. package/dist/package.mjs +4 -0
  184. package/dist/plugins/access/access.d.mts +17 -0
  185. package/dist/plugins/access/access.mjs +78 -0
  186. package/dist/plugins/access/index.d.mts +3 -0
  187. package/dist/plugins/access/index.mjs +2 -0
  188. package/dist/plugins/access/types.d.mts +24 -0
  189. package/dist/plugins/additional-fields/client.d.mts +100 -0
  190. package/dist/plugins/additional-fields/client.mjs +11 -0
  191. package/dist/plugins/admin/access/index.d.mts +2 -0
  192. package/dist/plugins/admin/access/index.mjs +2 -0
  193. package/dist/plugins/admin/access/statement.d.mts +51 -0
  194. package/dist/plugins/admin/access/statement.mjs +52 -0
  195. package/dist/plugins/admin/admin.d.mts +911 -0
  196. package/dist/plugins/admin/admin.mjs +89 -0
  197. package/dist/plugins/admin/client.d.mts +81 -0
  198. package/dist/plugins/admin/client.mjs +39 -0
  199. package/dist/plugins/admin/error-codes.d.mts +30 -0
  200. package/dist/plugins/admin/error-codes.mjs +29 -0
  201. package/dist/plugins/admin/has-permission.mjs +12 -0
  202. package/dist/plugins/admin/index.d.mts +3 -0
  203. package/dist/plugins/admin/index.mjs +2 -0
  204. package/dist/plugins/admin/routes.mjs +919 -0
  205. package/dist/plugins/admin/schema.d.mts +40 -0
  206. package/dist/plugins/admin/schema.mjs +33 -0
  207. package/dist/plugins/admin/types.d.mts +88 -0
  208. package/dist/plugins/anonymous/client.d.mts +32 -0
  209. package/dist/plugins/anonymous/client.mjs +21 -0
  210. package/dist/plugins/anonymous/error-codes.d.mts +15 -0
  211. package/dist/plugins/anonymous/error-codes.mjs +14 -0
  212. package/dist/plugins/anonymous/index.d.mts +175 -0
  213. package/dist/plugins/anonymous/index.mjs +219 -0
  214. package/dist/plugins/anonymous/schema.d.mts +15 -0
  215. package/dist/plugins/anonymous/schema.mjs +9 -0
  216. package/dist/plugins/anonymous/types.d.mts +65 -0
  217. package/dist/plugins/bearer/index.d.mts +45 -0
  218. package/dist/plugins/bearer/index.mjs +74 -0
  219. package/dist/plugins/captcha/constants.d.mts +9 -0
  220. package/dist/plugins/captcha/constants.mjs +27 -0
  221. package/dist/plugins/captcha/error-codes.mjs +13 -0
  222. package/dist/plugins/captcha/index.d.mts +27 -0
  223. package/dist/plugins/captcha/index.mjs +79 -0
  224. package/dist/plugins/captcha/types.d.mts +52 -0
  225. package/dist/plugins/captcha/utils.mjs +9 -0
  226. package/dist/plugins/captcha/verify-handlers/captchafox.mjs +27 -0
  227. package/dist/plugins/captcha/verify-handlers/cloudflare-turnstile.mjs +47 -0
  228. package/dist/plugins/captcha/verify-handlers/google-recaptcha.mjs +32 -0
  229. package/dist/plugins/captcha/verify-handlers/h-captcha.mjs +27 -0
  230. package/dist/plugins/custom-session/client.d.mts +17 -0
  231. package/dist/plugins/custom-session/client.mjs +7 -0
  232. package/dist/plugins/custom-session/index.d.mts +73 -0
  233. package/dist/plugins/custom-session/index.mjs +65 -0
  234. package/dist/plugins/device-authorization/client.d.mts +17 -0
  235. package/dist/plugins/device-authorization/client.mjs +18 -0
  236. package/dist/plugins/device-authorization/error-codes.mjs +19 -0
  237. package/dist/plugins/device-authorization/index.d.mts +558 -0
  238. package/dist/plugins/device-authorization/index.mjs +87 -0
  239. package/dist/plugins/device-authorization/routes.d.mts +32 -0
  240. package/dist/plugins/device-authorization/routes.mjs +725 -0
  241. package/dist/plugins/device-authorization/schema.d.mts +18 -0
  242. package/dist/plugins/device-authorization/schema.mjs +63 -0
  243. package/dist/plugins/email-otp/client.d.mts +21 -0
  244. package/dist/plugins/email-otp/client.mjs +17 -0
  245. package/dist/plugins/email-otp/error-codes.d.mts +10 -0
  246. package/dist/plugins/email-otp/error-codes.mjs +9 -0
  247. package/dist/plugins/email-otp/index.d.mts +551 -0
  248. package/dist/plugins/email-otp/index.mjs +145 -0
  249. package/dist/plugins/email-otp/otp-token.mjs +55 -0
  250. package/dist/plugins/email-otp/routes.mjs +784 -0
  251. package/dist/plugins/email-otp/types.d.mts +109 -0
  252. package/dist/plugins/email-otp/utils.mjs +17 -0
  253. package/dist/plugins/generic-oauth/error-codes.mjs +8 -0
  254. package/dist/plugins/generic-oauth/index.d.mts +52 -0
  255. package/dist/plugins/generic-oauth/index.mjs +279 -0
  256. package/dist/plugins/generic-oauth/providers/auth0.d.mts +36 -0
  257. package/dist/plugins/generic-oauth/providers/auth0.mjs +49 -0
  258. package/dist/plugins/generic-oauth/providers/gumroad.d.mts +31 -0
  259. package/dist/plugins/generic-oauth/providers/gumroad.mjs +62 -0
  260. package/dist/plugins/generic-oauth/providers/hubspot.d.mts +36 -0
  261. package/dist/plugins/generic-oauth/providers/hubspot.mjs +62 -0
  262. package/dist/plugins/generic-oauth/providers/index.d.mts +10 -0
  263. package/dist/plugins/generic-oauth/providers/keycloak.d.mts +36 -0
  264. package/dist/plugins/generic-oauth/providers/keycloak.mjs +47 -0
  265. package/dist/plugins/generic-oauth/providers/line.d.mts +54 -0
  266. package/dist/plugins/generic-oauth/providers/line.mjs +93 -0
  267. package/dist/plugins/generic-oauth/providers/microsoft-entra-id.d.mts +39 -0
  268. package/dist/plugins/generic-oauth/providers/microsoft-entra-id.mjs +104 -0
  269. package/dist/plugins/generic-oauth/providers/okta.d.mts +36 -0
  270. package/dist/plugins/generic-oauth/providers/okta.mjs +47 -0
  271. package/dist/plugins/generic-oauth/providers/patreon.d.mts +29 -0
  272. package/dist/plugins/generic-oauth/providers/patreon.mjs +61 -0
  273. package/dist/plugins/generic-oauth/providers/slack.d.mts +29 -0
  274. package/dist/plugins/generic-oauth/providers/slack.mjs +63 -0
  275. package/dist/plugins/generic-oauth/providers/yandex.d.mts +29 -0
  276. package/dist/plugins/generic-oauth/providers/yandex.mjs +67 -0
  277. package/dist/plugins/generic-oauth/types.d.mts +268 -0
  278. package/dist/plugins/haveibeenpwned/index.d.mts +63 -0
  279. package/dist/plugins/haveibeenpwned/index.mjs +81 -0
  280. package/dist/plugins/index.d.mts +69 -0
  281. package/dist/plugins/index.mjs +49 -0
  282. package/dist/plugins/jwt/adapter.mjs +68 -0
  283. package/dist/plugins/jwt/client.d.mts +41 -0
  284. package/dist/plugins/jwt/client.mjs +19 -0
  285. package/dist/plugins/jwt/cookie-cache.mjs +77 -0
  286. package/dist/plugins/jwt/index.d.mts +246 -0
  287. package/dist/plugins/jwt/index.mjs +214 -0
  288. package/dist/plugins/jwt/schema.d.mts +33 -0
  289. package/dist/plugins/jwt/schema.mjs +29 -0
  290. package/dist/plugins/jwt/sign.d.mts +128 -0
  291. package/dist/plugins/jwt/sign.mjs +130 -0
  292. package/dist/plugins/jwt/types.d.mts +256 -0
  293. package/dist/plugins/jwt/utils.d.mts +41 -0
  294. package/dist/plugins/jwt/utils.mjs +64 -0
  295. package/dist/plugins/jwt/verify.d.mts +11 -0
  296. package/dist/plugins/jwt/verify.mjs +45 -0
  297. package/dist/plugins/last-login-method/client.d.mts +48 -0
  298. package/dist/plugins/last-login-method/client.mjs +48 -0
  299. package/dist/plugins/last-login-method/index.d.mts +127 -0
  300. package/dist/plugins/last-login-method/index.mjs +98 -0
  301. package/dist/plugins/magic-link/client.d.mts +10 -0
  302. package/dist/plugins/magic-link/client.mjs +11 -0
  303. package/dist/plugins/magic-link/index.d.mts +213 -0
  304. package/dist/plugins/magic-link/index.mjs +208 -0
  305. package/dist/plugins/magic-link/utils.mjs +9 -0
  306. package/dist/plugins/multi-session/client.d.mts +19 -0
  307. package/dist/plugins/multi-session/client.mjs +19 -0
  308. package/dist/plugins/multi-session/error-codes.d.mts +8 -0
  309. package/dist/plugins/multi-session/error-codes.mjs +5 -0
  310. package/dist/plugins/multi-session/index.d.mts +212 -0
  311. package/dist/plugins/multi-session/index.mjs +217 -0
  312. package/dist/plugins/oauth-popup/client.d.mts +82 -0
  313. package/dist/plugins/oauth-popup/client.mjs +203 -0
  314. package/dist/plugins/oauth-popup/constants.d.mts +11 -0
  315. package/dist/plugins/oauth-popup/constants.mjs +11 -0
  316. package/dist/plugins/oauth-popup/error-codes.d.mts +11 -0
  317. package/dist/plugins/oauth-popup/error-codes.mjs +10 -0
  318. package/dist/plugins/oauth-popup/index.d.mts +67 -0
  319. package/dist/plugins/oauth-popup/index.mjs +232 -0
  320. package/dist/plugins/oauth-popup/types.d.mts +30 -0
  321. package/dist/plugins/oauth-proxy/index.d.mts +130 -0
  322. package/dist/plugins/oauth-proxy/index.mjs +407 -0
  323. package/dist/plugins/oauth-proxy/utils.mjs +55 -0
  324. package/dist/plugins/one-tap/client.d.mts +174 -0
  325. package/dist/plugins/one-tap/client.mjs +208 -0
  326. package/dist/plugins/one-tap/index.d.mts +82 -0
  327. package/dist/plugins/one-tap/index.mjs +100 -0
  328. package/dist/plugins/one-time-token/client.d.mts +10 -0
  329. package/dist/plugins/one-time-token/client.mjs +11 -0
  330. package/dist/plugins/one-time-token/index.d.mts +132 -0
  331. package/dist/plugins/one-time-token/index.mjs +107 -0
  332. package/dist/plugins/one-time-token/utils.mjs +9 -0
  333. package/dist/plugins/open-api/generator.d.mts +126 -0
  334. package/dist/plugins/open-api/generator.mjs +557 -0
  335. package/dist/plugins/open-api/index.d.mts +97 -0
  336. package/dist/plugins/open-api/index.mjs +65 -0
  337. package/dist/plugins/open-api/logo.mjs +13 -0
  338. package/dist/plugins/organization/access/index.d.mts +2 -0
  339. package/dist/plugins/organization/access/index.mjs +2 -0
  340. package/dist/plugins/organization/access/statement.d.mts +113 -0
  341. package/dist/plugins/organization/access/statement.mjs +77 -0
  342. package/dist/plugins/organization/adapter.d.mts +815 -0
  343. package/dist/plugins/organization/adapter.mjs +813 -0
  344. package/dist/plugins/organization/call.mjs +15 -0
  345. package/dist/plugins/organization/client.d.mts +375 -0
  346. package/dist/plugins/organization/client.mjs +104 -0
  347. package/dist/plugins/organization/error-codes.d.mts +66 -0
  348. package/dist/plugins/organization/error-codes.mjs +65 -0
  349. package/dist/plugins/organization/has-permission.d.mts +17 -0
  350. package/dist/plugins/organization/has-permission.mjs +34 -0
  351. package/dist/plugins/organization/index.d.mts +6 -0
  352. package/dist/plugins/organization/index.mjs +4 -0
  353. package/dist/plugins/organization/organization.d.mts +420 -0
  354. package/dist/plugins/organization/organization.mjs +886 -0
  355. package/dist/plugins/organization/permission.d.mts +15 -0
  356. package/dist/plugins/organization/permission.mjs +14 -0
  357. package/dist/plugins/organization/routes/crud-access-control.d.mts +511 -0
  358. package/dist/plugins/organization/routes/crud-access-control.mjs +674 -0
  359. package/dist/plugins/organization/routes/crud-invites.d.mts +1154 -0
  360. package/dist/plugins/organization/routes/crud-invites.mjs +602 -0
  361. package/dist/plugins/organization/routes/crud-members.d.mts +1057 -0
  362. package/dist/plugins/organization/routes/crud-members.mjs +518 -0
  363. package/dist/plugins/organization/routes/crud-org.d.mts +918 -0
  364. package/dist/plugins/organization/routes/crud-org.mjs +455 -0
  365. package/dist/plugins/organization/routes/crud-team.d.mts +1238 -0
  366. package/dist/plugins/organization/routes/crud-team.mjs +766 -0
  367. package/dist/plugins/organization/schema.d.mts +390 -0
  368. package/dist/plugins/organization/schema.mjs +65 -0
  369. package/dist/plugins/organization/types.d.mts +691 -0
  370. package/dist/plugins/phone-number/client.d.mts +31 -0
  371. package/dist/plugins/phone-number/client.mjs +19 -0
  372. package/dist/plugins/phone-number/error-codes.d.mts +19 -0
  373. package/dist/plugins/phone-number/error-codes.mjs +18 -0
  374. package/dist/plugins/phone-number/index.d.mts +360 -0
  375. package/dist/plugins/phone-number/index.mjs +57 -0
  376. package/dist/plugins/phone-number/routes.mjs +529 -0
  377. package/dist/plugins/phone-number/schema.d.mts +22 -0
  378. package/dist/plugins/phone-number/schema.mjs +18 -0
  379. package/dist/plugins/phone-number/types.d.mts +116 -0
  380. package/dist/plugins/siwe/client.d.mts +14 -0
  381. package/dist/plugins/siwe/client.mjs +15 -0
  382. package/dist/plugins/siwe/index.d.mts +62 -0
  383. package/dist/plugins/siwe/index.mjs +272 -0
  384. package/dist/plugins/siwe/parse-message.mjs +60 -0
  385. package/dist/plugins/siwe/schema.d.mts +35 -0
  386. package/dist/plugins/siwe/schema.mjs +30 -0
  387. package/dist/plugins/siwe/types.d.mts +43 -0
  388. package/dist/plugins/test-utils/auth-helpers.mjs +33 -0
  389. package/dist/plugins/test-utils/cookie-builder.mjs +55 -0
  390. package/dist/plugins/test-utils/db-helpers.mjs +65 -0
  391. package/dist/plugins/test-utils/factories.mjs +38 -0
  392. package/dist/plugins/test-utils/index.d.mts +73 -0
  393. package/dist/plugins/test-utils/index.mjs +97 -0
  394. package/dist/plugins/test-utils/otp-sink.mjs +21 -0
  395. package/dist/plugins/test-utils/types.d.mts +51 -0
  396. package/dist/plugins/two-factor/backup-codes/index.d.mts +291 -0
  397. package/dist/plugins/two-factor/backup-codes/index.mjs +341 -0
  398. package/dist/plugins/two-factor/client.d.mts +76 -0
  399. package/dist/plugins/two-factor/client.mjs +41 -0
  400. package/dist/plugins/two-factor/constant.mjs +6 -0
  401. package/dist/plugins/two-factor/error-code.d.mts +20 -0
  402. package/dist/plugins/two-factor/error-code.mjs +19 -0
  403. package/dist/plugins/two-factor/index.d.mts +720 -0
  404. package/dist/plugins/two-factor/index.mjs +349 -0
  405. package/dist/plugins/two-factor/otp/index.d.mts +216 -0
  406. package/dist/plugins/two-factor/otp/index.mjs +252 -0
  407. package/dist/plugins/two-factor/schema.d.mts +59 -0
  408. package/dist/plugins/two-factor/schema.mjs +53 -0
  409. package/dist/plugins/two-factor/totp/index.d.mts +219 -0
  410. package/dist/plugins/two-factor/totp/index.mjs +230 -0
  411. package/dist/plugins/two-factor/types.d.mts +111 -0
  412. package/dist/plugins/two-factor/utils.mjs +9 -0
  413. package/dist/plugins/two-factor/verify-two-factor.mjs +205 -0
  414. package/dist/plugins/username/client.d.mts +38 -0
  415. package/dist/plugins/username/client.mjs +17 -0
  416. package/dist/plugins/username/error-codes.d.mts +16 -0
  417. package/dist/plugins/username/error-codes.mjs +15 -0
  418. package/dist/plugins/username/index.d.mts +326 -0
  419. package/dist/plugins/username/index.mjs +312 -0
  420. package/dist/plugins/username/schema.d.mts +50 -0
  421. package/dist/plugins/username/schema.mjs +25 -0
  422. package/dist/social-providers/index.d.mts +1 -0
  423. package/dist/social-providers/index.mjs +2 -0
  424. package/dist/state.d.mts +48 -0
  425. package/dist/state.mjs +149 -0
  426. package/dist/test-utils/headers.d.mts +8 -0
  427. package/dist/test-utils/headers.mjs +17 -0
  428. package/dist/test-utils/http-test-instance.d.mts +413 -0
  429. package/dist/test-utils/http-test-instance.mjs +107 -0
  430. package/dist/test-utils/index.d.mts +4 -0
  431. package/dist/test-utils/index.mjs +4 -0
  432. package/dist/test-utils/test-instance.d.mts +56 -0
  433. package/dist/test-utils/test-instance.mjs +242 -0
  434. package/dist/types/adapter.d.mts +2 -0
  435. package/dist/types/api.d.mts +28 -0
  436. package/dist/types/auth.d.mts +32 -0
  437. package/dist/types/helper.d.mts +26 -0
  438. package/dist/types/index.d.mts +10 -0
  439. package/dist/types/index.mjs +1 -0
  440. package/dist/types/models.d.mts +10 -0
  441. package/dist/types/plugins.d.mts +19 -0
  442. package/dist/utils/boolean.mjs +6 -0
  443. package/dist/utils/constants.mjs +4 -0
  444. package/dist/utils/date.mjs +6 -0
  445. package/dist/utils/hashing.mjs +18 -0
  446. package/dist/utils/hide-metadata.d.mts +6 -0
  447. package/dist/utils/hide-metadata.mjs +4 -0
  448. package/dist/utils/index.d.mts +4 -0
  449. package/dist/utils/is-api-error.d.mts +2 -0
  450. package/dist/utils/is-api-error.mjs +2 -0
  451. package/dist/utils/is-atom.mjs +6 -0
  452. package/dist/utils/is-promise.mjs +6 -0
  453. package/dist/utils/middleware-response.mjs +7 -0
  454. package/dist/utils/password.mjs +32 -0
  455. package/dist/utils/plugin-helper.mjs +14 -0
  456. package/dist/utils/request.mjs +23 -0
  457. package/dist/utils/shim.mjs +22 -0
  458. package/dist/utils/time.d.mts +48 -0
  459. package/dist/utils/time.mjs +98 -0
  460. package/dist/utils/url.d.mts +78 -0
  461. package/dist/utils/url.mjs +238 -0
  462. package/dist/utils/validate-user-info.mjs +44 -0
  463. package/dist/utils/wildcard.mjs +106 -0
  464. package/dist/version.mjs +5 -0
  465. package/package.json +595 -3
@@ -0,0 +1,109 @@
1
+ import { GenericEndpointContext } from "@better-auth/core";
2
+
3
+ //#region src/plugins/email-otp/types.d.ts
4
+ interface EmailOTPOptions {
5
+ /**
6
+ * Function to send email verification.
7
+ *
8
+ * It is recommended to not await the email sending to avoid timing attacks.
9
+ * On serverless platforms, use `waitUntil` or similar to ensure the email is sent.
10
+ */
11
+ sendVerificationOTP: (data: {
12
+ email: string;
13
+ otp: string;
14
+ type: "sign-in" | "email-verification" | "forget-password" | "change-email";
15
+ }, ctx?: GenericEndpointContext | undefined) => Promise<void>;
16
+ /**
17
+ * Length of the OTP
18
+ *
19
+ * @default 6
20
+ */
21
+ otpLength?: number | undefined;
22
+ /**
23
+ * Expiry time of the OTP in seconds
24
+ *
25
+ * @default 300 (5 minutes)
26
+ */
27
+ expiresIn?: number | undefined;
28
+ /**
29
+ * Custom function to generate otp
30
+ */
31
+ generateOTP?: (data: {
32
+ email: string;
33
+ type: "sign-in" | "email-verification" | "forget-password" | "change-email";
34
+ }, ctx?: GenericEndpointContext) => string | undefined;
35
+ /**
36
+ * Send email verification on sign-up
37
+ *
38
+ * @Default false
39
+ */
40
+ sendVerificationOnSignUp?: boolean | undefined;
41
+ /**
42
+ * A boolean value that determines whether to prevent
43
+ * automatic sign-up when the user is not registered.
44
+ *
45
+ * @Default false
46
+ */
47
+ disableSignUp?: boolean | undefined;
48
+ /**
49
+ * Allowed attempts for the OTP code
50
+ * @default 3
51
+ */
52
+ allowedAttempts?: number | undefined;
53
+ /**
54
+ * Store the OTP in your database in a secure way
55
+ * Note: This will not affect the OTP sent to the user, it will only affect the OTP stored in your database
56
+ *
57
+ * @default "plain"
58
+ */
59
+ storeOTP?: ("hashed" | "plain" | "encrypted" | {
60
+ hash: (otp: string) => Promise<string>;
61
+ } | {
62
+ encrypt: (otp: string) => Promise<string>;
63
+ decrypt: (otp: string) => Promise<string>;
64
+ }) | undefined;
65
+ /**
66
+ * Strategy for handling OTP when the user requests a new OTP
67
+ * while an existing one is still valid.
68
+ *
69
+ * - `"rotate"`: Always generates a new OTP (default behavior).
70
+ * - `"reuse"`: Resends the same OTP and extends its expiry.
71
+ * Only works when the OTP is recoverable (plain, encrypted, or custom encrypt/decrypt).
72
+ * Falls back to `"rotate"` when OTP is hashed.
73
+ *
74
+ * @default "rotate"
75
+ */
76
+ resendStrategy?: "rotate" | "reuse" | undefined;
77
+ /**
78
+ * Change email configuration for the change email with OTP flow
79
+ *
80
+ * @default {
81
+ * enabled: false,
82
+ * verifyCurrentEmail: false,
83
+ * }
84
+ */
85
+ changeEmail?: {
86
+ enabled?: boolean;
87
+ verifyCurrentEmail?: boolean;
88
+ };
89
+ /**
90
+ * Override the default email verification to use email otp instead
91
+ *
92
+ * @default false
93
+ */
94
+ overrideDefaultEmailVerification?: boolean | undefined;
95
+ /**
96
+ * Rate limit configuration
97
+ *
98
+ * @default {
99
+ * window: 60,
100
+ * max: 3,
101
+ * }
102
+ */
103
+ rateLimit?: {
104
+ window: number;
105
+ max: number;
106
+ };
107
+ }
108
+ //#endregion
109
+ export { EmailOTPOptions };
@@ -0,0 +1,17 @@
1
+ import { base64Url } from "@better-auth/utils/base64";
2
+ import { createHash } from "@better-auth/utils/hash";
3
+ //#region src/plugins/email-otp/utils.ts
4
+ function toOTPIdentifier(type, email) {
5
+ return `${type}-otp-${email}`;
6
+ }
7
+ const defaultKeyHasher = async (otp) => {
8
+ const hash = await createHash("SHA-256").digest(new TextEncoder().encode(otp));
9
+ return base64Url.encode(new Uint8Array(hash), { padding: false });
10
+ };
11
+ function splitAtLastColon(input) {
12
+ const idx = input.lastIndexOf(":");
13
+ if (idx === -1) return [input, ""];
14
+ return [input.slice(0, idx), input.slice(idx + 1)];
15
+ }
16
+ //#endregion
17
+ export { defaultKeyHasher, splitAtLastColon, toOTPIdentifier };
@@ -0,0 +1,8 @@
1
+ import { defineErrorCodes } from "@better-auth/core/utils/error-codes";
2
+ //#region src/plugins/generic-oauth/error-codes.ts
3
+ const GENERIC_OAUTH_ERROR_CODES = defineErrorCodes({
4
+ INVALID_OAUTH_CONFIGURATION: "Invalid OAuth configuration",
5
+ TOKEN_URL_NOT_FOUND: "Invalid OAuth configuration. Token URL not found."
6
+ });
7
+ //#endregion
8
+ export { GENERIC_OAUTH_ERROR_CODES };
@@ -0,0 +1,52 @@
1
+ import { GenericOAuthConfig, GenericOAuthOptions, GenericOAuthUserInfo } from "./types.mjs";
2
+ import { Auth0Options, auth0 } from "./providers/auth0.mjs";
3
+ import { GumroadOptions, gumroad } from "./providers/gumroad.mjs";
4
+ import { HubSpotOptions, hubspot } from "./providers/hubspot.mjs";
5
+ import { KeycloakOptions, keycloak } from "./providers/keycloak.mjs";
6
+ import { LineOptions, line } from "./providers/line.mjs";
7
+ import { MicrosoftEntraIdOptions, microsoftEntraId } from "./providers/microsoft-entra-id.mjs";
8
+ import { OktaOptions, okta } from "./providers/okta.mjs";
9
+ import { PatreonOptions, patreon } from "./providers/patreon.mjs";
10
+ import { SlackOptions, slack } from "./providers/slack.mjs";
11
+ import { YandexOptions, yandex } from "./providers/yandex.mjs";
12
+ import { AuthContext } from "@better-auth/core";
13
+ import * as _$_better_auth_core_oauth20 from "@better-auth/core/oauth2";
14
+ import { OAuthProvider } from "@better-auth/core/oauth2";
15
+ import * as _$_better_auth_core_utils_error_codes0 from "@better-auth/core/utils/error-codes";
16
+
17
+ //#region src/plugins/generic-oauth/index.d.ts
18
+ declare module "@better-auth/core" {
19
+ interface BetterAuthPluginRegistry<AuthOptions, Options> {
20
+ "generic-oauth": {
21
+ creator: typeof genericOAuth;
22
+ };
23
+ }
24
+ }
25
+ /**
26
+ * Base type for OAuth provider options.
27
+ * Extracts common fields from GenericOAuthConfig for provider helpers.
28
+ */
29
+ type BaseOAuthProviderOptions = Pick<GenericOAuthConfig, "clientId" | "clientSecret" | "tokenEndpointAuth" | "scopes" | "redirectURI" | "endSessionEndpoint" | "postLogoutRedirectURI" | "disableProviderLogout" | "pkce" | "disableImplicitSignUp" | "disableSignUp" | "overrideUserInfo">;
30
+ /**
31
+ * A generic OAuth plugin that registers any OAuth/OIDC provider
32
+ * as a first-class social provider.
33
+ *
34
+ * Providers are used through the standard `signIn.social` and
35
+ * `callback/:id` core endpoints — no plugin-specific endpoints needed.
36
+ */
37
+ declare const genericOAuth: <const ID extends string>(options: GenericOAuthOptions<ID>) => {
38
+ id: "generic-oauth";
39
+ version: string;
40
+ init: (ctx: AuthContext) => Promise<{
41
+ context: {
42
+ socialProviders: OAuthProvider<object, Partial<_$_better_auth_core_oauth20.ProviderOptions<object>>>[];
43
+ };
44
+ }>;
45
+ options: GenericOAuthOptions<ID>;
46
+ $ERROR_CODES: {
47
+ INVALID_OAUTH_CONFIGURATION: _$_better_auth_core_utils_error_codes0.RawError<"INVALID_OAUTH_CONFIGURATION">;
48
+ TOKEN_URL_NOT_FOUND: _$_better_auth_core_utils_error_codes0.RawError<"TOKEN_URL_NOT_FOUND">;
49
+ };
50
+ };
51
+ //#endregion
52
+ export { Auth0Options, BaseOAuthProviderOptions, type GenericOAuthConfig, type GenericOAuthOptions, type GenericOAuthUserInfo, GumroadOptions, HubSpotOptions, KeycloakOptions, LineOptions, MicrosoftEntraIdOptions, OktaOptions, PatreonOptions, SlackOptions, YandexOptions, auth0, genericOAuth, gumroad, hubspot, keycloak, line, microsoftEntraId, okta, patreon, slack, yandex };
@@ -0,0 +1,279 @@
1
+ import { PACKAGE_VERSION } from "../../version.mjs";
2
+ import { GENERIC_OAUTH_ERROR_CODES } from "./error-codes.mjs";
3
+ import { auth0 } from "./providers/auth0.mjs";
4
+ import { gumroad } from "./providers/gumroad.mjs";
5
+ import { hubspot } from "./providers/hubspot.mjs";
6
+ import { keycloak } from "./providers/keycloak.mjs";
7
+ import { line } from "./providers/line.mjs";
8
+ import { microsoftEntraId } from "./providers/microsoft-entra-id.mjs";
9
+ import { okta } from "./providers/okta.mjs";
10
+ import { patreon } from "./providers/patreon.mjs";
11
+ import { slack } from "./providers/slack.mjs";
12
+ import { yandex } from "./providers/yandex.mjs";
13
+ import { APIError } from "@better-auth/core/error";
14
+ import { applyDefaultAccessTokenExpiry, createAuthorizationURL, refreshAccessToken, validateAuthorizationCode, verifyProviderIdToken } from "@better-auth/core/oauth2";
15
+ import { createRemoteJWKSet, decodeJwt } from "jose";
16
+ import { betterFetch } from "@better-fetch/fetch";
17
+ //#region src/plugins/generic-oauth/index.ts
18
+ function isSecretlessTokenEndpointAuth(tokenEndpointAuth) {
19
+ return tokenEndpointAuth?.method === "private_key_jwt" || tokenEndpointAuth?.method === "none";
20
+ }
21
+ function isClientSecretTokenEndpointAuth(tokenEndpointAuth) {
22
+ return tokenEndpointAuth?.method === "client_secret_basic" || tokenEndpointAuth?.method === "client_secret_post";
23
+ }
24
+ async function fetchDiscovery(url, headers) {
25
+ const result = await betterFetch(url, {
26
+ method: "GET",
27
+ headers
28
+ });
29
+ if (result.error || !result.data) return null;
30
+ if (result.data.issuer) try {
31
+ new URL(result.data.issuer);
32
+ } catch {
33
+ return null;
34
+ }
35
+ return result.data;
36
+ }
37
+ async function fetchUserInfo(tokens, userInfoUrl) {
38
+ if (tokens.idToken) try {
39
+ const decoded = decodeJwt(tokens.idToken);
40
+ if (decoded?.sub && decoded?.email) return {
41
+ id: decoded.sub,
42
+ emailVerified: decoded.email_verified,
43
+ image: decoded.picture,
44
+ ...decoded
45
+ };
46
+ } catch {}
47
+ if (!userInfoUrl) return null;
48
+ const userInfo = await betterFetch(userInfoUrl, {
49
+ method: "GET",
50
+ headers: { Authorization: `Bearer ${tokens.accessToken}` }
51
+ });
52
+ if (userInfo.error || !userInfo.data) return null;
53
+ return {
54
+ ...userInfo.data,
55
+ email: userInfo.data.email,
56
+ emailVerified: userInfo.data.email_verified ?? false,
57
+ image: userInfo.data.picture,
58
+ name: userInfo.data.name
59
+ };
60
+ }
61
+ /**
62
+ * A generic OAuth plugin that registers any OAuth/OIDC provider
63
+ * as a first-class social provider.
64
+ *
65
+ * Providers are used through the standard `signIn.social` and
66
+ * `callback/:id` core endpoints — no plugin-specific endpoints needed.
67
+ */
68
+ const genericOAuth = (options) => {
69
+ const seenIds = /* @__PURE__ */ new Set();
70
+ const nonUniqueIds = /* @__PURE__ */ new Set();
71
+ for (const config of options.config) {
72
+ const id = config.providerId;
73
+ if (seenIds.has(id)) nonUniqueIds.add(id);
74
+ seenIds.add(id);
75
+ }
76
+ if (nonUniqueIds.size > 0) console.warn(`Duplicate provider IDs found: ${Array.from(nonUniqueIds).join(", ")}`);
77
+ return {
78
+ id: "generic-oauth",
79
+ version: PACKAGE_VERSION,
80
+ init: async (ctx) => {
81
+ const genericProviders = [];
82
+ for (const c of options.config) {
83
+ let authorizationUrl = c.authorizationUrl;
84
+ let tokenUrl = c.tokenUrl;
85
+ let userInfoUrl = c.userInfoUrl;
86
+ let endSessionEndpoint = c.endSessionEndpoint;
87
+ let issuer;
88
+ let isOidc = false;
89
+ let idTokenConfig;
90
+ if (c.discoveryUrl) {
91
+ const discovered = await fetchDiscovery(c.discoveryUrl, c.discoveryHeaders).catch((err) => {
92
+ ctx.logger.error(`Discovery fetch failed for "${c.providerId}": ${err}`);
93
+ return null;
94
+ });
95
+ if (discovered) {
96
+ authorizationUrl ??= discovered.authorization_endpoint;
97
+ tokenUrl ??= discovered.token_endpoint;
98
+ userInfoUrl ??= discovered.userinfo_endpoint;
99
+ endSessionEndpoint ??= discovered.end_session_endpoint;
100
+ issuer = discovered.issuer;
101
+ const signingAlgs = discovered.id_token_signing_alg_values_supported;
102
+ isOidc = Array.isArray(signingAlgs) && signingAlgs.length > 0;
103
+ if (discovered.jwks_uri && discovered.issuer) {
104
+ let jwksUrl;
105
+ try {
106
+ jwksUrl = new URL(discovered.jwks_uri, c.discoveryUrl);
107
+ } catch {
108
+ ctx.logger.error(`Provider "${c.providerId}": invalid jwks_uri "${discovered.jwks_uri}" in discovery document. Provider skipped.`);
109
+ continue;
110
+ }
111
+ idTokenConfig = {
112
+ jwks: createRemoteJWKSet(jwksUrl),
113
+ issuer: discovered.issuer,
114
+ audience: c.clientId,
115
+ algorithms: isOidc ? signingAlgs : void 0
116
+ };
117
+ }
118
+ }
119
+ if (!authorizationUrl || !tokenUrl && !c.getToken) {
120
+ ctx.logger.error(`Provider "${c.providerId}": discovery left no usable authorization endpoint or token exchange. Provider skipped.`);
121
+ continue;
122
+ }
123
+ }
124
+ if (c.requireIdTokenVerification && !idTokenConfig) {
125
+ if (c.discoveryUrl) {
126
+ ctx.logger.error(`Provider "${c.providerId}": requires verified ID tokens, but discovery did not provide a usable issuer and jwks_uri. Provider skipped.`);
127
+ continue;
128
+ }
129
+ throw new Error(`Provider "${c.providerId}": requires verified ID tokens, but discovery did not provide a usable issuer and jwks_uri.`);
130
+ }
131
+ const tokenEndpointAuth = c.tokenEndpointAuth;
132
+ if (c.clientSecret && isSecretlessTokenEndpointAuth(tokenEndpointAuth)) throw new Error(`Provider "${c.providerId}": tokenEndpointAuth.method "${tokenEndpointAuth?.method}" cannot be combined with clientSecret`);
133
+ if (!c.clientSecret && isClientSecretTokenEndpointAuth(tokenEndpointAuth)) throw new Error(`Provider "${c.providerId}": tokenEndpointAuth.method "${tokenEndpointAuth?.method}" requires clientSecret`);
134
+ if (!c.clientSecret && !tokenEndpointAuth && c.authentication === "basic") throw new Error(`Provider "${c.providerId}": authentication "basic" requires clientSecret`);
135
+ const accountSubject = c.accountSubject;
136
+ const provider = {
137
+ id: c.providerId,
138
+ name: c.name ?? c.providerId,
139
+ issuer,
140
+ accountSubject: ({ tokens, profile }) => {
141
+ const genericProfile = profile;
142
+ if (accountSubject) return accountSubject({
143
+ tokens,
144
+ profile: genericProfile
145
+ });
146
+ return isOidc ? genericProfile.sub ?? "" : genericProfile.id ?? "";
147
+ },
148
+ idToken: idTokenConfig,
149
+ requiresIdTokenNonce: idTokenConfig !== void 0 && c.disableIdTokenNonceBinding !== true,
150
+ allowIdpInitiated: c.allowIdpInitiated,
151
+ async createEndSessionURL(data) {
152
+ if (c.disableProviderLogout) return null;
153
+ if (!endSessionEndpoint) return null;
154
+ let url;
155
+ try {
156
+ url = new URL(endSessionEndpoint);
157
+ } catch {
158
+ return null;
159
+ }
160
+ if (data.idToken) url.searchParams.set("id_token_hint", data.idToken);
161
+ const configuredRedirectURI = data.postLogoutRedirectURI ?? c.postLogoutRedirectURI;
162
+ const postLogoutRedirectURI = configuredRedirectURI ? new URL(configuredRedirectURI, ctx.baseURL).toString() : void 0;
163
+ if (postLogoutRedirectURI) {
164
+ url.searchParams.set("post_logout_redirect_uri", postLogoutRedirectURI);
165
+ url.searchParams.set("client_id", c.clientId);
166
+ if (data.state) url.searchParams.set("state", data.state);
167
+ } else if (!data.idToken) url.searchParams.set("client_id", c.clientId);
168
+ return url;
169
+ },
170
+ createAuthorizationURL(data) {
171
+ if (!authorizationUrl) throw APIError.from("BAD_REQUEST", GENERIC_OAUTH_ERROR_CODES.INVALID_OAUTH_CONFIGURATION);
172
+ return createAuthorizationURL({
173
+ id: c.providerId,
174
+ options: {
175
+ clientId: c.clientId,
176
+ clientSecret: c.clientSecret,
177
+ redirectURI: c.redirectURI
178
+ },
179
+ authorizationEndpoint: authorizationUrl,
180
+ state: data.state,
181
+ codeVerifier: c.pkce ?? true ? data.codeVerifier : void 0,
182
+ scopes: (() => {
183
+ const merged = [...data.scopes ?? [], ...c.scopes ?? []];
184
+ if (isOidc && !merged.includes("openid")) merged.unshift("openid");
185
+ return merged;
186
+ })(),
187
+ redirectURI: data.redirectURI,
188
+ prompt: c.prompt,
189
+ accessType: c.accessType,
190
+ responseType: c.responseType,
191
+ responseMode: c.responseMode,
192
+ nonce: data.idTokenNonce,
193
+ additionalParams: {
194
+ ...c.authorizationUrlParams ?? {},
195
+ ...data.additionalParams ?? {}
196
+ },
197
+ loginHint: data.loginHint
198
+ });
199
+ },
200
+ async validateAuthorizationCode(data) {
201
+ if (c.getToken) return applyDefaultAccessTokenExpiry(await c.getToken(data), c.accessTokenExpiresIn);
202
+ if (!tokenUrl) throw APIError.from("BAD_REQUEST", GENERIC_OAUTH_ERROR_CODES.TOKEN_URL_NOT_FOUND);
203
+ return applyDefaultAccessTokenExpiry(await validateAuthorizationCode({
204
+ headers: c.authorizationHeaders,
205
+ code: data.code,
206
+ codeVerifier: c.pkce ?? true ? data.codeVerifier : void 0,
207
+ redirectURI: data.redirectURI,
208
+ options: {
209
+ clientId: c.clientId,
210
+ clientSecret: c.clientSecret,
211
+ redirectURI: c.redirectURI
212
+ },
213
+ tokenEndpoint: tokenUrl,
214
+ authentication: c.authentication,
215
+ tokenEndpointAuth,
216
+ additionalParams: c.tokenUrlParams
217
+ }), c.accessTokenExpiresIn);
218
+ },
219
+ async getUserInfo(tokens) {
220
+ const { expectedIdTokenNonce, ...oauthTokens } = tokens;
221
+ if (oauthTokens.idToken && provider.idToken) {
222
+ if (!await verifyProviderIdToken(provider, oauthTokens.idToken, expectedIdTokenNonce)) {
223
+ ctx.logger.error(`Provider "${c.providerId}": id_token failed verification against the discovery JWKS or expected nonce`);
224
+ return null;
225
+ }
226
+ }
227
+ const raw = c.getUserInfo ? await c.getUserInfo(oauthTokens) : await fetchUserInfo(oauthTokens, userInfoUrl);
228
+ if (!raw) return null;
229
+ const mapped = c.mapProfileToUser ? await c.mapProfileToUser(raw) : {};
230
+ const user = {
231
+ email: raw.email,
232
+ emailVerified: raw.emailVerified,
233
+ image: raw.image,
234
+ name: raw.name,
235
+ ...mapped
236
+ };
237
+ return {
238
+ user: {
239
+ ...user,
240
+ image: user.image ?? void 0
241
+ },
242
+ data: raw
243
+ };
244
+ },
245
+ async refreshAccessToken(refreshToken, refreshCtx) {
246
+ if (!tokenUrl) throw APIError.from("BAD_REQUEST", GENERIC_OAUTH_ERROR_CODES.TOKEN_URL_NOT_FOUND);
247
+ const resolvedRefreshParams = typeof c.refreshTokenParams === "function" ? await c.refreshTokenParams(refreshCtx) : c.refreshTokenParams;
248
+ return applyDefaultAccessTokenExpiry(await refreshAccessToken({
249
+ refreshToken,
250
+ options: {
251
+ clientId: c.clientId,
252
+ clientSecret: c.clientSecret
253
+ },
254
+ authentication: c.authentication,
255
+ tokenEndpointAuth,
256
+ tokenEndpoint: tokenUrl,
257
+ extraParams: resolvedRefreshParams
258
+ }), c.accessTokenExpiresIn);
259
+ },
260
+ disableImplicitSignUp: c.disableImplicitSignUp,
261
+ disableSignUp: c.disableSignUp,
262
+ options: {
263
+ disableSignUp: c.disableSignUp,
264
+ overrideUserInfoOnSignIn: c.overrideUserInfo,
265
+ requireEmailVerification: c.requireEmailVerification
266
+ }
267
+ };
268
+ genericProviders.push(provider);
269
+ }
270
+ const existingIds = new Set(ctx.socialProviders.map((p) => p.id));
271
+ for (const gp of genericProviders) if (existingIds.has(gp.id)) ctx.logger.warn(`Generic OAuth provider "${gp.id}" shadows a built-in social provider with the same ID`);
272
+ return { context: { socialProviders: genericProviders.concat(ctx.socialProviders) } };
273
+ },
274
+ options,
275
+ $ERROR_CODES: GENERIC_OAUTH_ERROR_CODES
276
+ };
277
+ };
278
+ //#endregion
279
+ export { auth0, genericOAuth, gumroad, hubspot, keycloak, line, microsoftEntraId, okta, patreon, slack, yandex };
@@ -0,0 +1,36 @@
1
+ import { GenericOAuthConfig } from "../types.mjs";
2
+ import { BaseOAuthProviderOptions } from "../index.mjs";
3
+
4
+ //#region src/plugins/generic-oauth/providers/auth0.d.ts
5
+ interface Auth0Options extends BaseOAuthProviderOptions {
6
+ /**
7
+ * Auth0 domain (e.g., dev-xxx.eu.auth0.com)
8
+ * This will be used to construct the discovery URL.
9
+ */
10
+ domain: string;
11
+ }
12
+ /**
13
+ * Auth0 OAuth provider helper
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * import { genericOAuth, auth0 } from "better-auth/plugins/generic-oauth";
18
+ *
19
+ * export const auth = betterAuth({
20
+ * plugins: [
21
+ * genericOAuth({
22
+ * config: [
23
+ * auth0({
24
+ * clientId: process.env.AUTH0_CLIENT_ID,
25
+ * clientSecret: process.env.AUTH0_CLIENT_SECRET,
26
+ * domain: process.env.AUTH0_DOMAIN,
27
+ * }),
28
+ * ],
29
+ * }),
30
+ * ],
31
+ * });
32
+ * ```
33
+ */
34
+ declare function auth0(options: Auth0Options): GenericOAuthConfig<"auth0">;
35
+ //#endregion
36
+ export { Auth0Options, auth0 };
@@ -0,0 +1,49 @@
1
+ //#region src/plugins/generic-oauth/providers/auth0.ts
2
+ /**
3
+ * Auth0 OAuth provider helper
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * import { genericOAuth, auth0 } from "better-auth/plugins/generic-oauth";
8
+ *
9
+ * export const auth = betterAuth({
10
+ * plugins: [
11
+ * genericOAuth({
12
+ * config: [
13
+ * auth0({
14
+ * clientId: process.env.AUTH0_CLIENT_ID,
15
+ * clientSecret: process.env.AUTH0_CLIENT_SECRET,
16
+ * domain: process.env.AUTH0_DOMAIN,
17
+ * }),
18
+ * ],
19
+ * }),
20
+ * ],
21
+ * });
22
+ * ```
23
+ */
24
+ function auth0(options) {
25
+ const defaultScopes = [
26
+ "openid",
27
+ "profile",
28
+ "email"
29
+ ];
30
+ const domainUrl = options.domain.startsWith("http://") || options.domain.startsWith("https://") ? options.domain : `https://${options.domain}`;
31
+ return {
32
+ providerId: "auth0",
33
+ discoveryUrl: `https://${new URL(domainUrl).host}/.well-known/openid-configuration`,
34
+ clientId: options.clientId,
35
+ clientSecret: options.clientSecret,
36
+ tokenEndpointAuth: options.tokenEndpointAuth,
37
+ scopes: options.scopes ?? defaultScopes,
38
+ redirectURI: options.redirectURI,
39
+ endSessionEndpoint: options.endSessionEndpoint,
40
+ postLogoutRedirectURI: options.postLogoutRedirectURI,
41
+ disableProviderLogout: options.disableProviderLogout,
42
+ pkce: options.pkce,
43
+ disableImplicitSignUp: options.disableImplicitSignUp,
44
+ disableSignUp: options.disableSignUp,
45
+ overrideUserInfo: options.overrideUserInfo
46
+ };
47
+ }
48
+ //#endregion
49
+ export { auth0 };
@@ -0,0 +1,31 @@
1
+ import { GenericOAuthConfig } from "../types.mjs";
2
+ import { BaseOAuthProviderOptions } from "../index.mjs";
3
+
4
+ //#region src/plugins/generic-oauth/providers/gumroad.d.ts
5
+ interface GumroadOptions extends BaseOAuthProviderOptions {}
6
+ /**
7
+ * Gumroad OAuth provider helper
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { genericOAuth, gumroad } from "better-auth/plugins/generic-oauth";
12
+ *
13
+ * export const auth = betterAuth({
14
+ * plugins: [
15
+ * genericOAuth({
16
+ * config: [
17
+ * gumroad({
18
+ * clientId: process.env.GUMROAD_CLIENT_ID,
19
+ * clientSecret: process.env.GUMROAD_CLIENT_SECRET,
20
+ * }),
21
+ * ],
22
+ * }),
23
+ * ],
24
+ * });
25
+ * ```
26
+ *
27
+ * @see https://app.gumroad.com/oauth
28
+ */
29
+ declare function gumroad(options: GumroadOptions): GenericOAuthConfig<"gumroad">;
30
+ //#endregion
31
+ export { GumroadOptions, gumroad };
@@ -0,0 +1,62 @@
1
+ import { betterFetch } from "@better-fetch/fetch";
2
+ //#region src/plugins/generic-oauth/providers/gumroad.ts
3
+ /**
4
+ * Gumroad OAuth provider helper
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import { genericOAuth, gumroad } from "better-auth/plugins/generic-oauth";
9
+ *
10
+ * export const auth = betterAuth({
11
+ * plugins: [
12
+ * genericOAuth({
13
+ * config: [
14
+ * gumroad({
15
+ * clientId: process.env.GUMROAD_CLIENT_ID,
16
+ * clientSecret: process.env.GUMROAD_CLIENT_SECRET,
17
+ * }),
18
+ * ],
19
+ * }),
20
+ * ],
21
+ * });
22
+ * ```
23
+ *
24
+ * @see https://app.gumroad.com/oauth
25
+ */
26
+ function gumroad(options) {
27
+ const getUserInfo = async (tokens) => {
28
+ const { data: profile, error } = await betterFetch("https://api.gumroad.com/v2/user", {
29
+ method: "GET",
30
+ headers: { Authorization: `Bearer ${tokens.accessToken}` }
31
+ });
32
+ if (error || !profile?.success || !profile.user) return null;
33
+ return {
34
+ id: profile.user.user_id,
35
+ name: profile.user.name,
36
+ email: profile.user.email,
37
+ image: profile.user.profile_url,
38
+ emailVerified: false
39
+ };
40
+ };
41
+ return {
42
+ providerId: "gumroad",
43
+ accountSubject: ({ profile }) => profile.id ?? "",
44
+ authorizationUrl: "https://gumroad.com/oauth/authorize",
45
+ tokenUrl: "https://api.gumroad.com/oauth/token",
46
+ clientId: options.clientId,
47
+ clientSecret: options.clientSecret,
48
+ tokenEndpointAuth: options.tokenEndpointAuth,
49
+ scopes: options.scopes ?? ["view_profile"],
50
+ redirectURI: options.redirectURI,
51
+ endSessionEndpoint: options.endSessionEndpoint,
52
+ postLogoutRedirectURI: options.postLogoutRedirectURI,
53
+ disableProviderLogout: options.disableProviderLogout,
54
+ pkce: options.pkce,
55
+ disableImplicitSignUp: options.disableImplicitSignUp,
56
+ disableSignUp: options.disableSignUp,
57
+ overrideUserInfo: options.overrideUserInfo,
58
+ getUserInfo
59
+ };
60
+ }
61
+ //#endregion
62
+ export { gumroad };
@@ -0,0 +1,36 @@
1
+ import { GenericOAuthConfig } from "../types.mjs";
2
+ import { BaseOAuthProviderOptions } from "../index.mjs";
3
+
4
+ //#region src/plugins/generic-oauth/providers/hubspot.d.ts
5
+ interface HubSpotOptions extends BaseOAuthProviderOptions {
6
+ /**
7
+ * OAuth scopes to request.
8
+ * @default ["oauth"]
9
+ */
10
+ scopes?: string[];
11
+ }
12
+ /**
13
+ * HubSpot OAuth provider helper
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * import { genericOAuth, hubspot } from "better-auth/plugins/generic-oauth";
18
+ *
19
+ * export const auth = betterAuth({
20
+ * plugins: [
21
+ * genericOAuth({
22
+ * config: [
23
+ * hubspot({
24
+ * clientId: process.env.HUBSPOT_CLIENT_ID,
25
+ * clientSecret: process.env.HUBSPOT_CLIENT_SECRET,
26
+ * scopes: ["oauth", "contacts"],
27
+ * }),
28
+ * ],
29
+ * }),
30
+ * ],
31
+ * });
32
+ * ```
33
+ */
34
+ declare function hubspot(options: HubSpotOptions): GenericOAuthConfig<"hubspot">;
35
+ //#endregion
36
+ export { HubSpotOptions, hubspot };