@convex-dev/better-auth 0.7.0-alpha.9 → 0.7.1

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 (107) hide show
  1. package/dist/commonjs/client/adapter.d.ts +10 -1
  2. package/dist/commonjs/client/adapter.d.ts.map +1 -1
  3. package/dist/commonjs/client/adapter.js +195 -193
  4. package/dist/commonjs/client/adapter.js.map +1 -1
  5. package/dist/commonjs/client/index.d.ts +283 -179
  6. package/dist/commonjs/client/index.d.ts.map +1 -1
  7. package/dist/commonjs/client/index.js +46 -58
  8. package/dist/commonjs/client/index.js.map +1 -1
  9. package/dist/commonjs/component/adapterTest.d.ts +19 -0
  10. package/dist/commonjs/component/adapterTest.d.ts.map +1 -0
  11. package/dist/commonjs/component/adapterTest.js +82 -0
  12. package/dist/commonjs/component/adapterTest.js.map +1 -0
  13. package/dist/commonjs/component/lib.d.ts +308 -536
  14. package/dist/commonjs/component/lib.d.ts.map +1 -1
  15. package/dist/commonjs/component/lib.js +469 -292
  16. package/dist/commonjs/component/lib.js.map +1 -1
  17. package/dist/commonjs/component/schema.d.ts +465 -26
  18. package/dist/commonjs/component/schema.d.ts.map +1 -1
  19. package/dist/commonjs/component/schema.js +334 -18
  20. package/dist/commonjs/component/schema.js.map +1 -1
  21. package/dist/commonjs/component/util.d.ts +944 -68
  22. package/dist/commonjs/component/util.d.ts.map +1 -1
  23. package/dist/commonjs/nextjs/index.d.ts.map +1 -1
  24. package/dist/commonjs/nextjs/index.js +3 -9
  25. package/dist/commonjs/nextjs/index.js.map +1 -1
  26. package/dist/commonjs/plugins/convex/index.d.ts +14 -11
  27. package/dist/commonjs/plugins/convex/index.d.ts.map +1 -1
  28. package/dist/commonjs/plugins/convex/index.js +3 -2
  29. package/dist/commonjs/plugins/convex/index.js.map +1 -1
  30. package/dist/commonjs/plugins/cross-domain/client.d.ts +1 -1
  31. package/dist/commonjs/plugins/cross-domain/index.d.ts +5 -3
  32. package/dist/commonjs/plugins/cross-domain/index.d.ts.map +1 -1
  33. package/dist/commonjs/plugins/cross-domain/index.js +19 -5
  34. package/dist/commonjs/plugins/cross-domain/index.js.map +1 -1
  35. package/dist/commonjs/react/client.d.ts +1 -1
  36. package/dist/commonjs/react/client.d.ts.map +1 -1
  37. package/dist/commonjs/react/client.js +3 -9
  38. package/dist/commonjs/react/client.js.map +1 -1
  39. package/dist/commonjs/react-start/index.d.ts +4 -4
  40. package/dist/commonjs/react-start/index.d.ts.map +1 -1
  41. package/dist/commonjs/react-start/index.js +3 -0
  42. package/dist/commonjs/react-start/index.js.map +1 -1
  43. package/dist/commonjs/utils/index.d.ts +2 -0
  44. package/dist/commonjs/utils/index.d.ts.map +1 -0
  45. package/dist/commonjs/utils/index.js +8 -0
  46. package/dist/commonjs/utils/index.js.map +1 -0
  47. package/dist/esm/client/adapter.d.ts +10 -1
  48. package/dist/esm/client/adapter.d.ts.map +1 -1
  49. package/dist/esm/client/adapter.js +195 -193
  50. package/dist/esm/client/adapter.js.map +1 -1
  51. package/dist/esm/client/index.d.ts +283 -179
  52. package/dist/esm/client/index.d.ts.map +1 -1
  53. package/dist/esm/client/index.js +46 -58
  54. package/dist/esm/client/index.js.map +1 -1
  55. package/dist/esm/component/adapterTest.d.ts +19 -0
  56. package/dist/esm/component/adapterTest.d.ts.map +1 -0
  57. package/dist/esm/component/adapterTest.js +82 -0
  58. package/dist/esm/component/adapterTest.js.map +1 -0
  59. package/dist/esm/component/lib.d.ts +308 -536
  60. package/dist/esm/component/lib.d.ts.map +1 -1
  61. package/dist/esm/component/lib.js +469 -292
  62. package/dist/esm/component/lib.js.map +1 -1
  63. package/dist/esm/component/schema.d.ts +465 -26
  64. package/dist/esm/component/schema.d.ts.map +1 -1
  65. package/dist/esm/component/schema.js +334 -18
  66. package/dist/esm/component/schema.js.map +1 -1
  67. package/dist/esm/component/util.d.ts +944 -68
  68. package/dist/esm/component/util.d.ts.map +1 -1
  69. package/dist/esm/nextjs/index.d.ts.map +1 -1
  70. package/dist/esm/nextjs/index.js +3 -9
  71. package/dist/esm/nextjs/index.js.map +1 -1
  72. package/dist/esm/plugins/convex/index.d.ts +14 -11
  73. package/dist/esm/plugins/convex/index.d.ts.map +1 -1
  74. package/dist/esm/plugins/convex/index.js +3 -2
  75. package/dist/esm/plugins/convex/index.js.map +1 -1
  76. package/dist/esm/plugins/cross-domain/client.d.ts +1 -1
  77. package/dist/esm/plugins/cross-domain/index.d.ts +5 -3
  78. package/dist/esm/plugins/cross-domain/index.d.ts.map +1 -1
  79. package/dist/esm/plugins/cross-domain/index.js +19 -5
  80. package/dist/esm/plugins/cross-domain/index.js.map +1 -1
  81. package/dist/esm/react/client.d.ts +1 -1
  82. package/dist/esm/react/client.d.ts.map +1 -1
  83. package/dist/esm/react/client.js +3 -9
  84. package/dist/esm/react/client.js.map +1 -1
  85. package/dist/esm/react-start/index.d.ts +4 -4
  86. package/dist/esm/react-start/index.d.ts.map +1 -1
  87. package/dist/esm/react-start/index.js +3 -0
  88. package/dist/esm/react-start/index.js.map +1 -1
  89. package/dist/esm/utils/index.d.ts +2 -0
  90. package/dist/esm/utils/index.d.ts.map +1 -0
  91. package/dist/esm/utils/index.js +8 -0
  92. package/dist/esm/utils/index.js.map +1 -0
  93. package/package.json +24 -7
  94. package/src/client/adapter.test.ts +378 -0
  95. package/src/client/adapter.ts +210 -198
  96. package/src/client/index.ts +46 -71
  97. package/src/component/_generated/api.d.ts +2189 -171
  98. package/src/component/adapterTest.ts +141 -0
  99. package/src/component/lib.ts +648 -342
  100. package/src/component/schema.ts +349 -18
  101. package/src/nextjs/index.ts +3 -14
  102. package/src/plugins/convex/index.ts +5 -2
  103. package/src/plugins/cross-domain/index.ts +19 -5
  104. package/src/react/client.tsx +5 -11
  105. package/src/react-start/index.ts +4 -1
  106. package/src/client/cors.ts +0 -425
  107. /package/src/{util.ts → utils/index.ts} +0 -0
@@ -1,3 +1,7 @@
1
+ // This file is auto-generated from auth.ts by generate-schema.ts. Do not edit this file manually.
2
+ // To regenerate the schema, run:
3
+ // npx tsx generate-schema.ts
4
+
1
5
  import { defineSchema, defineTable } from "convex/server";
2
6
  import { v } from "convex/values";
3
7
 
@@ -7,13 +11,23 @@ const schema = defineSchema({
7
11
  email: v.string(),
8
12
  emailVerified: v.boolean(),
9
13
  image: v.optional(v.string()),
10
- twoFactorEnabled: v.optional(v.boolean()),
11
- userId: v.string(),
12
14
  createdAt: v.number(),
13
15
  updatedAt: v.number(),
16
+ twoFactorEnabled: v.optional(v.boolean()),
17
+ isAnonymous: v.optional(v.boolean()),
18
+ username: v.optional(v.string()),
19
+ displayUsername: v.optional(v.string()),
20
+ phoneNumber: v.optional(v.string()),
21
+ phoneNumberVerified: v.optional(v.boolean()),
22
+ stripeCustomerId: v.optional(v.string()),
23
+ userId: v.optional(v.string()),
14
24
  })
25
+ .index("email_name", ["email","name"])
26
+ .index("name", ["name"])
27
+ .index("userId", ["userId"])
15
28
  .index("email", ["email"])
16
- .index("userId", ["userId"]),
29
+ .index("username", ["username"])
30
+ .index("phoneNumber", ["phoneNumber"]),
17
31
 
18
32
  session: defineTable({
19
33
  expiresAt: v.number(),
@@ -23,11 +37,12 @@ const schema = defineSchema({
23
37
  ipAddress: v.optional(v.string()),
24
38
  userAgent: v.optional(v.string()),
25
39
  userId: v.string(),
40
+ activeOrganizationId: v.optional(v.string()),
26
41
  })
27
- .index("token", ["token"])
28
- .index("userId", ["userId"])
29
42
  .index("expiresAt", ["expiresAt"])
30
- .index("userId_expiresAt", ["userId", "expiresAt"]),
43
+ .index("expiresAt_userId", ["expiresAt","userId"])
44
+ .index("token", ["token"])
45
+ .index("userId", ["userId"]),
31
46
 
32
47
  account: defineTable({
33
48
  accountId: v.string(),
@@ -43,34 +58,350 @@ const schema = defineSchema({
43
58
  createdAt: v.number(),
44
59
  updatedAt: v.number(),
45
60
  })
46
- .index("userId", ["userId"])
47
61
  .index("accountId", ["accountId"])
48
- .index("providerId_accountId", ["providerId", "accountId"])
49
- .index("userId_providerId", ["userId", "providerId"]),
62
+ .index("accountId_providerId", ["accountId","providerId"])
63
+ .index("providerId_userId", ["providerId","userId"])
64
+ .index("userId", ["userId"]),
65
+
66
+ verification: defineTable({
67
+ identifier: v.string(),
68
+ value: v.string(),
69
+ expiresAt: v.number(),
70
+ createdAt: v.optional(v.number()),
71
+ updatedAt: v.optional(v.number()),
72
+ })
73
+ .index("expiresAt", ["expiresAt"])
74
+ .index("identifier", ["identifier"]),
50
75
 
51
76
  twoFactor: defineTable({
52
77
  secret: v.string(),
53
78
  backupCodes: v.string(),
54
79
  userId: v.string(),
55
- }).index("userId", ["userId"]),
80
+ })
81
+ .index("userId", ["userId"]),
56
82
 
57
- verification: defineTable({
58
- identifier: v.string(),
59
- value: v.string(),
60
- expiresAt: v.number(),
83
+ passkey: defineTable({
84
+ name: v.optional(v.string()),
85
+ publicKey: v.string(),
86
+ userId: v.string(),
87
+ credentialID: v.string(),
88
+ counter: v.number(),
89
+ deviceType: v.string(),
90
+ backedUp: v.boolean(),
91
+ transports: v.optional(v.string()),
92
+ createdAt: v.optional(v.number()),
93
+ aaguid: v.optional(v.string()),
94
+ })
95
+ .index("credentialID", ["credentialID"])
96
+ .index("userId", ["userId"]),
97
+
98
+ apikey: defineTable({
99
+ name: v.optional(v.string()),
100
+ start: v.optional(v.string()),
101
+ prefix: v.optional(v.string()),
102
+ key: v.string(),
103
+ userId: v.string(),
104
+ refillInterval: v.optional(v.number()),
105
+ refillAmount: v.optional(v.number()),
106
+ lastRefillAt: v.optional(v.number()),
107
+ enabled: v.optional(v.boolean()),
108
+ rateLimitEnabled: v.optional(v.boolean()),
109
+ rateLimitTimeWindow: v.optional(v.number()),
110
+ rateLimitMax: v.optional(v.number()),
111
+ requestCount: v.optional(v.number()),
112
+ remaining: v.optional(v.number()),
113
+ lastRequest: v.optional(v.number()),
114
+ expiresAt: v.optional(v.number()),
115
+ createdAt: v.number(),
116
+ updatedAt: v.number(),
117
+ permissions: v.optional(v.string()),
118
+ metadata: v.optional(v.string()),
119
+ })
120
+ .index("key", ["key"])
121
+ .index("userId", ["userId"]),
122
+
123
+ oauthApplication: defineTable({
124
+ name: v.optional(v.string()),
125
+ icon: v.optional(v.string()),
126
+ metadata: v.optional(v.string()),
127
+ clientId: v.optional(v.string()),
128
+ clientSecret: v.optional(v.string()),
129
+ redirectURLs: v.optional(v.string()),
130
+ type: v.optional(v.string()),
131
+ disabled: v.optional(v.boolean()),
132
+ userId: v.optional(v.string()),
133
+ createdAt: v.optional(v.number()),
134
+ updatedAt: v.optional(v.number()),
135
+ })
136
+ .index("clientId", ["clientId"]),
137
+
138
+ oauthAccessToken: defineTable({
139
+ accessToken: v.optional(v.string()),
140
+ refreshToken: v.optional(v.string()),
141
+ accessTokenExpiresAt: v.optional(v.number()),
142
+ refreshTokenExpiresAt: v.optional(v.number()),
143
+ clientId: v.optional(v.string()),
144
+ userId: v.optional(v.string()),
145
+ scopes: v.optional(v.string()),
146
+ createdAt: v.optional(v.number()),
147
+ updatedAt: v.optional(v.number()),
148
+ })
149
+ .index("accessToken", ["accessToken"])
150
+ .index("refreshToken", ["refreshToken"]),
151
+
152
+ oauthConsent: defineTable({
153
+ clientId: v.optional(v.string()),
154
+ userId: v.optional(v.string()),
155
+ scopes: v.optional(v.string()),
61
156
  createdAt: v.optional(v.number()),
62
157
  updatedAt: v.optional(v.number()),
158
+ consentGiven: v.optional(v.boolean()),
159
+ })
160
+ .index("clientId_userId", ["clientId","userId"]),
161
+
162
+ organization: defineTable({
163
+ name: v.string(),
164
+ slug: v.optional(v.string()),
165
+ logo: v.optional(v.string()),
166
+ createdAt: v.number(),
167
+ metadata: v.optional(v.string()),
168
+ })
169
+ .index("name", ["name"])
170
+ .index("slug", ["slug"]),
171
+
172
+ member: defineTable({
173
+ organizationId: v.string(),
174
+ userId: v.string(),
175
+ role: v.string(),
176
+ teamId: v.optional(v.string()),
177
+ createdAt: v.number(),
178
+ })
179
+ .index("organizationId_userId", ["organizationId","userId"])
180
+ .index("organizationId", ["organizationId"])
181
+ .index("userId", ["userId"])
182
+ .index("role", ["role"])
183
+ .index("teamId", ["teamId"]),
184
+
185
+ invitation: defineTable({
186
+ organizationId: v.string(),
187
+ email: v.string(),
188
+ role: v.optional(v.string()),
189
+ teamId: v.optional(v.string()),
190
+ status: v.string(),
191
+ expiresAt: v.number(),
192
+ inviterId: v.string(),
193
+ })
194
+ .index("email_organizationId_status", ["email","organizationId","status"])
195
+ .index("organizationId_status", ["organizationId","status"])
196
+ .index("organizationId", ["organizationId"])
197
+ .index("email", ["email"])
198
+ .index("role", ["role"])
199
+ .index("teamId", ["teamId"])
200
+ .index("status", ["status"])
201
+ .index("inviterId", ["inviterId"]),
202
+
203
+ team: defineTable({
204
+ name: v.string(),
205
+ organizationId: v.string(),
206
+ createdAt: v.number(),
207
+ updatedAt: v.optional(v.number()),
63
208
  })
64
- .index("identifier", ["identifier"])
65
- .index("expiresAt", ["expiresAt"]),
209
+ .index("organizationId", ["organizationId"]),
210
+
211
+ ssoProvider: defineTable({
212
+ issuer: v.string(),
213
+ oidcConfig: v.optional(v.string()),
214
+ samlConfig: v.optional(v.string()),
215
+ userId: v.optional(v.string()),
216
+ providerId: v.string(),
217
+ organizationId: v.optional(v.string()),
218
+ domain: v.string(),
219
+ })
220
+ .index("organizationId", ["organizationId"])
221
+ .index("domain", ["domain"])
222
+ .index("userId", ["userId"])
223
+ .index("providerId", ["providerId"]),
66
224
 
67
225
  jwks: defineTable({
68
226
  publicKey: v.string(),
69
227
  privateKey: v.string(),
70
228
  createdAt: v.number(),
71
- // no longer used
72
- id: v.optional(v.string()),
73
229
  }),
230
+
231
+ subscription: defineTable({
232
+ plan: v.string(),
233
+ referenceId: v.string(),
234
+ stripeCustomerId: v.optional(v.string()),
235
+ stripeSubscriptionId: v.optional(v.string()),
236
+ status: v.optional(v.string()),
237
+ periodStart: v.optional(v.number()),
238
+ periodEnd: v.optional(v.number()),
239
+ cancelAtPeriodEnd: v.optional(v.boolean()),
240
+ seats: v.optional(v.number()),
241
+ })
242
+ .index("stripeSubscriptionId", ["stripeSubscriptionId"])
243
+ .index("stripeCustomerId", ["stripeCustomerId"])
244
+ .index("referenceId", ["referenceId"]),
245
+
246
+ rateLimit: defineTable({
247
+ key: v.optional(v.string()),
248
+ count: v.optional(v.number()),
249
+ lastRequest: v.optional(v.number()),
250
+ })
251
+ .index("key", ["key"]),
252
+
74
253
  });
75
254
 
76
255
  export default schema;
256
+
257
+ export const specialFields = {
258
+ user: {
259
+ name: {
260
+ sortable: true
261
+ },
262
+ email: {
263
+ sortable: true,
264
+ unique: true
265
+ },
266
+ username: {
267
+ sortable: true,
268
+ unique: true
269
+ },
270
+ phoneNumber: {
271
+ sortable: true,
272
+ unique: true
273
+ }
274
+ },
275
+ session: {
276
+ token: {
277
+ unique: true
278
+ },
279
+ userId: {
280
+ references: {
281
+ model: "user",
282
+ field: "id",
283
+ onDelete: "cascade"
284
+ }
285
+ }
286
+ },
287
+ account: {
288
+ userId: {
289
+ references: {
290
+ model: "user",
291
+ field: "id",
292
+ onDelete: "cascade"
293
+ }
294
+ }
295
+ },
296
+ twoFactor: {
297
+ userId: {
298
+ references: {
299
+ model: "user",
300
+ field: "id"
301
+ }
302
+ }
303
+ },
304
+ passkey: {
305
+ userId: {
306
+ references: {
307
+ model: "user",
308
+ field: "id"
309
+ }
310
+ }
311
+ },
312
+ apikey: {
313
+ userId: {
314
+ references: {
315
+ model: "user",
316
+ field: "id"
317
+ }
318
+ }
319
+ },
320
+ oauthApplication: {
321
+ clientId: {
322
+ unique: true
323
+ }
324
+ },
325
+ oauthAccessToken: {
326
+ accessToken: {
327
+ unique: true
328
+ },
329
+ refreshToken: {
330
+ unique: true
331
+ }
332
+ },
333
+ organization: {
334
+ name: {
335
+ sortable: true
336
+ },
337
+ slug: {
338
+ sortable: true,
339
+ unique: true
340
+ }
341
+ },
342
+ member: {
343
+ organizationId: {
344
+ references: {
345
+ model: "organization",
346
+ field: "id"
347
+ }
348
+ },
349
+ userId: {
350
+ references: {
351
+ model: "user",
352
+ field: "id"
353
+ }
354
+ },
355
+ role: {
356
+ sortable: true
357
+ },
358
+ teamId: {
359
+ sortable: true
360
+ }
361
+ },
362
+ invitation: {
363
+ organizationId: {
364
+ references: {
365
+ model: "organization",
366
+ field: "id"
367
+ }
368
+ },
369
+ email: {
370
+ sortable: true
371
+ },
372
+ role: {
373
+ sortable: true
374
+ },
375
+ teamId: {
376
+ sortable: true
377
+ },
378
+ status: {
379
+ sortable: true
380
+ },
381
+ inviterId: {
382
+ references: {
383
+ model: "user",
384
+ field: "id"
385
+ }
386
+ }
387
+ },
388
+ team: {
389
+ organizationId: {
390
+ references: {
391
+ model: "organization",
392
+ field: "id"
393
+ }
394
+ }
395
+ },
396
+ ssoProvider: {
397
+ userId: {
398
+ references: {
399
+ model: "user",
400
+ field: "id"
401
+ }
402
+ },
403
+ providerId: {
404
+ unique: true
405
+ }
406
+ }
407
+ };
@@ -3,23 +3,9 @@ import { createCookieGetter } from "better-auth/cookies";
3
3
  import { GenericActionCtx } from "convex/server";
4
4
  import { JWT_COOKIE_NAME } from "../plugins/convex";
5
5
 
6
- const requireBaseURL = (
7
- createAuth: (ctx: GenericActionCtx<any>) => ReturnType<typeof betterAuth>
8
- ) => {
9
- if (!createAuth({} as any).options.baseURL) {
10
- throw new Error(
11
- "No baseURL found in Better Auth config. baseUrl should be set to your Convex Site URL."
12
- );
13
- }
14
- return createAuth({} as any).options.baseURL;
15
- };
16
-
17
6
  export const getToken = async (
18
7
  createAuth: (ctx: GenericActionCtx<any>) => ReturnType<typeof betterAuth>
19
8
  ) => {
20
- // Require baseURL here because it's protocol determines cookie secure mode,
21
- // and must be set to ensure cookies work between Next.js and Convex.
22
- requireBaseURL(createAuth);
23
9
  const { cookies } = await import("next/headers");
24
10
  const cookieStore = await cookies();
25
11
  const auth = createAuth({} as any);
@@ -33,6 +19,9 @@ const handler = (request: Request, opts?: { convexSiteUrl?: string }) => {
33
19
  const requestUrl = new URL(request.url);
34
20
  const convexSiteUrl =
35
21
  opts?.convexSiteUrl ?? process.env.NEXT_PUBLIC_CONVEX_SITE_URL;
22
+ if (!convexSiteUrl) {
23
+ throw new Error("NEXT_PUBLIC_CONVEX_SITE_URL is not set");
24
+ }
36
25
  const nextUrl = `${convexSiteUrl}${requestUrl.pathname}${requestUrl.search}`;
37
26
  const newRequest = new Request(nextUrl, request);
38
27
  newRequest.headers.set("accept-encoding", "application/json");
@@ -51,7 +51,7 @@ export const convex = (
51
51
  return session.user.userId;
52
52
  },
53
53
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
54
- definePayload: ({ user: { id, userId, ...user }, session }) => ({
54
+ definePayload: ({ user: { id, userId, image, ...user }, session }) => ({
55
55
  ...user,
56
56
  sessionId: session.id,
57
57
  }),
@@ -144,7 +144,10 @@ export const convex = (
144
144
  },
145
145
  {
146
146
  matcher: (ctx) => {
147
- return ctx.path?.startsWith("/sign-out");
147
+ return (
148
+ ctx.path?.startsWith("/sign-out") ||
149
+ ctx.path?.startsWith("/delete-user")
150
+ );
148
151
  },
149
152
  handler: createAuthMiddleware(async (ctx) => {
150
153
  const jwtCookie = ctx.context.createAuthCookie(JWT_COOKIE_NAME, {
@@ -21,6 +21,13 @@ export const crossDomain = ({ siteUrl }: { siteUrl: string }) => {
21
21
 
22
22
  return {
23
23
  id: "cross-domain",
24
+ init(ctx) {
25
+ return {
26
+ options: {
27
+ trustedOrigins: [siteUrl],
28
+ },
29
+ };
30
+ },
24
31
  hooks: {
25
32
  before: [
26
33
  {
@@ -52,12 +59,22 @@ export const crossDomain = ({ siteUrl }: { siteUrl: string }) => {
52
59
  };
53
60
  }),
54
61
  },
62
+ {
63
+ matcher: (ctx) => {
64
+ return ctx.method === "GET" && ctx.path.startsWith("/verify-email");
65
+ },
66
+ handler: createAuthMiddleware(async (ctx) => {
67
+ if (ctx.query?.callbackURL) {
68
+ ctx.query.callbackURL = rewriteCallbackURL(ctx.query.callbackURL);
69
+ }
70
+ return { context: ctx };
71
+ }),
72
+ },
55
73
  {
56
74
  matcher: (ctx) => {
57
75
  return (
58
- ctx.path.startsWith("/link-social") ||
76
+ (ctx.method === "POST" && ctx.path.startsWith("/link-social")) ||
59
77
  ctx.path.startsWith("/send-verification-email") ||
60
- ctx.path.startsWith("/verify-email") ||
61
78
  ctx.path.startsWith("/sign-in/email") ||
62
79
  ctx.path.startsWith("/sign-in/social") ||
63
80
  ctx.path.startsWith("/sign-in/magic-link") ||
@@ -149,8 +166,5 @@ export const crossDomain = ({ siteUrl }: { siteUrl: string }) => {
149
166
  }
150
167
  ),
151
168
  },
152
- options: {
153
- trustedOrigins: [siteUrl],
154
- },
155
169
  } satisfies BetterAuthPlugin;
156
170
  };
@@ -27,7 +27,7 @@ export function useAuth() {
27
27
  }
28
28
 
29
29
  export type ConvexAuthClient = {
30
- verbose: boolean | undefined;
30
+ verbose?: boolean;
31
31
  logger?: ConvexReactClient["logger"];
32
32
  };
33
33
 
@@ -64,7 +64,7 @@ export function AuthProvider({
64
64
  const { data: session, isPending: isSessionPending } =
65
65
  authClient.useSession();
66
66
 
67
- const verbose: boolean = (client as any).options?.verbose ?? false;
67
+ const verbose: boolean = client.verbose ?? false;
68
68
  const logVerbose = useCallback(
69
69
  (message: string) => {
70
70
  if (verbose) {
@@ -128,17 +128,11 @@ export function AuthProvider({
128
128
  () => {
129
129
  // eslint-disable-next-line @typescript-eslint/no-floating-promises
130
130
  (async () => {
131
- // Return early if cross domain plugin is not configured.
132
- // Apparently there's no sane way to do this type check. Only the in
133
- // keyword narrows the type effectively but it doesn't work on functions.
134
- if (!(authClient as any)["crossDomain"]) {
135
- return;
136
- }
137
- const authClientWithCrossDomain =
138
- authClient as AuthClientWithPlugins<PluginsWithCrossDomain>;
139
- const url = new URL(window.location.href);
131
+ const url = new URL(window.location?.href);
140
132
  const token = url.searchParams.get("ott");
141
133
  if (token) {
134
+ const authClientWithCrossDomain =
135
+ authClient as AuthClientWithPlugins<PluginsWithCrossDomain>;
142
136
  url.searchParams.delete("ott");
143
137
  const result =
144
138
  await authClientWithCrossDomain.crossDomain.oneTimeToken.verify({
@@ -14,12 +14,15 @@ export const getCookieName = async (
14
14
  };
15
15
 
16
16
  const requireConvexSiteUrl = (
17
- opts: { convexSiteUrl: string },
17
+ opts: { convexSiteUrl: string; verbose?: boolean },
18
18
  calledFrom: string
19
19
  ) => {
20
20
  if (!opts.convexSiteUrl) {
21
21
  throw new Error(`${calledFrom}: opts.convexSiteUrl is required`);
22
22
  }
23
+ if (opts.verbose) {
24
+ console.log(`${calledFrom}: opts.convexSiteUrl: ${opts.convexSiteUrl}`);
25
+ }
23
26
  return opts.convexSiteUrl;
24
27
  };
25
28