@convex-dev/better-auth 0.8.9 → 0.9.0

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 (95) hide show
  1. package/dist/commonjs/client/adapter.d.ts +8 -4
  2. package/dist/commonjs/client/adapter.d.ts.map +1 -1
  3. package/dist/commonjs/client/adapter.js +45 -8
  4. package/dist/commonjs/client/adapter.js.map +1 -1
  5. package/dist/commonjs/client/adapterUtils.d.ts +6 -6
  6. package/dist/commonjs/client/adapterUtils.d.ts.map +1 -1
  7. package/dist/commonjs/client/adapterUtils.js +17 -9
  8. package/dist/commonjs/client/adapterUtils.js.map +1 -1
  9. package/dist/commonjs/client/createSchema.d.ts +0 -5
  10. package/dist/commonjs/client/createSchema.d.ts.map +1 -1
  11. package/dist/commonjs/client/createSchema.js +0 -8
  12. package/dist/commonjs/client/createSchema.js.map +1 -1
  13. package/dist/commonjs/client/index.d.ts +64 -3355
  14. package/dist/commonjs/client/index.d.ts.map +1 -1
  15. package/dist/commonjs/client/index.js +100 -33
  16. package/dist/commonjs/client/index.js.map +1 -1
  17. package/dist/commonjs/component/adapter.d.ts +11 -9
  18. package/dist/commonjs/component/adapter.d.ts.map +1 -1
  19. package/dist/commonjs/component/adapter.js +1 -1
  20. package/dist/commonjs/component/adapter.js.map +1 -1
  21. package/dist/commonjs/component/adapterTest.d.ts +1 -1
  22. package/dist/commonjs/component/adapterTest.d.ts.map +1 -1
  23. package/dist/commonjs/component/schema.d.ts +16 -419
  24. package/dist/commonjs/component/schema.d.ts.map +1 -1
  25. package/dist/commonjs/component/schema.js +6 -196
  26. package/dist/commonjs/component/schema.js.map +1 -1
  27. package/dist/commonjs/plugins/convex/index.d.ts +10 -2
  28. package/dist/commonjs/plugins/convex/index.d.ts.map +1 -1
  29. package/dist/commonjs/plugins/convex/index.js +17 -1
  30. package/dist/commonjs/plugins/convex/index.js.map +1 -1
  31. package/dist/commonjs/plugins/cross-domain/index.d.ts +5 -0
  32. package/dist/commonjs/plugins/cross-domain/index.d.ts.map +1 -1
  33. package/dist/commonjs/plugins/cross-domain/index.js +8 -0
  34. package/dist/commonjs/plugins/cross-domain/index.js.map +1 -1
  35. package/dist/commonjs/react-start/index.d.ts.map +1 -1
  36. package/dist/commonjs/react-start/index.js +10 -2
  37. package/dist/commonjs/react-start/index.js.map +1 -1
  38. package/dist/commonjs/utils/index.d.ts +5 -5
  39. package/dist/commonjs/utils/index.d.ts.map +1 -1
  40. package/dist/commonjs/utils/index.js +9 -11
  41. package/dist/commonjs/utils/index.js.map +1 -1
  42. package/dist/esm/client/adapter.d.ts +8 -4
  43. package/dist/esm/client/adapter.d.ts.map +1 -1
  44. package/dist/esm/client/adapter.js +45 -8
  45. package/dist/esm/client/adapter.js.map +1 -1
  46. package/dist/esm/client/adapterUtils.d.ts +6 -6
  47. package/dist/esm/client/adapterUtils.d.ts.map +1 -1
  48. package/dist/esm/client/adapterUtils.js +17 -9
  49. package/dist/esm/client/adapterUtils.js.map +1 -1
  50. package/dist/esm/client/createSchema.d.ts +0 -5
  51. package/dist/esm/client/createSchema.d.ts.map +1 -1
  52. package/dist/esm/client/createSchema.js +0 -8
  53. package/dist/esm/client/createSchema.js.map +1 -1
  54. package/dist/esm/client/index.d.ts +64 -3355
  55. package/dist/esm/client/index.d.ts.map +1 -1
  56. package/dist/esm/client/index.js +100 -33
  57. package/dist/esm/client/index.js.map +1 -1
  58. package/dist/esm/component/adapter.d.ts +11 -9
  59. package/dist/esm/component/adapter.d.ts.map +1 -1
  60. package/dist/esm/component/adapter.js +1 -1
  61. package/dist/esm/component/adapter.js.map +1 -1
  62. package/dist/esm/component/adapterTest.d.ts +1 -1
  63. package/dist/esm/component/adapterTest.d.ts.map +1 -1
  64. package/dist/esm/component/schema.d.ts +16 -419
  65. package/dist/esm/component/schema.d.ts.map +1 -1
  66. package/dist/esm/component/schema.js +6 -196
  67. package/dist/esm/component/schema.js.map +1 -1
  68. package/dist/esm/plugins/convex/index.d.ts +10 -2
  69. package/dist/esm/plugins/convex/index.d.ts.map +1 -1
  70. package/dist/esm/plugins/convex/index.js +17 -1
  71. package/dist/esm/plugins/convex/index.js.map +1 -1
  72. package/dist/esm/plugins/cross-domain/index.d.ts +5 -0
  73. package/dist/esm/plugins/cross-domain/index.d.ts.map +1 -1
  74. package/dist/esm/plugins/cross-domain/index.js +8 -0
  75. package/dist/esm/plugins/cross-domain/index.js.map +1 -1
  76. package/dist/esm/react-start/index.d.ts.map +1 -1
  77. package/dist/esm/react-start/index.js +10 -2
  78. package/dist/esm/react-start/index.js.map +1 -1
  79. package/dist/esm/utils/index.d.ts +5 -5
  80. package/dist/esm/utils/index.d.ts.map +1 -1
  81. package/dist/esm/utils/index.js +9 -11
  82. package/dist/esm/utils/index.js.map +1 -1
  83. package/package.json +13 -8
  84. package/src/client/adapter.test.ts +94 -34
  85. package/src/client/adapter.ts +66 -14
  86. package/src/client/adapterUtils.ts +23 -8
  87. package/src/client/createSchema.ts +0 -8
  88. package/src/client/index.ts +124 -63
  89. package/src/component/_generated/api.d.ts +133 -1303
  90. package/src/component/adapter.ts +1 -0
  91. package/src/component/schema.ts +11 -214
  92. package/src/plugins/convex/index.ts +21 -1
  93. package/src/plugins/cross-domain/index.ts +8 -0
  94. package/src/react-start/index.ts +10 -2
  95. package/src/utils/index.ts +20 -10
@@ -10,4 +10,5 @@ export const {
10
10
  updateMany,
11
11
  deleteOne,
12
12
  deleteMany,
13
+ migrationRemoveUserId,
13
14
  } = createApi(schema, () => auth);
@@ -21,7 +21,7 @@ export const tables = {
21
21
  phoneNumberVerified: v.optional(v.union(v.null(), v.boolean())),
22
22
  userId: v.optional(v.union(v.null(), v.string())),
23
23
  })
24
- .index("email_name", ["email", "name"])
24
+ .index("email_name", ["email","name"])
25
25
  .index("name", ["name"])
26
26
  .index("userId", ["userId"])
27
27
  .index("username", ["username"])
@@ -36,7 +36,7 @@ export const tables = {
36
36
  userId: v.string(),
37
37
  })
38
38
  .index("expiresAt", ["expiresAt"])
39
- .index("expiresAt_userId", ["expiresAt", "userId"])
39
+ .index("expiresAt_userId", ["expiresAt","userId"])
40
40
  .index("token", ["token"])
41
41
  .index("userId", ["userId"]),
42
42
  account: defineTable({
@@ -54,8 +54,8 @@ export const tables = {
54
54
  updatedAt: v.number(),
55
55
  })
56
56
  .index("accountId", ["accountId"])
57
- .index("accountId_providerId", ["accountId", "providerId"])
58
- .index("providerId_userId", ["providerId", "userId"])
57
+ .index("accountId_providerId", ["accountId","providerId"])
58
+ .index("providerId_userId", ["providerId","userId"])
59
59
  .index("userId", ["userId"]),
60
60
  verification: defineTable({
61
61
  identifier: v.string(),
@@ -70,7 +70,8 @@ export const tables = {
70
70
  secret: v.string(),
71
71
  backupCodes: v.string(),
72
72
  userId: v.string(),
73
- }).index("userId", ["userId"]),
73
+ })
74
+ .index("userId", ["userId"]),
74
75
  passkey: defineTable({
75
76
  name: v.optional(v.union(v.null(), v.string())),
76
77
  publicKey: v.string(),
@@ -100,7 +101,6 @@ export const tables = {
100
101
  })
101
102
  .index("clientId", ["clientId"])
102
103
  .index("userId", ["userId"]),
103
-
104
104
  oauthAccessToken: defineTable({
105
105
  accessToken: v.optional(v.union(v.null(), v.string())),
106
106
  refreshToken: v.optional(v.union(v.null(), v.string())),
@@ -116,7 +116,6 @@ export const tables = {
116
116
  .index("refreshToken", ["refreshToken"])
117
117
  .index("clientId", ["clientId"])
118
118
  .index("userId", ["userId"]),
119
-
120
119
  oauthConsent: defineTable({
121
120
  clientId: v.optional(v.union(v.null(), v.string())),
122
121
  userId: v.optional(v.union(v.null(), v.string())),
@@ -125,229 +124,27 @@ export const tables = {
125
124
  updatedAt: v.optional(v.union(v.null(), v.number())),
126
125
  consentGiven: v.optional(v.union(v.null(), v.boolean())),
127
126
  })
128
- .index("clientId_userId", ["clientId", "userId"])
129
- .index("userId", ["userId"]),
130
-
131
- team: defineTable({
132
- name: v.string(),
133
- organizationId: v.string(),
134
- createdAt: v.number(),
135
- updatedAt: v.optional(v.union(v.null(), v.number())),
136
- }).index("organizationId", ["organizationId"]),
137
-
138
- teamMember: defineTable({
139
- teamId: v.string(),
140
- userId: v.string(),
141
- createdAt: v.optional(v.union(v.null(), v.number())),
142
- })
143
- .index("teamId", ["teamId"])
127
+ .index("clientId_userId", ["clientId","userId"])
144
128
  .index("userId", ["userId"]),
145
-
146
- organization: defineTable({
147
- name: v.string(),
148
- slug: v.optional(v.union(v.null(), v.string())),
149
- logo: v.optional(v.union(v.null(), v.string())),
150
- createdAt: v.number(),
151
- metadata: v.optional(v.union(v.null(), v.string())),
152
- })
153
- .index("name", ["name"])
154
- .index("slug", ["slug"]),
155
-
156
- member: defineTable({
157
- organizationId: v.string(),
158
- userId: v.string(),
159
- role: v.string(),
160
- createdAt: v.number(),
161
- })
162
- .index("organizationId_userId", ["organizationId", "userId"])
163
- .index("userId", ["userId"])
164
- .index("role", ["role"]),
165
-
166
- invitation: defineTable({
167
- organizationId: v.string(),
168
- email: v.string(),
169
- role: v.optional(v.union(v.null(), v.string())),
170
- teamId: v.optional(v.union(v.null(), v.string())),
171
- status: v.string(),
172
- expiresAt: v.number(),
173
- inviterId: v.string(),
174
- })
175
- .index("email_organizationId_status", ["email", "organizationId", "status"])
176
- .index("organizationId_status", ["organizationId", "status"])
177
- .index("role", ["role"])
178
- .index("teamId", ["teamId"])
179
- .index("status", ["status"])
180
- .index("inviterId", ["inviterId"]),
181
-
182
- ssoProvider: defineTable({
183
- issuer: v.string(),
184
- oidcConfig: v.optional(v.union(v.null(), v.string())),
185
- samlConfig: v.optional(v.union(v.null(), v.string())),
186
- userId: v.optional(v.union(v.null(), v.string())),
187
- providerId: v.string(),
188
- organizationId: v.optional(v.union(v.null(), v.string())),
189
- domain: v.string(),
190
- })
191
- .index("organizationId", ["organizationId"])
192
- .index("domain", ["domain"])
193
- .index("userId", ["userId"])
194
- .index("providerId", ["providerId"]),
195
-
196
129
  jwks: defineTable({
197
130
  publicKey: v.string(),
198
131
  privateKey: v.string(),
199
132
  createdAt: v.number(),
200
133
  }),
201
-
202
- subscription: defineTable({
203
- plan: v.string(),
204
- referenceId: v.string(),
205
- stripeCustomerId: v.optional(v.union(v.null(), v.string())),
206
- stripeSubscriptionId: v.optional(v.union(v.null(), v.string())),
207
- status: v.optional(v.union(v.null(), v.string())),
208
- periodStart: v.optional(v.union(v.null(), v.number())),
209
- periodEnd: v.optional(v.union(v.null(), v.number())),
210
- trialStart: v.optional(v.union(v.null(), v.number())),
211
- trialEnd: v.optional(v.union(v.null(), v.number())),
212
- cancelAtPeriodEnd: v.optional(v.union(v.null(), v.boolean())),
213
- seats: v.optional(v.union(v.null(), v.number())),
214
- })
215
- .index("stripeSubscriptionId", ["stripeSubscriptionId"])
216
- .index("stripeCustomerId", ["stripeCustomerId"])
217
- .index("referenceId", ["referenceId"]),
218
-
219
- walletAddress: defineTable({
220
- userId: v.string(),
221
- address: v.string(),
222
- chainId: v.number(),
223
- isPrimary: v.optional(v.union(v.null(), v.boolean())),
224
- createdAt: v.number(),
225
- }).index("userId", ["userId"]),
226
-
227
134
  rateLimit: defineTable({
228
135
  key: v.optional(v.union(v.null(), v.string())),
229
136
  count: v.optional(v.union(v.null(), v.number())),
230
137
  lastRequest: v.optional(v.union(v.null(), v.number())),
231
- }).index("key", ["key"]),
138
+ })
139
+ .index("key", ["key"]),
232
140
  ratelimit: defineTable({
233
141
  key: v.string(),
234
142
  count: v.number(),
235
143
  lastRequest: v.number(),
236
- }).index("key", ["key"]),
144
+ })
145
+ .index("key", ["key"]),
237
146
  };
238
147
 
239
148
  const schema = defineSchema(tables);
240
149
 
241
150
  export default schema;
242
-
243
- export const specialFields = {
244
- user: {
245
- name: {
246
- sortable: true,
247
- },
248
- email: {
249
- sortable: true,
250
- unique: true,
251
- },
252
- username: {
253
- sortable: true,
254
- unique: true,
255
- },
256
- phoneNumber: {
257
- sortable: true,
258
- unique: true,
259
- },
260
- },
261
- session: {
262
- token: {
263
- unique: true,
264
- },
265
- userId: {
266
- references: {
267
- model: "user",
268
- field: "id",
269
- onDelete: "cascade",
270
- },
271
- },
272
- },
273
- account: {
274
- userId: {
275
- references: {
276
- model: "user",
277
- field: "id",
278
- onDelete: "cascade",
279
- },
280
- },
281
- },
282
- twoFactor: {
283
- userId: {
284
- references: {
285
- model: "user",
286
- field: "id",
287
- },
288
- },
289
- },
290
- passkey: {
291
- userId: {
292
- references: {
293
- model: "user",
294
- field: "id",
295
- },
296
- },
297
- },
298
- oauthApplication: {
299
- clientId: {
300
- unique: true,
301
- },
302
- userId: {
303
- references: {
304
- model: "user",
305
- field: "id",
306
- onDelete: "cascade",
307
- },
308
- },
309
- },
310
- oauthAccessToken: {
311
- accessToken: {
312
- unique: true,
313
- },
314
- refreshToken: {
315
- unique: true,
316
- },
317
- clientId: {
318
- references: {
319
- model: "oauthApplication",
320
- field: "clientId",
321
- onDelete: "cascade",
322
- },
323
- },
324
- userId: {
325
- references: {
326
- model: "user",
327
- field: "id",
328
- onDelete: "cascade",
329
- },
330
- },
331
- },
332
- oauthConsent: {
333
- clientId: {
334
- references: {
335
- model: "oauthApplication",
336
- field: "clientId",
337
- onDelete: "cascade",
338
- },
339
- },
340
- userId: {
341
- references: {
342
- model: "user",
343
- field: "id",
344
- onDelete: "cascade",
345
- },
346
- },
347
- },
348
- ratelimit: {
349
- key: {
350
- unique: true,
351
- },
352
- },
353
- };
@@ -60,7 +60,27 @@ export const convex = (
60
60
  }
61
61
  },
62
62
  hooks: {
63
- before: [...bearer.hooks.before],
63
+ before: [
64
+ ...bearer.hooks.before,
65
+ // Don't attempt to refresh the session with a query ctx
66
+ {
67
+ matcher: (ctx) => {
68
+ return (
69
+ !ctx.context.adapter.options?.isRunMutationCtx &&
70
+ ctx.path === "/get-session"
71
+ );
72
+ },
73
+ handler: createAuthMiddleware(async (ctx) => {
74
+ ctx.query = { ...ctx.query, disableRefresh: true };
75
+ ctx.context.internalAdapter.deleteSession = async (
76
+ ..._args: any[]
77
+ ) => {
78
+ //skip
79
+ };
80
+ return { context: ctx };
81
+ }),
82
+ },
83
+ ],
64
84
  after: [
65
85
  ...oidcProvider.hooks.after,
66
86
  {
@@ -35,12 +35,19 @@ export const crossDomain = ({ siteUrl }: { siteUrl: string }) => {
35
35
  options: {
36
36
  trustedOrigins: [siteUrl],
37
37
  },
38
+ context: {
39
+ oauthConfig: {
40
+ skipStateCookieCheck: true,
41
+ },
42
+ },
38
43
  };
39
44
  },
40
45
  hooks: {
41
46
  before: [
42
47
  {
43
48
  matcher(ctx) {
49
+ console.log("ctx.request?.headers", ctx.request?.headers);
50
+ console.log("ctx.headers", ctx.headers);
44
51
  return (
45
52
  Boolean(
46
53
  ctx.request?.headers.get("better-auth-cookie") ||
@@ -122,6 +129,7 @@ export const crossDomain = ({ siteUrl }: { siteUrl: string }) => {
122
129
  },
123
130
  handler: createAuthMiddleware(async (ctx) => {
124
131
  const setCookie = ctx.context.responseHeaders?.get("set-cookie");
132
+ console.log("setCookie", setCookie);
125
133
  if (!setCookie) {
126
134
  return;
127
135
  }
@@ -120,6 +120,14 @@ export const reactStartHandler = (
120
120
  throw new Error("VITE_CONVEX_SITE_URL is not set");
121
121
  }
122
122
  const nextUrl = `${convexSiteUrl}${requestUrl.pathname}${requestUrl.search}`;
123
- request.headers.set("accept-encoding", "application/json");
124
- return fetch(nextUrl, new Request(request, { redirect: "manual" }));
123
+ const headers = new Headers(request.headers);
124
+ headers.set("accept-encoding", "application/json");
125
+ return fetch(nextUrl, {
126
+ method: request.method,
127
+ headers,
128
+ redirect: "manual",
129
+ body: request.body,
130
+ // @ts-expect-error - duplex is required for streaming request bodies in modern fetch
131
+ duplex: "half",
132
+ });
125
133
  };
@@ -6,16 +6,11 @@ import {
6
6
  } from "convex/server";
7
7
  import { GenericCtx } from "../client";
8
8
 
9
- /**
10
- * @deprecated Just reference variables direct, the component will
11
- * use other ways to make sure the appropriate variables are available
12
- */
13
- export const requireEnv = (name: string) => {
14
- const value = process.env[name];
15
- if (value === undefined) {
16
- throw new Error(`Missing environment variable \`${name}\``);
17
- }
18
- return value;
9
+ export type RunMutationCtx<DataModel extends GenericDataModel> = (
10
+ | GenericMutationCtx<DataModel>
11
+ | GenericActionCtx<DataModel>
12
+ ) & {
13
+ runMutation: GenericMutationCtx<DataModel>["runMutation"];
19
14
  };
20
15
 
21
16
  export const isQueryCtx = <DataModel extends GenericDataModel>(
@@ -36,6 +31,12 @@ export const isActionCtx = <DataModel extends GenericDataModel>(
36
31
  return "runAction" in ctx;
37
32
  };
38
33
 
34
+ export const isRunMutationCtx = <DataModel extends GenericDataModel>(
35
+ ctx: GenericCtx<DataModel>
36
+ ): ctx is RunMutationCtx<DataModel> => {
37
+ return "runMutation" in ctx;
38
+ };
39
+
39
40
  export const requireQueryCtx = <DataModel extends GenericDataModel>(
40
41
  ctx: GenericCtx<DataModel>
41
42
  ): GenericQueryCtx<DataModel> => {
@@ -62,3 +63,12 @@ export const requireActionCtx = <DataModel extends GenericDataModel>(
62
63
  }
63
64
  return ctx;
64
65
  };
66
+
67
+ export const requireRunMutationCtx = <DataModel extends GenericDataModel>(
68
+ ctx: GenericCtx<DataModel>
69
+ ): RunMutationCtx<DataModel> => {
70
+ if (!isRunMutationCtx(ctx)) {
71
+ throw new Error("Mutation or action context required");
72
+ }
73
+ return ctx;
74
+ };