@convex-dev/better-auth 0.7.0-alpha.8 → 0.7.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 (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 +190 -192
  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 +59 -67
  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 +190 -192
  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 +59 -67
  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 +206 -198
  96. package/src/client/index.ts +60 -80
  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
@@ -16,33 +16,36 @@ import { type GenericId, Infer, v } from "convex/values";
16
16
  import type { api } from "../component/_generated/api";
17
17
  import schema from "../component/schema";
18
18
  import { convexAdapter } from "./adapter";
19
- import corsRouter from "./cors";
20
- import { getByArgsValidator, updateArgsInputValidator } from "../component/lib";
21
19
  import { betterAuth } from "better-auth";
22
20
  import { omit } from "convex-helpers";
23
21
  import { createCookieGetter } from "better-auth/cookies";
24
22
  import { fetchQuery } from "convex/nextjs";
25
23
  import { JWT_COOKIE_NAME } from "../plugins/convex";
26
- import { requireEnv } from "../util";
24
+ import { requireEnv } from "../utils";
25
+ import { partial } from "convex-helpers/validators";
26
+ import { adapterArgsValidator, adapterWhereValidator } from "../component/lib";
27
+ import { corsRouter } from "convex-helpers/server/cors";
27
28
  export { convexAdapter };
28
29
 
29
30
  const createUserFields = omit(schema.tables.user.validator.fields, ["userId"]);
30
31
  const createUserValidator = v.object(createUserFields);
31
32
  const createUserArgsValidator = v.object({
32
33
  input: v.object({
33
- ...createUserFields,
34
- table: v.literal("user"),
34
+ model: v.literal("user"),
35
+ data: v.object(createUserFields),
35
36
  }),
36
37
  });
37
38
  const updateUserArgsValidator = v.object({
38
- input: updateArgsInputValidator("user"),
39
+ input: v.object({
40
+ model: v.literal("user"),
41
+ where: v.optional(v.array(adapterWhereValidator)),
42
+ update: v.object(partial(createUserFields)),
43
+ }),
39
44
  });
40
- const deleteUserArgsValidator = v.object(getByArgsValidator);
41
-
42
45
  const createSessionArgsValidator = v.object({
43
46
  input: v.object({
44
- table: v.literal("session"),
45
- ...schema.tables.session.validator.fields,
47
+ model: v.literal("session"),
48
+ data: v.object(schema.tables.session.validator.fields),
46
49
  }),
47
50
  });
48
51
 
@@ -61,7 +64,7 @@ export type AuthFunctions = {
61
64
  deleteUser: FunctionReference<
62
65
  "mutation",
63
66
  "internal",
64
- Infer<typeof deleteUserArgsValidator>
67
+ Infer<typeof adapterArgsValidator>
65
68
  >;
66
69
  updateUser: FunctionReference<
67
70
  "mutation",
@@ -128,10 +131,14 @@ export class BetterAuth<UserId extends string = string> {
128
131
  if (!identity) {
129
132
  return null;
130
133
  }
131
- const doc = await ctx.runQuery(this.component.lib.getBy, {
132
- table: "user",
133
- field: "userId",
134
- value: identity.subject,
134
+ const doc = await ctx.runQuery(this.component.lib.findOne, {
135
+ model: "user",
136
+ where: [
137
+ {
138
+ field: "userId",
139
+ value: identity.subject,
140
+ },
141
+ ],
135
142
  });
136
143
  if (!doc) {
137
144
  return null;
@@ -182,35 +189,38 @@ export class BetterAuth<UserId extends string = string> {
182
189
  createUser: internalMutationGeneric({
183
190
  args: createUserArgsValidator,
184
191
  handler: async (ctx, args) => {
185
- const userId = await opts.onCreateUser(ctx, args.input);
186
- const input = { ...args.input, table: "user", userId };
192
+ const userId = await opts.onCreateUser(ctx, args.input.data);
187
193
  return ctx.runMutation(this.component.lib.create, {
188
- input,
194
+ input: {
195
+ ...args.input,
196
+ data: { ...args.input.data, userId },
197
+ },
189
198
  });
190
199
  },
191
200
  }),
192
201
  deleteUser: internalMutationGeneric({
193
- args: deleteUserArgsValidator,
202
+ args: adapterArgsValidator,
194
203
  handler: async (ctx, args) => {
195
- const doc = await ctx.runMutation(this.component.lib.deleteBy, args);
196
- if (opts.onDeleteUser) {
204
+ const doc = await ctx.runMutation(this.component.lib.deleteOne, args);
205
+ if (doc && opts.onDeleteUser) {
197
206
  await opts.onDeleteUser(ctx, doc.userId as UserId);
198
207
  }
208
+ return doc;
199
209
  },
200
210
  }),
201
211
  updateUser: internalMutationGeneric({
202
212
  args: updateUserArgsValidator,
203
213
  handler: async (ctx, args) => {
204
214
  const updatedUser = await ctx.runMutation(
205
- this.component.lib.update,
206
- args
215
+ this.component.lib.updateOne,
216
+ { input: args.input }
207
217
  );
208
218
  // Type narrowing
209
219
  if (!("emailVerified" in updatedUser)) {
210
220
  throw new Error("invalid user");
211
221
  }
212
222
  if (opts.onUpdateUser) {
213
- await opts.onUpdateUser(ctx, omit(updatedUser, ["id"]));
223
+ await opts.onUpdateUser(ctx, omit(updatedUser, ["_id"]));
214
224
  }
215
225
  return updatedUser;
216
226
  },
@@ -218,14 +228,9 @@ export class BetterAuth<UserId extends string = string> {
218
228
  createSession: internalMutationGeneric({
219
229
  args: createSessionArgsValidator,
220
230
  handler: async (ctx, args) => {
221
- const session = await ctx.runMutation(
222
- this.component.lib.create,
223
- args
224
- );
225
- // Type narrowing
226
- if (!("ipAddress" in session)) {
227
- throw new Error("invalid session");
228
- }
231
+ const session = await ctx.runMutation(this.component.lib.create, {
232
+ input: args.input,
233
+ });
229
234
  await opts.onCreateSession?.(ctx, session);
230
235
  return session;
231
236
  },
@@ -253,15 +258,20 @@ export class BetterAuth<UserId extends string = string> {
253
258
  return response;
254
259
  });
255
260
 
256
- // Redirect root well-known to api well-known
257
- http.route({
258
- path: "/.well-known/openid-configuration",
259
- method: "GET",
260
- handler: httpActionGeneric(async () => {
261
- const url = `${requireEnv("CONVEX_SITE_URL")}/api/auth/convex/.well-known/openid-configuration`;
262
- return Response.redirect(url);
263
- }),
264
- });
261
+ const wellKnown = http.lookup("/.well-known/openid-configuration", "GET");
262
+
263
+ // If registerRoutes is used multiple times, this may already be defined
264
+ if (!wellKnown) {
265
+ // Redirect root well-known to api well-known
266
+ http.route({
267
+ path: "/.well-known/openid-configuration",
268
+ method: "GET",
269
+ handler: httpActionGeneric(async () => {
270
+ const url = `${requireEnv("CONVEX_SITE_URL")}/api/auth/convex/.well-known/openid-configuration`;
271
+ return Response.redirect(url);
272
+ }),
273
+ });
274
+ }
265
275
 
266
276
  if (!opts.cors) {
267
277
  http.route({
@@ -278,50 +288,20 @@ export class BetterAuth<UserId extends string = string> {
278
288
 
279
289
  return;
280
290
  }
281
-
282
- const trustedOrigins = [
283
- ...(Array.isArray(betterAuthOptions.trustedOrigins)
284
- ? betterAuthOptions.trustedOrigins
285
- : [betterAuthOptions.trustedOrigins]),
286
- betterAuthOptions.baseURL!,
287
- ];
288
- // The crossDomain plugin adds siteUrl to trustedOrigins
289
- const trustedOriginsFromPlugins =
290
- betterAuthOptions.plugins?.reduce((acc, plugin) => {
291
- if (plugin.options?.trustedOrigins) {
292
- acc.push(...plugin.options.trustedOrigins);
293
- }
294
- return acc;
295
- }, [] as string[]) ?? [];
296
-
297
- // Reuse trustedOrigins as default for allowedOrigins
298
- const allowedOrigins = async (request: Request) => {
299
- return (
300
- await Promise.all(
301
- [...trustedOrigins, ...trustedOriginsFromPlugins].map(
302
- async (origin) => {
303
- if (!origin) {
304
- return [];
305
- }
306
- if (typeof origin === "function") {
307
- return origin(request);
308
- }
309
- return [origin];
310
- }
311
- )
312
- )
313
- )
314
- .flat()
315
- .map((origin) =>
291
+ const cors = corsRouter(http, {
292
+ allowedOrigins: async (request) => {
293
+ const trustedOriginsOption =
294
+ (await createAuth({} as any).$context).options.trustedOrigins ?? [];
295
+ const trustedOrigins = Array.isArray(trustedOriginsOption)
296
+ ? trustedOriginsOption
297
+ : await trustedOriginsOption(request);
298
+ return trustedOrigins.map((origin) =>
316
299
  // Strip trailing wildcards, unsupported for allowedOrigins
317
300
  origin.endsWith("*") && origin.length > 1
318
301
  ? origin.slice(0, -1)
319
302
  : origin
320
303
  );
321
- };
322
-
323
- const cors = corsRouter(http, {
324
- allowedOrigins,
304
+ },
325
305
  allowCredentials: true,
326
306
  allowedHeaders: ["Content-Type", "Better-Auth-Cookie"],
327
307
  exposedHeaders: ["Set-Better-Auth-Cookie"],