@estifanos-sh/convex-auth 0.0.2 → 0.0.3

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 (298) hide show
  1. package/README.md +5 -5
  2. package/dist/_generated/component.d.ts +130 -61
  3. package/dist/_generated/component.d.ts.map +1 -1
  4. package/dist/_generated/dataModel.d.ts +28 -0
  5. package/dist/_generated/dataModel.d.ts.map +1 -0
  6. package/dist/bin.js +1 -2
  7. package/dist/browser/index.d.ts +2 -2
  8. package/dist/browser/index.d.ts.map +1 -1
  9. package/dist/browser/index.js.map +1 -1
  10. package/dist/client/core/types.d.ts +40 -79
  11. package/dist/client/core/types.d.ts.map +1 -1
  12. package/dist/client/core/types.js.map +1 -1
  13. package/dist/client/errors.d.ts +15 -0
  14. package/dist/client/errors.d.ts.map +1 -0
  15. package/dist/client/errors.js +8 -1
  16. package/dist/client/errors.js.map +1 -1
  17. package/dist/client/index.d.ts +6 -3
  18. package/dist/client/index.d.ts.map +1 -1
  19. package/dist/client/index.js +3 -2
  20. package/dist/client/index.js.map +1 -1
  21. package/dist/component/_generated/component.d.ts +130 -61
  22. package/dist/component/_generated/component.d.ts.map +1 -1
  23. package/dist/component/_generated/dataModel.d.ts +1 -1
  24. package/dist/component/_generated/server.d.ts +1 -1
  25. package/dist/component/account.d.ts +43 -37
  26. package/dist/component/account.d.ts.map +1 -1
  27. package/dist/component/account.js +14 -16
  28. package/dist/component/account.js.map +1 -1
  29. package/dist/component/connection/audit.d.ts +29 -29
  30. package/dist/component/connection/audit.d.ts.map +1 -1
  31. package/dist/component/connection/audit.js +2 -1
  32. package/dist/component/connection/audit.js.map +1 -1
  33. package/dist/component/connection/cache.d.ts +6 -6
  34. package/dist/component/connection/domain/verification.d.ts +19 -19
  35. package/dist/component/connection/domain.d.ts +20 -20
  36. package/dist/component/connection/saml/assertion.d.ts +4 -4
  37. package/dist/component/connection/saml/request.d.ts +9 -9
  38. package/dist/component/connection/saml/request.d.ts.map +1 -1
  39. package/dist/component/connection/scim/config.d.ts +13 -13
  40. package/dist/component/connection/scim/identity.d.ts +102 -59
  41. package/dist/component/connection/scim/identity.d.ts.map +1 -1
  42. package/dist/component/connection/scim/identity.js +357 -56
  43. package/dist/component/connection/scim/identity.js.map +1 -1
  44. package/dist/component/connection/secret.d.ts +15 -15
  45. package/dist/component/connection/secret.d.ts.map +1 -1
  46. package/dist/component/connection/webhook/delivery.d.ts +69 -53
  47. package/dist/component/connection/webhook/delivery.d.ts.map +1 -1
  48. package/dist/component/connection/webhook/delivery.js +127 -170
  49. package/dist/component/connection/webhook/delivery.js.map +1 -1
  50. package/dist/component/connection/webhook/endpoint.d.ts +21 -21
  51. package/dist/component/connection/webhook/events.d.ts +26 -0
  52. package/dist/component/connection/webhook/events.d.ts.map +1 -0
  53. package/dist/component/connection/webhook/events.js +39 -0
  54. package/dist/component/connection/webhook/events.js.map +1 -0
  55. package/dist/component/connection.d.ts +38 -38
  56. package/dist/component/connection.d.ts.map +1 -1
  57. package/dist/component/context.d.ts +115 -0
  58. package/dist/component/context.d.ts.map +1 -0
  59. package/dist/component/context.js +50 -0
  60. package/dist/component/context.js.map +1 -0
  61. package/dist/component/convex.config.d.ts +2 -2
  62. package/dist/component/crons.d.ts +2 -2
  63. package/dist/component/event.d.ts +134 -138
  64. package/dist/component/event.d.ts.map +1 -1
  65. package/dist/component/event.js +88 -117
  66. package/dist/component/event.js.map +1 -1
  67. package/dist/component/eventstream.d.ts +30 -0
  68. package/dist/component/eventstream.d.ts.map +1 -0
  69. package/dist/component/eventstream.js +51 -0
  70. package/dist/component/eventstream.js.map +1 -0
  71. package/dist/component/factor/device.d.ts +25 -24
  72. package/dist/component/factor/device.d.ts.map +1 -1
  73. package/dist/component/factor/device.js +5 -2
  74. package/dist/component/factor/device.js.map +1 -1
  75. package/dist/component/factor/passkey.d.ts +84 -75
  76. package/dist/component/factor/passkey.d.ts.map +1 -1
  77. package/dist/component/factor/passkey.js +6 -6
  78. package/dist/component/factor/passkey.js.map +1 -1
  79. package/dist/component/factor/totp.d.ts +54 -49
  80. package/dist/component/factor/totp.d.ts.map +1 -1
  81. package/dist/component/factor/totp.js +3 -3
  82. package/dist/component/factor/totp.js.map +1 -1
  83. package/dist/component/group/active.d.ts +326 -22
  84. package/dist/component/group/active.d.ts.map +1 -1
  85. package/dist/component/group/active.js +21 -11
  86. package/dist/component/group/active.js.map +1 -1
  87. package/dist/component/group/invite.d.ts +28 -28
  88. package/dist/component/group/invite.d.ts.map +1 -1
  89. package/dist/component/group/member.d.ts +34 -34
  90. package/dist/component/group.d.ts +47 -62
  91. package/dist/component/group.d.ts.map +1 -1
  92. package/dist/component/http.d.ts +2 -2
  93. package/dist/component/limits.d.ts +4 -4
  94. package/dist/component/maintenance.d.ts +2 -2
  95. package/dist/component/model.d.ts +1362 -1027
  96. package/dist/component/model.d.ts.map +1 -1
  97. package/dist/component/model.js +23 -6
  98. package/dist/component/model.js.map +1 -1
  99. package/dist/component/modules.d.ts +8 -2
  100. package/dist/component/modules.d.ts.map +1 -1
  101. package/dist/component/modules.js +3 -0
  102. package/dist/component/modules.js.map +1 -1
  103. package/dist/component/oauth/client.d.ts +20 -20
  104. package/dist/component/oauth/code.d.ts +14 -14
  105. package/dist/component/oauth/refresh.d.ts +19 -19
  106. package/dist/component/schema.d.ts +1100 -611
  107. package/dist/component/schema.d.ts.map +1 -1
  108. package/dist/component/schema.js +17 -4
  109. package/dist/component/schema.js.map +1 -1
  110. package/dist/component/session.d.ts +72 -32
  111. package/dist/component/session.d.ts.map +1 -1
  112. package/dist/component/session.js +120 -32
  113. package/dist/component/session.js.map +1 -1
  114. package/dist/component/token/continuation.d.ts +40 -18
  115. package/dist/component/token/continuation.d.ts.map +1 -1
  116. package/dist/component/token/continuation.js +57 -11
  117. package/dist/component/token/continuation.js.map +1 -1
  118. package/dist/component/token/pkce.d.ts +22 -22
  119. package/dist/component/token/pkce.d.ts.map +1 -1
  120. package/dist/component/token/refresh.d.ts +39 -35
  121. package/dist/component/token/refresh.d.ts.map +1 -1
  122. package/dist/component/token/refresh.js +11 -6
  123. package/dist/component/token/refresh.js.map +1 -1
  124. package/dist/component/token/verification.d.ts +36 -32
  125. package/dist/component/token/verification.d.ts.map +1 -1
  126. package/dist/component/token/verification.js +3 -3
  127. package/dist/component/token/verification.js.map +1 -1
  128. package/dist/component/user/email.d.ts +21 -21
  129. package/dist/component/user/key.d.ts +35 -35
  130. package/dist/component/user/key.d.ts.map +1 -1
  131. package/dist/component/user.d.ts +51 -45
  132. package/dist/component/user.d.ts.map +1 -1
  133. package/dist/core/index.d.ts +54 -90
  134. package/dist/core/index.d.ts.map +1 -1
  135. package/dist/core/index.js +1 -4
  136. package/dist/core/index.js.map +1 -1
  137. package/dist/expo/index.d.ts +3 -3
  138. package/dist/expo/index.d.ts.map +1 -1
  139. package/dist/expo/index.js.map +1 -1
  140. package/dist/model.js.map +1 -1
  141. package/dist/providers/anonymous.d.ts +11 -5
  142. package/dist/providers/anonymous.d.ts.map +1 -1
  143. package/dist/providers/anonymous.js +4 -1
  144. package/dist/providers/anonymous.js.map +1 -1
  145. package/dist/providers/apple.d.ts +1 -1
  146. package/dist/providers/credentials.d.ts +21 -13
  147. package/dist/providers/credentials.d.ts.map +1 -1
  148. package/dist/providers/credentials.js +2 -0
  149. package/dist/providers/credentials.js.map +1 -1
  150. package/dist/providers/custom.d.ts +3 -3
  151. package/dist/providers/custom.d.ts.map +1 -1
  152. package/dist/providers/custom.js.map +1 -1
  153. package/dist/providers/email.d.ts +3 -3
  154. package/dist/providers/email.d.ts.map +1 -1
  155. package/dist/providers/email.js.map +1 -1
  156. package/dist/providers/github.d.ts +1 -1
  157. package/dist/providers/google.d.ts +1 -1
  158. package/dist/providers/microsoft.d.ts +1 -1
  159. package/dist/providers/password.d.ts +103 -8
  160. package/dist/providers/password.d.ts.map +1 -1
  161. package/dist/providers/password.js +71 -26
  162. package/dist/providers/password.js.map +1 -1
  163. package/dist/providers/phone.d.ts +4 -3
  164. package/dist/providers/phone.d.ts.map +1 -1
  165. package/dist/providers/phone.js.map +1 -1
  166. package/dist/react/index.d.ts +40 -41
  167. package/dist/react/index.d.ts.map +1 -1
  168. package/dist/react/index.js +27 -52
  169. package/dist/react/index.js.map +1 -1
  170. package/dist/server/auth.d.ts +157 -117
  171. package/dist/server/auth.d.ts.map +1 -1
  172. package/dist/server/auth.js +41 -22
  173. package/dist/server/auth.js.map +1 -1
  174. package/dist/server/component/factor/db.js +4 -4
  175. package/dist/server/component/factor/db.js.map +1 -1
  176. package/dist/server/config.d.ts +2 -1
  177. package/dist/server/connection/domain.d.ts +4 -66
  178. package/dist/server/connection/domain.d.ts.map +1 -1
  179. package/dist/server/connection/domain.js +22 -4
  180. package/dist/server/connection/domain.js.map +1 -1
  181. package/dist/server/connection/group/service.js +6 -4
  182. package/dist/server/connection/group/service.js.map +1 -1
  183. package/dist/server/connection/http.js +94 -261
  184. package/dist/server/connection/http.js.map +1 -1
  185. package/dist/server/connection/oidc.js +8 -17
  186. package/dist/server/connection/oidc.js.map +1 -1
  187. package/dist/server/connection/policy/domain.js +4 -1
  188. package/dist/server/connection/policy/domain.js.map +1 -1
  189. package/dist/server/connection/policy.js +14 -13
  190. package/dist/server/connection/policy.js.map +1 -1
  191. package/dist/server/connection/provision.js +5 -19
  192. package/dist/server/connection/provision.js.map +1 -1
  193. package/dist/server/connection/webhook.js +4 -36
  194. package/dist/server/connection/webhook.js.map +1 -1
  195. package/dist/server/context.d.ts +2 -2
  196. package/dist/server/context.d.ts.map +1 -1
  197. package/dist/server/context.js +35 -24
  198. package/dist/server/context.js.map +1 -1
  199. package/dist/server/contract.d.ts.map +1 -1
  200. package/dist/server/contract.js +6 -14
  201. package/dist/server/contract.js.map +1 -1
  202. package/dist/server/core.js +6 -0
  203. package/dist/server/core.js.map +1 -1
  204. package/dist/server/cors.d.ts +2 -2
  205. package/dist/server/cors.d.ts.map +1 -1
  206. package/dist/server/crypto.js.map +1 -1
  207. package/dist/server/db.js +2 -1
  208. package/dist/server/db.js.map +1 -1
  209. package/dist/server/domains/context.js +34 -0
  210. package/dist/server/domains/context.js.map +1 -0
  211. package/dist/server/domains/factor.d.ts +3 -2
  212. package/dist/server/domains/factor.d.ts.map +1 -1
  213. package/dist/server/domains/factor.js.map +1 -1
  214. package/dist/server/domains/group.js.map +1 -1
  215. package/dist/server/domains/invite.js.map +1 -1
  216. package/dist/server/domains/key.js.map +1 -1
  217. package/dist/server/domains/member.js.map +1 -1
  218. package/dist/server/domains/session.js.map +1 -1
  219. package/dist/server/domains/user.js.map +1 -1
  220. package/dist/server/env.js +2 -22
  221. package/dist/server/env.js.map +1 -1
  222. package/dist/server/events.d.ts +0 -1
  223. package/dist/server/events.d.ts.map +1 -1
  224. package/dist/server/events.js +6 -6
  225. package/dist/server/events.js.map +1 -1
  226. package/dist/server/http.d.ts +1 -0
  227. package/dist/server/http.d.ts.map +1 -1
  228. package/dist/server/http.js +4 -4
  229. package/dist/server/http.js.map +1 -1
  230. package/dist/server/identity/claims.js +1 -1
  231. package/dist/server/identity/convex.d.ts +2 -0
  232. package/dist/server/identity/convex.d.ts.map +1 -1
  233. package/dist/server/index.d.ts +2 -3
  234. package/dist/server/index.js +1 -2
  235. package/dist/server/limits.js +21 -1
  236. package/dist/server/limits.js.map +1 -1
  237. package/dist/server/mutations/credentials/signin.js +6 -3
  238. package/dist/server/mutations/credentials/signin.js.map +1 -1
  239. package/dist/server/mutations/invalidate.js +5 -10
  240. package/dist/server/mutations/invalidate.js.map +1 -1
  241. package/dist/server/mutations/oauth.js +1 -1
  242. package/dist/server/mutations/oauth.js.map +1 -1
  243. package/dist/server/mutations/retrieve.js +4 -1
  244. package/dist/server/mutations/retrieve.js.map +1 -1
  245. package/dist/server/mutations/signin.js +2 -2
  246. package/dist/server/mutations/signin.js.map +1 -1
  247. package/dist/server/mutations/verify.js +4 -3
  248. package/dist/server/mutations/verify.js.map +1 -1
  249. package/dist/server/oauth/factory.js.map +1 -1
  250. package/dist/server/runtime.d.ts +107 -127
  251. package/dist/server/runtime.d.ts.map +1 -1
  252. package/dist/server/runtime.js +43 -28
  253. package/dist/server/runtime.js.map +1 -1
  254. package/dist/server/session/lifecycle.d.ts.map +1 -1
  255. package/dist/server/session/lifecycle.js +18 -3
  256. package/dist/server/session/lifecycle.js.map +1 -1
  257. package/dist/server/signin/flow.js +1 -1
  258. package/dist/server/signin/flow.js.map +1 -1
  259. package/dist/server/tokens.js +1 -0
  260. package/dist/server/tokens.js.map +1 -1
  261. package/dist/server/totp.js +3 -3
  262. package/dist/server/totp.js.map +1 -1
  263. package/dist/server/types.d.ts +63 -43
  264. package/dist/server/types.d.ts.map +1 -1
  265. package/dist/server/user/account.js +0 -1
  266. package/dist/server/user/account.js.map +1 -1
  267. package/dist/server/validators.d.ts +874 -917
  268. package/dist/server/validators.d.ts.map +1 -1
  269. package/dist/server/validators.js +33 -32
  270. package/dist/server/validators.js.map +1 -1
  271. package/dist/server/webauthn.js +4 -4
  272. package/dist/server/webauthn.js.map +1 -1
  273. package/dist/shared/brand.d.ts +3 -7
  274. package/dist/shared/brand.d.ts.map +1 -1
  275. package/dist/shared/params.d.ts +78 -0
  276. package/dist/shared/params.d.ts.map +1 -0
  277. package/dist/shared/results.d.ts +7 -1
  278. package/dist/shared/results.d.ts.map +1 -1
  279. package/dist/svelte/context.svelte.d.ts +23 -12
  280. package/dist/svelte/context.svelte.d.ts.map +1 -1
  281. package/dist/svelte/context.svelte.js +20 -13
  282. package/dist/svelte/index.d.ts +1 -4
  283. package/dist/svelte/index.d.ts.map +1 -1
  284. package/dist/svelte/index.js +1 -4
  285. package/dist/test.d.ts +1105 -611
  286. package/dist/test.d.ts.map +1 -1
  287. package/package.json +2 -1
  288. package/dist/server/env.d.ts +0 -28
  289. package/dist/server/env.d.ts.map +0 -1
  290. package/dist/svelte/AuthLoading.svelte +0 -13
  291. package/dist/svelte/AuthLoading.svelte.d.ts +0 -8
  292. package/dist/svelte/AuthLoading.svelte.d.ts.map +0 -1
  293. package/dist/svelte/SignedIn.svelte +0 -14
  294. package/dist/svelte/SignedIn.svelte.d.ts +0 -8
  295. package/dist/svelte/SignedIn.svelte.d.ts.map +0 -1
  296. package/dist/svelte/SignedOut.svelte +0 -13
  297. package/dist/svelte/SignedOut.svelte.d.ts +0 -8
  298. package/dist/svelte/SignedOut.svelte.d.ts.map +0 -1
@@ -1,67 +1,73 @@
1
1
  import { SessionRows } from "./session.js";
2
- import * as convex_values2561 from "convex/values";
3
- import * as convex_server109 from "convex/server";
2
+ import * as convex_values2031 from "convex/values";
3
+ import * as convex_server105 from "convex/server";
4
4
 
5
5
  //#region src/component/account.d.ts
6
6
  declare namespace account_d_exports {
7
7
  export { beginCredentialsSignIn, completeCredentialsSignIn, create, get, list, remove, update };
8
8
  }
9
- type AcceptedCredentialsSignIn = SessionRows & {
9
+ type AcceptedCredentialsSignIn = Omit<SessionRows, "epoch"> & {
10
10
  status: "accepted";
11
11
  };
12
12
  /** Reserve a password attempt and load all sign-in state in one transaction. */
13
- declare const beginCredentialsSignIn: convex_server109.RegisteredMutation<"public", {
13
+ declare const beginCredentialsSignIn: convex_server105.RegisteredMutation<"public", {
14
14
  provider: string;
15
15
  providerAccountId: string;
16
+ limitIdentifier: string;
16
17
  maxAttemptsPerHour: number;
17
18
  reserveAttempt: boolean;
18
19
  includeTotp: boolean;
19
20
  }, Promise<{
20
- status: "invalid";
21
+ status: "limited";
21
22
  account?: undefined;
22
23
  user?: undefined;
23
24
  hasTotp?: undefined;
24
25
  } | {
25
- status: "limited";
26
+ status: "invalid";
26
27
  account?: undefined;
27
28
  user?: undefined;
28
29
  hasTotp?: undefined;
29
30
  } | {
30
31
  status: "ready";
31
32
  account: {
32
- _id: convex_values2561.GenericId<"Account">;
33
+ _id: convex_values2031.GenericId<"Account">;
33
34
  _creationTime: number;
34
- emailVerified?: string | undefined;
35
35
  extend?: any;
36
36
  secret?: string | undefined;
37
+ emailVerified?: string | undefined;
37
38
  phoneVerified?: string | undefined;
38
- userId: convex_values2561.GenericId<"User">;
39
39
  provider: string;
40
+ userId: convex_values2031.GenericId<"User">;
40
41
  providerAccountId: string;
41
42
  };
42
43
  user: {
43
- _id: convex_values2561.GenericId<"User">;
44
+ _id: convex_values2031.GenericId<"User">;
44
45
  _creationTime: number;
45
- name?: string | undefined;
46
46
  email?: string | undefined;
47
- image?: string | undefined;
47
+ extend?: any;
48
48
  phone?: string | undefined;
49
+ name?: string | undefined;
49
50
  firstName?: string | undefined;
50
51
  lastName?: string | undefined;
52
+ image?: string | undefined;
51
53
  emailVerificationTime?: number | undefined;
52
54
  phoneVerificationTime?: number | undefined;
53
55
  isAnonymous?: boolean | undefined;
54
- lastActiveGroup?: convex_values2561.GenericId<"Group"> | undefined;
55
- extend?: any;
56
+ lastActiveGroup?: convex_values2031.GenericId<"Group"> | undefined;
57
+ sessionEpoch?: number | undefined;
56
58
  };
57
59
  hasTotp: boolean;
58
60
  }>>;
59
61
  /** Refund a verified password attempt and optionally issue its session atomically. */
60
- declare const completeCredentialsSignIn: convex_server109.RegisteredMutation<"public", {
61
- replaceSessionId?: convex_values2561.GenericId<"Session"> | undefined;
62
- accountId: convex_values2561.GenericId<"Account">;
62
+ declare const completeCredentialsSignIn: convex_server105.RegisteredMutation<"public", {
63
+ replaceSession?: {
64
+ sessionId: convex_values2031.GenericId<"Session">;
65
+ authenticatedUserId: convex_values2031.GenericId<"User">;
66
+ } | undefined;
67
+ accountId: convex_values2031.GenericId<"Account">;
63
68
  sessionExpirationTime: number;
64
69
  refreshTokenExpirationTime: number;
70
+ limitIdentifier: string;
65
71
  issueSession: boolean;
66
72
  generateTokens: boolean;
67
73
  }, Promise<AcceptedCredentialsSignIn | {
@@ -73,53 +79,53 @@ declare const completeCredentialsSignIn: convex_server109.RegisteredMutation<"pu
73
79
  * Read an account by id, or by `{ provider, providerAccountId }` when both
74
80
  * are given. Returns `null` when no selector matches.
75
81
  */
76
- declare const get: convex_server109.RegisteredQuery<"public", {
77
- id?: convex_values2561.GenericId<"Account"> | undefined;
82
+ declare const get: convex_server105.RegisteredQuery<"public", {
83
+ id?: convex_values2031.GenericId<"Account"> | undefined;
78
84
  provider?: string | undefined;
79
85
  providerAccountId?: string | undefined;
80
86
  }, Promise<{
81
- _id: convex_values2561.GenericId<"Account">;
87
+ _id: convex_values2031.GenericId<"Account">;
82
88
  _creationTime: number;
83
- emailVerified?: string | undefined;
84
89
  extend?: any;
85
90
  secret?: string | undefined;
91
+ emailVerified?: string | undefined;
86
92
  phoneVerified?: string | undefined;
87
- userId: convex_values2561.GenericId<"User">;
88
93
  provider: string;
94
+ userId: convex_values2031.GenericId<"User">;
89
95
  providerAccountId: string;
90
96
  } | null>>;
91
97
  /** List the accounts owned by a user. */
92
- declare const list: convex_server109.RegisteredQuery<"public", {
93
- userId: convex_values2561.GenericId<"User">;
98
+ declare const list: convex_server105.RegisteredQuery<"public", {
99
+ userId: convex_values2031.GenericId<"User">;
94
100
  }, Promise<{
95
- _id: convex_values2561.GenericId<"Account">;
101
+ _id: convex_values2031.GenericId<"Account">;
96
102
  _creationTime: number;
97
- emailVerified?: string | undefined;
98
103
  extend?: any;
99
104
  secret?: string | undefined;
105
+ emailVerified?: string | undefined;
100
106
  phoneVerified?: string | undefined;
101
- userId: convex_values2561.GenericId<"User">;
102
107
  provider: string;
108
+ userId: convex_values2031.GenericId<"User">;
103
109
  providerAccountId: string;
104
110
  }[]>>;
105
111
  /** Insert a new account. */
106
- declare const create: convex_server109.RegisteredMutation<"public", {
112
+ declare const create: convex_server105.RegisteredMutation<"public", {
107
113
  extend?: any;
108
114
  secret?: string | undefined;
109
- userId: convex_values2561.GenericId<"User">;
110
115
  provider: string;
116
+ userId: convex_values2031.GenericId<"User">;
111
117
  providerAccountId: string;
112
- }, Promise<convex_values2561.GenericId<"Account">>>;
118
+ }, Promise<convex_values2031.GenericId<"Account">>>;
113
119
  /** Patch fields on an account. */
114
- declare const update: convex_server109.RegisteredMutation<"public", {
115
- id: convex_values2561.GenericId<"Account">;
120
+ declare const update: convex_server105.RegisteredMutation<"public", {
121
+ id: convex_values2031.GenericId<"Account">;
116
122
  patch: {
117
- emailVerified?: string | undefined;
118
123
  extend?: any;
119
- userId?: convex_values2561.GenericId<"User"> | undefined;
120
124
  provider?: string | undefined;
125
+ userId?: convex_values2031.GenericId<"User"> | undefined;
121
126
  providerAccountId?: string | undefined;
122
127
  secret?: string | undefined;
128
+ emailVerified?: string | undefined;
123
129
  phoneVerified?: string | undefined;
124
130
  };
125
131
  }, Promise<null>>;
@@ -127,10 +133,10 @@ declare const update: convex_server109.RegisteredMutation<"public", {
127
133
  * Delete an account. When `requireOtherAccount` is set, refuses to delete the
128
134
  * user's last remaining account so they are never left with none.
129
135
  */
130
- declare const remove: convex_server109.RegisteredMutation<"public", {
131
- userId?: convex_values2561.GenericId<"User"> | undefined;
136
+ declare const remove: convex_server105.RegisteredMutation<"public", {
137
+ userId?: convex_values2031.GenericId<"User"> | undefined;
132
138
  requireOtherAccount?: boolean | undefined;
133
- id: convex_values2561.GenericId<"Account">;
139
+ id: convex_values2031.GenericId<"Account">;
134
140
  }, Promise<null>>;
135
141
  //#endregion
136
142
  export { account_d_exports };
@@ -1 +1 @@
1
- {"version":3,"file":"account.d.ts","names":[],"sources":["../../src/component/account.ts"],"mappings":";;;;;;;;KAmBK,yBAAA,GAA4B,WAAA;EAAgB,MAAA;AAAA;;cAGpC,sBAAA,mBAAsB,kBAAA;;;;;;;;;;;;;;;;;;;SAqDjC,iBAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAGW,yBAAA,mBAAyB,kBAAA;qBA4CpC,iBAAA,CAAA,SAAA;;;;;;;;;;;;;;;cAMW,GAAA,mBAAG,eAAA;OAmBd,iBAAA,CAAA,SAAA;;;;;;;;;;;;;;;cAGW,IAAA,mBAAI,eAAA;UASf,iBAAA,CAAA,SAAA;AAAA;;;;;;;;;;;;cAGW,MAAA,mBAAM,kBAAA;;;UAqCjB,iBAAA,CAAA,SAAA;;;;;cAGW,MAAA,mBAAM,kBAAA;MAkBjB,iBAAA,CAAA,SAAA;;;;;;;;;;;;;;;cAMI,MAAA,mBAAM,kBAAA;WAmCV,iBAAA,CAAA,SAAA"}
1
+ {"version":3,"file":"account.d.ts","names":[],"sources":["../../src/component/account.ts"],"mappings":";;;;;;;;KAmBK,yBAAA,GAA4B,IAAA,CAAK,WAAA;EAA0B,MAAA;AAAA;;cAGnD,sBAAA,mBAAsB,kBAAA;;;;;;;;;;;;;;;;;;;;SAuDjC,iBAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAGW,yBAAA,mBAAyB,kBAAA;;eA6CpC,iBAAA,CAAA,SAAA;;;;;;;;;;;;;;;;;;cAMW,GAAA,mBAAG,eAAA;OAmBd,iBAAA,CAAA,SAAA;;;;;;;;;;;;;;;cAGW,IAAA,mBAAI,eAAA;UASf,iBAAA,CAAA,SAAA;AAAA;;;;;;;;;;;;cAGW,MAAA,mBAAM,kBAAA;;;;UAqCjB,iBAAA,CAAA,SAAA;;;;cAGW,MAAA,mBAAM,kBAAA;MAkBjB,iBAAA,CAAA,SAAA;;;;;;;;;;;;;;;cAMI,MAAA,mBAAM,kBAAA;WAmCV,iBAAA,CAAA,SAAA"}
@@ -3,7 +3,7 @@ import { vAccountDoc, vUserDoc } from "./model.js";
3
3
  import { mutation, query } from "./_generated/server.js";
4
4
  import "./functions.js";
5
5
  import { recordSignInLimit, resetSignInLimit } from "./limits.js";
6
- import { createSessionRows } from "./session.js";
6
+ import { createSessionRows, vSessionReplacement } from "./session.js";
7
7
  import { ConvexError, v } from "convex/values";
8
8
 
9
9
  //#region src/component/account.ts
@@ -21,6 +21,7 @@ const beginCredentialsSignIn = mutation({
21
21
  args: {
22
22
  provider: v.string(),
23
23
  providerAccountId: v.string(),
24
+ limitIdentifier: v.string(),
24
25
  maxAttemptsPerHour: v.number(),
25
26
  reserveAttempt: v.boolean(),
26
27
  includeTotp: v.boolean()
@@ -32,20 +33,16 @@ const beginCredentialsSignIn = mutation({
32
33
  hasTotp: v.boolean()
33
34
  })),
34
35
  handler: async (ctx, args) => {
36
+ if (!(args.reserveAttempt ? await recordSignInLimit(ctx, {
37
+ identifier: args.limitIdentifier,
38
+ maxAttemptsPerHour: args.maxAttemptsPerHour
39
+ }) : {
40
+ ok: true,
41
+ retryAfter: void 0
42
+ }).ok) return { status: "limited" };
35
43
  const account = await ctx.db.query("Account").withIndex("provider_account_id", (q) => q.eq("provider", args.provider).eq("providerAccountId", args.providerAccountId)).unique();
36
44
  if (account === null) return { status: "invalid" };
37
- const [user, totp, limit] = await Promise.all([
38
- ctx.db.get("User", account.userId),
39
- args.includeTotp ? ctx.db.query("TotpFactor").withIndex("user_id_verified", (q) => q.eq("userId", account.userId).eq("verified", true)).first() : Promise.resolve(null),
40
- args.reserveAttempt ? recordSignInLimit(ctx, {
41
- identifier: account._id,
42
- maxAttemptsPerHour: args.maxAttemptsPerHour
43
- }) : Promise.resolve({
44
- ok: true,
45
- retryAfter: void 0
46
- })
47
- ]);
48
- if (!limit.ok) return { status: "limited" };
45
+ const [user, totp] = await Promise.all([ctx.db.get("User", account.userId), args.includeTotp ? ctx.db.query("TotpFactor").withIndex("user_id_verified", (q) => q.eq("userId", account.userId).eq("verified", true)).first() : Promise.resolve(null)]);
49
46
  if (user === null) return { status: "invalid" };
50
47
  return {
51
48
  status: "ready",
@@ -59,9 +56,10 @@ const beginCredentialsSignIn = mutation({
59
56
  const completeCredentialsSignIn = mutation({
60
57
  args: {
61
58
  accountId: v.id("Account"),
59
+ limitIdentifier: v.string(),
62
60
  issueSession: v.boolean(),
63
61
  generateTokens: v.boolean(),
64
- replaceSessionId: v.optional(v.id("Session")),
62
+ replaceSession: v.optional(vSessionReplacement),
65
63
  sessionExpirationTime: v.number(),
66
64
  refreshTokenExpirationTime: v.number()
67
65
  },
@@ -75,11 +73,11 @@ const completeCredentialsSignIn = mutation({
75
73
  handler: async (ctx, args) => {
76
74
  const account = await ctx.db.get("Account", args.accountId);
77
75
  if (account === null) return { status: "rejected" };
78
- await resetSignInLimit(ctx, account._id);
76
+ await resetSignInLimit(ctx, args.limitIdentifier);
79
77
  if (!args.issueSession) return { status: "reset" };
80
78
  const created = await createSessionRows(ctx, {
81
79
  userId: account.userId,
82
- replaceSessionId: args.replaceSessionId,
80
+ replaceSession: args.replaceSession,
83
81
  sessionExpirationTime: args.sessionExpirationTime,
84
82
  refreshTokenExpirationTime: args.generateTokens ? args.refreshTokenExpirationTime : void 0
85
83
  });
@@ -1 +1 @@
1
- {"version":3,"file":"account.js","names":[],"sources":["../../src/component/account.ts"],"sourcesContent":["/**\n * `component.account.*` — provider-linked auth accounts.\n *\n * Reads collapse into one overloaded `get`; `list`\n * takes the owning `userId`.\n *\n * @module\n */\n\nimport { ConvexError, v } from \"convex/values\";\nimport { ErrorCode } from \"../shared/codes\";\n\nimport { recordSignInLimit, resetSignInLimit } from \"./limits\";\nimport { mutation, query } from \"./functions\";\nimport { vAccountDoc, vUserDoc } from \"./model\";\nimport { createSessionRows, type SessionRows } from \"./session\";\n\nconst ACCOUNT_LIST_BATCH = 128;\n\ntype AcceptedCredentialsSignIn = SessionRows & { status: \"accepted\" };\n\n/** Reserve a password attempt and load all sign-in state in one transaction. */\nexport const beginCredentialsSignIn = mutation({\n args: {\n provider: v.string(),\n providerAccountId: v.string(),\n maxAttemptsPerHour: v.number(),\n reserveAttempt: v.boolean(),\n includeTotp: v.boolean(),\n },\n returns: v.union(\n v.object({ status: v.literal(\"invalid\") }),\n v.object({ status: v.literal(\"limited\") }),\n v.object({\n status: v.literal(\"ready\"),\n account: vAccountDoc,\n user: vUserDoc,\n hasTotp: v.boolean(),\n }),\n ),\n handler: async (ctx, args) => {\n const account = await ctx.db\n .query(\"Account\")\n .withIndex(\"provider_account_id\", (q) =>\n q.eq(\"provider\", args.provider).eq(\"providerAccountId\", args.providerAccountId),\n )\n .unique();\n if (account === null) return { status: \"invalid\" as const };\n\n const [user, totp, limit] = await Promise.all([\n ctx.db.get(\"User\", account.userId),\n args.includeTotp\n ? ctx.db\n .query(\"TotpFactor\")\n .withIndex(\"user_id_verified\", (q) =>\n q.eq(\"userId\", account.userId).eq(\"verified\", true),\n )\n .first()\n : Promise.resolve(null),\n args.reserveAttempt\n ? recordSignInLimit(ctx, {\n identifier: account._id,\n maxAttemptsPerHour: args.maxAttemptsPerHour,\n })\n : Promise.resolve({ ok: true as const, retryAfter: undefined }),\n ]);\n if (!limit.ok) return { status: \"limited\" as const };\n if (user === null) return { status: \"invalid\" as const };\n return {\n status: \"ready\" as const,\n account,\n user,\n hasTotp: totp !== null,\n };\n },\n});\n\n/** Refund a verified password attempt and optionally issue its session atomically. */\nexport const completeCredentialsSignIn = mutation({\n args: {\n accountId: v.id(\"Account\"),\n issueSession: v.boolean(),\n generateTokens: v.boolean(),\n replaceSessionId: v.optional(v.id(\"Session\")),\n sessionExpirationTime: v.number(),\n refreshTokenExpirationTime: v.number(),\n },\n returns: v.union(\n v.object({ status: v.literal(\"rejected\") }),\n v.object({ status: v.literal(\"reset\") }),\n v.object({\n status: v.literal(\"accepted\"),\n user: vUserDoc,\n sessionId: v.id(\"Session\"),\n refreshTokenId: v.optional(v.id(\"RefreshToken\")),\n replacedSessionId: v.optional(v.id(\"Session\")),\n }),\n ),\n handler: async (ctx, args) => {\n const account = await ctx.db.get(\"Account\", args.accountId);\n if (account === null) return { status: \"rejected\" as const };\n await resetSignInLimit(ctx, account._id);\n if (!args.issueSession) return { status: \"reset\" as const };\n\n const created = await createSessionRows(ctx, {\n userId: account.userId,\n replaceSessionId: args.replaceSessionId,\n sessionExpirationTime: args.sessionExpirationTime,\n refreshTokenExpirationTime: args.generateTokens ? args.refreshTokenExpirationTime : undefined,\n });\n if (created === null) return { status: \"rejected\" as const };\n const result: AcceptedCredentialsSignIn = {\n status: \"accepted\" as const,\n user: created.user,\n sessionId: created.sessionId,\n };\n if (created.refreshTokenId !== undefined) result.refreshTokenId = created.refreshTokenId;\n if (created.replacedSessionId !== undefined) {\n result.replacedSessionId = created.replacedSessionId;\n }\n return result;\n },\n});\n\n/**\n * Read an account by id, or by `{ provider, providerAccountId }` when both\n * are given. Returns `null` when no selector matches.\n */\nexport const get = query({\n args: {\n id: v.optional(v.id(\"Account\")),\n provider: v.optional(v.string()),\n providerAccountId: v.optional(v.string()),\n },\n returns: v.union(vAccountDoc, v.null()),\n handler: async (ctx, args) => {\n if (args.provider !== undefined && args.providerAccountId !== undefined) {\n return await ctx.db\n .query(\"Account\")\n .withIndex(\"provider_account_id\", (q) =>\n q.eq(\"provider\", args.provider!).eq(\"providerAccountId\", args.providerAccountId!),\n )\n .unique();\n }\n if (args.id === undefined) return null;\n return await ctx.db.get(\"Account\", args.id);\n },\n});\n\n/** List the accounts owned by a user. */\nexport const list = query({\n args: { userId: v.id(\"User\") },\n returns: v.array(vAccountDoc),\n handler: async (ctx, { userId }) => {\n return await ctx.db\n .query(\"Account\")\n .withIndex(\"user_id_provider\", (q) => q.eq(\"userId\", userId))\n .take(ACCOUNT_LIST_BATCH);\n },\n});\n\n/** Insert a new account. */\nexport const create = mutation({\n args: {\n userId: v.id(\"User\"),\n provider: v.string(),\n providerAccountId: v.string(),\n secret: v.optional(v.string()),\n extend: v.optional(v.any()),\n },\n returns: v.id(\"Account\"),\n handler: async (ctx, args) => {\n // Dedup on the (provider, providerAccountId) identity. A bare insert let two\n // concurrent or retried provisioning ceremonies — SCIM POST retries, a\n // passkey double-submit — create duplicate Account rows, which then made\n // `account.get(...).unique()` throw on every future lookup (a permanent\n // sign-in lockout / rogue credential attribution). The index-range read plus\n // insert in this single mutation is OCC-atomic: a racing insert into the same\n // range conflicts and retries, then observes the winner's row below.\n const existing = await ctx.db\n .query(\"Account\")\n .withIndex(\"provider_account_id\", (q) =>\n q.eq(\"provider\", args.provider).eq(\"providerAccountId\", args.providerAccountId),\n )\n .first();\n if (existing !== null) {\n if (existing.userId !== args.userId) {\n // Already linked to a different user — reject rather than silently\n // attribute the identity (e.g. an attacker registering a passkey\n // credentialId that already belongs to a victim).\n throw new ConvexError({\n code: ErrorCode.ACCOUNT_ALREADY_LINKED,\n message: \"This account is already linked to another user.\",\n });\n }\n return existing._id;\n }\n return await ctx.db.insert(\"Account\", args);\n },\n});\n\n/** Patch fields on an account. */\nexport const update = mutation({\n args: {\n id: v.id(\"Account\"),\n patch: v.object({\n userId: v.optional(v.id(\"User\")),\n provider: v.optional(v.string()),\n providerAccountId: v.optional(v.string()),\n secret: v.optional(v.string()),\n emailVerified: v.optional(v.string()),\n phoneVerified: v.optional(v.string()),\n extend: v.optional(v.any()),\n }),\n },\n returns: v.null(),\n handler: async (ctx, { id: accountId, patch }) => {\n await ctx.db.patch(\"Account\", accountId, patch);\n return null;\n },\n});\n\n/**\n * Delete an account. When `requireOtherAccount` is set, refuses to delete the\n * user's last remaining account so they are never left with none.\n */\nconst remove = mutation({\n args: {\n id: v.id(\"Account\"),\n userId: v.optional(v.id(\"User\")),\n requireOtherAccount: v.optional(v.boolean()),\n },\n returns: v.null(),\n handler: async (ctx, { id: accountId, userId, requireOtherAccount }) => {\n const doc = await ctx.db.get(\"Account\", accountId);\n if (doc === null || (userId !== undefined && doc.userId !== userId)) {\n throw new ConvexError({\n code: ErrorCode.ACCOUNT_NOT_FOUND,\n message: \"Account not found.\",\n });\n }\n if (requireOtherAccount === true) {\n let otherFound = false;\n for await (const sibling of ctx.db\n .query(\"Account\")\n .withIndex(\"user_id_provider\", (q) => q.eq(\"userId\", doc.userId))) {\n if (sibling._id !== accountId) {\n otherFound = true;\n break;\n }\n }\n if (!otherFound) {\n throw new ConvexError({\n code: ErrorCode.INVALID_PARAMETERS,\n message: \"The provided parameters are invalid.\",\n });\n }\n }\n await ctx.db.delete(\"Account\", accountId);\n return null;\n },\n});\n\nexport { remove };\n"],"mappings":"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"}
1
+ {"version":3,"file":"account.js","names":[],"sources":["../../src/component/account.ts"],"sourcesContent":["/**\n * `component.account.*` — provider-linked auth accounts.\n *\n * Reads collapse into one overloaded `get`; `list`\n * takes the owning `userId`.\n *\n * @module\n */\n\nimport { ConvexError, v } from \"convex/values\";\nimport { ErrorCode } from \"../shared/codes\";\n\nimport { recordSignInLimit, resetSignInLimit } from \"./limits\";\nimport { mutation, query } from \"./functions\";\nimport { vAccountDoc, vUserDoc } from \"./model\";\nimport { createSessionRows, type SessionRows, vSessionReplacement } from \"./session\";\n\nconst ACCOUNT_LIST_BATCH = 128;\n\ntype AcceptedCredentialsSignIn = Omit<SessionRows, \"epoch\"> & { status: \"accepted\" };\n\n/** Reserve a password attempt and load all sign-in state in one transaction. */\nexport const beginCredentialsSignIn = mutation({\n args: {\n provider: v.string(),\n providerAccountId: v.string(),\n limitIdentifier: v.string(),\n maxAttemptsPerHour: v.number(),\n reserveAttempt: v.boolean(),\n includeTotp: v.boolean(),\n },\n returns: v.union(\n v.object({ status: v.literal(\"invalid\") }),\n v.object({ status: v.literal(\"limited\") }),\n v.object({\n status: v.literal(\"ready\"),\n account: vAccountDoc,\n user: vUserDoc,\n hasTotp: v.boolean(),\n }),\n ),\n handler: async (ctx, args) => {\n const limit = args.reserveAttempt\n ? await recordSignInLimit(ctx, {\n identifier: args.limitIdentifier,\n maxAttemptsPerHour: args.maxAttemptsPerHour,\n })\n : { ok: true as const, retryAfter: undefined };\n if (!limit.ok) return { status: \"limited\" as const };\n\n const account = await ctx.db\n .query(\"Account\")\n .withIndex(\"provider_account_id\", (q) =>\n q.eq(\"provider\", args.provider).eq(\"providerAccountId\", args.providerAccountId),\n )\n .unique();\n if (account === null) return { status: \"invalid\" as const };\n\n const [user, totp] = await Promise.all([\n ctx.db.get(\"User\", account.userId),\n args.includeTotp\n ? ctx.db\n .query(\"TotpFactor\")\n .withIndex(\"user_id_verified\", (q) =>\n q.eq(\"userId\", account.userId).eq(\"verified\", true),\n )\n .first()\n : Promise.resolve(null),\n ]);\n if (user === null) return { status: \"invalid\" as const };\n return {\n status: \"ready\" as const,\n account,\n user,\n hasTotp: totp !== null,\n };\n },\n});\n\n/** Refund a verified password attempt and optionally issue its session atomically. */\nexport const completeCredentialsSignIn = mutation({\n args: {\n accountId: v.id(\"Account\"),\n limitIdentifier: v.string(),\n issueSession: v.boolean(),\n generateTokens: v.boolean(),\n replaceSession: v.optional(vSessionReplacement),\n sessionExpirationTime: v.number(),\n refreshTokenExpirationTime: v.number(),\n },\n returns: v.union(\n v.object({ status: v.literal(\"rejected\") }),\n v.object({ status: v.literal(\"reset\") }),\n v.object({\n status: v.literal(\"accepted\"),\n user: vUserDoc,\n sessionId: v.id(\"Session\"),\n refreshTokenId: v.optional(v.id(\"RefreshToken\")),\n replacedSessionId: v.optional(v.id(\"Session\")),\n }),\n ),\n handler: async (ctx, args) => {\n const account = await ctx.db.get(\"Account\", args.accountId);\n if (account === null) return { status: \"rejected\" as const };\n await resetSignInLimit(ctx, args.limitIdentifier);\n if (!args.issueSession) return { status: \"reset\" as const };\n\n const created = await createSessionRows(ctx, {\n userId: account.userId,\n replaceSession: args.replaceSession,\n sessionExpirationTime: args.sessionExpirationTime,\n refreshTokenExpirationTime: args.generateTokens ? args.refreshTokenExpirationTime : undefined,\n });\n if (created === null) return { status: \"rejected\" as const };\n const result: AcceptedCredentialsSignIn = {\n status: \"accepted\" as const,\n user: created.user,\n sessionId: created.sessionId,\n };\n if (created.refreshTokenId !== undefined) result.refreshTokenId = created.refreshTokenId;\n if (created.replacedSessionId !== undefined) {\n result.replacedSessionId = created.replacedSessionId;\n }\n return result;\n },\n});\n\n/**\n * Read an account by id, or by `{ provider, providerAccountId }` when both\n * are given. Returns `null` when no selector matches.\n */\nexport const get = query({\n args: {\n id: v.optional(v.id(\"Account\")),\n provider: v.optional(v.string()),\n providerAccountId: v.optional(v.string()),\n },\n returns: v.union(vAccountDoc, v.null()),\n handler: async (ctx, args) => {\n if (args.provider !== undefined && args.providerAccountId !== undefined) {\n return await ctx.db\n .query(\"Account\")\n .withIndex(\"provider_account_id\", (q) =>\n q.eq(\"provider\", args.provider!).eq(\"providerAccountId\", args.providerAccountId!),\n )\n .unique();\n }\n if (args.id === undefined) return null;\n return await ctx.db.get(\"Account\", args.id);\n },\n});\n\n/** List the accounts owned by a user. */\nexport const list = query({\n args: { userId: v.id(\"User\") },\n returns: v.array(vAccountDoc),\n handler: async (ctx, { userId }) => {\n return await ctx.db\n .query(\"Account\")\n .withIndex(\"user_id_provider\", (q) => q.eq(\"userId\", userId))\n .take(ACCOUNT_LIST_BATCH);\n },\n});\n\n/** Insert a new account. */\nexport const create = mutation({\n args: {\n userId: v.id(\"User\"),\n provider: v.string(),\n providerAccountId: v.string(),\n secret: v.optional(v.string()),\n extend: v.optional(v.any()),\n },\n returns: v.id(\"Account\"),\n handler: async (ctx, args) => {\n // Dedup on the (provider, providerAccountId) identity. A bare insert let two\n // concurrent or retried provisioning ceremonies — SCIM POST retries, a\n // passkey double-submit — create duplicate Account rows, which then made\n // `account.get(...).unique()` throw on every future lookup (a permanent\n // sign-in lockout / rogue credential attribution). The index-range read plus\n // insert in this single mutation is OCC-atomic: a racing insert into the same\n // range conflicts and retries, then observes the winner's row below.\n const existing = await ctx.db\n .query(\"Account\")\n .withIndex(\"provider_account_id\", (q) =>\n q.eq(\"provider\", args.provider).eq(\"providerAccountId\", args.providerAccountId),\n )\n .first();\n if (existing !== null) {\n if (existing.userId !== args.userId) {\n // Already linked to a different user — reject rather than silently\n // attribute the identity (e.g. an attacker registering a passkey\n // credentialId that already belongs to a victim).\n throw new ConvexError({\n code: ErrorCode.ACCOUNT_ALREADY_LINKED,\n message: \"This account is already linked to another user.\",\n });\n }\n return existing._id;\n }\n return await ctx.db.insert(\"Account\", args);\n },\n});\n\n/** Patch fields on an account. */\nexport const update = mutation({\n args: {\n id: v.id(\"Account\"),\n patch: v.object({\n userId: v.optional(v.id(\"User\")),\n provider: v.optional(v.string()),\n providerAccountId: v.optional(v.string()),\n secret: v.optional(v.string()),\n emailVerified: v.optional(v.string()),\n phoneVerified: v.optional(v.string()),\n extend: v.optional(v.any()),\n }),\n },\n returns: v.null(),\n handler: async (ctx, { id: accountId, patch }) => {\n await ctx.db.patch(\"Account\", accountId, patch);\n return null;\n },\n});\n\n/**\n * Delete an account. When `requireOtherAccount` is set, refuses to delete the\n * user's last remaining account so they are never left with none.\n */\nconst remove = mutation({\n args: {\n id: v.id(\"Account\"),\n userId: v.optional(v.id(\"User\")),\n requireOtherAccount: v.optional(v.boolean()),\n },\n returns: v.null(),\n handler: async (ctx, { id: accountId, userId, requireOtherAccount }) => {\n const doc = await ctx.db.get(\"Account\", accountId);\n if (doc === null || (userId !== undefined && doc.userId !== userId)) {\n throw new ConvexError({\n code: ErrorCode.ACCOUNT_NOT_FOUND,\n message: \"Account not found.\",\n });\n }\n if (requireOtherAccount === true) {\n let otherFound = false;\n for await (const sibling of ctx.db\n .query(\"Account\")\n .withIndex(\"user_id_provider\", (q) => q.eq(\"userId\", doc.userId))) {\n if (sibling._id !== accountId) {\n otherFound = true;\n break;\n }\n }\n if (!otherFound) {\n throw new ConvexError({\n code: ErrorCode.INVALID_PARAMETERS,\n message: \"The provided parameters are invalid.\",\n });\n }\n }\n await ctx.db.delete(\"Account\", accountId);\n return null;\n },\n});\n\nexport { remove };\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import * as convex_values2852 from "convex/values";
2
- import * as convex_server207 from "convex/server";
1
+ import * as convex_values3277 from "convex/values";
2
+ import * as convex_server212 from "convex/server";
3
3
 
4
4
  //#region src/component/connection/audit.d.ts
5
5
  declare namespace audit_d_exports {
@@ -16,9 +16,9 @@ declare namespace audit_d_exports {
16
16
  * an allowlist). Requires exactly one of `connectionId` or `groupId` — passing
17
17
  * neither throws rather than scanning the entire audit log.
18
18
  */
19
- declare const list: convex_server207.RegisteredQuery<"public", {
20
- connectionId?: convex_values2852.GenericId<"GroupConnection"> | undefined;
21
- groupId?: convex_values2852.GenericId<"Group"> | undefined;
19
+ declare const list: convex_server212.RegisteredQuery<"public", {
20
+ connectionId?: convex_values3277.GenericId<"GroupConnection"> | undefined;
21
+ groupId?: convex_values3277.GenericId<"Group"> | undefined;
22
22
  paginationOpts: {
23
23
  id?: number;
24
24
  endCursor?: string | null;
@@ -29,55 +29,55 @@ declare const list: convex_server207.RegisteredQuery<"public", {
29
29
  };
30
30
  }, Promise<{
31
31
  page: {
32
- _id: convex_values2852.GenericId<"AuthEventProjection">;
32
+ _id: convex_values3277.GenericId<"AuthEventProjection">;
33
33
  _creationTime: number;
34
34
  eventId: string;
35
- targetKind: "user" | "connection" | "group" | "session" | "api_key" | "oauth_client" | "global";
35
+ targetKind: "user" | "session" | "api_key" | "connection" | "oauth_client" | "group" | "global";
36
36
  targetId: string;
37
37
  kind: "user.created" | "user.updated" | "session.signed_in" | "session.signed_out" | "session.invalidated" | "session.refresh_exchanged" | "session.refresh_reuse_detected" | "account.linked" | "account.unlinked" | "password.changed" | "passkey.added" | "passkey.removed" | "totp.enrolled" | "totp.removed" | "email.verified" | "phone.verified" | "api_key.created" | "api_key.revoked" | "oauth.client.created" | "oauth.client.revoked" | "oauth.code.created" | "oauth.token.created" | "oauth.token.exchanged" | "oauth.refresh.reuse_detected" | "oauth.refresh.revoked" | "connection.created" | "connection.updated" | "connection.removed" | "connection.login.succeeded" | "connection.login.failed" | "connection.domain.verification_requested" | "connection.domain.verified" | "connection.policy.updated" | "connection.saml.set" | "connection.saml.refreshed" | "connection.oidc.set" | "connection.scim.set" | "connection.scim.read" | "connection.scim.user.provisioned" | "connection.scim.user.updated" | "connection.scim.user.deactivated" | "connection.scim.user.reactivated" | "connection.scim.group.provisioned" | "connection.scim.group.updated" | "connection.scim.group.deactivated" | "connection.scim.group.reactivated" | "webhook.endpoint.created" | "webhook.endpoint.disabled" | "webhook.delivery.created" | "webhook.delivery.attempted" | "webhook.delivery.succeeded" | "webhook.delivery.failed";
38
- category: "email" | "phone" | "password" | "oauth" | "scim" | "user" | "connection" | "session" | "account" | "passkey" | "totp" | "api_key" | "webhook" | "security";
38
+ category: "email" | "password" | "phone" | "user" | "session" | "account" | "passkey" | "totp" | "api_key" | "oauth" | "connection" | "scim" | "webhook" | "security";
39
39
  occurredAt: number;
40
- actorType: "scim" | "user" | "api_key" | "webhook" | "oauth_client" | "system" | "anonymous";
40
+ actorType: "user" | "api_key" | "scim" | "webhook" | "system" | "oauth_client" | "anonymous";
41
41
  actorId: string | undefined;
42
- subjectType: "email" | "phone" | "user" | "connection" | "group" | "session" | "account" | "passkey" | "totp" | "api_key" | "oauth_client" | "system" | "oauth_code" | "scim_identity" | "webhook_endpoint" | "webhook_delivery";
42
+ subjectType: "email" | "phone" | "user" | "session" | "account" | "passkey" | "totp" | "api_key" | "connection" | "system" | "oauth_client" | "oauth_code" | "group" | "scim_identity" | "webhook_endpoint" | "webhook_delivery";
43
43
  subjectId: string | undefined;
44
44
  outcome: "success" | "failure";
45
45
  errorCode: string | undefined;
46
46
  requestId: string | undefined;
47
47
  ip: undefined;
48
48
  data: {
49
+ profile?: Record<string, any> | undefined;
49
50
  type?: string | undefined;
50
51
  provider?: string | undefined;
51
- profile?: Record<string, any> | undefined;
52
52
  existingUserId?: string | undefined;
53
53
  } | {
54
54
  method?: string | undefined;
55
55
  provider: string;
56
56
  } | {
57
+ flow?: "reset" | "change" | undefined;
57
58
  userId?: string | undefined;
58
- sessionId?: string | undefined;
59
59
  reason?: string | undefined;
60
+ sessionId?: string | undefined;
60
61
  refreshTokenId?: string | undefined;
61
- flow?: "reset" | "change" | undefined;
62
62
  } | {
63
- accountId?: string | undefined;
64
63
  provider?: string | undefined;
65
64
  providerAccountId?: string | undefined;
65
+ accountId?: string | undefined;
66
66
  } | {
67
- name?: string | undefined;
68
- credentialId?: string | undefined;
69
67
  reason?: string | undefined;
70
68
  passkeyId?: string | undefined;
69
+ credentialId?: string | undefined;
71
70
  totpId?: string | undefined;
72
71
  keyId?: string | undefined;
72
+ name?: string | undefined;
73
73
  prefix?: string | undefined;
74
74
  } | {
75
75
  email?: string | undefined;
76
76
  phone?: string | undefined;
77
77
  userId?: string | undefined;
78
78
  } | {
79
- name?: string | undefined;
80
79
  userId?: string | undefined;
80
+ name?: string | undefined;
81
81
  clientId?: string | undefined;
82
82
  codeId?: string | undefined;
83
83
  scopes?: string[] | undefined;
@@ -85,16 +85,15 @@ declare const list: convex_server207.RegisteredQuery<"public", {
85
85
  grantType?: string | undefined;
86
86
  resource?: string | undefined;
87
87
  } | {
88
+ errorCode?: string | undefined;
88
89
  userId?: string | undefined;
89
90
  connectionId?: string | undefined;
90
- verifiedAt?: number | undefined;
91
- expiresAt?: number | undefined;
92
- version?: number | undefined;
91
+ changed?: string[] | undefined;
93
92
  protocol?: "oidc" | "saml" | undefined;
94
93
  domain?: string | undefined;
95
94
  recordName?: string | undefined;
96
- errorCode?: string | undefined;
97
- changed?: string[] | undefined;
95
+ expiresAt?: number | undefined;
96
+ verifiedAt?: number | undefined;
98
97
  metadataUrl?: string | undefined;
99
98
  domains?: string[] | undefined;
100
99
  issuer?: string | undefined;
@@ -102,28 +101,29 @@ declare const list: convex_server207.RegisteredQuery<"public", {
102
101
  jwksUri?: string | undefined;
103
102
  audience?: string | string[] | undefined;
104
103
  tokenEndpointAuthMethod?: string | undefined;
104
+ version?: number | undefined;
105
105
  } | {
106
106
  userId?: string | undefined;
107
+ scimConfigId?: string | undefined;
108
+ resourceType?: "user" | "group" | undefined;
109
+ resourceId?: string | undefined;
107
110
  operation?: string | undefined;
108
111
  externalId?: string | undefined;
109
- groupId?: string | undefined;
110
112
  active?: boolean | undefined;
111
- resourceType?: "user" | "group" | undefined;
112
- scimConfigId?: string | undefined;
113
- resourceId?: string | undefined;
113
+ groupId?: string | undefined;
114
114
  } | {
115
- status?: number | undefined;
116
115
  endpointId?: string | undefined;
117
116
  deliveryId?: string | undefined;
118
117
  sourceEventId?: string | undefined;
119
118
  sourceEventType?: "user.created" | "user.updated" | "session.signed_in" | "session.signed_out" | "session.invalidated" | "session.refresh_exchanged" | "session.refresh_reuse_detected" | "account.linked" | "account.unlinked" | "password.changed" | "passkey.added" | "passkey.removed" | "totp.enrolled" | "totp.removed" | "email.verified" | "phone.verified" | "api_key.created" | "api_key.revoked" | "oauth.client.created" | "oauth.client.revoked" | "oauth.code.created" | "oauth.token.created" | "oauth.token.exchanged" | "oauth.refresh.reuse_detected" | "oauth.refresh.revoked" | "connection.created" | "connection.updated" | "connection.removed" | "connection.login.succeeded" | "connection.login.failed" | "connection.domain.verification_requested" | "connection.domain.verified" | "connection.policy.updated" | "connection.saml.set" | "connection.saml.refreshed" | "connection.oidc.set" | "connection.scim.set" | "connection.scim.read" | "connection.scim.user.provisioned" | "connection.scim.user.updated" | "connection.scim.user.deactivated" | "connection.scim.user.reactivated" | "connection.scim.group.provisioned" | "connection.scim.group.updated" | "connection.scim.group.deactivated" | "connection.scim.group.reactivated" | "webhook.endpoint.created" | "webhook.endpoint.disabled" | "webhook.delivery.created" | "webhook.delivery.attempted" | "webhook.delivery.succeeded" | "webhook.delivery.failed" | undefined;
120
119
  attemptCount?: number | undefined;
120
+ status?: number | undefined;
121
121
  error?: string | undefined;
122
122
  } | undefined;
123
123
  }[];
124
124
  isDone: boolean;
125
- continueCursor: convex_server207.Cursor;
126
- splitCursor?: convex_server207.Cursor | null;
125
+ continueCursor: convex_server212.Cursor;
126
+ splitCursor?: convex_server212.Cursor | null;
127
127
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
128
128
  }>>;
129
129
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"audit.d.ts","names":[],"sources":["../../../src/component/connection/audit.ts"],"mappings":";;;;;;;;;;;;;AA+GA;;;;;cAAa,IAAA,mBAAI,eAAA;iBAkCf,iBAAA,CAAA,SAAA"}
1
+ {"version":3,"file":"audit.d.ts","names":[],"sources":["../../../src/component/connection/audit.ts"],"mappings":";;;;;;;;;;;;;AA8GA;;;;;cAAa,IAAA,mBAAI,eAAA;iBAkCf,iBAAA,CAAA,SAAA"}
@@ -1,4 +1,5 @@
1
1
  import { ErrorCode } from "../../shared/codes.js";
2
+ import { EVENT_KIND_CATEGORY } from "../../shared/event/kinds.js";
2
3
  import { vAuthEventProjectionDoc, vPaginated } from "../model.js";
3
4
  import schema_default from "../schema.js";
4
5
  import { query } from "../_generated/server.js";
@@ -83,7 +84,7 @@ const PUBLIC_DATA_KEYS = {
83
84
  };
84
85
  function publicData(kind, value) {
85
86
  if (typeof value !== "object" || value === null || Array.isArray(value)) return void 0;
86
- const keys = PUBLIC_DATA_KEYS[kind.startsWith("api_key.") ? "api_key" : kind.slice(0, kind.indexOf("."))] ?? [];
87
+ const keys = PUBLIC_DATA_KEYS[EVENT_KIND_CATEGORY[kind]] ?? [];
87
88
  const source = value;
88
89
  const redacted = {};
89
90
  for (const key of keys) {
@@ -1 +1 @@
1
- {"version":3,"file":"audit.js","names":["schema"],"sources":["../../../src/component/connection/audit.ts"],"sourcesContent":["/**\n * `component.connection.audit.*` - Connection audit projections backed by auth events.\n *\n * @module\n */\n\nimport { paginationOptsValidator } from \"convex/server\";\nimport { paginator } from \"convex-helpers/server/pagination\";\nimport { ConvexError, v, type Infer } from \"convex/values\";\n\nimport { ErrorCode } from \"../../shared/codes\";\nimport type { Doc } from \"../_generated/dataModel\";\nimport { query } from \"../functions\";\nimport { vAuthEventData, vAuthEventProjectionDoc, vPaginated } from \"../model\";\nimport schema from \"../schema\";\n\nconst PUBLIC_DATA_KEYS = {\n user: [\"type\", \"provider\", \"existingUserId\"],\n session: [\"provider\", \"method\", \"reason\"],\n account: [\"provider\", \"accountId\"],\n password: [\"userId\"],\n passkey: [\"passkeyId\"],\n totp: [\"totpId\"],\n email: [\"userId\"],\n phone: [\"userId\"],\n api_key: [\"keyId\", \"name\", \"prefix\", \"reason\"],\n oauth: [\"clientId\", \"codeId\", \"scopes\", \"grantType\", \"resource\"],\n connection: [\n \"connectionId\",\n \"protocol\",\n \"domain\",\n \"recordName\",\n \"expiresAt\",\n \"verifiedAt\",\n \"metadataUrl\",\n \"domains\",\n \"version\",\n \"errorCode\",\n \"issuer\",\n \"discoveryUrl\",\n \"jwksUri\",\n \"audience\",\n \"tokenEndpointAuthMethod\",\n ],\n scim: [\n \"scimConfigId\",\n \"resourceType\",\n \"resourceId\",\n \"operation\",\n \"externalId\",\n \"active\",\n \"groupId\",\n \"userId\",\n ],\n webhook: [\n \"endpointId\",\n \"deliveryId\",\n \"sourceEventId\",\n \"sourceEventType\",\n \"attemptCount\",\n \"status\",\n \"error\",\n ],\n security: [\"reason\", \"errorCode\"],\n} as const;\n\nfunction publicData(kind: string, value: unknown): Infer<typeof vAuthEventData> | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n const category = kind.startsWith(\"api_key.\")\n ? \"api_key\"\n : (kind.slice(0, kind.indexOf(\".\")) as keyof typeof PUBLIC_DATA_KEYS);\n const keys = PUBLIC_DATA_KEYS[category] ?? [];\n const source = value as Record<string, unknown>;\n const redacted: Record<string, unknown> = {};\n for (const key of keys) {\n const nested = source[key];\n if (nested !== undefined) redacted[key] = nested;\n }\n return Object.keys(redacted).length === 0\n ? undefined\n : (redacted as Infer<typeof vAuthEventData>);\n}\n\nfunction publicProjection(doc: Doc<\"AuthEventProjection\">) {\n return {\n _id: doc._id,\n _creationTime: doc._creationTime,\n eventId: doc.eventId,\n targetKind: doc.targetKind,\n targetId: doc.targetId,\n kind: doc.kind,\n category: doc.category,\n occurredAt: doc.occurredAt,\n actorType: doc.actorType,\n actorId: doc.actorId,\n subjectType: doc.subjectType,\n subjectId: doc.subjectId,\n outcome: doc.outcome,\n errorCode: doc.errorCode,\n requestId: doc.requestId,\n ip: undefined,\n data: publicData(doc.kind, doc.data),\n };\n}\n\n/**\n * List audit-event projections for a connection or a group, newest first and\n * paginated. Rows are redacted to public fields (IP dropped, `data` narrowed to\n * an allowlist). Requires exactly one of `connectionId` or `groupId` — passing\n * neither throws rather than scanning the entire audit log.\n */\nexport const list = query({\n args: {\n connectionId: v.optional(v.id(\"GroupConnection\")),\n groupId: v.optional(v.id(\"Group\")),\n paginationOpts: paginationOptsValidator,\n },\n returns: vPaginated(vAuthEventProjectionDoc),\n handler: async (ctx, args) => {\n if (args.connectionId !== undefined) {\n const result = await paginator(ctx.db, schema)\n .query(\"AuthEventProjection\")\n .withIndex(\"target_time\", (idx) =>\n idx.eq(\"targetKind\", \"connection\").eq(\"targetId\", args.connectionId!),\n )\n .order(\"desc\")\n .paginate(args.paginationOpts);\n return { ...result, page: result.page.map(publicProjection) };\n }\n if (args.groupId !== undefined) {\n const result = await paginator(ctx.db, schema)\n .query(\"AuthEventProjection\")\n .withIndex(\"target_time\", (idx) =>\n idx.eq(\"targetKind\", \"group\").eq(\"targetId\", args.groupId!),\n )\n .order(\"desc\")\n .paginate(args.paginationOpts);\n return { ...result, page: result.page.map(publicProjection) };\n }\n throw new ConvexError({\n code: ErrorCode.INVALID_PARAMETERS,\n message:\n \"connection.audit.list requires either `connectionId` or `groupId` to target the query. Passing neither would walk the entire audit log.\",\n });\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;AAgBA,MAAM,mBAAmB;CACvB,MAAM;EAAC;EAAQ;EAAY;EAAiB;CAC5C,SAAS;EAAC;EAAY;EAAU;EAAS;CACzC,SAAS,CAAC,YAAY,YAAY;CAClC,UAAU,CAAC,SAAS;CACpB,SAAS,CAAC,YAAY;CACtB,MAAM,CAAC,SAAS;CAChB,OAAO,CAAC,SAAS;CACjB,OAAO,CAAC,SAAS;CACjB,SAAS;EAAC;EAAS;EAAQ;EAAU;EAAS;CAC9C,OAAO;EAAC;EAAY;EAAU;EAAU;EAAa;EAAW;CAChE,YAAY;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,UAAU,CAAC,UAAU,YAAY;CAClC;AAED,SAAS,WAAW,MAAc,OAA0D;AAC1F,KAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,MAAM,CAAE,QAAO;CAIhF,MAAM,OAAO,iBAHI,KAAK,WAAW,WAAW,GACxC,YACC,KAAK,MAAM,GAAG,KAAK,QAAQ,IAAI,CAAC,KACM,EAAE;CAC7C,MAAM,SAAS;CACf,MAAM,WAAoC,EAAE;AAC5C,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,SAAS,OAAO;AACtB,MAAI,WAAW,OAAW,UAAS,OAAO;;AAE5C,QAAO,OAAO,KAAK,SAAS,CAAC,WAAW,IACpC,SACC;;AAGP,SAAS,iBAAiB,KAAiC;AACzD,QAAO;EACL,KAAK,IAAI;EACT,eAAe,IAAI;EACnB,SAAS,IAAI;EACb,YAAY,IAAI;EAChB,UAAU,IAAI;EACd,MAAM,IAAI;EACV,UAAU,IAAI;EACd,YAAY,IAAI;EAChB,WAAW,IAAI;EACf,SAAS,IAAI;EACb,aAAa,IAAI;EACjB,WAAW,IAAI;EACf,SAAS,IAAI;EACb,WAAW,IAAI;EACf,WAAW,IAAI;EACf,IAAI;EACJ,MAAM,WAAW,IAAI,MAAM,IAAI,KAAK;EACrC;;;;;;;;AASH,MAAa,OAAO,MAAM;CACxB,MAAM;EACJ,cAAc,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC;EACjD,SAAS,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;EAClC,gBAAgB;EACjB;CACD,SAAS,WAAW,wBAAwB;CAC5C,SAAS,OAAO,KAAK,SAAS;AAC5B,MAAI,KAAK,iBAAiB,QAAW;GACnC,MAAM,SAAS,MAAM,UAAU,IAAI,IAAIA,eAAO,CAC3C,MAAM,sBAAsB,CAC5B,UAAU,gBAAgB,QACzB,IAAI,GAAG,cAAc,aAAa,CAAC,GAAG,YAAY,KAAK,aAAc,CACtE,CACA,MAAM,OAAO,CACb,SAAS,KAAK,eAAe;AAChC,UAAO;IAAE,GAAG;IAAQ,MAAM,OAAO,KAAK,IAAI,iBAAiB;IAAE;;AAE/D,MAAI,KAAK,YAAY,QAAW;GAC9B,MAAM,SAAS,MAAM,UAAU,IAAI,IAAIA,eAAO,CAC3C,MAAM,sBAAsB,CAC5B,UAAU,gBAAgB,QACzB,IAAI,GAAG,cAAc,QAAQ,CAAC,GAAG,YAAY,KAAK,QAAS,CAC5D,CACA,MAAM,OAAO,CACb,SAAS,KAAK,eAAe;AAChC,UAAO;IAAE,GAAG;IAAQ,MAAM,OAAO,KAAK,IAAI,iBAAiB;IAAE;;AAE/D,QAAM,IAAI,YAAY;GACpB,MAAM,UAAU;GAChB,SACE;GACH,CAAC;;CAEL,CAAC"}
1
+ {"version":3,"file":"audit.js","names":["schema"],"sources":["../../../src/component/connection/audit.ts"],"sourcesContent":["/**\n * `component.connection.audit.*` - Connection audit projections backed by auth events.\n *\n * @module\n */\n\nimport { paginationOptsValidator } from \"convex/server\";\nimport { paginator } from \"convex-helpers/server/pagination\";\nimport { ConvexError, v, type Infer } from \"convex/values\";\n\nimport { ErrorCode } from \"../../shared/codes\";\nimport { EVENT_KIND_CATEGORY, type AuthEventKind } from \"../../shared/event/kinds\";\nimport type { Doc } from \"../_generated/dataModel\";\nimport { query } from \"../functions\";\nimport { vAuthEventData, vAuthEventProjectionDoc, vPaginated } from \"../model\";\nimport schema from \"../schema\";\n\nconst PUBLIC_DATA_KEYS = {\n user: [\"type\", \"provider\", \"existingUserId\"],\n session: [\"provider\", \"method\", \"reason\"],\n account: [\"provider\", \"accountId\"],\n password: [\"userId\"],\n passkey: [\"passkeyId\"],\n totp: [\"totpId\"],\n email: [\"userId\"],\n phone: [\"userId\"],\n api_key: [\"keyId\", \"name\", \"prefix\", \"reason\"],\n oauth: [\"clientId\", \"codeId\", \"scopes\", \"grantType\", \"resource\"],\n connection: [\n \"connectionId\",\n \"protocol\",\n \"domain\",\n \"recordName\",\n \"expiresAt\",\n \"verifiedAt\",\n \"metadataUrl\",\n \"domains\",\n \"version\",\n \"errorCode\",\n \"issuer\",\n \"discoveryUrl\",\n \"jwksUri\",\n \"audience\",\n \"tokenEndpointAuthMethod\",\n ],\n scim: [\n \"scimConfigId\",\n \"resourceType\",\n \"resourceId\",\n \"operation\",\n \"externalId\",\n \"active\",\n \"groupId\",\n \"userId\",\n ],\n webhook: [\n \"endpointId\",\n \"deliveryId\",\n \"sourceEventId\",\n \"sourceEventType\",\n \"attemptCount\",\n \"status\",\n \"error\",\n ],\n security: [\"reason\", \"errorCode\"],\n} as const;\n\nfunction publicData(kind: AuthEventKind, value: unknown): Infer<typeof vAuthEventData> | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n const category = EVENT_KIND_CATEGORY[kind];\n const keys = PUBLIC_DATA_KEYS[category] ?? [];\n const source = value as Record<string, unknown>;\n const redacted: Record<string, unknown> = {};\n for (const key of keys) {\n const nested = source[key];\n if (nested !== undefined) redacted[key] = nested;\n }\n return Object.keys(redacted).length === 0\n ? undefined\n : (redacted as Infer<typeof vAuthEventData>);\n}\n\nfunction publicProjection(doc: Doc<\"AuthEventProjection\">) {\n return {\n _id: doc._id,\n _creationTime: doc._creationTime,\n eventId: doc.eventId,\n targetKind: doc.targetKind,\n targetId: doc.targetId,\n kind: doc.kind,\n category: doc.category,\n occurredAt: doc.occurredAt,\n actorType: doc.actorType,\n actorId: doc.actorId,\n subjectType: doc.subjectType,\n subjectId: doc.subjectId,\n outcome: doc.outcome,\n errorCode: doc.errorCode,\n requestId: doc.requestId,\n ip: undefined,\n data: publicData(doc.kind, doc.data),\n };\n}\n\n/**\n * List audit-event projections for a connection or a group, newest first and\n * paginated. Rows are redacted to public fields (IP dropped, `data` narrowed to\n * an allowlist). Requires exactly one of `connectionId` or `groupId` — passing\n * neither throws rather than scanning the entire audit log.\n */\nexport const list = query({\n args: {\n connectionId: v.optional(v.id(\"GroupConnection\")),\n groupId: v.optional(v.id(\"Group\")),\n paginationOpts: paginationOptsValidator,\n },\n returns: vPaginated(vAuthEventProjectionDoc),\n handler: async (ctx, args) => {\n if (args.connectionId !== undefined) {\n const result = await paginator(ctx.db, schema)\n .query(\"AuthEventProjection\")\n .withIndex(\"target_time\", (idx) =>\n idx.eq(\"targetKind\", \"connection\").eq(\"targetId\", args.connectionId!),\n )\n .order(\"desc\")\n .paginate(args.paginationOpts);\n return { ...result, page: result.page.map(publicProjection) };\n }\n if (args.groupId !== undefined) {\n const result = await paginator(ctx.db, schema)\n .query(\"AuthEventProjection\")\n .withIndex(\"target_time\", (idx) =>\n idx.eq(\"targetKind\", \"group\").eq(\"targetId\", args.groupId!),\n )\n .order(\"desc\")\n .paginate(args.paginationOpts);\n return { ...result, page: result.page.map(publicProjection) };\n }\n throw new ConvexError({\n code: ErrorCode.INVALID_PARAMETERS,\n message:\n \"connection.audit.list requires either `connectionId` or `groupId` to target the query. Passing neither would walk the entire audit log.\",\n });\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,MAAM,mBAAmB;CACvB,MAAM;EAAC;EAAQ;EAAY;EAAiB;CAC5C,SAAS;EAAC;EAAY;EAAU;EAAS;CACzC,SAAS,CAAC,YAAY,YAAY;CAClC,UAAU,CAAC,SAAS;CACpB,SAAS,CAAC,YAAY;CACtB,MAAM,CAAC,SAAS;CAChB,OAAO,CAAC,SAAS;CACjB,OAAO,CAAC,SAAS;CACjB,SAAS;EAAC;EAAS;EAAQ;EAAU;EAAS;CAC9C,OAAO;EAAC;EAAY;EAAU;EAAU;EAAa;EAAW;CAChE,YAAY;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,UAAU,CAAC,UAAU,YAAY;CAClC;AAED,SAAS,WAAW,MAAqB,OAA0D;AACjG,KAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,MAAM,CAAE,QAAO;CAEhF,MAAM,OAAO,iBADI,oBAAoB,UACM,EAAE;CAC7C,MAAM,SAAS;CACf,MAAM,WAAoC,EAAE;AAC5C,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,SAAS,OAAO;AACtB,MAAI,WAAW,OAAW,UAAS,OAAO;;AAE5C,QAAO,OAAO,KAAK,SAAS,CAAC,WAAW,IACpC,SACC;;AAGP,SAAS,iBAAiB,KAAiC;AACzD,QAAO;EACL,KAAK,IAAI;EACT,eAAe,IAAI;EACnB,SAAS,IAAI;EACb,YAAY,IAAI;EAChB,UAAU,IAAI;EACd,MAAM,IAAI;EACV,UAAU,IAAI;EACd,YAAY,IAAI;EAChB,WAAW,IAAI;EACf,SAAS,IAAI;EACb,aAAa,IAAI;EACjB,WAAW,IAAI;EACf,SAAS,IAAI;EACb,WAAW,IAAI;EACf,WAAW,IAAI;EACf,IAAI;EACJ,MAAM,WAAW,IAAI,MAAM,IAAI,KAAK;EACrC;;;;;;;;AASH,MAAa,OAAO,MAAM;CACxB,MAAM;EACJ,cAAc,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC;EACjD,SAAS,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;EAClC,gBAAgB;EACjB;CACD,SAAS,WAAW,wBAAwB;CAC5C,SAAS,OAAO,KAAK,SAAS;AAC5B,MAAI,KAAK,iBAAiB,QAAW;GACnC,MAAM,SAAS,MAAM,UAAU,IAAI,IAAIA,eAAO,CAC3C,MAAM,sBAAsB,CAC5B,UAAU,gBAAgB,QACzB,IAAI,GAAG,cAAc,aAAa,CAAC,GAAG,YAAY,KAAK,aAAc,CACtE,CACA,MAAM,OAAO,CACb,SAAS,KAAK,eAAe;AAChC,UAAO;IAAE,GAAG;IAAQ,MAAM,OAAO,KAAK,IAAI,iBAAiB;IAAE;;AAE/D,MAAI,KAAK,YAAY,QAAW;GAC9B,MAAM,SAAS,MAAM,UAAU,IAAI,IAAIA,eAAO,CAC3C,MAAM,sBAAsB,CAC5B,UAAU,gBAAgB,QACzB,IAAI,GAAG,cAAc,QAAQ,CAAC,GAAG,YAAY,KAAK,QAAS,CAC5D,CACA,MAAM,OAAO,CACb,SAAS,KAAK,eAAe;AAChC,UAAO;IAAE,GAAG;IAAQ,MAAM,OAAO,KAAK,IAAI,iBAAiB;IAAE;;AAE/D,QAAM,IAAI,YAAY;GACpB,MAAM,UAAU;GAChB,SACE;GACH,CAAC;;CAEL,CAAC"}
@@ -1,4 +1,4 @@
1
- import * as convex_server210 from "convex/server";
1
+ import * as convex_server215 from "convex/server";
2
2
 
3
3
  //#region src/component/connection/cache.d.ts
4
4
  declare namespace cache_d_exports {
@@ -27,7 +27,7 @@ declare namespace cache_d_exports {
27
27
  /**
28
28
  * Read-through fetch for OIDC discovery JSON. Cached 1h per URL.
29
29
  */
30
- declare const oidcDiscovery: convex_server210.RegisteredAction<"public", {
30
+ declare const oidcDiscovery: convex_server215.RegisteredAction<"public", {
31
31
  runtimeOrigin?: string | undefined;
32
32
  externalHost?: string | undefined;
33
33
  url: string;
@@ -45,7 +45,7 @@ declare const oidcDiscovery: convex_server210.RegisteredAction<"public", {
45
45
  * Cached 2h per URL (separate from the runtime sign-in path so admin
46
46
  * dashboards don't share keys with hot-path traffic).
47
47
  */
48
- declare const oidcStatusDiscovery: convex_server210.RegisteredAction<"public", {
48
+ declare const oidcStatusDiscovery: convex_server215.RegisteredAction<"public", {
49
49
  runtimeOrigin?: string | undefined;
50
50
  externalHost?: string | undefined;
51
51
  url: string;
@@ -61,19 +61,19 @@ declare const oidcStatusDiscovery: convex_server210.RegisteredAction<"public", {
61
61
  /**
62
62
  * Read-through fetch for SAML IdP metadata XML. Cached 24h per URL.
63
63
  */
64
- declare const samlMetadata: convex_server210.RegisteredAction<"public", {
64
+ declare const samlMetadata: convex_server215.RegisteredAction<"public", {
65
65
  runtimeOrigin?: string | undefined;
66
66
  externalHost?: string | undefined;
67
67
  url: string;
68
68
  }, Promise<string>>;
69
69
  /** Invalidate a cached OIDC discovery entry (e.g. on `discoveryUrl` update). */
70
- declare const invalidateOidcDiscovery: convex_server210.RegisteredMutation<"public", {
70
+ declare const invalidateOidcDiscovery: convex_server215.RegisteredMutation<"public", {
71
71
  runtimeOrigin?: string | undefined;
72
72
  externalHost?: string | undefined;
73
73
  url: string;
74
74
  }, Promise<null>>;
75
75
  /** Invalidate a cached SAML metadata entry (e.g. on `metadataUrl` update). */
76
- declare const invalidateSamlMetadata: convex_server210.RegisteredMutation<"public", {
76
+ declare const invalidateSamlMetadata: convex_server215.RegisteredMutation<"public", {
77
77
  runtimeOrigin?: string | undefined;
78
78
  externalHost?: string | undefined;
79
79
  url: string;