@neutralauth/internal-auth 0.10.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 (147) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +39 -0
  3. package/dist/auth-config.d.ts +43 -0
  4. package/dist/auth-config.d.ts.map +1 -0
  5. package/dist/auth-config.js +43 -0
  6. package/dist/auth-config.js.map +1 -0
  7. package/dist/auth-options.d.ts +3 -0
  8. package/dist/auth-options.d.ts.map +1 -0
  9. package/dist/auth-options.js +40 -0
  10. package/dist/auth-options.js.map +1 -0
  11. package/dist/auth.d.ts +2 -0
  12. package/dist/auth.d.ts.map +1 -0
  13. package/dist/auth.js +4 -0
  14. package/dist/auth.js.map +1 -0
  15. package/dist/client/adapter-utils.d.ts +66 -0
  16. package/dist/client/adapter-utils.d.ts.map +1 -0
  17. package/dist/client/adapter-utils.js +437 -0
  18. package/dist/client/adapter-utils.js.map +1 -0
  19. package/dist/client/adapter.d.ts +14 -0
  20. package/dist/client/adapter.d.ts.map +1 -0
  21. package/dist/client/adapter.js +274 -0
  22. package/dist/client/adapter.js.map +1 -0
  23. package/dist/client/create-api.d.ts +141 -0
  24. package/dist/client/create-api.d.ts.map +1 -0
  25. package/dist/client/create-api.js +205 -0
  26. package/dist/client/create-api.js.map +1 -0
  27. package/dist/client/create-client.d.ts +183 -0
  28. package/dist/client/create-client.d.ts.map +1 -0
  29. package/dist/client/create-client.js +311 -0
  30. package/dist/client/create-client.js.map +1 -0
  31. package/dist/client/create-schema.d.ts +19 -0
  32. package/dist/client/create-schema.d.ts.map +1 -0
  33. package/dist/client/create-schema.js +114 -0
  34. package/dist/client/create-schema.js.map +1 -0
  35. package/dist/client/index.d.ts +7 -0
  36. package/dist/client/index.d.ts.map +1 -0
  37. package/dist/client/index.js +10 -0
  38. package/dist/client/index.js.map +1 -0
  39. package/dist/client/plugins/index.d.ts +3 -0
  40. package/dist/client/plugins/index.d.ts.map +1 -0
  41. package/dist/client/plugins/index.js +3 -0
  42. package/dist/client/plugins/index.js.map +1 -0
  43. package/dist/component/_generated/api.d.ts +36 -0
  44. package/dist/component/_generated/api.d.ts.map +1 -0
  45. package/dist/component/_generated/api.js +31 -0
  46. package/dist/component/_generated/api.js.map +1 -0
  47. package/dist/component/_generated/component.d.ts +787 -0
  48. package/dist/component/_generated/component.d.ts.map +1 -0
  49. package/dist/component/_generated/component.js +11 -0
  50. package/dist/component/_generated/component.js.map +1 -0
  51. package/dist/component/_generated/dataModel.d.ts +46 -0
  52. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  53. package/dist/component/_generated/dataModel.js +11 -0
  54. package/dist/component/_generated/dataModel.js.map +1 -0
  55. package/dist/component/_generated/server.d.ts +121 -0
  56. package/dist/component/_generated/server.d.ts.map +1 -0
  57. package/dist/component/_generated/server.js +78 -0
  58. package/dist/component/_generated/server.js.map +1 -0
  59. package/dist/component/adapter.d.ts +130 -0
  60. package/dist/component/adapter.d.ts.map +1 -0
  61. package/dist/component/adapter.js +5 -0
  62. package/dist/component/adapter.js.map +1 -0
  63. package/dist/component/adapterTest.d.ts +10 -0
  64. package/dist/component/adapterTest.d.ts.map +1 -0
  65. package/dist/component/adapterTest.js +409 -0
  66. package/dist/component/adapterTest.js.map +1 -0
  67. package/dist/component/convex.config.d.ts +3 -0
  68. package/dist/component/convex.config.d.ts.map +1 -0
  69. package/dist/component/convex.config.js +4 -0
  70. package/dist/component/convex.config.js.map +1 -0
  71. package/dist/component/schema.d.ts +474 -0
  72. package/dist/component/schema.d.ts.map +1 -0
  73. package/dist/component/schema.js +139 -0
  74. package/dist/component/schema.js.map +1 -0
  75. package/dist/nextjs/client.d.ts +4 -0
  76. package/dist/nextjs/client.d.ts.map +1 -0
  77. package/dist/nextjs/client.js +37 -0
  78. package/dist/nextjs/client.js.map +1 -0
  79. package/dist/nextjs/index.d.ts +22 -0
  80. package/dist/nextjs/index.d.ts.map +1 -0
  81. package/dist/nextjs/index.js +98 -0
  82. package/dist/nextjs/index.js.map +1 -0
  83. package/dist/plugins/convex/client.d.ts +6 -0
  84. package/dist/plugins/convex/client.d.ts.map +1 -0
  85. package/dist/plugins/convex/client.js +7 -0
  86. package/dist/plugins/convex/client.js.map +1 -0
  87. package/dist/plugins/convex/index.d.ts +322 -0
  88. package/dist/plugins/convex/index.d.ts.map +1 -0
  89. package/dist/plugins/convex/index.js +422 -0
  90. package/dist/plugins/convex/index.js.map +1 -0
  91. package/dist/plugins/cross-domain/client.d.ts +132 -0
  92. package/dist/plugins/cross-domain/client.d.ts.map +1 -0
  93. package/dist/plugins/cross-domain/client.js +192 -0
  94. package/dist/plugins/cross-domain/client.js.map +1 -0
  95. package/dist/plugins/cross-domain/index.d.ts +51 -0
  96. package/dist/plugins/cross-domain/index.d.ts.map +1 -0
  97. package/dist/plugins/cross-domain/index.js +173 -0
  98. package/dist/plugins/cross-domain/index.js.map +1 -0
  99. package/dist/plugins/index.d.ts +3 -0
  100. package/dist/plugins/index.d.ts.map +1 -0
  101. package/dist/plugins/index.js +3 -0
  102. package/dist/plugins/index.js.map +1 -0
  103. package/dist/react/index.d.ts +80 -0
  104. package/dist/react/index.d.ts.map +1 -0
  105. package/dist/react/index.js +190 -0
  106. package/dist/react/index.js.map +1 -0
  107. package/dist/react-start/index.d.ts +13 -0
  108. package/dist/react-start/index.d.ts.map +1 -0
  109. package/dist/react-start/index.js +101 -0
  110. package/dist/react-start/index.js.map +1 -0
  111. package/dist/utils/index.d.ts +33 -0
  112. package/dist/utils/index.d.ts.map +1 -0
  113. package/dist/utils/index.js +91 -0
  114. package/dist/utils/index.js.map +1 -0
  115. package/package.json +208 -0
  116. package/src/auth-config.ts +80 -0
  117. package/src/auth-options.ts +54 -0
  118. package/src/auth.ts +4 -0
  119. package/src/client/adapter-utils.ts +639 -0
  120. package/src/client/adapter.test.ts +83 -0
  121. package/src/client/adapter.ts +363 -0
  122. package/src/client/create-api.ts +339 -0
  123. package/src/client/create-client.ts +452 -0
  124. package/src/client/create-schema.ts +166 -0
  125. package/src/client/index.ts +22 -0
  126. package/src/client/plugins/index.ts +2 -0
  127. package/src/component/_generated/api.ts +52 -0
  128. package/src/component/_generated/component.ts +2008 -0
  129. package/src/component/_generated/dataModel.ts +60 -0
  130. package/src/component/_generated/server.ts +161 -0
  131. package/src/component/adapter.ts +13 -0
  132. package/src/component/adapterTest.ts +505 -0
  133. package/src/component/convex.config.ts +5 -0
  134. package/src/component/schema.ts +142 -0
  135. package/src/nextjs/client.tsx +54 -0
  136. package/src/nextjs/index.ts +152 -0
  137. package/src/plugins/convex/client.ts +9 -0
  138. package/src/plugins/convex/index.ts +596 -0
  139. package/src/plugins/cross-domain/client.test.ts +217 -0
  140. package/src/plugins/cross-domain/client.ts +234 -0
  141. package/src/plugins/cross-domain/index.ts +199 -0
  142. package/src/plugins/index.ts +2 -0
  143. package/src/react/index.tsx +304 -0
  144. package/src/react-start/index.ts +153 -0
  145. package/src/react-start/vite-env.d.ts +2 -0
  146. package/src/test.ts +18 -0
  147. package/src/utils/index.ts +171 -0
@@ -0,0 +1,339 @@
1
+ import {
2
+ mutationGeneric,
3
+ paginationOptsValidator,
4
+ queryGeneric,
5
+ } from "convex/server";
6
+ import type { FunctionHandle, SchemaDefinition } from "convex/server";
7
+ import { v } from "convex/values";
8
+ import type { GenericId } from "convex/values";
9
+ import { asyncMap } from "convex-helpers";
10
+ import { partial } from "convex-helpers/validators";
11
+ import {
12
+ adapterWhereValidator,
13
+ checkUniqueFields,
14
+ hasUniqueFields,
15
+ listOne,
16
+ paginate,
17
+ selectFields,
18
+ } from "./adapter-utils.js";
19
+ import { getAuthTables } from "better-auth/db";
20
+ import type { TableNames } from "../component/_generated/dataModel.js";
21
+ import type { BetterAuthOptions } from "better-auth/minimal";
22
+
23
+ const whereValidator = (
24
+ schema: SchemaDefinition<any, any>,
25
+ tableName: TableNames
26
+ ) =>
27
+ v.object({
28
+ field: v.union(
29
+ ...Object.keys(schema.tables[tableName].validator.fields).map((field) =>
30
+ v.literal(field)
31
+ ),
32
+ v.literal("_id")
33
+ ),
34
+ operator: v.optional(
35
+ v.union(
36
+ v.literal("lt"),
37
+ v.literal("lte"),
38
+ v.literal("gt"),
39
+ v.literal("gte"),
40
+ v.literal("eq"),
41
+ v.literal("in"),
42
+ v.literal("not_in"),
43
+ v.literal("ne"),
44
+ v.literal("contains"),
45
+ v.literal("starts_with"),
46
+ v.literal("ends_with")
47
+ )
48
+ ),
49
+ value: v.union(
50
+ v.string(),
51
+ v.number(),
52
+ v.boolean(),
53
+ v.array(v.string()),
54
+ v.array(v.number()),
55
+ v.null()
56
+ ),
57
+ connector: v.optional(v.union(v.literal("AND"), v.literal("OR"))),
58
+ });
59
+
60
+ export const createApi = <Schema extends SchemaDefinition<any, any>>(
61
+ schema: Schema,
62
+ createAuthOptions: (ctx: any) => BetterAuthOptions
63
+ ) => {
64
+ const betterAuthSchema = getAuthTables(createAuthOptions({} as any));
65
+ return {
66
+ create: mutationGeneric({
67
+ args: {
68
+ input: v.union(
69
+ ...Object.entries(schema.tables).map(([model, table]) =>
70
+ v.object({
71
+ model: v.literal(model),
72
+ data: v.object((table as any).validator.fields),
73
+ })
74
+ )
75
+ ),
76
+ select: v.optional(v.array(v.string())),
77
+ onCreateHandle: v.optional(v.string()),
78
+ },
79
+ handler: async (ctx, args) => {
80
+ await checkUniqueFields(
81
+ ctx,
82
+ schema,
83
+ betterAuthSchema,
84
+ args.input.model,
85
+ args.input.data
86
+ );
87
+ const id = await ctx.db.insert(
88
+ args.input.model as any,
89
+ args.input.data
90
+ );
91
+ const doc = await ctx.db.get(id);
92
+ if (!doc) {
93
+ throw new Error(`Failed to create ${args.input.model}`);
94
+ }
95
+ const result = selectFields(doc, args.select);
96
+ if (args.onCreateHandle) {
97
+ await ctx.runMutation(
98
+ args.onCreateHandle as FunctionHandle<"mutation">,
99
+ {
100
+ model: args.input.model,
101
+ doc,
102
+ }
103
+ );
104
+ }
105
+ return result;
106
+ },
107
+ }),
108
+ findOne: queryGeneric({
109
+ args: {
110
+ model: v.union(
111
+ ...Object.keys(schema.tables).map((model) => v.literal(model))
112
+ ),
113
+ where: v.optional(v.array(adapterWhereValidator)),
114
+ select: v.optional(v.array(v.string())),
115
+ join: v.optional(v.any()),
116
+ },
117
+ handler: async (ctx, args) => {
118
+ return await listOne(ctx, schema, betterAuthSchema, args);
119
+ },
120
+ }),
121
+ findMany: queryGeneric({
122
+ args: {
123
+ model: v.union(
124
+ ...Object.keys(schema.tables).map((model) => v.literal(model))
125
+ ),
126
+ where: v.optional(v.array(adapterWhereValidator)),
127
+ limit: v.optional(v.number()),
128
+ sortBy: v.optional(
129
+ v.object({
130
+ direction: v.union(v.literal("asc"), v.literal("desc")),
131
+ field: v.string(),
132
+ })
133
+ ),
134
+ offset: v.optional(v.number()),
135
+ join: v.optional(v.any()),
136
+ paginationOpts: paginationOptsValidator,
137
+ },
138
+ handler: async (ctx, args) => {
139
+ return await paginate(ctx, schema, betterAuthSchema, args);
140
+ },
141
+ }),
142
+ updateOne: mutationGeneric({
143
+ args: {
144
+ input: v.union(
145
+ ...Object.entries(schema.tables).map(
146
+ ([name, table]: [string, Schema["tables"][string]]) => {
147
+ const tableName = name as TableNames;
148
+ const fields = partial(table.validator.fields);
149
+ return v.object({
150
+ model: v.literal(tableName),
151
+ update: v.object(fields),
152
+ where: v.optional(v.array(whereValidator(schema, tableName))),
153
+ });
154
+ }
155
+ )
156
+ ),
157
+ onUpdateHandle: v.optional(v.string()),
158
+ },
159
+ handler: async (ctx, args) => {
160
+ const doc = await listOne(ctx, schema, betterAuthSchema, args.input);
161
+ if (!doc) {
162
+ throw new Error(`Failed to update ${args.input.model}`);
163
+ }
164
+ await checkUniqueFields(
165
+ ctx,
166
+ schema,
167
+ betterAuthSchema,
168
+ args.input.model,
169
+ args.input.update,
170
+ doc
171
+ );
172
+ await ctx.db.patch(
173
+ doc._id as GenericId<string>,
174
+ args.input.update as any
175
+ );
176
+ const updatedDoc = await ctx.db.get(doc._id as GenericId<string>);
177
+ if (!updatedDoc) {
178
+ throw new Error(`Failed to update ${args.input.model}`);
179
+ }
180
+ if (args.onUpdateHandle) {
181
+ await ctx.runMutation(
182
+ args.onUpdateHandle as FunctionHandle<"mutation">,
183
+ {
184
+ model: args.input.model,
185
+ newDoc: updatedDoc,
186
+ oldDoc: doc,
187
+ }
188
+ );
189
+ }
190
+ return updatedDoc;
191
+ },
192
+ }),
193
+ updateMany: mutationGeneric({
194
+ args: {
195
+ input: v.union(
196
+ ...Object.entries(schema.tables).map(
197
+ ([name, table]: [string, Schema["tables"][string]]) => {
198
+ const tableName = name as TableNames;
199
+ const fields = partial(table.validator.fields);
200
+ return v.object({
201
+ model: v.literal(tableName),
202
+ update: v.object(fields),
203
+ where: v.optional(v.array(whereValidator(schema, tableName))),
204
+ });
205
+ }
206
+ )
207
+ ),
208
+ paginationOpts: paginationOptsValidator,
209
+ onUpdateHandle: v.optional(v.string()),
210
+ },
211
+ handler: async (ctx, args) => {
212
+ const { page, ...result } = await paginate(
213
+ ctx,
214
+ schema,
215
+ betterAuthSchema,
216
+ {
217
+ ...args.input,
218
+ paginationOpts: args.paginationOpts,
219
+ }
220
+ );
221
+ if (args.input.update) {
222
+ if (
223
+ hasUniqueFields(
224
+ betterAuthSchema,
225
+ args.input.model,
226
+ args.input.update ?? {}
227
+ ) &&
228
+ page.length > 1
229
+ ) {
230
+ throw new Error(
231
+ `Attempted to set unique fields in multiple documents in ${args.input.model} with the same value. Fields: ${Object.keys(args.input.update ?? {}).join(", ")}`
232
+ );
233
+ }
234
+ await asyncMap(page, async (doc) => {
235
+ await checkUniqueFields(
236
+ ctx,
237
+ schema,
238
+ betterAuthSchema,
239
+ args.input.model,
240
+ args.input.update ?? {},
241
+ doc
242
+ );
243
+ await ctx.db.patch(
244
+ doc._id as GenericId<string>,
245
+ args.input.update as any
246
+ );
247
+
248
+ if (args.onUpdateHandle) {
249
+ await ctx.runMutation(
250
+ args.onUpdateHandle as FunctionHandle<"mutation">,
251
+ {
252
+ model: args.input.model,
253
+ newDoc: await ctx.db.get(doc._id as GenericId<string>),
254
+ oldDoc: doc,
255
+ }
256
+ );
257
+ }
258
+ });
259
+ }
260
+ return {
261
+ ...result,
262
+ count: page.length,
263
+ ids: page.map((doc) => doc._id),
264
+ };
265
+ },
266
+ }),
267
+ deleteOne: mutationGeneric({
268
+ args: {
269
+ input: v.union(
270
+ ...Object.keys(schema.tables).map((name: string) => {
271
+ const tableName = name as TableNames;
272
+ return v.object({
273
+ model: v.literal(tableName),
274
+ where: v.optional(v.array(whereValidator(schema, tableName))),
275
+ });
276
+ })
277
+ ),
278
+ onDeleteHandle: v.optional(v.string()),
279
+ },
280
+ handler: async (ctx, args) => {
281
+ const doc = await listOne(ctx, schema, betterAuthSchema, args.input);
282
+ if (!doc) {
283
+ return;
284
+ }
285
+ await ctx.db.delete(doc._id as GenericId<string>);
286
+ if (args.onDeleteHandle) {
287
+ await ctx.runMutation(
288
+ args.onDeleteHandle as FunctionHandle<"mutation">,
289
+ { model: args.input.model, doc }
290
+ );
291
+ }
292
+ return doc;
293
+ },
294
+ }),
295
+ deleteMany: mutationGeneric({
296
+ args: {
297
+ input: v.union(
298
+ ...Object.keys(schema.tables).map((name: string) => {
299
+ const tableName = name as TableNames;
300
+ return v.object({
301
+ model: v.literal(tableName),
302
+ where: v.optional(v.array(whereValidator(schema, tableName))),
303
+ });
304
+ })
305
+ ),
306
+ paginationOpts: paginationOptsValidator,
307
+ onDeleteHandle: v.optional(v.string()),
308
+ },
309
+ handler: async (ctx, args) => {
310
+ const { page, ...result } = await paginate(
311
+ ctx,
312
+ schema,
313
+ betterAuthSchema,
314
+ {
315
+ ...args.input,
316
+ paginationOpts: args.paginationOpts,
317
+ }
318
+ );
319
+ await asyncMap(page, async (doc) => {
320
+ if (args.onDeleteHandle) {
321
+ await ctx.runMutation(
322
+ args.onDeleteHandle as FunctionHandle<"mutation">,
323
+ {
324
+ model: args.input.model,
325
+ doc,
326
+ }
327
+ );
328
+ }
329
+ await ctx.db.delete(doc._id as GenericId<string>);
330
+ });
331
+ return {
332
+ ...result,
333
+ count: page.length,
334
+ ids: page.map((doc) => doc._id),
335
+ };
336
+ },
337
+ }),
338
+ };
339
+ };