@convex-dev/better-auth 0.7.0-alpha.1 → 0.7.0-alpha.11

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 (116) 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 +183 -192
  4. package/dist/commonjs/client/adapter.js.map +1 -1
  5. package/dist/commonjs/client/index.d.ts +238 -179
  6. package/dist/commonjs/client/index.d.ts.map +1 -1
  7. package/dist/commonjs/client/index.js +63 -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 +218 -548
  14. package/dist/commonjs/component/lib.d.ts.map +1 -1
  15. package/dist/commonjs/component/lib.js +315 -286
  16. package/dist/commonjs/component/lib.js.map +1 -1
  17. package/dist/commonjs/component/schema.d.ts +90 -28
  18. package/dist/commonjs/component/schema.d.ts.map +1 -1
  19. package/dist/commonjs/component/schema.js +76 -18
  20. package/dist/commonjs/component/schema.js.map +1 -1
  21. package/dist/commonjs/component/util.d.ts +148 -86
  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 +12 -0
  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 +10 -4
  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 +37 -3
  40. package/dist/commonjs/react-start/index.d.ts.map +1 -1
  41. package/dist/commonjs/react-start/index.js +20 -4
  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 +183 -192
  50. package/dist/esm/client/adapter.js.map +1 -1
  51. package/dist/esm/client/index.d.ts +238 -179
  52. package/dist/esm/client/index.d.ts.map +1 -1
  53. package/dist/esm/client/index.js +63 -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 +218 -548
  60. package/dist/esm/component/lib.d.ts.map +1 -1
  61. package/dist/esm/component/lib.js +315 -286
  62. package/dist/esm/component/lib.js.map +1 -1
  63. package/dist/esm/component/schema.d.ts +90 -28
  64. package/dist/esm/component/schema.d.ts.map +1 -1
  65. package/dist/esm/component/schema.js +76 -18
  66. package/dist/esm/component/schema.js.map +1 -1
  67. package/dist/esm/component/util.d.ts +148 -86
  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 +12 -0
  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 +10 -4
  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 +37 -3
  86. package/dist/esm/react-start/index.d.ts.map +1 -1
  87. package/dist/esm/react-start/index.js +20 -4
  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 +20 -5
  94. package/src/client/adapter.test.ts +144 -0
  95. package/src/client/adapter.ts +191 -195
  96. package/src/client/index.ts +64 -80
  97. package/src/component/_generated/api.d.ts +605 -149
  98. package/src/component/adapterTest.ts +141 -0
  99. package/src/component/lib.ts +444 -335
  100. package/src/component/schema.ts +81 -19
  101. package/src/nextjs/index.ts +17 -0
  102. package/src/plugins/convex/index.ts +12 -4
  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 +33 -6
  106. package/src/react-start/vite-env.d.ts +2 -0
  107. package/dist/commonjs/react-router/index.d.ts +0 -10
  108. package/dist/commonjs/react-router/index.d.ts.map +0 -1
  109. package/dist/commonjs/react-router/index.js +0 -24
  110. package/dist/commonjs/react-router/index.js.map +0 -1
  111. package/dist/esm/react-router/index.d.ts +0 -10
  112. package/dist/esm/react-router/index.d.ts.map +0 -1
  113. package/dist/esm/react-router/index.js +0 -24
  114. package/dist/esm/react-router/index.js.map +0 -1
  115. package/src/client/cors.ts +0 -425
  116. /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
  },
@@ -241,6 +246,10 @@ export class BetterAuth<UserId extends string = string> {
241
246
  const betterAuthOptions = createAuth({} as any).options;
242
247
  const path = betterAuthOptions.basePath ?? "/api/auth";
243
248
  const authRequestHandler = httpActionGeneric(async (ctx, request) => {
249
+ if (this.config.verbose) {
250
+ console.log("options.baseURL", betterAuthOptions.baseURL);
251
+ console.log("request headers", request.headers);
252
+ }
244
253
  const auth = createAuth(ctx);
245
254
  const response = await auth.handler(request);
246
255
  if (this.config?.verbose) {
@@ -249,15 +258,20 @@ export class BetterAuth<UserId extends string = string> {
249
258
  return response;
250
259
  });
251
260
 
252
- // Redirect root well-known to api well-known
253
- http.route({
254
- path: "/.well-known/openid-configuration",
255
- method: "GET",
256
- handler: httpActionGeneric(async () => {
257
- const url = `${requireEnv("CONVEX_SITE_URL")}/api/auth/convex/.well-known/openid-configuration`;
258
- return Response.redirect(url);
259
- }),
260
- });
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
+ }
261
275
 
262
276
  if (!opts.cors) {
263
277
  http.route({
@@ -274,50 +288,20 @@ export class BetterAuth<UserId extends string = string> {
274
288
 
275
289
  return;
276
290
  }
277
-
278
- const trustedOrigins = [
279
- ...(Array.isArray(betterAuthOptions.trustedOrigins)
280
- ? betterAuthOptions.trustedOrigins
281
- : [betterAuthOptions.trustedOrigins]),
282
- betterAuthOptions.baseURL!,
283
- ];
284
- // The crossDomain plugin adds siteUrl to trustedOrigins
285
- const trustedOriginsFromPlugins =
286
- betterAuthOptions.plugins?.reduce((acc, plugin) => {
287
- if (plugin.options?.trustedOrigins) {
288
- acc.push(...plugin.options.trustedOrigins);
289
- }
290
- return acc;
291
- }, [] as string[]) ?? [];
292
-
293
- // Reuse trustedOrigins as default for allowedOrigins
294
- const allowedOrigins = async (request: Request) => {
295
- return (
296
- await Promise.all(
297
- [...trustedOrigins, ...trustedOriginsFromPlugins].map(
298
- async (origin) => {
299
- if (!origin) {
300
- return [];
301
- }
302
- if (typeof origin === "function") {
303
- return origin(request);
304
- }
305
- return [origin];
306
- }
307
- )
308
- )
309
- )
310
- .flat()
311
- .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) =>
312
299
  // Strip trailing wildcards, unsupported for allowedOrigins
313
300
  origin.endsWith("*") && origin.length > 1
314
301
  ? origin.slice(0, -1)
315
302
  : origin
316
303
  );
317
- };
318
-
319
- const cors = corsRouter(http, {
320
- allowedOrigins,
304
+ },
321
305
  allowCredentials: true,
322
306
  allowedHeaders: ["Content-Type", "Better-Auth-Cookie"],
323
307
  exposedHeaders: ["Set-Better-Auth-Cookie"],