@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,25 @@
1
+ import type { passkey } from "@better-auth/passkey"
2
+ import type { Auth } from "better-auth"
3
+ import type { magicLink, multiSession, username } from "better-auth/plugins"
4
+
5
+ export type AuthServer = Pick<Auth, "api">
6
+
7
+ export type MagicLinkAuthServer = Pick<
8
+ Auth<{ plugins: [ReturnType<typeof magicLink>] }>,
9
+ "api"
10
+ >
11
+
12
+ export type MultiSessionAuthServer = Pick<
13
+ Auth<{ plugins: [ReturnType<typeof multiSession>] }>,
14
+ "api"
15
+ >
16
+
17
+ export type PasskeyAuthServer = Pick<
18
+ Auth<{ plugins: [ReturnType<typeof passkey>] }>,
19
+ "api"
20
+ >
21
+
22
+ export type UsernameAuthServer = Pick<
23
+ Auth<{ plugins: [ReturnType<typeof username>] }>,
24
+ "api"
25
+ >
@@ -0,0 +1,25 @@
1
+ import type { AdditionalField } from "@better-auth-ui/core"
2
+
3
+ export function resolveRedirectTo(fallback: string): string {
4
+ return (
5
+ (typeof window !== "undefined" &&
6
+ new URLSearchParams(window.location.search).get("redirectTo")?.trim()) ||
7
+ fallback
8
+ )
9
+ }
10
+
11
+ export function mergeAdditionalFields(
12
+ pluginFields: readonly AdditionalField[] = [],
13
+ userFields: readonly AdditionalField[] = []
14
+ ): AdditionalField[] {
15
+ const fieldsByName = new Map<string, AdditionalField>()
16
+
17
+ for (const field of pluginFields) {
18
+ fieldsByName.set(field.name, field)
19
+ }
20
+ for (const field of userFields) {
21
+ fieldsByName.set(field.name, field)
22
+ }
23
+
24
+ return Array.from(fieldsByName.values())
25
+ }
@@ -0,0 +1,77 @@
1
+ import {
2
+ type Accessor,
3
+ createContext,
4
+ createSignal,
5
+ type JSX,
6
+ useContext
7
+ } from "solid-js"
8
+
9
+ /** Subset of Better Auth fetch options used by auth flows. Add fields as use-cases arise. */
10
+ export type FetchOptions = {
11
+ headers?: Record<string, string>
12
+ body?: Record<string, unknown>
13
+ credentials?: RequestCredentials
14
+ signal?: AbortSignal
15
+ }
16
+
17
+ export type FetchOptionsContextValue = {
18
+ /** Current fetchOptions, or `undefined` when none are set. */
19
+ fetchOptions: Accessor<FetchOptions | undefined>
20
+ /** Overrides the entire fetchOptions object. Pass `undefined` to clear. */
21
+ setFetchOptions: (fetchOptions: FetchOptions | undefined) => void
22
+ /** Clears fetchOptions and runs the registered reset callback. */
23
+ resetFetchOptions: () => void
24
+ /** Register a reset handler. Used by `captchaPlugin`. Pass `null` to clear. */
25
+ registerReset: (reset: (() => void) | null) => void
26
+ }
27
+
28
+ const FetchOptionsContext = createContext<FetchOptionsContextValue>()
29
+
30
+ export type FetchOptionsProviderProps = {
31
+ children?: JSX.Element | (() => JSX.Element)
32
+ }
33
+
34
+ const resolveProviderChildren = (
35
+ children: FetchOptionsProviderProps["children"]
36
+ ) => (typeof children === "function" ? children() : children)
37
+
38
+ export function FetchOptionsProvider(props: FetchOptionsProviderProps) {
39
+ const [fetchOptions, setFetchOptions] = createSignal<
40
+ FetchOptions | undefined
41
+ >()
42
+ let reset: (() => void) | null = null
43
+
44
+ const registerReset = (nextReset: (() => void) | null) => {
45
+ reset = nextReset
46
+ }
47
+
48
+ const resetFetchOptions = () => {
49
+ setFetchOptions(undefined)
50
+ reset?.()
51
+ }
52
+
53
+ return (
54
+ <FetchOptionsContext.Provider
55
+ value={{
56
+ fetchOptions,
57
+ setFetchOptions,
58
+ resetFetchOptions,
59
+ registerReset
60
+ }}
61
+ >
62
+ {resolveProviderChildren(props.children)}
63
+ </FetchOptionsContext.Provider>
64
+ )
65
+ }
66
+
67
+ export function useFetchOptions(): FetchOptionsContextValue {
68
+ const context = useContext(FetchOptionsContext)
69
+
70
+ if (!context) {
71
+ throw new Error(
72
+ "[Better Auth UI] useFetchOptions must be used within FetchOptionsProvider"
73
+ )
74
+ }
75
+
76
+ return context
77
+ }
@@ -0,0 +1,82 @@
1
+ import { authMutationKeys } from "@better-auth-ui/core"
2
+ import type { QueryClient, QueryKey } from "@tanstack/solid-query"
3
+ import { onCleanup } from "solid-js"
4
+ import type { AuthMutationMeta } from "../mutations/create-auth-mutation"
5
+
6
+ const keyStartsWith = (
7
+ queryKey: readonly unknown[],
8
+ prefix: readonly unknown[]
9
+ ) => prefix.every((part, index) => Object.is(queryKey[index], part))
10
+
11
+ const matchesAnyPrefix = (
12
+ queryKey: readonly unknown[] | undefined,
13
+ prefixes: Array<QueryKey> | undefined
14
+ ) =>
15
+ Boolean(
16
+ queryKey &&
17
+ prefixes?.some((prefix) =>
18
+ keyStartsWith(queryKey, prefix as readonly unknown[])
19
+ )
20
+ )
21
+
22
+ export async function invalidateAuthMutationMeta(
23
+ queryClient: QueryClient,
24
+ mutation: {
25
+ options?: { mutationKey?: QueryKey; meta?: unknown }
26
+ meta?: unknown
27
+ }
28
+ ) {
29
+ const mutationKey = mutation.options?.mutationKey
30
+
31
+ if (!keyStartsWith(mutationKey ?? [], authMutationKeys.all)) {
32
+ return
33
+ }
34
+
35
+ const meta = (mutation.options?.meta ??
36
+ mutation.meta ??
37
+ {}) as AuthMutationMeta
38
+ const { invalidates, awaits } = meta
39
+
40
+ if (invalidates?.length) {
41
+ queryClient.invalidateQueries({
42
+ predicate: (query) => matchesAnyPrefix(query.queryKey, invalidates)
43
+ })
44
+ }
45
+
46
+ if (awaits?.length) {
47
+ await queryClient.invalidateQueries(
48
+ {
49
+ predicate: (query) => matchesAnyPrefix(query.queryKey, awaits)
50
+ },
51
+ { cancelRefetch: false }
52
+ )
53
+ }
54
+ }
55
+
56
+ export function MutationInvalidator(props: { queryClient: QueryClient }) {
57
+ const mutationCache = props.queryClient.getMutationCache()
58
+ const previousOnSuccess = mutationCache.config.onSuccess
59
+
60
+ mutationCache.config.onSuccess = async (
61
+ data,
62
+ variables,
63
+ onMutateResult,
64
+ mutation,
65
+ context
66
+ ) => {
67
+ await previousOnSuccess?.(
68
+ data,
69
+ variables,
70
+ onMutateResult,
71
+ mutation,
72
+ context
73
+ )
74
+ await invalidateAuthMutationMeta(props.queryClient, mutation)
75
+ }
76
+
77
+ onCleanup(() => {
78
+ mutationCache.config.onSuccess = previousOnSuccess
79
+ })
80
+
81
+ return null
82
+ }
@@ -0,0 +1,10 @@
1
+ import { providerNames } from "@better-auth-ui/core"
2
+
3
+ /**
4
+ * Stable list of provider icon keys supported by core.
5
+ *
6
+ * Solid component icons are intentionally deferred to the Zaidan registry slice;
7
+ * this helper lets consumers and registry tooling align on the same provider
8
+ * namespace without shipping React icon components from this package.
9
+ */
10
+ export const providerIconNames = Object.keys(providerNames).sort()
@@ -0,0 +1,40 @@
1
+ import {
2
+ apiKeyMutationKeys,
3
+ apiKeyQueryKeys
4
+ } from "@better-auth-ui/core/plugins"
5
+ import type { ApiKeyAuthClient } from "../../lib/auth-client"
6
+ import { createAuthMutationOptions } from "../create-auth-mutation"
7
+ import { useSessionScopedMutation } from "../use-session-scoped-mutation"
8
+
9
+ export type CreateApiKeyParams<TAuthClient extends ApiKeyAuthClient> =
10
+ Parameters<TAuthClient["apiKey"]["create"]>[0]
11
+
12
+ export type CreateApiKeyOptions = Parameters<
13
+ typeof useSessionScopedMutation<
14
+ ApiKeyAuthClient,
15
+ ApiKeyAuthClient["apiKey"]["create"],
16
+ typeof apiKeyMutationKeys.create
17
+ >
18
+ >[4]
19
+
20
+ export function createApiKeyOptions<TAuthClient extends ApiKeyAuthClient>(
21
+ authClient: TAuthClient
22
+ ) {
23
+ return createAuthMutationOptions(
24
+ authClient.apiKey.create,
25
+ apiKeyMutationKeys.create
26
+ )
27
+ }
28
+
29
+ export function useCreateApiKey<TAuthClient extends ApiKeyAuthClient>(
30
+ authClient: TAuthClient,
31
+ options?: CreateApiKeyOptions
32
+ ) {
33
+ return useSessionScopedMutation(
34
+ authClient,
35
+ authClient.apiKey.create,
36
+ apiKeyMutationKeys.create,
37
+ (userId) => ({ awaits: [apiKeyQueryKeys.lists(userId)] }),
38
+ options
39
+ )
40
+ }
@@ -0,0 +1,40 @@
1
+ import {
2
+ apiKeyMutationKeys,
3
+ apiKeyQueryKeys
4
+ } from "@better-auth-ui/core/plugins"
5
+ import type { ApiKeyAuthClient } from "../../lib/auth-client"
6
+ import { createAuthMutationOptions } from "../create-auth-mutation"
7
+ import { useSessionScopedMutation } from "../use-session-scoped-mutation"
8
+
9
+ export type DeleteApiKeyParams<TAuthClient extends ApiKeyAuthClient> =
10
+ Parameters<TAuthClient["apiKey"]["delete"]>[0]
11
+
12
+ export type DeleteApiKeyOptions = Parameters<
13
+ typeof useSessionScopedMutation<
14
+ ApiKeyAuthClient,
15
+ ApiKeyAuthClient["apiKey"]["delete"],
16
+ typeof apiKeyMutationKeys.delete
17
+ >
18
+ >[4]
19
+
20
+ export function deleteApiKeyOptions<TAuthClient extends ApiKeyAuthClient>(
21
+ authClient: TAuthClient
22
+ ) {
23
+ return createAuthMutationOptions(
24
+ authClient.apiKey.delete,
25
+ apiKeyMutationKeys.delete
26
+ )
27
+ }
28
+
29
+ export function useDeleteApiKey<TAuthClient extends ApiKeyAuthClient>(
30
+ authClient: TAuthClient,
31
+ options?: DeleteApiKeyOptions
32
+ ) {
33
+ return useSessionScopedMutation(
34
+ authClient,
35
+ authClient.apiKey.delete,
36
+ apiKeyMutationKeys.delete,
37
+ (userId) => ({ awaits: [apiKeyQueryKeys.lists(userId)] }),
38
+ options
39
+ )
40
+ }
@@ -0,0 +1,15 @@
1
+ import { authMutationKeys } from "@better-auth-ui/core"
2
+ import type { AuthClient } from "../../lib/auth-client"
3
+ import { createAuthMutationOptions } from "../create-auth-mutation"
4
+
5
+ export type RequestPasswordResetParams<TAuthClient extends AuthClient> =
6
+ Parameters<TAuthClient["requestPasswordReset"]>[0]
7
+
8
+ export function requestPasswordResetOptions<TAuthClient extends AuthClient>(
9
+ authClient: TAuthClient
10
+ ) {
11
+ return createAuthMutationOptions(
12
+ authClient.requestPasswordReset,
13
+ authMutationKeys.requestPasswordReset
14
+ )
15
+ }
@@ -0,0 +1,16 @@
1
+ import { authMutationKeys } from "@better-auth-ui/core"
2
+ import type { AuthClient } from "../../lib/auth-client"
3
+ import { createAuthMutationOptions } from "../create-auth-mutation"
4
+
5
+ export type ResetPasswordParams<TAuthClient extends AuthClient> = Parameters<
6
+ TAuthClient["resetPassword"]
7
+ >[0]
8
+
9
+ export function resetPasswordOptions<TAuthClient extends AuthClient>(
10
+ authClient: TAuthClient
11
+ ) {
12
+ return createAuthMutationOptions(
13
+ authClient.resetPassword,
14
+ authMutationKeys.resetPassword
15
+ )
16
+ }
@@ -0,0 +1,15 @@
1
+ import { authMutationKeys } from "@better-auth-ui/core"
2
+ import type { AuthClient } from "../../lib/auth-client"
3
+ import { createAuthMutationOptions } from "../create-auth-mutation"
4
+
5
+ export type SendVerificationEmailParams<TAuthClient extends AuthClient> =
6
+ Parameters<TAuthClient["sendVerificationEmail"]>[0]
7
+
8
+ export function sendVerificationEmailOptions<TAuthClient extends AuthClient>(
9
+ authClient: TAuthClient
10
+ ) {
11
+ return createAuthMutationOptions(
12
+ authClient.sendVerificationEmail,
13
+ authMutationKeys.sendVerificationEmail
14
+ )
15
+ }
@@ -0,0 +1,17 @@
1
+ import { authMutationKeys, authQueryKeys } from "@better-auth-ui/core"
2
+ import type { AuthClient } from "../../lib/auth-client"
3
+ import { createAuthMutationOptions } from "../create-auth-mutation"
4
+
5
+ export type SignInEmailParams<TAuthClient extends AuthClient> = Parameters<
6
+ TAuthClient["signIn"]["email"]
7
+ >[0]
8
+
9
+ export function signInEmailOptions<TAuthClient extends AuthClient>(
10
+ authClient: TAuthClient
11
+ ) {
12
+ return createAuthMutationOptions(
13
+ authClient.signIn.email,
14
+ authMutationKeys.signIn.email,
15
+ { awaits: [authQueryKeys.session] }
16
+ )
17
+ }
@@ -0,0 +1,16 @@
1
+ import { authMutationKeys } from "@better-auth-ui/core"
2
+ import type { AuthClient } from "../../lib/auth-client"
3
+ import { createAuthMutationOptions } from "../create-auth-mutation"
4
+
5
+ export type SignInSocialParams<TAuthClient extends AuthClient> = Parameters<
6
+ TAuthClient["signIn"]["social"]
7
+ >[0]
8
+
9
+ export function signInSocialOptions<TAuthClient extends AuthClient>(
10
+ authClient: TAuthClient
11
+ ) {
12
+ return createAuthMutationOptions(
13
+ authClient.signIn.social,
14
+ authMutationKeys.signIn.social
15
+ )
16
+ }
@@ -0,0 +1,13 @@
1
+ import { authMutationKeys } from "@better-auth-ui/core"
2
+ import type { AuthClient } from "../../lib/auth-client"
3
+ import { createAuthMutationOptions } from "../create-auth-mutation"
4
+
5
+ export type SignOutParams<TAuthClient extends AuthClient> = Parameters<
6
+ TAuthClient["signOut"]
7
+ >[0]
8
+
9
+ export function signOutOptions<TAuthClient extends AuthClient>(
10
+ authClient: TAuthClient
11
+ ) {
12
+ return createAuthMutationOptions(authClient.signOut, authMutationKeys.signOut)
13
+ }
@@ -0,0 +1,17 @@
1
+ import { authMutationKeys, authQueryKeys } from "@better-auth-ui/core"
2
+ import type { AuthClient } from "../../lib/auth-client"
3
+ import { createAuthMutationOptions } from "../create-auth-mutation"
4
+
5
+ export type SignUpEmailParams<TAuthClient extends AuthClient> = Parameters<
6
+ TAuthClient["signUp"]["email"]
7
+ >[0]
8
+
9
+ export function signUpEmailOptions<TAuthClient extends AuthClient>(
10
+ authClient: TAuthClient
11
+ ) {
12
+ return createAuthMutationOptions(
13
+ authClient.signUp.email,
14
+ authMutationKeys.signUp.email,
15
+ { awaits: [authQueryKeys.session] }
16
+ )
17
+ }
@@ -0,0 +1,62 @@
1
+ import {
2
+ type CreateMutationOptions,
3
+ type MutationKey,
4
+ mutationOptions
5
+ } from "@tanstack/solid-query"
6
+ import type { BetterFetchError, BetterFetchOption } from "better-auth/client"
7
+
8
+ export type AuthMutationFn = (
9
+ // biome-ignore lint/suspicious/noExplicitAny: variance bridge for arbitrary Better Auth client methods
10
+ variables: any
11
+ ) => Promise<unknown>
12
+
13
+ export type AuthMutationFnData<TFn extends AuthMutationFn> = Awaited<
14
+ ReturnType<TFn>
15
+ >
16
+
17
+ export type AuthMutationFnVariables<TFn extends AuthMutationFn> =
18
+ Parameters<TFn>[0] extends infer P
19
+ ? undefined extends P
20
+ ? // biome-ignore lint/suspicious/noConfusingVoidType: void allows no-arg mutate
21
+ NonNullable<P> | void
22
+ : P
23
+ : never
24
+
25
+ export type AuthMutationOptions<
26
+ TFn extends AuthMutationFn,
27
+ TMutationKey extends MutationKey = MutationKey
28
+ > = Omit<
29
+ CreateMutationOptions<
30
+ AuthMutationFnData<TFn>,
31
+ BetterFetchError,
32
+ AuthMutationFnVariables<TFn>
33
+ >,
34
+ "mutationKey"
35
+ > & {
36
+ mutationKey: TMutationKey
37
+ }
38
+
39
+ export function authMutationOptions<
40
+ TFn extends AuthMutationFn,
41
+ const TMutationKey extends MutationKey
42
+ >(
43
+ authFn: TFn,
44
+ mutationKey: TMutationKey
45
+ ): AuthMutationOptions<TFn, TMutationKey> {
46
+ const mutationFn = (variables: AuthMutationFnVariables<TFn>) => {
47
+ const vars = (variables ?? {}) as { fetchOptions?: BetterFetchOption }
48
+ return authFn({
49
+ ...vars,
50
+ fetchOptions: { ...vars.fetchOptions, throw: true }
51
+ }) as Promise<AuthMutationFnData<TFn>>
52
+ }
53
+
54
+ return mutationOptions<
55
+ AuthMutationFnData<TFn>,
56
+ BetterFetchError,
57
+ AuthMutationFnVariables<TFn>
58
+ >({
59
+ mutationKey,
60
+ mutationFn
61
+ }) as AuthMutationOptions<TFn, TMutationKey>
62
+ }
@@ -0,0 +1,44 @@
1
+ import {
2
+ type MutationKey,
3
+ mutationOptions,
4
+ type QueryKey
5
+ } from "@tanstack/solid-query"
6
+ import type { BetterFetchError, BetterFetchOption } from "better-auth/client"
7
+
8
+ // biome-ignore lint/suspicious/noExplicitAny: Better Auth client methods have intentionally variable generated params.
9
+ export type MutationMethod<TData = unknown> = (params?: any) => Promise<TData>
10
+
11
+ export type MutationParams<TMethod extends MutationMethod> =
12
+ Parameters<TMethod>[0]
13
+ export type MutationData<TMethod extends MutationMethod> = Awaited<
14
+ ReturnType<TMethod>
15
+ >
16
+
17
+ export type AuthMutationMeta = {
18
+ invalidates?: Array<QueryKey>
19
+ awaits?: Array<QueryKey>
20
+ }
21
+
22
+ export function createAuthMutationOptions<
23
+ TMethod extends MutationMethod,
24
+ const TMutationKey extends MutationKey
25
+ >(authFn: TMethod, mutationKey: TMutationKey, meta?: AuthMutationMeta) {
26
+ const mutationFn = (params: MutationParams<TMethod>) => {
27
+ const input = (params ?? {}) as { fetchOptions?: BetterFetchOption }
28
+
29
+ return authFn({
30
+ ...input,
31
+ fetchOptions: { ...input.fetchOptions, throw: true }
32
+ } as MutationParams<TMethod>) as Promise<MutationData<TMethod>>
33
+ }
34
+
35
+ return mutationOptions<
36
+ MutationData<TMethod>,
37
+ BetterFetchError,
38
+ MutationParams<TMethod>
39
+ >({
40
+ mutationKey,
41
+ mutationFn,
42
+ ...(meta ? { meta } : {})
43
+ })
44
+ }
@@ -0,0 +1,15 @@
1
+ import { magicLinkMutationKeys } from "@better-auth-ui/core/plugins"
2
+ import type { MagicLinkAuthClient } from "../../lib/auth-client"
3
+ import { createAuthMutationOptions } from "../create-auth-mutation"
4
+
5
+ export type SignInMagicLinkParams<TAuthClient extends MagicLinkAuthClient> =
6
+ Parameters<TAuthClient["signIn"]["magicLink"]>[0]
7
+
8
+ export function signInMagicLinkOptions<TAuthClient extends MagicLinkAuthClient>(
9
+ authClient: TAuthClient
10
+ ) {
11
+ return createAuthMutationOptions(
12
+ authClient.signIn.magicLink,
13
+ magicLinkMutationKeys.signIn
14
+ )
15
+ }
@@ -0,0 +1,40 @@
1
+ import {
2
+ multiSessionMutationKeys,
3
+ multiSessionQueryKeys
4
+ } from "@better-auth-ui/core/plugins"
5
+ import type { MultiSessionAuthClient } from "../../lib/auth-client"
6
+ import { createAuthMutationOptions } from "../create-auth-mutation"
7
+ import { useSessionScopedMutation } from "../use-session-scoped-mutation"
8
+
9
+ export type RevokeMultiSessionParams<
10
+ TAuthClient extends MultiSessionAuthClient
11
+ > = Parameters<TAuthClient["multiSession"]["revoke"]>[0]
12
+
13
+ export type RevokeMultiSessionOptions = Parameters<
14
+ typeof useSessionScopedMutation<
15
+ MultiSessionAuthClient,
16
+ MultiSessionAuthClient["multiSession"]["revoke"],
17
+ typeof multiSessionMutationKeys.revoke
18
+ >
19
+ >[4]
20
+
21
+ export function revokeMultiSessionOptions<
22
+ TAuthClient extends MultiSessionAuthClient
23
+ >(authClient: TAuthClient) {
24
+ return createAuthMutationOptions(
25
+ authClient.multiSession.revoke,
26
+ multiSessionMutationKeys.revoke
27
+ )
28
+ }
29
+
30
+ export function useRevokeMultiSession<
31
+ TAuthClient extends MultiSessionAuthClient
32
+ >(authClient: TAuthClient, options?: RevokeMultiSessionOptions) {
33
+ return useSessionScopedMutation(
34
+ authClient,
35
+ authClient.multiSession.revoke,
36
+ multiSessionMutationKeys.revoke,
37
+ (userId) => ({ awaits: [multiSessionQueryKeys.lists(userId)] }),
38
+ options
39
+ )
40
+ }
@@ -0,0 +1,43 @@
1
+ import { authQueryKeys } from "@better-auth-ui/core"
2
+ import {
3
+ multiSessionMutationKeys,
4
+ multiSessionQueryKeys
5
+ } from "@better-auth-ui/core/plugins"
6
+ import type { MultiSessionAuthClient } from "../../lib/auth-client"
7
+ import { createAuthMutationOptions } from "../create-auth-mutation"
8
+ import { useSessionScopedMutation } from "../use-session-scoped-mutation"
9
+
10
+ export type SetActiveSessionParams<TAuthClient extends MultiSessionAuthClient> =
11
+ Parameters<TAuthClient["multiSession"]["setActive"]>[0]
12
+
13
+ export type SetActiveSessionOptions = Parameters<
14
+ typeof useSessionScopedMutation<
15
+ MultiSessionAuthClient,
16
+ MultiSessionAuthClient["multiSession"]["setActive"],
17
+ typeof multiSessionMutationKeys.setActive
18
+ >
19
+ >[4]
20
+
21
+ export function setActiveSessionOptions<
22
+ TAuthClient extends MultiSessionAuthClient
23
+ >(authClient: TAuthClient) {
24
+ return createAuthMutationOptions(
25
+ authClient.multiSession.setActive,
26
+ multiSessionMutationKeys.setActive
27
+ )
28
+ }
29
+
30
+ export function useSetActiveSession<TAuthClient extends MultiSessionAuthClient>(
31
+ authClient: TAuthClient,
32
+ options?: SetActiveSessionOptions
33
+ ) {
34
+ return useSessionScopedMutation(
35
+ authClient,
36
+ authClient.multiSession.setActive,
37
+ multiSessionMutationKeys.setActive,
38
+ (userId) => ({
39
+ awaits: [authQueryKeys.session, multiSessionQueryKeys.lists(userId)]
40
+ }),
41
+ options
42
+ )
43
+ }
@@ -0,0 +1,38 @@
1
+ import { organizationMutationKeys } from "@better-auth-ui/core/plugins"
2
+ import type { OrganizationAuthClient } from "../../lib/auth-client"
3
+ import { acceptInvitationMeta } from "./metadata"
4
+ import {
5
+ createOrganizationMutationOptions,
6
+ type OrganizationMutationOptions,
7
+ useOrganizationMutation
8
+ } from "./utils"
9
+
10
+ export type AcceptInvitationParams<
11
+ TAuthClient extends OrganizationAuthClient = OrganizationAuthClient
12
+ > = Parameters<TAuthClient["organization"]["acceptInvitation"]>[0]
13
+
14
+ export type AcceptInvitationOptions<
15
+ TAuthClient extends OrganizationAuthClient = OrganizationAuthClient
16
+ > = OrganizationMutationOptions<TAuthClient["organization"]["acceptInvitation"]>
17
+
18
+ export function acceptInvitationOptions<
19
+ TAuthClient extends OrganizationAuthClient
20
+ >(authClient: TAuthClient) {
21
+ return createOrganizationMutationOptions(
22
+ authClient.organization.acceptInvitation,
23
+ organizationMutationKeys.acceptInvitation
24
+ )
25
+ }
26
+
27
+ export function useAcceptInvitation<TAuthClient extends OrganizationAuthClient>(
28
+ authClient: TAuthClient,
29
+ options?: AcceptInvitationOptions<TAuthClient>
30
+ ) {
31
+ return useOrganizationMutation(
32
+ authClient,
33
+ authClient.organization.acceptInvitation,
34
+ organizationMutationKeys.acceptInvitation,
35
+ acceptInvitationMeta,
36
+ options
37
+ )
38
+ }