@better-auth-ui/solid 1.6.19

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 (270) hide show
  1. package/dist/components/auth/email/email-changed.d.ts +59 -0
  2. package/dist/components/auth/email/email-changed.js +264 -0
  3. package/dist/components/auth/email/email-styles.d.ts +48 -0
  4. package/dist/components/auth/email/email-styles.js +107 -0
  5. package/dist/components/auth/email/email-verification.d.ts +51 -0
  6. package/dist/components/auth/email/email-verification.js +212 -0
  7. package/dist/components/auth/email/index.d.ts +9 -0
  8. package/dist/components/auth/email/magic-link.d.ts +53 -0
  9. package/dist/components/auth/email/magic-link.js +213 -0
  10. package/dist/components/auth/email/new-device.d.ts +77 -0
  11. package/dist/components/auth/email/new-device.js +326 -0
  12. package/dist/components/auth/email/organization-invitation.d.ts +70 -0
  13. package/dist/components/auth/email/organization-invitation.js +260 -0
  14. package/dist/components/auth/email/otp-email.d.ts +49 -0
  15. package/dist/components/auth/email/otp-email.js +191 -0
  16. package/dist/components/auth/email/password-changed.d.ts +56 -0
  17. package/dist/components/auth/email/password-changed.js +236 -0
  18. package/dist/components/auth/email/reset-password.d.ts +51 -0
  19. package/dist/components/auth/email/reset-password.js +212 -0
  20. package/dist/email.d.ts +18 -0
  21. package/dist/email.js +10 -0
  22. package/dist/hooks/auth/use-authenticate.d.ts +3 -0
  23. package/dist/hooks/auth/use-authenticate.js +18 -0
  24. package/dist/hooks/auth/use-sign-out.d.ts +2 -0
  25. package/dist/hooks/auth/use-sign-out.js +17 -0
  26. package/dist/hooks/auth/use-user.d.ts +213 -0
  27. package/dist/hooks/auth/use-user.js +13 -0
  28. package/dist/hooks/use-auth-mutation.d.ts +6 -0
  29. package/dist/hooks/use-auth-mutation.js +11 -0
  30. package/dist/hooks/use-auth-query.d.ts +5 -0
  31. package/dist/hooks/use-auth-query.js +17 -0
  32. package/dist/index.d.ts +48 -0
  33. package/dist/index.js +68 -0
  34. package/dist/lib/auth-client.d.ts +26 -0
  35. package/dist/lib/auth-config.d.ts +12 -0
  36. package/dist/lib/auth-config.js +21 -0
  37. package/dist/lib/auth-plugin.d.ts +16 -0
  38. package/dist/lib/auth-provider.d.ts +12 -0
  39. package/dist/lib/auth-provider.js +36 -0
  40. package/dist/lib/auth-server.d.ts +16 -0
  41. package/dist/lib/auth-utils.d.ts +3 -0
  42. package/dist/lib/auth-utils.js +12 -0
  43. package/dist/lib/fetch-options-provider.d.ts +23 -0
  44. package/dist/lib/fetch-options-provider.js +29 -0
  45. package/dist/lib/mutation-invalidator.d.ts +11 -0
  46. package/dist/lib/mutation-invalidator.js +20 -0
  47. package/dist/lib/provider-icons.d.ts +8 -0
  48. package/dist/lib/provider-icons.js +5 -0
  49. package/dist/mutations/api-key/create-api-key-mutation.d.ts +71 -0
  50. package/dist/mutations/api-key/create-api-key-mutation.js +12 -0
  51. package/dist/mutations/api-key/delete-api-key-mutation.d.ts +23 -0
  52. package/dist/mutations/api-key/delete-api-key-mutation.js +12 -0
  53. package/dist/mutations/auth/request-password-reset-mutation.d.ts +11 -0
  54. package/dist/mutations/auth/request-password-reset-mutation.js +8 -0
  55. package/dist/mutations/auth/reset-password-mutation.d.ts +13 -0
  56. package/dist/mutations/auth/reset-password-mutation.js +8 -0
  57. package/dist/mutations/auth/send-verification-email-mutation.d.ts +11 -0
  58. package/dist/mutations/auth/send-verification-email-mutation.js +8 -0
  59. package/dist/mutations/auth/sign-in-email-mutation.d.ts +15 -0
  60. package/dist/mutations/auth/sign-in-email-mutation.js +8 -0
  61. package/dist/mutations/auth/sign-in-social-mutation.d.ts +53 -0
  62. package/dist/mutations/auth/sign-in-social-mutation.js +8 -0
  63. package/dist/mutations/auth/sign-out-mutation.d.ts +6 -0
  64. package/dist/mutations/auth/sign-out-mutation.js +8 -0
  65. package/dist/mutations/auth/sign-up-email-mutation.d.ts +17 -0
  66. package/dist/mutations/auth/sign-up-email-mutation.js +8 -0
  67. package/dist/mutations/auth-mutation-options.d.ts +10 -0
  68. package/dist/mutations/auth-mutation-options.js +19 -0
  69. package/dist/mutations/create-auth-mutation.d.ts +10 -0
  70. package/dist/mutations/create-auth-mutation.js +20 -0
  71. package/dist/mutations/magic-link/sign-in-magic-link-mutation.d.ts +19 -0
  72. package/dist/mutations/magic-link/sign-in-magic-link-mutation.js +8 -0
  73. package/dist/mutations/multi-session/revoke-multi-session-mutation.d.ts +19 -0
  74. package/dist/mutations/multi-session/revoke-multi-session-mutation.js +12 -0
  75. package/dist/mutations/multi-session/set-active-session-mutation.d.ts +19 -0
  76. package/dist/mutations/multi-session/set-active-session-mutation.js +13 -0
  77. package/dist/mutations/organization/accept-invitation-mutation.d.ts +18 -0
  78. package/dist/mutations/organization/accept-invitation-mutation.js +12 -0
  79. package/dist/mutations/organization/cancel-invitation-mutation.d.ts +18 -0
  80. package/dist/mutations/organization/cancel-invitation-mutation.js +12 -0
  81. package/dist/mutations/organization/check-slug-mutation.d.ts +18 -0
  82. package/dist/mutations/organization/check-slug-mutation.js +15 -0
  83. package/dist/mutations/organization/create-organization-mutation.d.ts +38 -0
  84. package/dist/mutations/organization/create-organization-mutation.js +12 -0
  85. package/dist/mutations/organization/delete-organization-mutation.d.ts +18 -0
  86. package/dist/mutations/organization/delete-organization-mutation.js +12 -0
  87. package/dist/mutations/organization/index.d.ts +13 -0
  88. package/dist/mutations/organization/index.js +13 -0
  89. package/dist/mutations/organization/invite-member-mutation.d.ts +30 -0
  90. package/dist/mutations/organization/invite-member-mutation.js +12 -0
  91. package/dist/mutations/organization/leave-organization-mutation.d.ts +18 -0
  92. package/dist/mutations/organization/leave-organization-mutation.js +12 -0
  93. package/dist/mutations/organization/metadata.d.ts +13 -0
  94. package/dist/mutations/organization/metadata.js +27 -0
  95. package/dist/mutations/organization/reject-invitation-mutation.d.ts +18 -0
  96. package/dist/mutations/organization/reject-invitation-mutation.js +12 -0
  97. package/dist/mutations/organization/remove-member-mutation.d.ts +22 -0
  98. package/dist/mutations/organization/remove-member-mutation.js +12 -0
  99. package/dist/mutations/organization/set-active-organization-mutation.d.ts +24 -0
  100. package/dist/mutations/organization/set-active-organization-mutation.js +35 -0
  101. package/dist/mutations/organization/update-member-role-mutation.d.ts +26 -0
  102. package/dist/mutations/organization/update-member-role-mutation.js +12 -0
  103. package/dist/mutations/organization/update-organization-mutation.d.ts +42 -0
  104. package/dist/mutations/organization/update-organization-mutation.js +12 -0
  105. package/dist/mutations/organization/utils.d.ts +8 -0
  106. package/dist/mutations/organization/utils.js +17 -0
  107. package/dist/mutations/passkey/add-passkey-mutation.d.ts +73 -0
  108. package/dist/mutations/passkey/add-passkey-mutation.js +12 -0
  109. package/dist/mutations/passkey/delete-passkey-mutation.d.ts +19 -0
  110. package/dist/mutations/passkey/delete-passkey-mutation.js +12 -0
  111. package/dist/mutations/passkey/sign-in-passkey-mutation.d.ts +50 -0
  112. package/dist/mutations/passkey/sign-in-passkey-mutation.js +9 -0
  113. package/dist/mutations/settings/change-email-mutation.d.ts +11 -0
  114. package/dist/mutations/settings/change-email-mutation.js +8 -0
  115. package/dist/mutations/settings/change-password-mutation.d.ts +13 -0
  116. package/dist/mutations/settings/change-password-mutation.js +8 -0
  117. package/dist/mutations/settings/delete-user-mutation.d.ts +13 -0
  118. package/dist/mutations/settings/delete-user-mutation.js +8 -0
  119. package/dist/mutations/settings/link-social-mutation.d.ts +35 -0
  120. package/dist/mutations/settings/link-social-mutation.js +8 -0
  121. package/dist/mutations/settings/revoke-session-mutation.d.ts +19 -0
  122. package/dist/mutations/settings/revoke-session-mutation.js +12 -0
  123. package/dist/mutations/settings/unlink-account-mutation.d.ts +23 -0
  124. package/dist/mutations/settings/unlink-account-mutation.js +12 -0
  125. package/dist/mutations/settings/update-user-mutation.d.ts +6 -0
  126. package/dist/mutations/settings/update-user-mutation.js +8 -0
  127. package/dist/mutations/use-session-scoped-mutation.d.ts +17 -0
  128. package/dist/mutations/use-session-scoped-mutation.js +17 -0
  129. package/dist/mutations/username/is-username-available-mutation.d.ts +9 -0
  130. package/dist/mutations/username/is-username-available-mutation.js +8 -0
  131. package/dist/mutations/username/sign-in-username-mutation.d.ts +15 -0
  132. package/dist/mutations/username/sign-in-username-mutation.js +9 -0
  133. package/dist/plugins/captcha-plugin.d.ts +29 -0
  134. package/dist/plugins/captcha-plugin.js +26 -0
  135. package/dist/plugins.d.ts +2 -0
  136. package/dist/plugins.js +2 -0
  137. package/dist/queries/api-key/list-api-keys-query.d.ts +44 -0
  138. package/dist/queries/api-key/list-api-keys-query.js +17 -0
  139. package/dist/queries/auth/session-query.d.ts +22 -0
  140. package/dist/queries/auth/session-query.js +32 -0
  141. package/dist/queries/auth-query-options.d.ts +14 -0
  142. package/dist/queries/auth-query-options.js +17 -0
  143. package/dist/queries/create-user-scoped-query.d.ts +25 -0
  144. package/dist/queries/create-user-scoped-query.js +29 -0
  145. package/dist/queries/multi-session/list-device-sessions-query.d.ts +23 -0
  146. package/dist/queries/multi-session/list-device-sessions-query.js +17 -0
  147. package/dist/queries/organization/active-organization-query.d.ts +37 -0
  148. package/dist/queries/organization/active-organization-query.js +26 -0
  149. package/dist/queries/organization/full-organization-query.d.ts +35 -0
  150. package/dist/queries/organization/full-organization-query.js +25 -0
  151. package/dist/queries/organization/has-permission-query.d.ts +23 -0
  152. package/dist/queries/organization/has-permission-query.js +31 -0
  153. package/dist/queries/organization/index.d.ts +7 -0
  154. package/dist/queries/organization/index.js +7 -0
  155. package/dist/queries/organization/list-invitations-query.d.ts +29 -0
  156. package/dist/queries/organization/list-invitations-query.js +29 -0
  157. package/dist/queries/organization/list-members-query.d.ts +53 -0
  158. package/dist/queries/organization/list-members-query.js +29 -0
  159. package/dist/queries/organization/list-organizations-query.d.ts +23 -0
  160. package/dist/queries/organization/list-organizations-query.js +25 -0
  161. package/dist/queries/organization/list-user-invitations-query.d.ts +29 -0
  162. package/dist/queries/organization/list-user-invitations-query.js +25 -0
  163. package/dist/queries/organization/plugin.d.ts +1 -0
  164. package/dist/queries/organization/plugin.js +8 -0
  165. package/dist/queries/organization/utils.d.ts +16 -0
  166. package/dist/queries/organization/utils.js +18 -0
  167. package/dist/queries/passkey/list-passkeys-query.d.ts +23 -0
  168. package/dist/queries/passkey/list-passkeys-query.js +17 -0
  169. package/dist/queries/settings/account-info-query.d.ts +35 -0
  170. package/dist/queries/settings/account-info-query.js +17 -0
  171. package/dist/queries/settings/list-accounts-query.d.ts +23 -0
  172. package/dist/queries/settings/list-accounts-query.js +17 -0
  173. package/dist/queries/settings/list-sessions-query.d.ts +24 -0
  174. package/dist/queries/settings/list-sessions-query.js +17 -0
  175. package/dist/server/queries/auth/session-query.d.ts +19 -0
  176. package/dist/server/queries/auth/session-query.js +13 -0
  177. package/dist/server.d.ts +7 -0
  178. package/dist/server.js +7 -0
  179. package/package.json +63 -0
  180. package/src/components/auth/email/email-changed.tsx +305 -0
  181. package/src/components/auth/email/email-styles.tsx +139 -0
  182. package/src/components/auth/email/email-verification.tsx +249 -0
  183. package/src/components/auth/email/index.ts +9 -0
  184. package/src/components/auth/email/magic-link.tsx +254 -0
  185. package/src/components/auth/email/new-device.tsx +347 -0
  186. package/src/components/auth/email/organization-invitation.tsx +322 -0
  187. package/src/components/auth/email/otp-email.tsx +239 -0
  188. package/src/components/auth/email/password-changed.tsx +279 -0
  189. package/src/components/auth/email/reset-password.tsx +250 -0
  190. package/src/email.ts +49 -0
  191. package/src/hooks/auth/use-authenticate.ts +30 -0
  192. package/src/hooks/auth/use-sign-out.ts +23 -0
  193. package/src/hooks/auth/use-user.ts +19 -0
  194. package/src/hooks/use-auth-mutation.ts +35 -0
  195. package/src/hooks/use-auth-query.ts +33 -0
  196. package/src/index.ts +48 -0
  197. package/src/lib/auth-client.ts +43 -0
  198. package/src/lib/auth-config.ts +46 -0
  199. package/src/lib/auth-plugin.ts +20 -0
  200. package/src/lib/auth-provider.tsx +60 -0
  201. package/src/lib/auth-server.ts +25 -0
  202. package/src/lib/auth-utils.ts +25 -0
  203. package/src/lib/fetch-options-provider.tsx +77 -0
  204. package/src/lib/mutation-invalidator.tsx +82 -0
  205. package/src/lib/provider-icons.ts +10 -0
  206. package/src/mutations/api-key/create-api-key-mutation.ts +40 -0
  207. package/src/mutations/api-key/delete-api-key-mutation.ts +40 -0
  208. package/src/mutations/auth/request-password-reset-mutation.ts +15 -0
  209. package/src/mutations/auth/reset-password-mutation.ts +16 -0
  210. package/src/mutations/auth/send-verification-email-mutation.ts +15 -0
  211. package/src/mutations/auth/sign-in-email-mutation.ts +17 -0
  212. package/src/mutations/auth/sign-in-social-mutation.ts +16 -0
  213. package/src/mutations/auth/sign-out-mutation.ts +13 -0
  214. package/src/mutations/auth/sign-up-email-mutation.ts +17 -0
  215. package/src/mutations/auth-mutation-options.ts +62 -0
  216. package/src/mutations/create-auth-mutation.ts +44 -0
  217. package/src/mutations/magic-link/sign-in-magic-link-mutation.ts +15 -0
  218. package/src/mutations/multi-session/revoke-multi-session-mutation.ts +40 -0
  219. package/src/mutations/multi-session/set-active-session-mutation.ts +43 -0
  220. package/src/mutations/organization/accept-invitation-mutation.ts +38 -0
  221. package/src/mutations/organization/cancel-invitation-mutation.ts +38 -0
  222. package/src/mutations/organization/check-slug-mutation.ts +36 -0
  223. package/src/mutations/organization/create-organization-mutation.ts +37 -0
  224. package/src/mutations/organization/delete-organization-mutation.ts +37 -0
  225. package/src/mutations/organization/index.ts +13 -0
  226. package/src/mutations/organization/invite-member-mutation.ts +38 -0
  227. package/src/mutations/organization/leave-organization-mutation.ts +37 -0
  228. package/src/mutations/organization/metadata.ts +103 -0
  229. package/src/mutations/organization/reject-invitation-mutation.ts +38 -0
  230. package/src/mutations/organization/remove-member-mutation.ts +38 -0
  231. package/src/mutations/organization/set-active-organization-mutation.ts +110 -0
  232. package/src/mutations/organization/update-member-role-mutation.ts +38 -0
  233. package/src/mutations/organization/update-organization-mutation.ts +37 -0
  234. package/src/mutations/organization/utils.ts +51 -0
  235. package/src/mutations/passkey/add-passkey-mutation.ts +40 -0
  236. package/src/mutations/passkey/delete-passkey-mutation.ts +40 -0
  237. package/src/mutations/passkey/sign-in-passkey-mutation.ts +17 -0
  238. package/src/mutations/settings/change-email-mutation.ts +17 -0
  239. package/src/mutations/settings/change-password-mutation.ts +16 -0
  240. package/src/mutations/settings/delete-user-mutation.ts +16 -0
  241. package/src/mutations/settings/link-social-mutation.ts +16 -0
  242. package/src/mutations/settings/revoke-session-mutation.ts +38 -0
  243. package/src/mutations/settings/unlink-account-mutation.ts +38 -0
  244. package/src/mutations/settings/update-user-mutation.ts +17 -0
  245. package/src/mutations/use-session-scoped-mutation.ts +64 -0
  246. package/src/mutations/username/is-username-available-mutation.ts +15 -0
  247. package/src/mutations/username/sign-in-username-mutation.ts +17 -0
  248. package/src/plugins/captcha-plugin.tsx +64 -0
  249. package/src/plugins.ts +2 -0
  250. package/src/queries/api-key/list-api-keys-query.ts +93 -0
  251. package/src/queries/auth/session-query.ts +81 -0
  252. package/src/queries/auth-query-options.ts +57 -0
  253. package/src/queries/create-user-scoped-query.ts +107 -0
  254. package/src/queries/multi-session/list-device-sessions-query.ts +107 -0
  255. package/src/queries/organization/active-organization-query.ts +127 -0
  256. package/src/queries/organization/full-organization-query.ts +111 -0
  257. package/src/queries/organization/has-permission-query.ts +121 -0
  258. package/src/queries/organization/index.ts +7 -0
  259. package/src/queries/organization/list-invitations-query.ts +124 -0
  260. package/src/queries/organization/list-members-query.ts +124 -0
  261. package/src/queries/organization/list-organizations-query.ts +113 -0
  262. package/src/queries/organization/list-user-invitations-query.ts +114 -0
  263. package/src/queries/organization/plugin.ts +11 -0
  264. package/src/queries/organization/utils.ts +88 -0
  265. package/src/queries/passkey/list-passkeys-query.ts +93 -0
  266. package/src/queries/settings/account-info-query.ts +94 -0
  267. package/src/queries/settings/list-accounts-query.ts +94 -0
  268. package/src/queries/settings/list-sessions-query.ts +96 -0
  269. package/src/server/queries/auth/session-query.ts +56 -0
  270. package/src/server.ts +7 -0
@@ -0,0 +1,250 @@
1
+ import {
2
+ Body,
3
+ Button,
4
+ Container,
5
+ Head,
6
+ Heading,
7
+ Hr,
8
+ Html,
9
+ Img,
10
+ Link,
11
+ Preview,
12
+ Section,
13
+ Tailwind,
14
+ Text
15
+ } from "@solidjs-email/main"
16
+ import type { JSX } from "solid-js"
17
+ import { Show } from "solid-js"
18
+ import {
19
+ type EmailClassNames,
20
+ type EmailColors,
21
+ EmailStyles
22
+ } from "./email-styles"
23
+
24
+ function cn(...classes: Array<string | false | null | undefined>) {
25
+ return classes.filter(Boolean).join(" ")
26
+ }
27
+
28
+ const resetPasswordEmailLocalization = {
29
+ RESET_YOUR_PASSWORD: "Reset your password",
30
+ LOGO: "Logo",
31
+ WE_RECEIVED_REQUEST_TO_RESET_PASSWORD:
32
+ "We received a request to reset the password for your {appName} account {email}.",
33
+ RESET_PASSWORD: "Reset password",
34
+ OR_COPY_AND_PASTE_URL: "Or copy and paste this URL into your browser:",
35
+ THIS_LINK_EXPIRES_IN_MINUTES:
36
+ "This link expires in {expirationMinutes} minutes.",
37
+ EMAIL_SENT_BY: "Email sent by {appName}.",
38
+ IF_YOU_DIDNT_REQUEST_PASSWORD_RESET:
39
+ "If you didn't request a password reset, you can safely ignore this email. Your password will remain unchanged.",
40
+ POWERED_BY_BETTER_AUTH: "Powered by {betterAuth}"
41
+ }
42
+
43
+ export type ResetPasswordEmailLocalization =
44
+ typeof resetPasswordEmailLocalization
45
+
46
+ export interface ResetPasswordEmailProps {
47
+ url: string
48
+ email?: string
49
+ appName?: string
50
+ expirationMinutes?: number
51
+ logoURL?: string | { light: string; dark: string }
52
+ classNames?: EmailClassNames
53
+ colors?: EmailColors
54
+ poweredBy?: boolean
55
+ darkMode?: boolean
56
+ head?: JSX.Element
57
+ localization?: Partial<ResetPasswordEmailLocalization>
58
+ }
59
+
60
+ function cleanSentence(value: string) {
61
+ return value.replace(/\s{2,}/g, " ").replace(" .", ".")
62
+ }
63
+
64
+ export function ResetPasswordEmail(props: ResetPasswordEmailProps) {
65
+ const expirationMinutes = () => props.expirationMinutes ?? 60
66
+ const darkMode = () => props.darkMode ?? true
67
+ const localization = () => ({
68
+ ...ResetPasswordEmail.localization,
69
+ ...props.localization
70
+ })
71
+ const requestText = () =>
72
+ cleanSentence(
73
+ localization()
74
+ .WE_RECEIVED_REQUEST_TO_RESET_PASSWORD.replace(
75
+ "{appName}",
76
+ props.appName || ""
77
+ )
78
+ .replace("{email}", props.email || "")
79
+ )
80
+
81
+ return (
82
+ <Html>
83
+ <Head>
84
+ <meta content="light dark" name="color-scheme" />
85
+ <meta content="light dark" name="supported-color-schemes" />
86
+ <EmailStyles colors={props.colors} darkMode={darkMode()} />
87
+ {props.head}
88
+ </Head>
89
+
90
+ <Preview>{localization().RESET_YOUR_PASSWORD}</Preview>
91
+
92
+ <Tailwind>
93
+ <Body
94
+ class={cn("bg-background", props.classNames?.body)}
95
+ style={{ "font-family": "Arial, Helvetica, sans-serif" }}
96
+ >
97
+ <Container
98
+ class={cn(
99
+ "mx-auto my-auto max-w-xl px-2 py-10",
100
+ props.classNames?.container
101
+ )}
102
+ >
103
+ <Section
104
+ class={cn(
105
+ "rounded-none border border-border bg-card p-8 text-card-foreground",
106
+ props.classNames?.card
107
+ )}
108
+ >
109
+ {props.logoURL &&
110
+ (typeof props.logoURL === "string" ? (
111
+ <Img
112
+ alt={props.appName || localization().LOGO}
113
+ class={cn("mx-auto mb-8", props.classNames?.logo)}
114
+ height={48}
115
+ src={props.logoURL}
116
+ width={48}
117
+ />
118
+ ) : (
119
+ <>
120
+ <Img
121
+ alt={props.appName || localization().LOGO}
122
+ class={cn(
123
+ "logo-light mx-auto mb-8",
124
+ props.classNames?.logo
125
+ )}
126
+ height={48}
127
+ src={props.logoURL.light}
128
+ width={48}
129
+ />
130
+ <Img
131
+ alt={props.appName || localization().LOGO}
132
+ class={cn(
133
+ "logo-dark hidden mx-auto mb-8",
134
+ props.classNames?.logo
135
+ )}
136
+ height={48}
137
+ src={props.logoURL.dark}
138
+ width={48}
139
+ />
140
+ </>
141
+ ))}
142
+
143
+ <Heading
144
+ class={cn(
145
+ "m-0 mb-5 font-semibold text-2xl",
146
+ props.classNames?.title
147
+ )}
148
+ >
149
+ {localization().RESET_YOUR_PASSWORD}
150
+ </Heading>
151
+
152
+ <Text class={cn("text-sm", props.classNames?.content)}>
153
+ {requestText()}
154
+ </Text>
155
+
156
+ <Section class="my-6">
157
+ <Button
158
+ class={cn(
159
+ "inline-block whitespace-nowrap rounded-none bg-primary px-6 py-2.5 font-medium text-primary-foreground text-sm no-underline",
160
+ props.classNames?.button
161
+ )}
162
+ href={props.url}
163
+ >
164
+ {localization().RESET_PASSWORD}
165
+ </Button>
166
+ </Section>
167
+
168
+ <Text
169
+ class={cn(
170
+ "m-0 mb-3 text-muted-foreground text-xs",
171
+ props.classNames?.description
172
+ )}
173
+ >
174
+ {localization().OR_COPY_AND_PASTE_URL}
175
+ </Text>
176
+
177
+ <Link
178
+ class={cn(
179
+ "break-all text-primary text-xs",
180
+ props.classNames?.link
181
+ )}
182
+ href={props.url}
183
+ >
184
+ {props.url}
185
+ </Link>
186
+
187
+ <Hr
188
+ class={cn(
189
+ "my-6 w-full border border-border border-solid",
190
+ props.classNames?.separator
191
+ )}
192
+ />
193
+
194
+ <Text
195
+ class={cn(
196
+ "m-0 mb-3 text-muted-foreground text-xs",
197
+ props.classNames?.description
198
+ )}
199
+ >
200
+ {localization().THIS_LINK_EXPIRES_IN_MINUTES.replace(
201
+ "{expirationMinutes}",
202
+ expirationMinutes().toString()
203
+ )}
204
+ <Show when={props.appName}>
205
+ {(appName) =>
206
+ ` ${localization().EMAIL_SENT_BY.replace("{appName}", appName())}`
207
+ }
208
+ </Show>
209
+ </Text>
210
+
211
+ <Text
212
+ class={cn(
213
+ "m-0 text-muted-foreground text-xs",
214
+ props.classNames?.description
215
+ )}
216
+ >
217
+ {localization().IF_YOU_DIDNT_REQUEST_PASSWORD_RESET}
218
+ </Text>
219
+
220
+ <Show when={props.poweredBy}>
221
+ <Text
222
+ class={cn(
223
+ "m-0 mt-4 text-center text-[11px] text-muted-foreground",
224
+ props.classNames?.poweredBy
225
+ )}
226
+ >
227
+ {localization().POWERED_BY_BETTER_AUTH.replace(
228
+ "{betterAuth}",
229
+ "better-auth"
230
+ )}
231
+ </Text>
232
+ </Show>
233
+ </Section>
234
+ </Container>
235
+ </Body>
236
+ </Tailwind>
237
+ </Html>
238
+ )
239
+ }
240
+
241
+ ResetPasswordEmail.localization = resetPasswordEmailLocalization
242
+
243
+ ResetPasswordEmail.PreviewProps = {
244
+ url: "https://better-auth-ui.com/auth/reset-password?token=example-token",
245
+ email: "m@example.com",
246
+ appName: "Better Auth",
247
+ darkMode: true
248
+ } satisfies ResetPasswordEmailProps
249
+
250
+ export default ResetPasswordEmail
package/src/email.ts ADDED
@@ -0,0 +1,49 @@
1
+ export type {
2
+ EmailChangedEmailLocalization,
3
+ EmailChangedEmailProps
4
+ } from "./components/auth/email/email-changed.js"
5
+ export { default as EmailChangedEmail } from "./components/auth/email/email-changed.js"
6
+ export type {
7
+ EmailClassNames,
8
+ EmailColors
9
+ } from "./components/auth/email/email-styles.js"
10
+ export {
11
+ default as EmailStyles,
12
+ defaultColors
13
+ } from "./components/auth/email/email-styles.js"
14
+ export type {
15
+ EmailVerificationEmailLocalization,
16
+ EmailVerificationEmailProps
17
+ } from "./components/auth/email/email-verification.js"
18
+ export { default as EmailVerificationEmail } from "./components/auth/email/email-verification.js"
19
+ export type {
20
+ MagicLinkEmailLocalization,
21
+ MagicLinkEmailProps
22
+ } from "./components/auth/email/magic-link.js"
23
+ export { default as MagicLinkEmail } from "./components/auth/email/magic-link.js"
24
+ export type {
25
+ DeviceInfo,
26
+ NewDeviceEmailLocalization,
27
+ NewDeviceEmailProps
28
+ } from "./components/auth/email/new-device.js"
29
+ export { default as NewDeviceEmail } from "./components/auth/email/new-device.js"
30
+ export type {
31
+ OrganizationInvitationEmailLocalization,
32
+ OrganizationInvitationEmailProps
33
+ } from "./components/auth/email/organization-invitation.js"
34
+ export { default as OrganizationInvitationEmail } from "./components/auth/email/organization-invitation.js"
35
+ export type {
36
+ OtpEmailEmailLocalization,
37
+ OtpEmailProps
38
+ } from "./components/auth/email/otp-email.js"
39
+ export { default as OtpEmail } from "./components/auth/email/otp-email.js"
40
+ export type {
41
+ PasswordChangedEmailLocalization,
42
+ PasswordChangedEmailProps
43
+ } from "./components/auth/email/password-changed.js"
44
+ export { default as PasswordChangedEmail } from "./components/auth/email/password-changed.js"
45
+ export type {
46
+ ResetPasswordEmailLocalization,
47
+ ResetPasswordEmailProps
48
+ } from "./components/auth/email/reset-password.js"
49
+ export { default as ResetPasswordEmail } from "./components/auth/email/reset-password.js"
@@ -0,0 +1,30 @@
1
+ import { createEffect } from "solid-js"
2
+ import { isServer } from "solid-js/web"
3
+ import type { AuthClient } from "../../lib/auth-client"
4
+ import { useAuth } from "../../lib/auth-provider"
5
+ import {
6
+ type UseSessionOptions,
7
+ useSession
8
+ } from "../../queries/auth/session-query"
9
+
10
+ export function useAuthenticate<TAuthClient extends AuthClient>(
11
+ authClient: TAuthClient,
12
+ options?: UseSessionOptions<TAuthClient>
13
+ ) {
14
+ const config = useAuth()
15
+ const session = useSession(authClient, options)
16
+
17
+ createEffect(() => {
18
+ if (session.data || session.isPending) return
19
+
20
+ const currentURL = isServer
21
+ ? "/"
22
+ : window.location.pathname + window.location.search
23
+ const redirectTo = encodeURIComponent(currentURL)
24
+ const signInPath = `${config.basePaths.auth}/${config.viewPaths.auth.signIn}?redirectTo=${redirectTo}`
25
+
26
+ config.navigate({ to: signInPath, replace: true })
27
+ })
28
+
29
+ return session
30
+ }
@@ -0,0 +1,23 @@
1
+ import { authMutationKeys, authQueryKeys } from "@better-auth-ui/core"
2
+ import { createMutation, useQueryClient } from "@tanstack/solid-query"
3
+ import type { AuthClient } from "../../lib/auth-client"
4
+
5
+ export function useSignOut<TAuthClient extends AuthClient>(
6
+ authClient: TAuthClient
7
+ ) {
8
+ const queryClient = useQueryClient()
9
+
10
+ return createMutation(() => ({
11
+ mutationKey: authMutationKeys.signOut,
12
+ mutationFn: async () => {
13
+ await authClient.signOut({
14
+ fetchOptions: { throw: true }
15
+ })
16
+ },
17
+ onSuccess: () => {
18
+ queryClient.removeQueries({
19
+ queryKey: authQueryKeys.all
20
+ })
21
+ }
22
+ }))
23
+ }
@@ -0,0 +1,19 @@
1
+ import type { AuthClient } from "../../lib/auth-client"
2
+ import {
3
+ type UseSessionOptions,
4
+ useSession
5
+ } from "../../queries/auth/session-query"
6
+
7
+ export function useUser<TAuthClient extends AuthClient>(
8
+ authClient: TAuthClient,
9
+ options?: UseSessionOptions<TAuthClient>
10
+ ) {
11
+ const session = useSession(authClient, options)
12
+
13
+ return {
14
+ ...session,
15
+ get data() {
16
+ return session.data?.user
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,35 @@
1
+ import {
2
+ type CreateMutationOptions,
3
+ createMutation,
4
+ type MutationKey
5
+ } from "@tanstack/solid-query"
6
+ import type { BetterFetchError } from "better-auth/client"
7
+ import {
8
+ type AuthMutationFn,
9
+ type AuthMutationFnData,
10
+ type AuthMutationFnVariables,
11
+ authMutationOptions
12
+ } from "../mutations/auth-mutation-options"
13
+
14
+ type UseAuthMutationOptions<TFn extends AuthMutationFn> = Omit<
15
+ CreateMutationOptions<
16
+ AuthMutationFnData<TFn>,
17
+ BetterFetchError,
18
+ AuthMutationFnVariables<TFn>
19
+ >,
20
+ "mutationKey" | "mutationFn"
21
+ >
22
+
23
+ export function useAuthMutation<
24
+ TFn extends AuthMutationFn,
25
+ const TMutationKey extends MutationKey
26
+ >(
27
+ authFn: TFn,
28
+ mutationKey: TMutationKey,
29
+ options?: UseAuthMutationOptions<TFn>
30
+ ) {
31
+ return createMutation(() => ({
32
+ ...authMutationOptions(authFn, mutationKey),
33
+ ...options
34
+ }))
35
+ }
@@ -0,0 +1,33 @@
1
+ import { createQuery, type QueryKey } from "@tanstack/solid-query"
2
+ import {
3
+ type AuthQueryFn,
4
+ type AuthQueryOptions,
5
+ authQueryOptions
6
+ } from "../queries/auth-query-options"
7
+
8
+ type UseAuthQueryOptions<
9
+ TFn extends AuthQueryFn,
10
+ TPrefix extends QueryKey
11
+ > = Omit<AuthQueryOptions<TFn, TPrefix>, "queryKey" | "queryFn"> &
12
+ Pick<NonNullable<Parameters<TFn>[0]>, "query" | "fetchOptions">
13
+
14
+ export function useAuthQuery<
15
+ TFn extends AuthQueryFn,
16
+ const TQueryKey extends QueryKey
17
+ >(
18
+ authFn: TFn,
19
+ queryKey: TQueryKey,
20
+ options?: UseAuthQueryOptions<TFn, TQueryKey>
21
+ ) {
22
+ return createQuery(() => {
23
+ const { query, fetchOptions, ...queryOptions } = options ?? {}
24
+
25
+ return {
26
+ ...authQueryOptions(authFn, queryKey, {
27
+ query,
28
+ fetchOptions
29
+ } as Parameters<TFn>[0]),
30
+ ...queryOptions
31
+ }
32
+ })
33
+ }
package/src/index.ts ADDED
@@ -0,0 +1,48 @@
1
+ export { createAuthClient } from "better-auth/solid"
2
+ export * from "./hooks/auth/use-authenticate"
3
+ export * from "./hooks/auth/use-sign-out"
4
+ export * from "./hooks/auth/use-user"
5
+ export * from "./hooks/use-auth-mutation"
6
+ export * from "./hooks/use-auth-query"
7
+ export type * from "./lib/auth-client"
8
+ export * from "./lib/auth-config"
9
+ export * from "./lib/auth-provider"
10
+ export * from "./lib/auth-utils"
11
+ export * from "./lib/fetch-options-provider"
12
+ export * from "./lib/mutation-invalidator"
13
+ export * from "./lib/provider-icons"
14
+ export * from "./mutations/api-key/create-api-key-mutation"
15
+ export * from "./mutations/api-key/delete-api-key-mutation"
16
+ export * from "./mutations/auth/request-password-reset-mutation"
17
+ export * from "./mutations/auth/reset-password-mutation"
18
+ export * from "./mutations/auth/send-verification-email-mutation"
19
+ export * from "./mutations/auth/sign-in-email-mutation"
20
+ export * from "./mutations/auth/sign-in-social-mutation"
21
+ export * from "./mutations/auth/sign-out-mutation"
22
+ export * from "./mutations/auth/sign-up-email-mutation"
23
+ export * from "./mutations/auth-mutation-options"
24
+ export * from "./mutations/magic-link/sign-in-magic-link-mutation"
25
+ export * from "./mutations/multi-session/revoke-multi-session-mutation"
26
+ export * from "./mutations/multi-session/set-active-session-mutation"
27
+ export * from "./mutations/organization"
28
+ export * from "./mutations/passkey/add-passkey-mutation"
29
+ export * from "./mutations/passkey/delete-passkey-mutation"
30
+ export * from "./mutations/passkey/sign-in-passkey-mutation"
31
+ export * from "./mutations/settings/change-email-mutation"
32
+ export * from "./mutations/settings/change-password-mutation"
33
+ export * from "./mutations/settings/delete-user-mutation"
34
+ export * from "./mutations/settings/link-social-mutation"
35
+ export * from "./mutations/settings/revoke-session-mutation"
36
+ export * from "./mutations/settings/unlink-account-mutation"
37
+ export * from "./mutations/settings/update-user-mutation"
38
+ export * from "./mutations/username/is-username-available-mutation"
39
+ export * from "./mutations/username/sign-in-username-mutation"
40
+ export * from "./queries/api-key/list-api-keys-query"
41
+ export * from "./queries/auth/session-query"
42
+ export * from "./queries/auth-query-options"
43
+ export * from "./queries/multi-session/list-device-sessions-query"
44
+ export * from "./queries/organization"
45
+ export * from "./queries/passkey/list-passkeys-query"
46
+ export * from "./queries/settings/account-info-query"
47
+ export * from "./queries/settings/list-accounts-query"
48
+ export * from "./queries/settings/list-sessions-query"
@@ -0,0 +1,43 @@
1
+ import type { apiKeyClient } from "@better-auth/api-key/client"
2
+ import type { passkeyClient } from "@better-auth/passkey/client"
3
+ import type {
4
+ magicLinkClient,
5
+ multiSessionClient,
6
+ organizationClient,
7
+ usernameClient
8
+ } from "better-auth/client/plugins"
9
+ import type { createAuthClient } from "better-auth/solid"
10
+
11
+ export type AuthClient = ReturnType<typeof createAuthClient>
12
+
13
+ export type MagicLinkAuthClient = ReturnType<
14
+ typeof createAuthClient<{ plugins: [ReturnType<typeof magicLinkClient>] }>
15
+ >
16
+
17
+ export type MultiSessionAuthClient = ReturnType<
18
+ typeof createAuthClient<{ plugins: [ReturnType<typeof multiSessionClient>] }>
19
+ >
20
+
21
+ export type PasskeyAuthClient = ReturnType<
22
+ typeof createAuthClient<{ plugins: [ReturnType<typeof passkeyClient>] }>
23
+ >
24
+
25
+ export type ApiKeyAuthClient = ReturnType<
26
+ typeof createAuthClient<{ plugins: [ReturnType<typeof apiKeyClient>] }>
27
+ >
28
+
29
+ export type UsernameAuthClient = ReturnType<
30
+ typeof createAuthClient<{ plugins: [ReturnType<typeof usernameClient>] }>
31
+ >
32
+
33
+ export type OrganizationAuthClient = ReturnType<
34
+ typeof createAuthClient<{
35
+ plugins: [ReturnType<typeof organizationClient<object>>]
36
+ }>
37
+ >
38
+
39
+ export type InferData<TMethod> = TMethod extends (
40
+ ...args: infer _Args
41
+ ) => Promise<infer TResult extends { data: unknown }>
42
+ ? TResult["data"]
43
+ : never
@@ -0,0 +1,46 @@
1
+ import {
2
+ type AuthConfig,
3
+ type DeepPartial,
4
+ deepmerge,
5
+ defaultAuthConfig
6
+ } from "@better-auth-ui/core"
7
+ import type { AuthClient } from "./auth-client"
8
+ import { mergeAdditionalFields, resolveRedirectTo } from "./auth-utils"
9
+
10
+ declare module "@better-auth-ui/core" {
11
+ interface AuthConfig {
12
+ /** The Solid Better Auth client used by auth context consumers. */
13
+ authClient: AuthClient
14
+ }
15
+ }
16
+
17
+ export type SolidAuthConfigInput<TAuthClient = AuthClient> =
18
+ DeepPartial<AuthConfig> & {
19
+ authClient: TAuthClient
20
+ }
21
+
22
+ export function resolveAuthConfig(
23
+ config: SolidAuthConfigInput<AuthClient>
24
+ ): AuthConfig {
25
+ const mergedConfig = deepmerge(defaultAuthConfig, {
26
+ ...config,
27
+ viewPaths: {
28
+ auth: {
29
+ ...defaultAuthConfig.viewPaths.auth,
30
+ ...config.viewPaths?.auth
31
+ },
32
+ settings: {
33
+ ...defaultAuthConfig.viewPaths.settings,
34
+ ...config.viewPaths?.settings
35
+ }
36
+ }
37
+ } as AuthConfig)
38
+
39
+ mergedConfig.redirectTo = resolveRedirectTo(mergedConfig.redirectTo)
40
+ mergedConfig.additionalFields = mergeAdditionalFields(
41
+ mergedConfig.plugins?.flatMap((plugin) => plugin.additionalFields ?? []),
42
+ mergedConfig.additionalFields
43
+ )
44
+
45
+ return mergedConfig as AuthConfig
46
+ }
@@ -0,0 +1,20 @@
1
+ import type { AuthPluginBase } from "@better-auth-ui/core"
2
+ import type { Component } from "solid-js"
3
+
4
+ export type CaptchaComponent = Component
5
+
6
+ export type SolidAuthPlugin = AuthPluginBase & {
7
+ /** Captcha widget rendered above submit buttons in auth forms. */
8
+ captchaComponent?: CaptchaComponent
9
+ /** Allow app-owned copied components to add Solid-specific plugin slots. */
10
+ [key: string]: unknown
11
+ }
12
+
13
+ declare module "@better-auth-ui/core" {
14
+ interface AuthPluginRegister {
15
+ solid: SolidAuthPlugin
16
+ }
17
+ }
18
+
19
+ export type { AuthPluginViewPaths } from "@better-auth-ui/core"
20
+ export type AuthPlugin = SolidAuthPlugin
@@ -0,0 +1,60 @@
1
+ import type { AuthConfig } from "@better-auth-ui/core"
2
+ import { QueryClient, QueryClientProvider } from "@tanstack/solid-query"
3
+ import { createContext, type JSX, useContext } from "solid-js"
4
+ import type { AuthClient } from "./auth-client"
5
+ import { resolveAuthConfig, type SolidAuthConfigInput } from "./auth-config"
6
+ import { FetchOptionsProvider } from "./fetch-options-provider"
7
+ import { MutationInvalidator } from "./mutation-invalidator"
8
+
9
+ const AuthContext = createContext<AuthConfig>()
10
+ /** Provider-instance scoped config fallback for SSR — replaces the former module-level global. */
11
+ const RenderingAuthConfigContext = createContext<AuthConfig>()
12
+
13
+ const fallbackQueryClient = new QueryClient({
14
+ defaultOptions: {
15
+ queries: {
16
+ staleTime: 5000
17
+ }
18
+ }
19
+ })
20
+
21
+ export type AuthProviderProps<TAuthClient = AuthClient> =
22
+ SolidAuthConfigInput<TAuthClient> & {
23
+ children?: JSX.Element | (() => JSX.Element)
24
+ /** TanStack QueryClient to use for your application's queries. */
25
+ queryClient?: QueryClient
26
+ }
27
+
28
+ const resolveProviderChildren = (children: AuthProviderProps["children"]) =>
29
+ typeof children === "function" ? children() : children
30
+
31
+ export function AuthProvider(props: AuthProviderProps) {
32
+ const { children, queryClient: qc, ...configInput } = props
33
+ const config = resolveAuthConfig(configInput as AuthProviderProps<AuthClient>)
34
+ const queryClient = qc || fallbackQueryClient
35
+
36
+ return (
37
+ <AuthContext.Provider value={config}>
38
+ <RenderingAuthConfigContext.Provider value={config}>
39
+ <QueryClientProvider client={queryClient}>
40
+ <FetchOptionsProvider>
41
+ <MutationInvalidator queryClient={queryClient} />
42
+ {resolveProviderChildren(children)}
43
+ </FetchOptionsProvider>
44
+ </QueryClientProvider>
45
+ </RenderingAuthConfigContext.Provider>
46
+ </AuthContext.Provider>
47
+ )
48
+ }
49
+
50
+ export function useAuth(): AuthConfig {
51
+ const context = useContext(AuthContext)
52
+ const renderingConfig = useContext(RenderingAuthConfigContext)
53
+ const auth = context ?? renderingConfig
54
+
55
+ if (!auth) {
56
+ throw new Error("[Better Auth UI] AuthProvider is required")
57
+ }
58
+
59
+ return auth
60
+ }