@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,60 @@
1
+ import { isDynamicBaseURLConfig, isRequestLike } from "../utils/url.mjs";
2
+ import { pickSource, resolveDynamicTrustedProxyHeaders, resolveRequestContext } from "../context/helpers.mjs";
3
+ import { dispatchAuthEndpoint, getOperationId } from "./dispatch.mjs";
4
+ import { hasRequestState, runWithRequestState } from "@better-auth/core/context";
5
+ import { APIError, BetterAuthError } from "@better-auth/core/error";
6
+ //#region src/api/to-auth-endpoints.ts
7
+ /**
8
+ * Resolves the per-call `AuthContext` for endpoints with a dynamic `baseURL`.
9
+ *
10
+ * - `rawCtx.baseURL` already set: HTTP handler rehydrated upstream; return as-is.
11
+ * - Direct `auth.api` call with a source or a configured `fallback`: resolve here.
12
+ * - Neither: throw `APIError` with a helpful message. Leaving `baseURL = ""`
13
+ * would let plugins build `new URL("")` and crash cryptically downstream.
14
+ */
15
+ async function resolveDynamicContext(rawCtx, input) {
16
+ if (rawCtx.baseURL) return rawCtx;
17
+ const source = pickSource(input);
18
+ const config = rawCtx.options.baseURL;
19
+ const hasFallback = isDynamicBaseURLConfig(config) && Boolean(config.fallback);
20
+ if (source === void 0 && !hasFallback) throw new APIError("INTERNAL_SERVER_ERROR", { message: "Dynamic baseURL could not be resolved for this direct auth.api call. Pass `headers: request.headers` (or `request`) to the call, or add `fallback` to your baseURL config." });
21
+ try {
22
+ return await resolveRequestContext(rawCtx, source, resolveDynamicTrustedProxyHeaders(rawCtx.options));
23
+ } catch (err) {
24
+ if (err instanceof BetterAuthError) throw new APIError("INTERNAL_SERVER_ERROR", { message: err.message });
25
+ throw err;
26
+ }
27
+ }
28
+ /**
29
+ * Wraps each raw endpoint so a router or `auth.api.*` call runs it through the
30
+ * configured hook pipeline. Per-call work that is specific to this entry point
31
+ * (dynamic `baseURL` resolution, request-state initialization) happens here;
32
+ * the hook pipeline itself lives in {@link dispatchAuthEndpoint}.
33
+ */
34
+ function toAuthEndpoints(endpoints, ctx) {
35
+ const api = {};
36
+ for (const [key, endpoint] of Object.entries(endpoints)) {
37
+ api[key] = async (context) => {
38
+ const operationId = getOperationId(endpoint, key);
39
+ const run = async () => {
40
+ const rawContext = await ctx;
41
+ const pendingSchemaCheck = rawContext.checkSchema?.();
42
+ if (pendingSchemaCheck) await pendingSchemaCheck;
43
+ const authContext = isDynamicBaseURLConfig(rawContext.options.baseURL) ? await resolveDynamicContext(rawContext, context) : rawContext;
44
+ return dispatchAuthEndpoint(endpoint, {
45
+ ...context,
46
+ context: authContext,
47
+ operationId,
48
+ asResponse: context?.asResponse ?? isRequestLike(context?.request)
49
+ });
50
+ };
51
+ if (await hasRequestState()) return run();
52
+ return runWithRequestState(/* @__PURE__ */ new WeakMap(), run);
53
+ };
54
+ api[key].path = endpoint.path;
55
+ api[key].options = endpoint.options;
56
+ }
57
+ return api;
58
+ }
59
+ //#endregion
60
+ export { toAuthEndpoints };
@@ -0,0 +1,66 @@
1
+ import { getBaseURL, getOrigin, isDynamicBaseURLConfig } from "../utils/url.mjs";
2
+ import { getTrustedOrigins, getTrustedProviders, resolveDynamicTrustedProxyHeaders, resolveRequestContext } from "../context/helpers.mjs";
3
+ import { getEndpoints, router } from "../api/index.mjs";
4
+ import { runWithAdapter } from "@better-auth/core/context";
5
+ import { BASE_ERROR_CODES, BetterAuthError } from "@better-auth/core/error";
6
+ import { SchemaMismatchError } from "@better-auth/core/db/internal";
7
+ //#region src/auth/base.ts
8
+ const createBetterAuth = (options, initFn) => {
9
+ const authContext = initFn(options).then((ctx) => {
10
+ const validateSchema = ctx.options.advanced?.database?.validateSchema;
11
+ if (!ctx.checkSchema && validateSchema !== false) {
12
+ const level = validateSchema === true ? "warn" : "debug";
13
+ ctx.logger[level](`Schema validation is not available for adapter "${ctx.adapter.id}". Skipping schema validation. Database operations will proceed normally.`);
14
+ }
15
+ const pendingSchemaCheck = ctx.checkSchema?.();
16
+ if (pendingSchemaCheck) pendingSchemaCheck.catch((error) => {
17
+ ctx.logger.error(error instanceof SchemaMismatchError ? error.message : "Could not validate the database schema. Check your database connection.");
18
+ });
19
+ return ctx;
20
+ });
21
+ const { api } = getEndpoints(authContext, options);
22
+ const errorCodes = options.plugins?.reduce((acc, plugin) => {
23
+ if (plugin.$ERROR_CODES) return {
24
+ ...acc,
25
+ ...plugin.$ERROR_CODES
26
+ };
27
+ return acc;
28
+ }, {});
29
+ const handler = async (request) => {
30
+ const ctx = await authContext;
31
+ const basePath = ctx.options.basePath || "/api/auth";
32
+ let handlerCtx;
33
+ if (isDynamicBaseURLConfig(options.baseURL)) handlerCtx = await resolveRequestContext(ctx, request, resolveDynamicTrustedProxyHeaders(ctx.options));
34
+ else {
35
+ handlerCtx = Object.create(Object.getPrototypeOf(ctx), Object.getOwnPropertyDescriptors(ctx));
36
+ let trustOptions = ctx.options;
37
+ if (!ctx.options.baseURL) {
38
+ const baseURL = getBaseURL(void 0, basePath, request, void 0, ctx.options.advanced?.trustedProxyHeaders);
39
+ if (!baseURL) throw new BetterAuthError("Could not get base URL from request. Please provide a valid base URL.");
40
+ handlerCtx.baseURL = baseURL;
41
+ handlerCtx.options = {
42
+ ...ctx.options,
43
+ baseURL: getOrigin(baseURL) || void 0
44
+ };
45
+ trustOptions = handlerCtx.options;
46
+ }
47
+ handlerCtx.trustedOrigins = await getTrustedOrigins(trustOptions, request);
48
+ handlerCtx.trustedProviders = await getTrustedProviders(trustOptions, request);
49
+ }
50
+ const { handler } = router(handlerCtx, options);
51
+ return runWithAdapter(handlerCtx.adapter, () => handler(request));
52
+ };
53
+ return {
54
+ handler,
55
+ fetch: handler,
56
+ api,
57
+ options,
58
+ $context: authContext,
59
+ $ERROR_CODES: {
60
+ ...errorCodes,
61
+ ...BASE_ERROR_CODES
62
+ }
63
+ };
64
+ };
65
+ //#endregion
66
+ export { createBetterAuth };
@@ -0,0 +1,28 @@
1
+ import { Auth } from "../types/auth.mjs";
2
+ import { BetterAuthOptions } from "@better-auth/core";
3
+
4
+ //#region src/auth/full.d.ts
5
+ /**
6
+ * Better Auth initializer for full mode (with Kysely)
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { betterAuth } from "better-auth";
11
+ *
12
+ * const auth = betterAuth({
13
+ * database: new PostgresDialect({ connection: process.env.DATABASE_URL }),
14
+ * });
15
+ * ```
16
+ *
17
+ * For minimal mode (without Kysely), import from `better-auth/minimal` instead
18
+ * @example
19
+ * ```ts
20
+ * import { betterAuth } from "better-auth/minimal";
21
+ *
22
+ * const auth = betterAuth({
23
+ * database: drizzleAdapter(db, { provider: "pg" }),
24
+ * });
25
+ */
26
+ declare const betterAuth: <Options extends BetterAuthOptions>(options: Options & {}) => Auth<Options>;
27
+ //#endregion
28
+ export { betterAuth };
@@ -0,0 +1,29 @@
1
+ import { init } from "../context/init.mjs";
2
+ import { createBetterAuth } from "./base.mjs";
3
+ //#region src/auth/full.ts
4
+ /**
5
+ * Better Auth initializer for full mode (with Kysely)
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { betterAuth } from "better-auth";
10
+ *
11
+ * const auth = betterAuth({
12
+ * database: new PostgresDialect({ connection: process.env.DATABASE_URL }),
13
+ * });
14
+ * ```
15
+ *
16
+ * For minimal mode (without Kysely), import from `better-auth/minimal` instead
17
+ * @example
18
+ * ```ts
19
+ * import { betterAuth } from "better-auth/minimal";
20
+ *
21
+ * const auth = betterAuth({
22
+ * database: drizzleAdapter(db, { provider: "pg" }),
23
+ * });
24
+ */
25
+ const betterAuth = (options) => {
26
+ return createBetterAuth(options, init);
27
+ };
28
+ //#endregion
29
+ export { betterAuth };
@@ -0,0 +1,10 @@
1
+ import { Auth } from "../types/auth.mjs";
2
+ import { BetterAuthOptions } from "@better-auth/core";
3
+
4
+ //#region src/auth/minimal.d.ts
5
+ /**
6
+ * Better Auth initializer for minimal mode (without Kysely)
7
+ */
8
+ declare const betterAuth: <Options extends BetterAuthOptions>(options: Options & {}) => Auth<Options>;
9
+ //#endregion
10
+ export { type BetterAuthOptions, betterAuth };
@@ -0,0 +1,11 @@
1
+ import { createBetterAuth } from "./base.mjs";
2
+ import { initMinimal } from "../context/init-minimal.mjs";
3
+ //#region src/auth/minimal.ts
4
+ /**
5
+ * Better Auth initializer for minimal mode (without Kysely)
6
+ */
7
+ const betterAuth = (options) => {
8
+ return createBetterAuth(options, initMinimal);
9
+ };
10
+ //#endregion
11
+ export { betterAuth };
@@ -0,0 +1,106 @@
1
+ import { wildcardMatch } from "../utils/wildcard.mjs";
2
+ import { getHost, getOrigin, getProtocol } from "../utils/url.mjs";
3
+ //#region src/auth/trusted-origins.ts
4
+ const CONTROL_CHARACTER_PATTERN = /[\u0000-\u001f\u007f-\u009f]/;
5
+ const RELATIVE_URL_PARSER_ORIGIN = "https://better-auth.invalid";
6
+ const ENCODED_PATH_SEPARATOR_PATTERN = /%2[fF]|%5[cC]/;
7
+ /**
8
+ * Resolves `.` and `..` segments in a path after percent-decoding so a
9
+ * path-pinned pattern cannot be bypassed with traversal: e.g.
10
+ * `myapp://host/cb/../evil` must not satisfy pattern `myapp://host/cb`.
11
+ * Returns "" for an empty or root path.
12
+ */
13
+ const normalizePath = (path) => {
14
+ let decoded = path;
15
+ try {
16
+ decoded = decodeURIComponent(path);
17
+ } catch {}
18
+ const segments = [];
19
+ for (const segment of decoded.split("/")) if (segment === "..") segments.pop();
20
+ else if (segment !== "." && segment !== "") segments.push(segment);
21
+ return segments.length > 0 ? `/${segments.join("/")}` : "";
22
+ };
23
+ /**
24
+ * Splits a custom-scheme origin into its scheme, authority and path using
25
+ * plain string operations.
26
+ *
27
+ * `new URL()` is deliberately avoided here: its parsing of non-special schemes
28
+ * (e.g. `myapp://`, `exp://`) is not consistent across the runtimes Better Auth
29
+ * targets (Node, Bun, Deno, Cloudflare Workers), and the result of an origin
30
+ * check must not depend on which engine extracts the authority.
31
+ *
32
+ * Scheme and authority are lower-cased (matching how a URL canonicalizes its
33
+ * host); the path is percent-decoded and resolved so traversal cannot bypass
34
+ * a path-pinned pattern.
35
+ */
36
+ const parseCustomSchemeOrigin = (value) => {
37
+ if (CONTROL_CHARACTER_PATTERN.test(value)) return null;
38
+ const schemeEnd = value.indexOf(":");
39
+ if (schemeEnd <= 0) return null;
40
+ const scheme = value.slice(0, schemeEnd).toLowerCase();
41
+ let rest = value.slice(schemeEnd + 1);
42
+ let authority = "";
43
+ if (rest.startsWith("//")) {
44
+ rest = rest.slice(2);
45
+ const authorityEnd = rest.search(/[/?#]/);
46
+ if (authorityEnd === -1) {
47
+ authority = rest;
48
+ rest = "";
49
+ } else {
50
+ authority = rest.slice(0, authorityEnd);
51
+ rest = rest.slice(authorityEnd);
52
+ }
53
+ }
54
+ const pathEnd = rest.search(/[?#]/);
55
+ const path = normalizePath(pathEnd === -1 ? rest : rest.slice(0, pathEnd));
56
+ return {
57
+ scheme,
58
+ authority: authority.toLowerCase(),
59
+ path
60
+ };
61
+ };
62
+ /**
63
+ * Validates root-relative redirects against ambiguous browser and router parsing.
64
+ *
65
+ * @see https://www.rfc-editor.org/rfc/rfc3986.html#section-4.2
66
+ * @see https://url.spec.whatwg.org/#concept-basic-url-parser
67
+ */
68
+ const isSafeRelativeURL = (value) => {
69
+ if (!value.startsWith("/") || value.startsWith("//") || value.includes("\\") || CONTROL_CHARACTER_PATTERN.test(value)) return false;
70
+ const pathEnd = value.search(/[?#]/);
71
+ const path = pathEnd === -1 ? value : value.slice(0, pathEnd);
72
+ if (ENCODED_PATH_SEPARATOR_PATTERN.test(path)) return false;
73
+ try {
74
+ return new URL(value, RELATIVE_URL_PARSER_ORIGIN).origin === RELATIVE_URL_PARSER_ORIGIN;
75
+ } catch {
76
+ return false;
77
+ }
78
+ };
79
+ /**
80
+ * Matches the given url against an origin or origin pattern
81
+ * See "options.trustedOrigins" for details of supported patterns
82
+ *
83
+ * @param url The url to test
84
+ * @param pattern The origin pattern
85
+ * @param [settings] Specify supported pattern matching settings
86
+ * @returns {boolean} true if the URL matches the origin pattern, false otherwise.
87
+ */
88
+ const matchesOriginPattern = (url, pattern, settings) => {
89
+ if (url.startsWith("/")) return settings?.allowRelativePaths === true && isSafeRelativeURL(url);
90
+ if (pattern.includes("*") || pattern.includes("?")) {
91
+ if (pattern.includes("://")) return wildcardMatch(pattern)(getOrigin(url) || url);
92
+ const host = getHost(url);
93
+ if (!host) return false;
94
+ return wildcardMatch(pattern)(host);
95
+ }
96
+ const protocol = getProtocol(url);
97
+ if (protocol === "http:" || protocol === "https:" || !protocol) return pattern === getOrigin(url);
98
+ const parsed = parseCustomSchemeOrigin(url);
99
+ const parsedPattern = parseCustomSchemeOrigin(pattern);
100
+ if (!parsed || !parsedPattern || parsed.scheme !== parsedPattern.scheme) return false;
101
+ if (parsedPattern.authority && parsed.authority !== parsedPattern.authority) return false;
102
+ if (!parsedPattern.path) return true;
103
+ return parsed.path === parsedPattern.path || parsed.path.startsWith(`${parsedPattern.path}/`);
104
+ };
105
+ //#endregion
106
+ export { matchesOriginPattern };
@@ -0,0 +1,19 @@
1
+ //#region src/client/broadcast-channel.d.ts
2
+ interface BroadcastMessage {
3
+ event?: "session" | undefined;
4
+ data?: {
5
+ trigger?: "signout" | "getSession" | "updateUser";
6
+ } | undefined;
7
+ clientId: string;
8
+ timestamp: number;
9
+ }
10
+ type BroadcastListener = (message: BroadcastMessage) => void;
11
+ declare const kBroadcastChannel: unique symbol;
12
+ interface BroadcastChannel {
13
+ post(message: Record<string, unknown>): void;
14
+ subscribe(listener: BroadcastListener): () => void;
15
+ setup(): () => void;
16
+ }
17
+ declare function getGlobalBroadcastChannel(name?: string): BroadcastChannel;
18
+ //#endregion
19
+ export { BroadcastChannel, BroadcastListener, BroadcastMessage, getGlobalBroadcastChannel, kBroadcastChannel };
@@ -0,0 +1,44 @@
1
+ //#region src/client/broadcast-channel.ts
2
+ const kBroadcastChannel = Symbol.for("better-auth:broadcast-channel");
3
+ const now = () => Math.floor(Date.now() / 1e3);
4
+ var WindowBroadcastChannel = class {
5
+ listeners = /* @__PURE__ */ new Set();
6
+ name;
7
+ constructor(name = "better-auth.message") {
8
+ this.name = name;
9
+ }
10
+ subscribe(listener) {
11
+ this.listeners.add(listener);
12
+ return () => {
13
+ this.listeners.delete(listener);
14
+ };
15
+ }
16
+ post(message) {
17
+ if (typeof window === "undefined") return;
18
+ try {
19
+ localStorage.setItem(this.name, JSON.stringify({
20
+ ...message,
21
+ timestamp: now()
22
+ }));
23
+ } catch {}
24
+ }
25
+ setup() {
26
+ if (typeof window === "undefined" || typeof window.addEventListener === "undefined") return () => {};
27
+ const handler = (event) => {
28
+ if (event.key !== this.name) return;
29
+ const message = JSON.parse(event.newValue ?? "{}");
30
+ if (message?.event !== "session" || !message?.data) return;
31
+ this.listeners.forEach((listener) => listener(message));
32
+ };
33
+ window.addEventListener("storage", handler);
34
+ return () => {
35
+ window.removeEventListener("storage", handler);
36
+ };
37
+ }
38
+ };
39
+ function getGlobalBroadcastChannel(name = "better-auth.message") {
40
+ if (!globalThis[kBroadcastChannel]) globalThis[kBroadcastChannel] = new WindowBroadcastChannel(name);
41
+ return globalThis[kBroadcastChannel];
42
+ }
43
+ //#endregion
44
+ export { getGlobalBroadcastChannel, kBroadcastChannel };
@@ -0,0 +1,90 @@
1
+ import { SessionData } from "./session-atom.mjs";
2
+ import { BetterAuthClientOptions, ClientAtomListener } from "@better-auth/core";
3
+ import * as _$nanostores from "nanostores";
4
+ import { WritableAtom } from "nanostores";
5
+ import * as _$_better_fetch_fetch0 from "@better-fetch/fetch";
6
+
7
+ //#region src/client/config.d.ts
8
+ declare const getClientConfig: (options?: BetterAuthClientOptions | undefined, loadEnv?: boolean | undefined) => {
9
+ readonly baseURL: string;
10
+ pluginsActions: Record<string, any>;
11
+ pluginsAtoms: Record<string, WritableAtom<any>>;
12
+ pluginPathMethods: Record<string, "GET" | "POST">;
13
+ atomListeners: ClientAtomListener[];
14
+ hydrateSession: (sessionData: SessionData | null) => void;
15
+ $sessionSignal: _$nanostores.PreinitializedWritableAtom<boolean> & object;
16
+ $fetch: _$_better_fetch_fetch0.BetterFetch<{
17
+ plugins: (_$_better_fetch_fetch0.BetterFetchPlugin<Record<string, any>> | {
18
+ id: string;
19
+ name: string;
20
+ hooks: {
21
+ onSuccess(context: _$_better_fetch_fetch0.SuccessContext<any>): void;
22
+ };
23
+ } | {
24
+ id: string;
25
+ name: string;
26
+ hooks: {
27
+ onSuccess: ((context: _$_better_fetch_fetch0.SuccessContext<any>) => Promise<void> | void) | undefined;
28
+ onError: ((context: _$_better_fetch_fetch0.ErrorContext) => Promise<void> | void) | undefined;
29
+ onRequest: (<T extends Record<string, any>>(context: _$_better_fetch_fetch0.RequestContext<T>) => Promise<_$_better_fetch_fetch0.RequestContext | void> | _$_better_fetch_fetch0.RequestContext | void) | undefined;
30
+ onResponse: ((context: _$_better_fetch_fetch0.ResponseContext) => Promise<Response | void | _$_better_fetch_fetch0.ResponseContext> | Response | _$_better_fetch_fetch0.ResponseContext | void) | undefined;
31
+ };
32
+ })[];
33
+ cache?: RequestCache | undefined;
34
+ credentials?: RequestCredentials;
35
+ integrity?: string | undefined;
36
+ keepalive?: boolean | undefined;
37
+ method: string;
38
+ mode?: RequestMode | undefined;
39
+ priority?: RequestPriority | undefined;
40
+ redirect?: RequestRedirect | undefined;
41
+ referrer?: string | undefined;
42
+ referrerPolicy?: ReferrerPolicy | undefined;
43
+ signal?: AbortSignal | null;
44
+ window?: null | undefined;
45
+ onRetry?: ((response: _$_better_fetch_fetch0.ResponseContext) => Promise<void> | void) | undefined;
46
+ hookOptions?: {
47
+ cloneResponse?: boolean;
48
+ } | undefined;
49
+ timeout?: number | undefined;
50
+ customFetchImpl: _$_better_fetch_fetch0.FetchEsque;
51
+ baseURL: string;
52
+ throw?: boolean | undefined;
53
+ auth?: ({
54
+ type: "Bearer";
55
+ token: string | Promise<string | undefined> | (() => string | Promise<string | undefined> | undefined) | undefined;
56
+ } | {
57
+ type: "Basic";
58
+ username: string | (() => string | undefined) | undefined;
59
+ password: string | (() => string | undefined) | undefined;
60
+ } | {
61
+ type: "Custom";
62
+ prefix: string | (() => string | undefined) | undefined;
63
+ value: string | (() => string | undefined) | undefined;
64
+ }) | undefined;
65
+ headers?: {} | {
66
+ [x: string]: string | undefined;
67
+ accept?: ((string & {}) | "application/json" | "text/plain" | "application/octet-stream") | undefined;
68
+ "content-type"?: ((string & {}) | "application/x-www-form-urlencoded" | "application/json" | "text/plain" | "application/octet-stream" | "multipart/form-data") | undefined;
69
+ authorization?: ((string & {}) | `Bearer ${string}` | `Basic ${string}`) | undefined;
70
+ } | undefined;
71
+ body?: any;
72
+ query?: any;
73
+ params?: any;
74
+ duplex?: "full" | "half" | undefined;
75
+ jsonParser: (text: string) => Promise<any> | any;
76
+ retry?: _$_better_fetch_fetch0.RetryOptions | undefined;
77
+ retryAttempt?: number | undefined;
78
+ output?: (_$_better_fetch_fetch0.StandardSchemaV1 | typeof Blob | typeof File) | undefined;
79
+ errorSchema?: _$_better_fetch_fetch0.StandardSchemaV1 | undefined;
80
+ disableValidation?: boolean | undefined;
81
+ disableSignal?: boolean | undefined;
82
+ }, unknown, unknown, {}>;
83
+ $store: {
84
+ notify: (signal?: (Omit<string, "$sessionSignal"> | "$sessionSignal") | undefined) => void;
85
+ listen: (signal: Omit<string, "$sessionSignal"> | "$sessionSignal", listener: (value: boolean, oldValue?: boolean | undefined) => void) => void;
86
+ atoms: Record<string, WritableAtom<any>>;
87
+ };
88
+ };
89
+ //#endregion
90
+ export { getClientConfig };
@@ -0,0 +1,113 @@
1
+ import { getBaseURL } from "../utils/url.mjs";
2
+ import { parseJSON } from "./parser.mjs";
3
+ import { redirectPlugin } from "./fetch-plugins.mjs";
4
+ import { getSessionAtom, hydrateSessionAtom } from "./session-atom.mjs";
5
+ import { defu } from "defu";
6
+ import { createFetch } from "@better-fetch/fetch";
7
+ //#region src/client/config.ts
8
+ const resolvePublicAuthUrl = (basePath) => {
9
+ if (typeof process === "undefined") return void 0;
10
+ const path = basePath ?? "/api/auth";
11
+ if (process.env.NEXT_PUBLIC_AUTH_URL) return process.env.NEXT_PUBLIC_AUTH_URL;
12
+ if (typeof window === "undefined") {
13
+ if (process.env.NEXTAUTH_URL) try {
14
+ return process.env.NEXTAUTH_URL;
15
+ } catch {}
16
+ if (process.env.VERCEL_URL) try {
17
+ const protocol = process.env.VERCEL_URL.startsWith("http") ? "" : "https://";
18
+ return `${new URL(`${protocol}${process.env.VERCEL_URL}`).origin}${path}`;
19
+ } catch {}
20
+ }
21
+ };
22
+ const getClientConfig = (options, loadEnv) => {
23
+ const isCredentialsSupported = "credentials" in Request.prototype;
24
+ const baseURL = getBaseURL(options?.baseURL, options?.basePath, void 0, loadEnv) ?? resolvePublicAuthUrl(options?.basePath) ?? "/api/auth";
25
+ const pluginsFetchPlugins = options?.plugins?.flatMap((plugin) => plugin.fetchPlugins).filter((pl) => pl !== void 0) || [];
26
+ const lifeCyclePlugin = {
27
+ id: "lifecycle-hooks",
28
+ name: "lifecycle-hooks",
29
+ hooks: {
30
+ onSuccess: options?.fetchOptions?.onSuccess,
31
+ onError: options?.fetchOptions?.onError,
32
+ onRequest: options?.fetchOptions?.onRequest,
33
+ onResponse: options?.fetchOptions?.onResponse
34
+ }
35
+ };
36
+ const { onSuccess: _onSuccess, onError: _onError, onRequest: _onRequest, onResponse: _onResponse, ...restOfFetchOptions } = options?.fetchOptions || {};
37
+ const $fetch = createFetch({
38
+ baseURL,
39
+ ...isCredentialsSupported ? { credentials: "include" } : {},
40
+ method: "GET",
41
+ jsonParser(text) {
42
+ if (!text) return null;
43
+ return parseJSON(text, { strict: false });
44
+ },
45
+ customFetchImpl: fetch,
46
+ ...restOfFetchOptions,
47
+ plugins: [
48
+ lifeCyclePlugin,
49
+ ...restOfFetchOptions.plugins || [],
50
+ ...options?.disableDefaultFetchPlugins ? [] : [redirectPlugin],
51
+ ...pluginsFetchPlugins
52
+ ]
53
+ });
54
+ const { $sessionSignal, session, broadcastSessionUpdate } = getSessionAtom($fetch, options);
55
+ let hasHydrated = false;
56
+ const hydrateSession = (sessionData) => {
57
+ if (hasHydrated || sessionData === null) return;
58
+ hasHydrated = true;
59
+ hydrateSessionAtom(session, sessionData);
60
+ };
61
+ const plugins = options?.plugins || [];
62
+ let pluginsActions = {};
63
+ const pluginsAtoms = {
64
+ $sessionSignal,
65
+ session
66
+ };
67
+ const pluginPathMethods = {
68
+ "/sign-out": "POST",
69
+ "/revoke-sessions": "POST",
70
+ "/revoke-other-sessions": "POST",
71
+ "/delete-user": "POST"
72
+ };
73
+ const atomListeners = [{
74
+ signal: "$sessionSignal",
75
+ matcher(path) {
76
+ return path === "/sign-out" || path === "/update-user" || path === "/update-session" || path === "/sign-up/email" || path === "/sign-in/email" || path === "/delete-user" || path === "/verify-email" || path === "/revoke-sessions" || path === "/revoke-session" || path === "/revoke-other-sessions" || path === "/change-email" || path === "/change-password";
77
+ },
78
+ callback(path) {
79
+ if (path === "/sign-out") broadcastSessionUpdate("signout");
80
+ else if (path === "/update-user" || path === "/update-session") broadcastSessionUpdate("updateUser");
81
+ }
82
+ }];
83
+ for (const plugin of plugins) {
84
+ if (plugin.getAtoms) Object.assign(pluginsAtoms, plugin.getAtoms?.($fetch));
85
+ if (plugin.pathMethods) Object.assign(pluginPathMethods, plugin.pathMethods);
86
+ if (plugin.atomListeners) atomListeners.push(...plugin.atomListeners);
87
+ }
88
+ const $store = {
89
+ notify: (signal) => {
90
+ pluginsAtoms[signal].set(!pluginsAtoms[signal].get());
91
+ },
92
+ listen: (signal, listener) => {
93
+ pluginsAtoms[signal].subscribe(listener);
94
+ },
95
+ atoms: pluginsAtoms
96
+ };
97
+ for (const plugin of plugins) if (plugin.getActions) pluginsActions = defu(plugin.getActions?.($fetch, $store, options) ?? {}, pluginsActions);
98
+ return {
99
+ get baseURL() {
100
+ return baseURL;
101
+ },
102
+ pluginsActions,
103
+ pluginsAtoms,
104
+ pluginPathMethods,
105
+ atomListeners,
106
+ hydrateSession,
107
+ $sessionSignal,
108
+ $fetch,
109
+ $store
110
+ };
111
+ };
112
+ //#endregion
113
+ export { getClientConfig };
@@ -0,0 +1,19 @@
1
+ import { Store, StoreValue } from "nanostores";
2
+
3
+ //#region src/client/equality.d.ts
4
+ /**
5
+ * Deep structural equality for JSON-serializable values.
6
+ * Handles: primitives, null, arrays, and plain objects.
7
+ * Short-circuits on referential equality at every recursion level.
8
+ */
9
+ declare function isJsonEqual(a: unknown, b: unknown): boolean;
10
+ /**
11
+ * Attach an equality gate to a nanostores atom via `onSet`.
12
+ * When `isEqual(currentValue, newValue)` returns true, the `set()` call
13
+ * is aborted: no listeners fire, no framework re-renders occur.
14
+ *
15
+ * Returns the unsubscribe function from `onSet`.
16
+ */
17
+ declare function withEquality<S extends Store>(store: S, isEqual: (a: StoreValue<S>, b: StoreValue<S>) => boolean): () => void;
18
+ //#endregion
19
+ export { isJsonEqual, withEquality };
@@ -0,0 +1,42 @@
1
+ import { onSet } from "nanostores";
2
+ //#region src/client/equality.ts
3
+ function isPlainObject(value) {
4
+ if (typeof value !== "object" || value === null) return false;
5
+ const prototype = Object.getPrototypeOf(value);
6
+ return prototype === Object.prototype || prototype === null;
7
+ }
8
+ /**
9
+ * Deep structural equality for JSON-serializable values.
10
+ * Handles: primitives, null, arrays, and plain objects.
11
+ * Short-circuits on referential equality at every recursion level.
12
+ */
13
+ function isJsonEqual(a, b) {
14
+ if (a === b) return true;
15
+ if (Array.isArray(a) && Array.isArray(b)) {
16
+ if (a.length !== b.length) return false;
17
+ for (let i = 0; i < a.length; i++) if (!isJsonEqual(a[i], b[i])) return false;
18
+ return true;
19
+ }
20
+ if (isPlainObject(a) && isPlainObject(b)) {
21
+ const keysA = Object.keys(a);
22
+ const keysB = Object.keys(b);
23
+ if (keysA.length !== keysB.length) return false;
24
+ for (const key of keysA) if (!(key in b) || !isJsonEqual(a[key], b[key])) return false;
25
+ return true;
26
+ }
27
+ return false;
28
+ }
29
+ /**
30
+ * Attach an equality gate to a nanostores atom via `onSet`.
31
+ * When `isEqual(currentValue, newValue)` returns true, the `set()` call
32
+ * is aborted: no listeners fire, no framework re-renders occur.
33
+ *
34
+ * Returns the unsubscribe function from `onSet`.
35
+ */
36
+ function withEquality(store, isEqual) {
37
+ return onSet(store, ({ newValue, abort }) => {
38
+ if (isEqual(store.value, newValue)) abort();
39
+ });
40
+ }
41
+ //#endregion
42
+ export { isJsonEqual, withEquality };
@@ -0,0 +1,17 @@
1
+ import { isSafeUrlScheme } from "@better-auth/core/utils/url";
2
+ //#region src/client/fetch-plugins.ts
3
+ const redirectPlugin = {
4
+ id: "redirect",
5
+ name: "Redirect",
6
+ hooks: { onSuccess(context) {
7
+ if (context.data?.url && context.data?.redirect && isSafeUrlScheme(context.data.url)) {
8
+ if (typeof window !== "undefined" && window.location) {
9
+ if (window.location) try {
10
+ window.location.href = context.data.url;
11
+ } catch {}
12
+ }
13
+ }
14
+ } }
15
+ };
16
+ //#endregion
17
+ export { redirectPlugin };