@convex-dev/better-auth 0.8.5 → 0.8.7

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 (235) hide show
  1. package/dist/commonjs/client/adapterUtils.js +1 -1
  2. package/dist/commonjs/client/adapterUtils.js.map +1 -1
  3. package/dist/commonjs/client/index.d.ts.map +1 -1
  4. package/dist/commonjs/client/index.js +2 -2
  5. package/dist/commonjs/client/index.js.map +1 -1
  6. package/dist/commonjs/plugins/cross-domain/index.d.ts +4 -3
  7. package/dist/commonjs/plugins/cross-domain/index.d.ts.map +1 -1
  8. package/dist/commonjs/plugins/cross-domain/index.js +20 -13
  9. package/dist/commonjs/plugins/cross-domain/index.js.map +1 -1
  10. package/dist/commonjs/react/index.d.ts +28 -7
  11. package/dist/commonjs/react/index.d.ts.map +1 -1
  12. package/dist/commonjs/react/index.js +59 -11
  13. package/dist/commonjs/react/index.js.map +1 -1
  14. package/dist/commonjs/{src/react/index.d.ts → react/old-index.d.ts} +1 -1
  15. package/dist/commonjs/react/old-index.d.ts.map +1 -0
  16. package/dist/commonjs/{src/react/index.js → react/old-index.js} +1 -1
  17. package/dist/commonjs/react/old-index.js.map +1 -0
  18. package/dist/commonjs/react-start/index.d.ts +3 -3
  19. package/dist/commonjs/react-start/index.d.ts.map +1 -1
  20. package/dist/commonjs/react-start/index.js.map +1 -1
  21. package/dist/esm/client/adapterUtils.js +1 -1
  22. package/dist/esm/client/adapterUtils.js.map +1 -1
  23. package/dist/esm/client/index.d.ts.map +1 -1
  24. package/dist/esm/client/index.js +2 -2
  25. package/dist/esm/client/index.js.map +1 -1
  26. package/dist/esm/plugins/cross-domain/index.d.ts +4 -3
  27. package/dist/esm/plugins/cross-domain/index.d.ts.map +1 -1
  28. package/dist/esm/plugins/cross-domain/index.js +20 -13
  29. package/dist/esm/plugins/cross-domain/index.js.map +1 -1
  30. package/dist/esm/react/index.d.ts +28 -7
  31. package/dist/esm/react/index.d.ts.map +1 -1
  32. package/dist/esm/react/index.js +59 -11
  33. package/dist/esm/react/index.js.map +1 -1
  34. package/dist/esm/{src/react/index.d.ts → react/old-index.d.ts} +1 -1
  35. package/dist/esm/react/old-index.d.ts.map +1 -0
  36. package/dist/esm/{src/react/index.js → react/old-index.js} +1 -1
  37. package/dist/esm/react/old-index.js.map +1 -0
  38. package/dist/esm/react-start/index.d.ts +3 -3
  39. package/dist/esm/react-start/index.d.ts.map +1 -1
  40. package/dist/esm/react-start/index.js.map +1 -1
  41. package/package.json +1 -1
  42. package/src/client/adapterUtils.ts +1 -1
  43. package/src/client/index.ts +2 -2
  44. package/src/plugins/cross-domain/index.ts +33 -20
  45. package/src/react/index.tsx +110 -28
  46. package/src/react-start/index.ts +2 -2
  47. package/dist/commonjs/client/createSchemaInternal.d.ts +0 -24
  48. package/dist/commonjs/client/createSchemaInternal.d.ts.map +0 -1
  49. package/dist/commonjs/client/createSchemaInternal.js +0 -105
  50. package/dist/commonjs/client/createSchemaInternal.js.map +0 -1
  51. package/dist/commonjs/component/lib.d.ts +0 -432
  52. package/dist/commonjs/component/lib.d.ts.map +0 -1
  53. package/dist/commonjs/component/lib.js +0 -570
  54. package/dist/commonjs/component/lib.js.map +0 -1
  55. package/dist/commonjs/component/util.d.ts +0 -1406
  56. package/dist/commonjs/component/util.d.ts.map +0 -1
  57. package/dist/commonjs/component/util.js +0 -4
  58. package/dist/commonjs/component/util.js.map +0 -1
  59. package/dist/commonjs/src/auth.d.ts +0 -3085
  60. package/dist/commonjs/src/auth.d.ts.map +0 -1
  61. package/dist/commonjs/src/auth.js +0 -72
  62. package/dist/commonjs/src/auth.js.map +0 -1
  63. package/dist/commonjs/src/client/adapter.d.ts +0 -18
  64. package/dist/commonjs/src/client/adapter.d.ts.map +0 -1
  65. package/dist/commonjs/src/client/adapter.js +0 -211
  66. package/dist/commonjs/src/client/adapter.js.map +0 -1
  67. package/dist/commonjs/src/client/createSchema.d.ts +0 -25
  68. package/dist/commonjs/src/client/createSchema.d.ts.map +0 -1
  69. package/dist/commonjs/src/client/createSchema.js +0 -103
  70. package/dist/commonjs/src/client/createSchema.js.map +0 -1
  71. package/dist/commonjs/src/client/index.d.ts +0 -3310
  72. package/dist/commonjs/src/client/index.d.ts.map +0 -1
  73. package/dist/commonjs/src/client/index.js +0 -377
  74. package/dist/commonjs/src/client/index.js.map +0 -1
  75. package/dist/commonjs/src/client/plugins/index.d.ts +0 -3
  76. package/dist/commonjs/src/client/plugins/index.d.ts.map +0 -1
  77. package/dist/commonjs/src/client/plugins/index.js +0 -3
  78. package/dist/commonjs/src/client/plugins/index.js.map +0 -1
  79. package/dist/commonjs/src/component/_generated/api.d.ts +0 -12
  80. package/dist/commonjs/src/component/_generated/api.d.ts.map +0 -1
  81. package/dist/commonjs/src/component/_generated/api.js +0 -22
  82. package/dist/commonjs/src/component/_generated/api.js.map +0 -1
  83. package/dist/commonjs/src/component/_generated/server.d.ts +0 -64
  84. package/dist/commonjs/src/component/_generated/server.d.ts.map +0 -1
  85. package/dist/commonjs/src/component/_generated/server.js +0 -74
  86. package/dist/commonjs/src/component/_generated/server.js.map +0 -1
  87. package/dist/commonjs/src/component/adapter.d.ts +0 -355
  88. package/dist/commonjs/src/component/adapter.d.ts.map +0 -1
  89. package/dist/commonjs/src/component/adapter.js +0 -573
  90. package/dist/commonjs/src/component/adapter.js.map +0 -1
  91. package/dist/commonjs/src/component/adapterTest.d.ts +0 -18
  92. package/dist/commonjs/src/component/adapterTest.d.ts.map +0 -1
  93. package/dist/commonjs/src/component/adapterTest.js +0 -75
  94. package/dist/commonjs/src/component/adapterTest.js.map +0 -1
  95. package/dist/commonjs/src/component/convex.config.d.ts +0 -3
  96. package/dist/commonjs/src/component/convex.config.d.ts.map +0 -1
  97. package/dist/commonjs/src/component/convex.config.js +0 -4
  98. package/dist/commonjs/src/component/convex.config.js.map +0 -1
  99. package/dist/commonjs/src/component/schema.d.ts +0 -562
  100. package/dist/commonjs/src/component/schema.d.ts.map +0 -1
  101. package/dist/commonjs/src/component/schema.js +0 -217
  102. package/dist/commonjs/src/component/schema.js.map +0 -1
  103. package/dist/commonjs/src/nextjs/index.d.ts +0 -10
  104. package/dist/commonjs/src/nextjs/index.d.ts.map +0 -1
  105. package/dist/commonjs/src/nextjs/index.js +0 -43
  106. package/dist/commonjs/src/nextjs/index.js.map +0 -1
  107. package/dist/commonjs/src/plugins/convex/client.d.ts +0 -9
  108. package/dist/commonjs/src/plugins/convex/client.d.ts.map +0 -1
  109. package/dist/commonjs/src/plugins/convex/client.js +0 -7
  110. package/dist/commonjs/src/plugins/convex/client.js.map +0 -1
  111. package/dist/commonjs/src/plugins/convex/index.d.ts +0 -415
  112. package/dist/commonjs/src/plugins/convex/index.d.ts.map +0 -1
  113. package/dist/commonjs/src/plugins/convex/index.js +0 -354
  114. package/dist/commonjs/src/plugins/convex/index.js.map +0 -1
  115. package/dist/commonjs/src/plugins/cross-domain/client.d.ts +0 -132
  116. package/dist/commonjs/src/plugins/cross-domain/client.d.ts.map +0 -1
  117. package/dist/commonjs/src/plugins/cross-domain/client.js +0 -176
  118. package/dist/commonjs/src/plugins/cross-domain/client.js.map +0 -1
  119. package/dist/commonjs/src/plugins/cross-domain/index.d.ts +0 -83
  120. package/dist/commonjs/src/plugins/cross-domain/index.d.ts.map +0 -1
  121. package/dist/commonjs/src/plugins/cross-domain/index.js +0 -153
  122. package/dist/commonjs/src/plugins/cross-domain/index.js.map +0 -1
  123. package/dist/commonjs/src/plugins/index.d.ts +0 -3
  124. package/dist/commonjs/src/plugins/index.d.ts.map +0 -1
  125. package/dist/commonjs/src/plugins/index.js +0 -3
  126. package/dist/commonjs/src/plugins/index.js.map +0 -1
  127. package/dist/commonjs/src/react/client.d.ts +0 -31
  128. package/dist/commonjs/src/react/client.d.ts.map +0 -1
  129. package/dist/commonjs/src/react/client.js +0 -96
  130. package/dist/commonjs/src/react/client.js.map +0 -1
  131. package/dist/commonjs/src/react/index.d.ts.map +0 -1
  132. package/dist/commonjs/src/react/index.js.map +0 -1
  133. package/dist/commonjs/src/react-start/index.d.ts +0 -45
  134. package/dist/commonjs/src/react-start/index.d.ts.map +0 -1
  135. package/dist/commonjs/src/react-start/index.js +0 -60
  136. package/dist/commonjs/src/react-start/index.js.map +0 -1
  137. package/dist/commonjs/src/utils/index.d.ts +0 -9
  138. package/dist/commonjs/src/utils/index.d.ts.map +0 -1
  139. package/dist/commonjs/src/utils/index.js +0 -35
  140. package/dist/commonjs/src/utils/index.js.map +0 -1
  141. package/dist/esm/client/createSchemaInternal.d.ts +0 -24
  142. package/dist/esm/client/createSchemaInternal.d.ts.map +0 -1
  143. package/dist/esm/client/createSchemaInternal.js +0 -105
  144. package/dist/esm/client/createSchemaInternal.js.map +0 -1
  145. package/dist/esm/component/lib.d.ts +0 -432
  146. package/dist/esm/component/lib.d.ts.map +0 -1
  147. package/dist/esm/component/lib.js +0 -570
  148. package/dist/esm/component/lib.js.map +0 -1
  149. package/dist/esm/component/util.d.ts +0 -1406
  150. package/dist/esm/component/util.d.ts.map +0 -1
  151. package/dist/esm/component/util.js +0 -4
  152. package/dist/esm/component/util.js.map +0 -1
  153. package/dist/esm/src/auth.d.ts +0 -3085
  154. package/dist/esm/src/auth.d.ts.map +0 -1
  155. package/dist/esm/src/auth.js +0 -72
  156. package/dist/esm/src/auth.js.map +0 -1
  157. package/dist/esm/src/client/adapter.d.ts +0 -18
  158. package/dist/esm/src/client/adapter.d.ts.map +0 -1
  159. package/dist/esm/src/client/adapter.js +0 -211
  160. package/dist/esm/src/client/adapter.js.map +0 -1
  161. package/dist/esm/src/client/createSchema.d.ts +0 -25
  162. package/dist/esm/src/client/createSchema.d.ts.map +0 -1
  163. package/dist/esm/src/client/createSchema.js +0 -103
  164. package/dist/esm/src/client/createSchema.js.map +0 -1
  165. package/dist/esm/src/client/index.d.ts +0 -3310
  166. package/dist/esm/src/client/index.d.ts.map +0 -1
  167. package/dist/esm/src/client/index.js +0 -377
  168. package/dist/esm/src/client/index.js.map +0 -1
  169. package/dist/esm/src/client/plugins/index.d.ts +0 -3
  170. package/dist/esm/src/client/plugins/index.d.ts.map +0 -1
  171. package/dist/esm/src/client/plugins/index.js +0 -3
  172. package/dist/esm/src/client/plugins/index.js.map +0 -1
  173. package/dist/esm/src/component/_generated/api.d.ts +0 -12
  174. package/dist/esm/src/component/_generated/api.d.ts.map +0 -1
  175. package/dist/esm/src/component/_generated/api.js +0 -22
  176. package/dist/esm/src/component/_generated/api.js.map +0 -1
  177. package/dist/esm/src/component/_generated/server.d.ts +0 -64
  178. package/dist/esm/src/component/_generated/server.d.ts.map +0 -1
  179. package/dist/esm/src/component/_generated/server.js +0 -74
  180. package/dist/esm/src/component/_generated/server.js.map +0 -1
  181. package/dist/esm/src/component/adapter.d.ts +0 -355
  182. package/dist/esm/src/component/adapter.d.ts.map +0 -1
  183. package/dist/esm/src/component/adapter.js +0 -573
  184. package/dist/esm/src/component/adapter.js.map +0 -1
  185. package/dist/esm/src/component/adapterTest.d.ts +0 -18
  186. package/dist/esm/src/component/adapterTest.d.ts.map +0 -1
  187. package/dist/esm/src/component/adapterTest.js +0 -75
  188. package/dist/esm/src/component/adapterTest.js.map +0 -1
  189. package/dist/esm/src/component/convex.config.d.ts +0 -3
  190. package/dist/esm/src/component/convex.config.d.ts.map +0 -1
  191. package/dist/esm/src/component/convex.config.js +0 -4
  192. package/dist/esm/src/component/convex.config.js.map +0 -1
  193. package/dist/esm/src/component/schema.d.ts +0 -562
  194. package/dist/esm/src/component/schema.d.ts.map +0 -1
  195. package/dist/esm/src/component/schema.js +0 -217
  196. package/dist/esm/src/component/schema.js.map +0 -1
  197. package/dist/esm/src/nextjs/index.d.ts +0 -10
  198. package/dist/esm/src/nextjs/index.d.ts.map +0 -1
  199. package/dist/esm/src/nextjs/index.js +0 -43
  200. package/dist/esm/src/nextjs/index.js.map +0 -1
  201. package/dist/esm/src/plugins/convex/client.d.ts +0 -9
  202. package/dist/esm/src/plugins/convex/client.d.ts.map +0 -1
  203. package/dist/esm/src/plugins/convex/client.js +0 -7
  204. package/dist/esm/src/plugins/convex/client.js.map +0 -1
  205. package/dist/esm/src/plugins/convex/index.d.ts +0 -415
  206. package/dist/esm/src/plugins/convex/index.d.ts.map +0 -1
  207. package/dist/esm/src/plugins/convex/index.js +0 -354
  208. package/dist/esm/src/plugins/convex/index.js.map +0 -1
  209. package/dist/esm/src/plugins/cross-domain/client.d.ts +0 -132
  210. package/dist/esm/src/plugins/cross-domain/client.d.ts.map +0 -1
  211. package/dist/esm/src/plugins/cross-domain/client.js +0 -176
  212. package/dist/esm/src/plugins/cross-domain/client.js.map +0 -1
  213. package/dist/esm/src/plugins/cross-domain/index.d.ts +0 -83
  214. package/dist/esm/src/plugins/cross-domain/index.d.ts.map +0 -1
  215. package/dist/esm/src/plugins/cross-domain/index.js +0 -153
  216. package/dist/esm/src/plugins/cross-domain/index.js.map +0 -1
  217. package/dist/esm/src/plugins/index.d.ts +0 -3
  218. package/dist/esm/src/plugins/index.d.ts.map +0 -1
  219. package/dist/esm/src/plugins/index.js +0 -3
  220. package/dist/esm/src/plugins/index.js.map +0 -1
  221. package/dist/esm/src/react/client.d.ts +0 -31
  222. package/dist/esm/src/react/client.d.ts.map +0 -1
  223. package/dist/esm/src/react/client.js +0 -96
  224. package/dist/esm/src/react/client.js.map +0 -1
  225. package/dist/esm/src/react/index.d.ts.map +0 -1
  226. package/dist/esm/src/react/index.js.map +0 -1
  227. package/dist/esm/src/react-start/index.d.ts +0 -45
  228. package/dist/esm/src/react-start/index.d.ts.map +0 -1
  229. package/dist/esm/src/react-start/index.js +0 -60
  230. package/dist/esm/src/react-start/index.js.map +0 -1
  231. package/dist/esm/src/utils/index.d.ts +0 -9
  232. package/dist/esm/src/utils/index.d.ts.map +0 -1
  233. package/dist/esm/src/utils/index.js +0 -35
  234. package/dist/esm/src/utils/index.js.map +0 -1
  235. package/src/react/client.tsx +0 -178
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "bugs": {
7
7
  "url": "https://github.com/get-convex/better-auth/issues"
8
8
  },
9
- "version": "0.8.5",
9
+ "version": "0.8.7",
10
10
  "license": "Apache-2.0",
11
11
  "keywords": [
12
12
  "convex",
@@ -417,7 +417,7 @@ const generateQuery = (
417
417
  )
418
418
  : query;
419
419
  const orderedQuery = args.sortBy
420
- ? indexedQuery.order(args.sortBy.direction === "asc" ? "asc" : "desc")
420
+ ? indexedQuery.order(args.sortBy.direction === "desc" ? "desc" : "asc")
421
421
  : indexedQuery;
422
422
  const filteredQuery = orderedQuery.filterWith(async (doc) => {
423
423
  if (!index && indexFields?.length) {
@@ -474,8 +474,8 @@ export const createClient = <
474
474
  model: "session",
475
475
  where: [
476
476
  {
477
- field: "userId",
478
- value: identity.subject,
477
+ field: "sessionId",
478
+ value: identity.sessionId as string,
479
479
  },
480
480
  ],
481
481
  });
@@ -1,3 +1,4 @@
1
+ import { HookEndpointContext } from "better-auth";
1
2
  import { setSessionCookie } from "better-auth/cookies";
2
3
  import { generateRandomString } from "better-auth/crypto";
3
4
  import {
@@ -19,6 +20,10 @@ export const crossDomain = ({ siteUrl }: { siteUrl: string }) => {
19
20
  return new URL(relativeCallbackURL, siteUrl).toString();
20
21
  };
21
22
 
23
+ const isExpoNative = (ctx: HookEndpointContext) => {
24
+ return ctx.headers?.has("expo-origin");
25
+ };
26
+
22
27
  return {
23
28
  id: "cross-domain",
24
29
  // TODO: remove this in the next minor release, it doesn't
@@ -35,15 +40,17 @@ export const crossDomain = ({ siteUrl }: { siteUrl: string }) => {
35
40
  hooks: {
36
41
  before: [
37
42
  {
38
- matcher(context) {
39
- return Boolean(
40
- context.request?.headers.get("better-auth-cookie") ||
41
- context.headers?.get("better-auth-cookie")
43
+ matcher(ctx) {
44
+ return (
45
+ Boolean(
46
+ ctx.request?.headers.get("better-auth-cookie") ||
47
+ ctx.headers?.get("better-auth-cookie")
48
+ ) && !isExpoNative(ctx)
42
49
  );
43
50
  },
44
- handler: createAuthMiddleware(async (c) => {
45
- const existingHeaders = (c.request?.headers ||
46
- c.headers) as Headers;
51
+ handler: createAuthMiddleware(async (ctx) => {
52
+ const existingHeaders = (ctx.request?.headers ||
53
+ ctx.headers) as Headers;
47
54
  const headers = new Headers({
48
55
  ...Object.fromEntries(existingHeaders?.entries()),
49
56
  });
@@ -65,7 +72,11 @@ export const crossDomain = ({ siteUrl }: { siteUrl: string }) => {
65
72
  },
66
73
  {
67
74
  matcher: (ctx) => {
68
- return ctx.method === "GET" && ctx.path.startsWith("/verify-email");
75
+ return (
76
+ ctx.method === "GET" &&
77
+ ctx.path.startsWith("/verify-email") &&
78
+ !isExpoNative(ctx)
79
+ );
69
80
  },
70
81
  handler: createAuthMiddleware(async (ctx) => {
71
82
  if (ctx.query?.callbackURL) {
@@ -77,13 +88,14 @@ export const crossDomain = ({ siteUrl }: { siteUrl: string }) => {
77
88
  {
78
89
  matcher: (ctx) => {
79
90
  return (
80
- (ctx.method === "POST" && ctx.path.startsWith("/link-social")) ||
81
- ctx.path.startsWith("/send-verification-email") ||
82
- ctx.path.startsWith("/sign-in/email") ||
83
- ctx.path.startsWith("/sign-in/social") ||
84
- ctx.path.startsWith("/sign-in/magic-link") ||
85
- ctx.path.startsWith("/delete-user") ||
86
- ctx.path.startsWith("/change-email")
91
+ ((ctx.method === "POST" && ctx.path.startsWith("/link-social")) ||
92
+ ctx.path.startsWith("/send-verification-email") ||
93
+ ctx.path.startsWith("/sign-in/email") ||
94
+ ctx.path.startsWith("/sign-in/social") ||
95
+ ctx.path.startsWith("/sign-in/magic-link") ||
96
+ ctx.path.startsWith("/delete-user") ||
97
+ ctx.path.startsWith("/change-email")) &&
98
+ !isExpoNative(ctx)
87
99
  );
88
100
  },
89
101
  handler: createAuthMiddleware(async (ctx) => {
@@ -105,8 +117,8 @@ export const crossDomain = ({ siteUrl }: { siteUrl: string }) => {
105
117
  ],
106
118
  after: [
107
119
  {
108
- matcher() {
109
- return true;
120
+ matcher(ctx) {
121
+ return !isExpoNative(ctx);
110
122
  },
111
123
  handler: createAuthMiddleware(async (ctx) => {
112
124
  const setCookie = ctx.context.responseHeaders?.get("set-cookie");
@@ -120,9 +132,10 @@ export const crossDomain = ({ siteUrl }: { siteUrl: string }) => {
120
132
  {
121
133
  matcher: (ctx) => {
122
134
  return (
123
- ctx.path?.startsWith("/callback") ||
124
- ctx.path?.startsWith("/oauth2/callback") ||
125
- ctx.path?.startsWith("/magic-link/verify")
135
+ (ctx.path?.startsWith("/callback") ||
136
+ ctx.path?.startsWith("/oauth2/callback") ||
137
+ ctx.path?.startsWith("/magic-link/verify")) &&
138
+ !isExpoNative(ctx)
126
139
  );
127
140
  },
128
141
  handler: createAuthMiddleware(async (ctx) => {
@@ -1,38 +1,120 @@
1
- "use client";
1
+ import { useEffect } from "react";
2
2
 
3
- import { ConvexProviderWithAuth, ConvexReactClient } from "convex/react";
4
- import { PropsWithChildren, useMemo } from "react";
5
- import {
6
- AuthClient,
7
- AuthProvider,
8
- useAuth,
9
- type ConvexAuthClient,
10
- } from "./client";
3
+ import { ReactNode, useCallback, useMemo } from "react";
4
+ import { AuthTokenFetcher } from "convex/browser";
5
+ import { ConvexProviderWithAuth } from "convex/react";
6
+ import { BetterAuthClientPlugin, ClientOptions } from "better-auth";
7
+ import { createAuthClient } from "better-auth/react";
8
+ import { convexClient, crossDomainClient } from "../client/plugins";
11
9
 
10
+ type CrossDomainClient = ReturnType<typeof crossDomainClient>;
11
+ type ConvexClient = ReturnType<typeof convexClient>;
12
+ type PluginsWithCrossDomain = (
13
+ | CrossDomainClient
14
+ | ConvexClient
15
+ | BetterAuthClientPlugin
16
+ )[];
17
+ type PluginsWithoutCrossDomain = (ConvexClient | BetterAuthClientPlugin)[];
18
+ type AuthClientWithPlugins<
19
+ Plugins extends PluginsWithCrossDomain | PluginsWithoutCrossDomain,
20
+ > = ReturnType<
21
+ typeof createAuthClient<
22
+ ClientOptions & {
23
+ plugins: Plugins;
24
+ }
25
+ >
26
+ >;
27
+ export type AuthClient =
28
+ | AuthClientWithPlugins<PluginsWithCrossDomain>
29
+ | AuthClientWithPlugins<PluginsWithoutCrossDomain>;
30
+
31
+ // Until we can import from our own entry points (requires TypeScript 4.7),
32
+ // just describe the interface enough to help users pass the right type.
33
+ type IConvexReactClient = {
34
+ setAuth(fetchToken: AuthTokenFetcher): void;
35
+ clearAuth(): void;
36
+ };
37
+
38
+ /**
39
+ * A wrapper React component which provides a {@link react.ConvexReactClient}
40
+ * authenticated with Better Auth.
41
+ *
42
+ * @public
43
+ */
12
44
  export function ConvexBetterAuthProvider({
45
+ children,
13
46
  client,
14
47
  authClient,
15
- children,
16
- }: PropsWithChildren<{
17
- client: ConvexReactClient;
48
+ }: {
49
+ children: ReactNode;
50
+ client: IConvexReactClient;
18
51
  authClient: AuthClient;
19
- }>) {
20
- const convexAuthClient = useMemo(
21
- () =>
22
- ({
23
- verbose: (client as any).options?.verbose,
24
- logger: client.logger,
25
- }) satisfies ConvexAuthClient,
26
- [client]
27
- );
52
+ }) {
53
+ const useBetterAuth = useUseAuthFromBetterAuth(authClient);
54
+
55
+ useEffect(() => {
56
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
57
+ (async () => {
58
+ const url = new URL(window.location?.href);
59
+ const token = url.searchParams.get("ott");
60
+ if (token) {
61
+ const authClientWithCrossDomain =
62
+ authClient as AuthClientWithPlugins<PluginsWithCrossDomain>;
63
+ url.searchParams.delete("ott");
64
+ const result =
65
+ await authClientWithCrossDomain.crossDomain.oneTimeToken.verify({
66
+ token,
67
+ });
68
+ const session = result.data?.session;
69
+ if (session) {
70
+ await authClient.getSession({
71
+ fetchOptions: {
72
+ headers: {
73
+ Authorization: `Bearer ${session.token}`,
74
+ },
75
+ },
76
+ });
77
+ authClientWithCrossDomain.updateSession();
78
+ }
79
+ window.history.replaceState({}, "", url);
80
+ }
81
+ })();
82
+ }, [authClient]);
28
83
  return (
29
- <AuthProvider client={convexAuthClient} authClient={authClient}>
30
- <ConvexProviderWithAuth client={client} useAuth={useAuth}>
31
- {children}
32
- </ConvexProviderWithAuth>
33
- </AuthProvider>
84
+ <ConvexProviderWithAuth client={client} useAuth={useBetterAuth}>
85
+ {children}
86
+ </ConvexProviderWithAuth>
34
87
  );
35
88
  }
36
89
 
37
- // TODO: Remove, short-lived alias
38
- export { ConvexBetterAuthProvider as ConvexProviderWithBetterAuth };
90
+ function useUseAuthFromBetterAuth(authClient: AuthClient) {
91
+ return useMemo(
92
+ () =>
93
+ function useAuthFromBetterAuth() {
94
+ const { data: session, isPending: isSessionPending } =
95
+ authClient.useSession();
96
+ const fetchAccessToken = useCallback(
97
+ async () => {
98
+ try {
99
+ const { data } = await authClient.convex.token();
100
+ return data?.token || null;
101
+ } catch {
102
+ return null;
103
+ }
104
+ },
105
+ // Build a new fetchAccessToken to trigger setAuth() whenever the
106
+ // session changes.
107
+ [session]
108
+ );
109
+ return useMemo(
110
+ () => ({
111
+ isLoading: isSessionPending,
112
+ isAuthenticated: session !== null,
113
+ fetchAccessToken,
114
+ }),
115
+ [isSessionPending, session, fetchAccessToken]
116
+ );
117
+ },
118
+ [authClient]
119
+ );
120
+ }
@@ -21,7 +21,7 @@ export const getCookieName = <DataModel extends GenericDataModel>(
21
21
 
22
22
  export const setupFetchClient = async <DataModel extends GenericDataModel>(
23
23
  createAuth: CreateAuth<DataModel>,
24
- getCookie: (name: string) => string | null
24
+ getCookie: (name: string) => string | undefined
25
25
  ) => {
26
26
  const createClient = () => {
27
27
  const sessionCookieName = getCookieName(createAuth);
@@ -97,7 +97,7 @@ export const fetchSession = async <
97
97
 
98
98
  export const getAuth = async <DataModel extends GenericDataModel>(
99
99
  request: Request,
100
- getCookie: (name: string) => string | null,
100
+ getCookie: (name: string) => string | undefined,
101
101
  createAuth: CreateAuth<DataModel>,
102
102
  opts?: { convexSiteUrl?: string }
103
103
  ) => {
@@ -1,24 +0,0 @@
1
- import { BetterAuthDbSchema } from "better-auth/db";
2
- export declare const indexFields: {
3
- account: (string | string[])[];
4
- rateLimit: string[];
5
- session: (string | string[])[];
6
- verification: string[];
7
- user: (string | string[])[];
8
- passkey: string[];
9
- apikey: string[];
10
- member: string[][];
11
- invitation: string[][];
12
- oauthConsent: string[][];
13
- ssoProvider: string[];
14
- subscription: string[];
15
- };
16
- export declare const createSchema: ({ file, tables, }: {
17
- tables: BetterAuthDbSchema;
18
- file?: string;
19
- }) => Promise<{
20
- code: string;
21
- path: string;
22
- overwrite: boolean;
23
- }>;
24
- //# sourceMappingURL=createSchemaInternal.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createSchemaInternal.d.ts","sourceRoot":"","sources":["../../../src/client/createSchemaInternal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAuB,MAAM,gBAAgB,CAAC;AAIzE,eAAO,MAAM,WAAW;;;;;;;;;;;;;CAgBvB,CAAC;AA6CF,eAAO,MAAM,YAAY,GAAU,mBAGhC;IACD,MAAM,EAAE,kBAAkB,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;;;;EAmFA,CAAC"}
@@ -1,105 +0,0 @@
1
- // Manually add fields to index on for schema generation,
2
- // all fields in the schema specialFields are automatically indexed
3
- export const indexFields = {
4
- account: ["accountId", ["accountId", "providerId"], ["providerId", "userId"]],
5
- rateLimit: ["key"],
6
- session: ["expiresAt", ["expiresAt", "userId"]],
7
- verification: ["expiresAt", "identifier"],
8
- user: [["email", "name"], "name", "userId"],
9
- passkey: ["credentialID"],
10
- apikey: ["key"],
11
- member: [["organizationId", "userId"]],
12
- invitation: [
13
- ["email", "organizationId", "status"],
14
- ["organizationId", "status"],
15
- ],
16
- oauthConsent: [["clientId", "userId"]],
17
- ssoProvider: ["organizationId", "domain"],
18
- subscription: ["stripeSubscriptionId", "stripeCustomerId", "referenceId"],
19
- };
20
- // Return map of unique, sortable, and reference fields
21
- const specialFields = (tables) => Object.fromEntries(Object.entries(tables)
22
- .map(([key, table]) => {
23
- const fields = Object.fromEntries(Object.entries(table.fields)
24
- .map(([fieldKey, field]) => [
25
- fieldKey,
26
- {
27
- ...(field.sortable ? { sortable: true } : {}),
28
- ...(field.unique ? { unique: true } : {}),
29
- ...(field.references ? { references: field.references } : {}),
30
- },
31
- ])
32
- .filter(([_key, value]) => typeof value === "object" ? Object.keys(value).length > 0 : true));
33
- return [key, fields];
34
- })
35
- .filter(([_key, value]) => typeof value === "object" ? Object.keys(value).length > 0 : true));
36
- const mergedIndexFields = (tables) => Object.fromEntries(Object.entries(tables).map(([key]) => {
37
- const manualIndexes = indexFields[key] || [];
38
- const specialFieldIndexes = Object.keys(specialFields(tables)[key] ||
39
- {}).filter((index) => !manualIndexes.some((m) => Array.isArray(m) ? m[0] === index : m === index));
40
- return [key, manualIndexes.concat(specialFieldIndexes)];
41
- }));
42
- export const createSchema = async ({ file, tables, }) => {
43
- const path = await import("path");
44
- const baseName = path.basename(process.cwd());
45
- if (baseName === "convex") {
46
- throw new Error("Better Auth schema must be generated in the Better Auth component directory.");
47
- }
48
- let code = `// This file is auto-generated. Do not edit this file manually.
49
- // To regenerate the schema, run:
50
- // \`npx @better-auth/cli generate --output ${file} -y\`
51
-
52
- import { defineSchema, defineTable } from "convex/server";
53
- import { v } from "convex/values";
54
-
55
- export const tables = {
56
- `;
57
- for (const tableKey in tables) {
58
- const table = tables[tableKey];
59
- const modelName = table.modelName;
60
- // No id fields in Convex schema
61
- const fields = Object.fromEntries(Object.entries(table.fields).filter(([key]) => key !== "id"));
62
- function getType(name, field) {
63
- const type = field.type;
64
- const typeMap = {
65
- string: `v.string()`,
66
- boolean: `v.boolean()`,
67
- number: `v.number()`,
68
- date: `v.number()`,
69
- "number[]": `v.array(v.number())`,
70
- "string[]": `v.array(v.string())`,
71
- };
72
- return typeMap[type];
73
- }
74
- const indexes = mergedIndexFields(tables)[modelName]?.map((index) => {
75
- const indexArray = Array.isArray(index) ? index.sort() : [index];
76
- const indexName = indexArray.join("_");
77
- return `.index("${indexName}", ${JSON.stringify(indexArray)})`;
78
- }) || [];
79
- const schema = `${modelName}: defineTable({
80
- ${Object.keys(fields)
81
- .map((field) => {
82
- const attr = fields[field];
83
- const type = getType(field, attr);
84
- const optional = (fieldSchema) => attr.required
85
- ? fieldSchema
86
- : `v.optional(v.union(v.null(), ${fieldSchema}))`;
87
- return ` ${field}: ${optional(type)},`;
88
- })
89
- .join("\n")}
90
- })${indexes.length > 0 ? `\n ${indexes.join("\n ")}` : ""},\n`;
91
- code += ` ${schema}`;
92
- }
93
- code += `};
94
-
95
- const schema = defineSchema(tables);
96
-
97
- export default schema;
98
- `;
99
- return {
100
- code,
101
- path: file ?? "./schema.ts",
102
- overwrite: true,
103
- };
104
- };
105
- //# sourceMappingURL=createSchemaInternal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createSchemaInternal.js","sourceRoot":"","sources":["../../../src/client/createSchemaInternal.ts"],"names":[],"mappings":"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"}