@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
@@ -0,0 +1,378 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ import { describe, expect, test } from "vitest";
4
+ import { runAdapterTest } from "better-auth/adapters/test";
5
+ import { convexTest } from "convex-test";
6
+ import { api } from "../component/_generated/api";
7
+ import schema from "../component/schema";
8
+ import { serialize } from "../component/adapterTest";
9
+ import { Adapter } from "better-auth";
10
+
11
+ export const getAdapter = (t: ReturnType<typeof convexTest>) => async () => {
12
+ return {
13
+ id: "convex",
14
+ create: async (data) => {
15
+ const result = await t.mutation(api.adapterTest.create, {
16
+ ...data,
17
+ data: serialize(data.data),
18
+ });
19
+ return result;
20
+ },
21
+ findOne: async (data) => {
22
+ return t.query(api.adapterTest.findOne, data);
23
+ },
24
+ findMany: async (data) => {
25
+ return t.query(api.adapterTest.findMany, data);
26
+ },
27
+ count: async (data) => {
28
+ return t.query(api.adapterTest.count, data);
29
+ },
30
+ update: async (data) => {
31
+ return t.mutation(api.adapterTest.update, {
32
+ ...data,
33
+ update: serialize(data.update),
34
+ });
35
+ },
36
+ updateMany: async (data) => {
37
+ return t.mutation(api.adapterTest.updateMany, data);
38
+ },
39
+ delete: async (data) => {
40
+ await t.mutation(api.adapterTest.delete, data);
41
+ },
42
+ deleteMany: async (data) => {
43
+ return t.mutation(api.adapterTest.deleteMany, data);
44
+ },
45
+ } satisfies Adapter;
46
+ };
47
+
48
+ describe("convex adapter", async () => {
49
+ const _t = convexTest(schema, import.meta.glob("../component/**/*.*s"));
50
+ await runAdapterTest({
51
+ getAdapter: getAdapter(_t),
52
+ disableTests: {
53
+ CREATE_MODEL: false,
54
+ CREATE_MODEL_SHOULD_ALWAYS_RETURN_AN_ID: false,
55
+ FIND_MODEL: false,
56
+ FIND_MODEL_WITHOUT_ID: false,
57
+ FIND_MODEL_WITH_SELECT: false,
58
+ FIND_MODEL_WITH_MODIFIED_FIELD_NAME: false,
59
+ UPDATE_MODEL: false,
60
+ SHOULD_FIND_MANY: false,
61
+ SHOULD_FIND_MANY_WITH_WHERE: false,
62
+ SHOULD_FIND_MANY_WITH_OPERATORS: false,
63
+ SHOULD_WORK_WITH_REFERENCE_FIELDS: false,
64
+ SHOULD_FIND_MANY_WITH_SORT_BY: false,
65
+ SHOULD_FIND_MANY_WITH_LIMIT: false,
66
+ SHOULD_FIND_MANY_WITH_OFFSET: true, // disabled for now
67
+ SHOULD_UPDATE_WITH_MULTIPLE_WHERE: false,
68
+ DELETE_MODEL: false,
69
+ SHOULD_DELETE_MANY: false,
70
+ SHOULD_NOT_THROW_ON_DELETE_RECORD_NOT_FOUND: false,
71
+ SHOULD_NOT_THROW_ON_RECORD_NOT_FOUND: false,
72
+ SHOULD_FIND_MANY_WITH_CONTAINS_OPERATOR: false,
73
+ SHOULD_SEARCH_USERS_WITH_STARTS_WITH: false,
74
+ SHOULD_SEARCH_USERS_WITH_ENDS_WITH: false,
75
+ SHOULD_PREFER_GENERATE_ID_IF_PROVIDED: true,
76
+ },
77
+ });
78
+
79
+ test("should handle lone range operators", async () => {
80
+ const t = convexTest(schema, import.meta.glob("../component/**/*.*s"));
81
+ const adapter = await getAdapter(t)();
82
+ const user = await adapter.create({
83
+ model: "user",
84
+ data: {
85
+ name: "ab",
86
+ email: "a@a.com",
87
+ },
88
+ });
89
+ expect(
90
+ await adapter.findMany({
91
+ model: "user",
92
+ where: [
93
+ {
94
+ field: "name",
95
+ operator: "lt",
96
+ value: "a",
97
+ },
98
+ ],
99
+ })
100
+ ).toEqual([]);
101
+ expect(
102
+ await adapter.findMany({
103
+ model: "user",
104
+ where: [
105
+ {
106
+ field: "name",
107
+ operator: "lte",
108
+ value: "a",
109
+ },
110
+ ],
111
+ })
112
+ ).toEqual([]);
113
+ expect(
114
+ await adapter.findMany({
115
+ model: "user",
116
+ where: [
117
+ {
118
+ field: "name",
119
+ operator: "gt",
120
+ value: "a",
121
+ },
122
+ ],
123
+ })
124
+ ).toEqual([user]);
125
+ expect(
126
+ await adapter.findMany({
127
+ model: "user",
128
+ where: [
129
+ {
130
+ field: "name",
131
+ operator: "gte",
132
+ value: "ab",
133
+ },
134
+ ],
135
+ })
136
+ ).toEqual([user]);
137
+ });
138
+
139
+ test("should handle compound indexes that include id field", async () => {
140
+ const t = convexTest(schema, import.meta.glob("../component/**/*.*s"));
141
+ const adapter = await getAdapter(t)();
142
+ const user = await adapter.create({
143
+ model: "user",
144
+ data: {
145
+ name: "foo",
146
+ email: "foo@bar.com",
147
+ },
148
+ });
149
+ expect(
150
+ await adapter.findOne({
151
+ model: "user",
152
+ where: [
153
+ {
154
+ field: "id",
155
+ value: user.id,
156
+ },
157
+ {
158
+ field: "name",
159
+ value: "wrong name",
160
+ },
161
+ ],
162
+ })
163
+ ).toEqual(null);
164
+ expect(
165
+ await adapter.findOne({
166
+ model: "user",
167
+ where: [
168
+ {
169
+ field: "id",
170
+ value: user.id,
171
+ },
172
+ {
173
+ field: "name",
174
+ value: "foo",
175
+ },
176
+ ],
177
+ })
178
+ ).toEqual(user);
179
+ expect(
180
+ await adapter.findOne({
181
+ model: "user",
182
+ where: [
183
+ {
184
+ field: "id",
185
+ value: user.id,
186
+ },
187
+ {
188
+ field: "name",
189
+ value: "foo",
190
+ operator: "lt",
191
+ },
192
+ ],
193
+ })
194
+ ).toEqual(null);
195
+ expect(
196
+ await adapter.findOne({
197
+ model: "user",
198
+ where: [
199
+ {
200
+ field: "id",
201
+ value: user.id,
202
+ },
203
+ {
204
+ field: "name",
205
+ value: "foo",
206
+ operator: "lte",
207
+ },
208
+ ],
209
+ })
210
+ ).toEqual(user);
211
+ expect(
212
+ await adapter.findOne({
213
+ model: "user",
214
+ where: [
215
+ {
216
+ field: "id",
217
+ value: user.id,
218
+ },
219
+ {
220
+ field: "name",
221
+ value: "foo",
222
+ operator: "gt",
223
+ },
224
+ ],
225
+ })
226
+ ).toEqual(null);
227
+ expect(
228
+ await adapter.findOne({
229
+ model: "user",
230
+ where: [
231
+ {
232
+ field: "id",
233
+ value: user.id,
234
+ },
235
+ {
236
+ field: "name",
237
+ value: "foo",
238
+ operator: "gte",
239
+ },
240
+ ],
241
+ })
242
+ ).toEqual(user);
243
+ expect(
244
+ await adapter.findOne({
245
+ model: "user",
246
+ where: [
247
+ {
248
+ field: "id",
249
+ value: user.id,
250
+ },
251
+ {
252
+ field: "name",
253
+ operator: "in",
254
+ value: ["wrong", "name"],
255
+ },
256
+ ],
257
+ })
258
+ ).toEqual(null);
259
+ expect(
260
+ await adapter.findOne({
261
+ model: "user",
262
+ where: [
263
+ {
264
+ field: "id",
265
+ value: user.id,
266
+ },
267
+ {
268
+ field: "name",
269
+ operator: "in",
270
+ value: ["foo"],
271
+ },
272
+ ],
273
+ })
274
+ ).toEqual(user);
275
+ });
276
+ test("should automatically paginate", async () => {
277
+ const t = convexTest(schema, import.meta.glob("../component/**/*.*s"));
278
+ const adapter = await getAdapter(t)();
279
+ for (let i = 0; i < 300; i++) {
280
+ await adapter.create({
281
+ model: "user",
282
+ data: {
283
+ name: `foo${i}`,
284
+ email: `foo${i}@bar.com`,
285
+ },
286
+ });
287
+ }
288
+ // Better Auth defaults to a limit of 100
289
+ expect(
290
+ await adapter.findMany({
291
+ model: "user",
292
+ })
293
+ ).toHaveLength(100);
294
+
295
+ // Pagination has a hardcoded numItems max of 200, this tests that it can handle
296
+ // specified limits beyond that
297
+ expect(
298
+ await adapter.findMany({
299
+ model: "user",
300
+ limit: 250,
301
+ })
302
+ ).toHaveLength(250);
303
+ expect(
304
+ await adapter.findMany({
305
+ model: "user",
306
+ limit: 350,
307
+ })
308
+ ).toHaveLength(300);
309
+ });
310
+ test("should handle OR where clauses", async () => {
311
+ const t = convexTest(schema, import.meta.glob("../component/**/*.*s"));
312
+ const adapter = await getAdapter(t)();
313
+ const user = await adapter.create({
314
+ model: "user",
315
+ data: {
316
+ name: "foo",
317
+ email: "foo@bar.com",
318
+ },
319
+ });
320
+ expect(
321
+ await adapter.findOne({
322
+ model: "user",
323
+ where: [
324
+ { field: "name", value: "bar", connector: "OR" },
325
+ { field: "name", value: "foo", connector: "OR" },
326
+ ],
327
+ })
328
+ ).toEqual(user);
329
+ });
330
+ test("should handle count", async () => {
331
+ const t = convexTest(schema, import.meta.glob("../component/**/*.*s"));
332
+ const adapter = await getAdapter(t)();
333
+ await adapter.create({
334
+ model: "user",
335
+ data: {
336
+ name: "foo",
337
+ email: "foo@bar.com",
338
+ },
339
+ });
340
+ await adapter.create({
341
+ model: "user",
342
+ data: {
343
+ name: "bar",
344
+ email: "bar@bar.com",
345
+ },
346
+ });
347
+ expect(
348
+ await adapter.count({
349
+ model: "user",
350
+ where: [{ field: "name", value: "foo" }],
351
+ })
352
+ ).toEqual(1);
353
+ });
354
+ test("should handle queries with no index", async () => {
355
+ const t = convexTest(schema, import.meta.glob("../component/**/*.*s"));
356
+ const adapter = await getAdapter(t)();
357
+ const user = await adapter.create({
358
+ model: "user",
359
+ data: {
360
+ name: "foo",
361
+ email: "foo@bar.com",
362
+ emailVerified: true,
363
+ },
364
+ });
365
+ expect(
366
+ await adapter.findOne({
367
+ model: "user",
368
+ where: [{ field: "emailVerified", value: true }],
369
+ })
370
+ ).toEqual(user);
371
+ expect(
372
+ await adapter.findOne({
373
+ model: "user",
374
+ where: [{ field: "emailVerified", value: false }],
375
+ })
376
+ ).toEqual(null);
377
+ });
378
+ });