@robelest/convex-auth 0.0.4-preview.13 → 0.0.4-preview.16

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 (328) hide show
  1. package/README.md +140 -9
  2. package/dist/bin.cjs +5957 -5478
  3. package/dist/client/index.d.ts +3 -7
  4. package/dist/client/index.d.ts.map +1 -1
  5. package/dist/client/index.js +27 -26
  6. package/dist/client/index.js.map +1 -1
  7. package/dist/component/_generated/api.d.ts +14 -0
  8. package/dist/component/_generated/api.d.ts.map +1 -1
  9. package/dist/component/_generated/api.js.map +1 -1
  10. package/dist/component/_generated/component.d.ts +1672 -24
  11. package/dist/component/_generated/component.d.ts.map +1 -1
  12. package/dist/component/convex.config.d.ts +2 -2
  13. package/dist/component/convex.config.d.ts.map +1 -1
  14. package/dist/component/index.d.ts +1 -1
  15. package/dist/component/index.js +2 -2
  16. package/dist/component/model.d.ts +153 -0
  17. package/dist/component/model.d.ts.map +1 -0
  18. package/dist/component/model.js +343 -0
  19. package/dist/component/model.js.map +1 -0
  20. package/dist/component/providers/sso.d.ts +1 -1
  21. package/dist/component/public/enterprise.d.ts +54 -0
  22. package/dist/component/public/enterprise.d.ts.map +1 -0
  23. package/dist/component/public/enterprise.js +515 -0
  24. package/dist/component/public/enterprise.js.map +1 -0
  25. package/dist/component/public/factors.d.ts +52 -0
  26. package/dist/component/public/factors.d.ts.map +1 -0
  27. package/dist/component/public/factors.js +285 -0
  28. package/dist/component/public/factors.js.map +1 -0
  29. package/dist/component/public/groups.d.ts +116 -0
  30. package/dist/component/public/groups.d.ts.map +1 -0
  31. package/dist/component/public/groups.js +596 -0
  32. package/dist/component/public/groups.js.map +1 -0
  33. package/dist/component/public/identity.d.ts +93 -0
  34. package/dist/component/public/identity.d.ts.map +1 -0
  35. package/dist/component/public/identity.js +426 -0
  36. package/dist/component/public/identity.js.map +1 -0
  37. package/dist/component/public/keys.d.ts +41 -0
  38. package/dist/component/public/keys.d.ts.map +1 -0
  39. package/dist/component/public/keys.js +157 -0
  40. package/dist/component/public/keys.js.map +1 -0
  41. package/dist/component/public/shared.d.ts +26 -0
  42. package/dist/component/public/shared.d.ts.map +1 -0
  43. package/dist/component/public/shared.js +32 -0
  44. package/dist/component/public/shared.js.map +1 -0
  45. package/dist/component/public.d.ts +9 -321
  46. package/dist/component/public.d.ts.map +1 -1
  47. package/dist/component/public.js +6 -2145
  48. package/dist/component/schema.d.ts +406 -260
  49. package/dist/component/schema.js +37 -32
  50. package/dist/component/schema.js.map +1 -1
  51. package/dist/component/server/auth.d.ts +161 -15
  52. package/dist/component/server/auth.d.ts.map +1 -1
  53. package/dist/component/server/auth.js +100 -7
  54. package/dist/component/server/auth.js.map +1 -1
  55. package/dist/component/server/cookies.js +3 -0
  56. package/dist/component/server/cookies.js.map +1 -1
  57. package/dist/component/server/db.js +1 -0
  58. package/dist/component/server/db.js.map +1 -1
  59. package/dist/component/server/device.js +3 -1
  60. package/dist/component/server/device.js.map +1 -1
  61. package/dist/component/server/domains/core.js +629 -0
  62. package/dist/component/server/domains/core.js.map +1 -0
  63. package/dist/component/server/domains/sso.js +884 -0
  64. package/dist/component/server/domains/sso.js.map +1 -0
  65. package/dist/component/server/factory.d.ts +136 -0
  66. package/dist/component/server/factory.d.ts.map +1 -0
  67. package/dist/component/server/factory.js +1134 -0
  68. package/dist/component/server/factory.js.map +1 -0
  69. package/dist/component/server/fx.js +2 -1
  70. package/dist/component/server/fx.js.map +1 -1
  71. package/dist/component/server/http.js +287 -0
  72. package/dist/component/server/http.js.map +1 -0
  73. package/dist/component/server/identity.js +13 -0
  74. package/dist/component/server/identity.js.map +1 -0
  75. package/dist/component/server/keys.js +4 -0
  76. package/dist/component/server/keys.js.map +1 -1
  77. package/dist/component/server/mutations/account.js +1 -1
  78. package/dist/component/server/mutations/index.js +2 -2
  79. package/dist/component/server/mutations/index.js.map +1 -1
  80. package/dist/component/server/mutations/invalidate.js +1 -1
  81. package/dist/component/server/mutations/oauth.js +10 -7
  82. package/dist/component/server/mutations/oauth.js.map +1 -1
  83. package/dist/component/server/mutations/refresh.js +1 -1
  84. package/dist/component/server/mutations/register.js +1 -1
  85. package/dist/component/server/mutations/retrieve.js +1 -1
  86. package/dist/component/server/mutations/signature.js +1 -1
  87. package/dist/component/server/mutations/store.js +6 -3
  88. package/dist/component/server/mutations/store.js.map +1 -1
  89. package/dist/component/server/mutations/verify.js +1 -1
  90. package/dist/component/server/oauth.js +3 -0
  91. package/dist/component/server/oauth.js.map +1 -1
  92. package/dist/component/server/passkey.js +3 -2
  93. package/dist/component/server/passkey.js.map +1 -1
  94. package/dist/component/server/provider.js +2 -0
  95. package/dist/component/server/provider.js.map +1 -1
  96. package/dist/component/server/providers.js +10 -0
  97. package/dist/component/server/providers.js.map +1 -1
  98. package/dist/component/server/ratelimit.js +3 -0
  99. package/dist/component/server/ratelimit.js.map +1 -1
  100. package/dist/component/server/redirects.js +2 -0
  101. package/dist/component/server/redirects.js.map +1 -1
  102. package/dist/component/server/refresh.js +5 -0
  103. package/dist/component/server/refresh.js.map +1 -1
  104. package/dist/component/server/sessions.js +5 -0
  105. package/dist/component/server/sessions.js.map +1 -1
  106. package/dist/component/server/signin.js +2 -1
  107. package/dist/component/server/signin.js.map +1 -1
  108. package/dist/component/server/sso.js +166 -19
  109. package/dist/component/server/sso.js.map +1 -1
  110. package/dist/component/server/tokens.js +1 -0
  111. package/dist/component/server/tokens.js.map +1 -1
  112. package/dist/component/server/totp.js +4 -2
  113. package/dist/component/server/totp.js.map +1 -1
  114. package/dist/component/server/types.d.ts +106 -38
  115. package/dist/component/server/types.d.ts.map +1 -1
  116. package/dist/component/server/types.js.map +1 -1
  117. package/dist/component/server/users.js +1 -0
  118. package/dist/component/server/users.js.map +1 -1
  119. package/dist/component/server/utils.js +44 -2
  120. package/dist/component/server/utils.js.map +1 -1
  121. package/dist/providers/anonymous.d.ts +1 -1
  122. package/dist/providers/credentials.d.ts +1 -1
  123. package/dist/providers/password.d.ts +1 -1
  124. package/dist/providers/sso.d.ts +1 -1
  125. package/dist/providers/sso.js.map +1 -1
  126. package/dist/server/auth.d.ts +163 -17
  127. package/dist/server/auth.d.ts.map +1 -1
  128. package/dist/server/auth.js +100 -7
  129. package/dist/server/auth.js.map +1 -1
  130. package/dist/server/cookies.d.ts +1 -38
  131. package/dist/server/cookies.js +3 -0
  132. package/dist/server/cookies.js.map +1 -1
  133. package/dist/server/db.d.ts +1 -125
  134. package/dist/server/db.js +1 -0
  135. package/dist/server/db.js.map +1 -1
  136. package/dist/server/device.d.ts +1 -24
  137. package/dist/server/device.js +3 -1
  138. package/dist/server/device.js.map +1 -1
  139. package/dist/server/domains/core.d.ts +434 -0
  140. package/dist/server/domains/core.d.ts.map +1 -0
  141. package/dist/server/domains/core.js +629 -0
  142. package/dist/server/domains/core.js.map +1 -0
  143. package/dist/server/domains/sso.d.ts +409 -0
  144. package/dist/server/domains/sso.d.ts.map +1 -0
  145. package/dist/server/domains/sso.js +884 -0
  146. package/dist/server/domains/sso.js.map +1 -0
  147. package/dist/server/enterpriseValidators.d.ts +1 -0
  148. package/dist/server/enterpriseValidators.js +60 -0
  149. package/dist/server/enterpriseValidators.js.map +1 -0
  150. package/dist/server/factory.d.ts +136 -0
  151. package/dist/server/factory.d.ts.map +1 -0
  152. package/dist/server/factory.js +1134 -0
  153. package/dist/server/factory.js.map +1 -0
  154. package/dist/server/fx.d.ts +1 -16
  155. package/dist/server/fx.d.ts.map +1 -1
  156. package/dist/server/fx.js +1 -0
  157. package/dist/server/fx.js.map +1 -1
  158. package/dist/server/http.d.ts +59 -0
  159. package/dist/server/http.d.ts.map +1 -0
  160. package/dist/server/http.js +287 -0
  161. package/dist/server/http.js.map +1 -0
  162. package/dist/server/identity.d.ts +1 -0
  163. package/dist/server/identity.js +13 -0
  164. package/dist/server/identity.js.map +1 -0
  165. package/dist/server/index.d.ts +468 -1
  166. package/dist/server/index.d.ts.map +1 -1
  167. package/dist/server/index.js +530 -36
  168. package/dist/server/index.js.map +1 -1
  169. package/dist/server/keys.d.ts +1 -57
  170. package/dist/server/keys.js +4 -0
  171. package/dist/server/keys.js.map +1 -1
  172. package/dist/server/mutations/account.d.ts +7 -7
  173. package/dist/server/mutations/account.d.ts.map +1 -1
  174. package/dist/server/mutations/code.d.ts +13 -13
  175. package/dist/server/mutations/code.d.ts.map +1 -1
  176. package/dist/server/mutations/index.d.ts +107 -107
  177. package/dist/server/mutations/index.d.ts.map +1 -1
  178. package/dist/server/mutations/index.js +1 -1
  179. package/dist/server/mutations/index.js.map +1 -1
  180. package/dist/server/mutations/invalidate.d.ts +5 -5
  181. package/dist/server/mutations/invalidate.d.ts.map +1 -1
  182. package/dist/server/mutations/oauth.d.ts +10 -10
  183. package/dist/server/mutations/oauth.d.ts.map +1 -1
  184. package/dist/server/mutations/oauth.js +9 -6
  185. package/dist/server/mutations/oauth.js.map +1 -1
  186. package/dist/server/mutations/refresh.d.ts +4 -4
  187. package/dist/server/mutations/register.d.ts +12 -12
  188. package/dist/server/mutations/register.d.ts.map +1 -1
  189. package/dist/server/mutations/retrieve.d.ts +7 -7
  190. package/dist/server/mutations/signature.d.ts +5 -5
  191. package/dist/server/mutations/signin.d.ts +6 -6
  192. package/dist/server/mutations/signin.d.ts.map +1 -1
  193. package/dist/server/mutations/signout.d.ts +1 -1
  194. package/dist/server/mutations/store.d.ts +3 -2
  195. package/dist/server/mutations/store.d.ts.map +1 -1
  196. package/dist/server/mutations/store.js +6 -3
  197. package/dist/server/mutations/store.js.map +1 -1
  198. package/dist/server/mutations/verifier.d.ts +1 -1
  199. package/dist/server/mutations/verify.d.ts +11 -11
  200. package/dist/server/mutations/verify.d.ts.map +1 -1
  201. package/dist/server/oauth.d.ts +1 -59
  202. package/dist/server/oauth.js +3 -0
  203. package/dist/server/oauth.js.map +1 -1
  204. package/dist/server/passkey.d.ts.map +1 -1
  205. package/dist/server/passkey.js +3 -2
  206. package/dist/server/passkey.js.map +1 -1
  207. package/dist/server/provider.d.ts +1 -14
  208. package/dist/server/provider.d.ts.map +1 -1
  209. package/dist/server/provider.js +2 -0
  210. package/dist/server/provider.js.map +1 -1
  211. package/dist/server/providers.js +10 -0
  212. package/dist/server/providers.js.map +1 -1
  213. package/dist/server/ratelimit.d.ts +1 -22
  214. package/dist/server/ratelimit.js +3 -0
  215. package/dist/server/ratelimit.js.map +1 -1
  216. package/dist/server/redirects.d.ts +1 -10
  217. package/dist/server/redirects.js +2 -0
  218. package/dist/server/redirects.js.map +1 -1
  219. package/dist/server/refresh.d.ts +1 -37
  220. package/dist/server/refresh.js +5 -0
  221. package/dist/server/refresh.js.map +1 -1
  222. package/dist/server/sessions.d.ts +1 -28
  223. package/dist/server/sessions.js +5 -0
  224. package/dist/server/sessions.js.map +1 -1
  225. package/dist/server/signin.d.ts +1 -55
  226. package/dist/server/signin.js +2 -1
  227. package/dist/server/signin.js.map +1 -1
  228. package/dist/server/sso.d.ts +1 -348
  229. package/dist/server/sso.js +165 -18
  230. package/dist/server/sso.js.map +1 -1
  231. package/dist/server/templates.d.ts +1 -21
  232. package/dist/server/templates.js +1 -0
  233. package/dist/server/templates.js.map +1 -1
  234. package/dist/server/tokens.d.ts +1 -11
  235. package/dist/server/tokens.js +1 -0
  236. package/dist/server/tokens.js.map +1 -1
  237. package/dist/server/totp.d.ts +1 -23
  238. package/dist/server/totp.js +4 -2
  239. package/dist/server/totp.js.map +1 -1
  240. package/dist/server/types.d.ts +114 -77
  241. package/dist/server/types.d.ts.map +1 -1
  242. package/dist/server/types.js.map +1 -1
  243. package/dist/server/users.d.ts +1 -31
  244. package/dist/server/users.js +1 -0
  245. package/dist/server/users.js.map +1 -1
  246. package/dist/server/utils.d.ts +1 -27
  247. package/dist/server/utils.js +44 -2
  248. package/dist/server/utils.js.map +1 -1
  249. package/dist/server/version.d.ts +1 -1
  250. package/dist/server/version.js +1 -1
  251. package/dist/server/version.js.map +1 -1
  252. package/package.json +4 -5
  253. package/src/cli/bin.ts +5 -0
  254. package/src/cli/index.ts +22 -9
  255. package/src/cli/keys.ts +3 -0
  256. package/src/client/index.ts +36 -37
  257. package/src/component/_generated/api.ts +14 -0
  258. package/src/component/_generated/component.ts +2106 -9
  259. package/src/component/index.ts +3 -1
  260. package/src/component/model.ts +441 -0
  261. package/src/component/public/enterprise.ts +753 -0
  262. package/src/component/public/factors.ts +332 -0
  263. package/src/component/public/groups.ts +932 -0
  264. package/src/component/public/identity.ts +566 -0
  265. package/src/component/public/keys.ts +209 -0
  266. package/src/component/public/shared.ts +119 -0
  267. package/src/component/public.ts +5 -2965
  268. package/src/component/schema.ts +68 -63
  269. package/src/providers/sso.ts +1 -1
  270. package/src/server/auth.ts +413 -18
  271. package/src/server/cookies.ts +3 -0
  272. package/src/server/db.ts +3 -0
  273. package/src/server/device.ts +3 -1
  274. package/src/server/domains/core.ts +1071 -0
  275. package/src/server/domains/sso.ts +1749 -0
  276. package/src/server/enterpriseValidators.ts +93 -0
  277. package/src/server/factory.ts +2181 -0
  278. package/src/server/fx.ts +1 -0
  279. package/src/server/http.ts +529 -0
  280. package/src/server/identity.ts +18 -0
  281. package/src/server/index.ts +806 -40
  282. package/src/server/keys.ts +4 -0
  283. package/src/server/mutations/index.ts +1 -1
  284. package/src/server/mutations/oauth.ts +36 -8
  285. package/src/server/mutations/store.ts +6 -3
  286. package/src/server/oauth.ts +6 -0
  287. package/src/server/passkey.ts +3 -2
  288. package/src/server/provider.ts +2 -0
  289. package/src/server/providers.ts +20 -0
  290. package/src/server/ratelimit.ts +3 -0
  291. package/src/server/redirects.ts +2 -0
  292. package/src/server/refresh.ts +5 -0
  293. package/src/server/sessions.ts +5 -0
  294. package/src/server/signin.ts +1 -0
  295. package/src/server/sso.ts +259 -17
  296. package/src/server/templates.ts +1 -0
  297. package/src/server/tokens.ts +1 -0
  298. package/src/server/totp.ts +4 -2
  299. package/src/server/types.ts +178 -83
  300. package/src/server/users.ts +1 -0
  301. package/src/server/utils.ts +71 -1
  302. package/src/server/version.ts +1 -1
  303. package/dist/component/public.js.map +0 -1
  304. package/dist/component/server/implementation.d.ts +0 -1264
  305. package/dist/component/server/implementation.d.ts.map +0 -1
  306. package/dist/component/server/implementation.js +0 -2365
  307. package/dist/component/server/implementation.js.map +0 -1
  308. package/dist/server/cookies.d.ts.map +0 -1
  309. package/dist/server/db.d.ts.map +0 -1
  310. package/dist/server/device.d.ts.map +0 -1
  311. package/dist/server/implementation.d.ts +0 -1264
  312. package/dist/server/implementation.d.ts.map +0 -1
  313. package/dist/server/implementation.js +0 -2365
  314. package/dist/server/implementation.js.map +0 -1
  315. package/dist/server/keys.d.ts.map +0 -1
  316. package/dist/server/oauth.d.ts.map +0 -1
  317. package/dist/server/ratelimit.d.ts.map +0 -1
  318. package/dist/server/redirects.d.ts.map +0 -1
  319. package/dist/server/refresh.d.ts.map +0 -1
  320. package/dist/server/sessions.d.ts.map +0 -1
  321. package/dist/server/signin.d.ts.map +0 -1
  322. package/dist/server/sso.d.ts.map +0 -1
  323. package/dist/server/templates.d.ts.map +0 -1
  324. package/dist/server/tokens.d.ts.map +0 -1
  325. package/dist/server/totp.d.ts.map +0 -1
  326. package/dist/server/users.d.ts.map +0 -1
  327. package/dist/server/utils.d.ts.map +0 -1
  328. package/src/server/implementation.ts +0 -5336
@@ -7,7 +7,7 @@
7
7
  * @module
8
8
  */
9
9
 
10
- export { AuthCtx, createAuth } from "../server/auth";
10
+ export { AuthCtx, createAuth, defineRoles } from "../server/auth";
11
11
  export type {
12
12
  AuthApi,
13
13
  AuthConfig,
@@ -26,6 +26,8 @@ export type {
26
26
  KeyScope,
27
27
  ScopeChecker,
28
28
  KeyRecord,
29
+ EnterprisePolicy,
30
+ EnterprisePolicyPatch,
29
31
  HttpKeyContext,
30
32
  CorsConfig,
31
33
  DeviceProviderConfig,
@@ -0,0 +1,441 @@
1
+ import { v } from "convex/values";
2
+
3
+ export const TABLES = {
4
+ User: "User",
5
+ Session: "Session",
6
+ Account: "Account",
7
+ AuthVerifier: "AuthVerifier",
8
+ VerificationCode: "VerificationCode",
9
+ RefreshToken: "RefreshToken",
10
+ Passkey: "Passkey",
11
+ TotpFactor: "TotpFactor",
12
+ RateLimit: "RateLimit",
13
+ Group: "Group",
14
+ GroupTag: "GroupTag",
15
+ GroupMember: "GroupMember",
16
+ GroupInvite: "GroupInvite",
17
+ Enterprise: "Enterprise",
18
+ EnterpriseDomain: "EnterpriseDomain",
19
+ EnterpriseDomainVerification: "EnterpriseDomainVerification",
20
+ EnterpriseSecret: "EnterpriseSecret",
21
+ EnterpriseScimConfig: "EnterpriseScimConfig",
22
+ EnterpriseScimIdentity: "EnterpriseScimIdentity",
23
+ EnterpriseAuditEvent: "EnterpriseAuditEvent",
24
+ EnterpriseWebhookEndpoint: "EnterpriseWebhookEndpoint",
25
+ EnterpriseWebhookDelivery: "EnterpriseWebhookDelivery",
26
+ ApiKey: "ApiKey",
27
+ DeviceCode: "DeviceCode",
28
+ } as const;
29
+
30
+ export const vTag = v.object({ key: v.string(), value: v.string() });
31
+
32
+ export const vInviteStatus = v.union(
33
+ v.literal("pending"),
34
+ v.literal("accepted"),
35
+ v.literal("revoked"),
36
+ v.literal("expired"),
37
+ );
38
+
39
+ export const vDeviceStatus = v.union(
40
+ v.literal("pending"),
41
+ v.literal("authorized"),
42
+ v.literal("denied"),
43
+ );
44
+
45
+ export const vEnterpriseAccountLinkingPolicy = v.union(
46
+ v.literal("verifiedEmail"),
47
+ v.literal("none"),
48
+ );
49
+
50
+ export const vEnterpriseScimReuseUserPolicy = v.union(
51
+ v.literal("externalId"),
52
+ v.literal("none"),
53
+ );
54
+
55
+ export const vEnterpriseJitProvisioningMode = v.union(
56
+ v.literal("off"),
57
+ v.literal("createUser"),
58
+ v.literal("createUserAndMembership"),
59
+ );
60
+
61
+ export const vEnterpriseDeprovisionMode = v.union(
62
+ v.literal("soft"),
63
+ v.literal("hard"),
64
+ );
65
+
66
+ export const vEnterpriseStatus = v.union(
67
+ v.literal("draft"),
68
+ v.literal("active"),
69
+ v.literal("disabled"),
70
+ );
71
+
72
+ export const vEnterprisePolicy = v.object({
73
+ version: v.literal(1),
74
+ identity: v.object({
75
+ accountLinking: v.object({
76
+ oidc: vEnterpriseAccountLinkingPolicy,
77
+ saml: vEnterpriseAccountLinkingPolicy,
78
+ }),
79
+ }),
80
+ provisioning: v.object({
81
+ scimReuse: v.object({
82
+ user: vEnterpriseScimReuseUserPolicy,
83
+ }),
84
+ jit: v.object({
85
+ mode: vEnterpriseJitProvisioningMode,
86
+ defaultRole: v.optional(v.string()),
87
+ defaultRoleIds: v.optional(v.array(v.string())),
88
+ }),
89
+ deprovision: v.object({
90
+ mode: vEnterpriseDeprovisionMode,
91
+ }),
92
+ }),
93
+ extend: v.optional(v.any()),
94
+ });
95
+
96
+ export const vScimStatus = v.union(
97
+ v.literal("draft"),
98
+ v.literal("active"),
99
+ v.literal("disabled"),
100
+ );
101
+
102
+ export const vScimResourceType = v.union(v.literal("user"), v.literal("group"));
103
+
104
+ export const vAuditActorType = v.union(
105
+ v.literal("user"),
106
+ v.literal("system"),
107
+ v.literal("scim"),
108
+ v.literal("api_key"),
109
+ v.literal("webhook"),
110
+ );
111
+
112
+ export const vAuditStatus = v.union(v.literal("success"), v.literal("failure"));
113
+
114
+ export const vWebhookEndpointStatus = v.union(
115
+ v.literal("active"),
116
+ v.literal("disabled"),
117
+ );
118
+
119
+ export const vWebhookDeliveryStatus = v.union(
120
+ v.literal("pending"),
121
+ v.literal("processing"),
122
+ v.literal("delivered"),
123
+ v.literal("failed"),
124
+ );
125
+
126
+ export const vInviteTokenAcceptStatus = v.union(
127
+ v.literal("accepted"),
128
+ v.literal("already_accepted"),
129
+ );
130
+
131
+ export const vMembershipStatus = v.union(
132
+ v.literal("joined"),
133
+ v.literal("already_joined"),
134
+ v.literal("not_applicable"),
135
+ );
136
+
137
+ export const vApiKeyScope = v.object({
138
+ resource: v.string(),
139
+ actions: v.array(v.string()),
140
+ });
141
+
142
+ export const vApiKeyRateLimit = v.object({
143
+ maxRequests: v.number(),
144
+ windowMs: v.number(),
145
+ });
146
+
147
+ export const vApiKeyRateLimitState = v.object({
148
+ attemptsLeft: v.number(),
149
+ lastAttemptTime: v.number(),
150
+ });
151
+
152
+ export const vEnterpriseSecretKind = v.union(v.literal("oidc_client_secret"));
153
+
154
+ function vDocMeta<T extends (typeof TABLES)[keyof typeof TABLES]>(
155
+ tableName: T,
156
+ ) {
157
+ return {
158
+ _id: v.id(tableName),
159
+ _creationTime: v.number(),
160
+ };
161
+ }
162
+
163
+ export const vUserDoc = v.object({
164
+ ...vDocMeta(TABLES.User),
165
+ name: v.optional(v.string()),
166
+ image: v.optional(v.string()),
167
+ email: v.optional(v.string()),
168
+ emailVerificationTime: v.optional(v.number()),
169
+ phone: v.optional(v.string()),
170
+ phoneVerificationTime: v.optional(v.number()),
171
+ isAnonymous: v.optional(v.boolean()),
172
+ extend: v.optional(v.any()),
173
+ });
174
+
175
+ export const vSessionDoc = v.object({
176
+ ...vDocMeta(TABLES.Session),
177
+ userId: v.id(TABLES.User),
178
+ expirationTime: v.number(),
179
+ });
180
+
181
+ export const vAccountDoc = v.object({
182
+ ...vDocMeta(TABLES.Account),
183
+ userId: v.id(TABLES.User),
184
+ provider: v.string(),
185
+ providerAccountId: v.string(),
186
+ secret: v.optional(v.string()),
187
+ emailVerified: v.optional(v.string()),
188
+ phoneVerified: v.optional(v.string()),
189
+ extend: v.optional(v.any()),
190
+ });
191
+
192
+ export const vAuthVerifierDoc = v.object({
193
+ ...vDocMeta(TABLES.AuthVerifier),
194
+ sessionId: v.optional(v.id(TABLES.Session)),
195
+ signature: v.optional(v.string()),
196
+ });
197
+
198
+ export const vVerificationCodeDoc = v.object({
199
+ ...vDocMeta(TABLES.VerificationCode),
200
+ accountId: v.id(TABLES.Account),
201
+ provider: v.string(),
202
+ code: v.string(),
203
+ expirationTime: v.number(),
204
+ verifier: v.optional(v.string()),
205
+ emailVerified: v.optional(v.string()),
206
+ phoneVerified: v.optional(v.string()),
207
+ });
208
+
209
+ export const vRefreshTokenDoc = v.object({
210
+ ...vDocMeta(TABLES.RefreshToken),
211
+ sessionId: v.id(TABLES.Session),
212
+ expirationTime: v.number(),
213
+ firstUsedTime: v.optional(v.number()),
214
+ parentRefreshTokenId: v.optional(v.id(TABLES.RefreshToken)),
215
+ });
216
+
217
+ export const vPasskeyDoc = v.object({
218
+ ...vDocMeta(TABLES.Passkey),
219
+ userId: v.id(TABLES.User),
220
+ credentialId: v.string(),
221
+ publicKey: v.bytes(),
222
+ algorithm: v.number(),
223
+ counter: v.number(),
224
+ transports: v.optional(v.array(v.string())),
225
+ deviceType: v.string(),
226
+ backedUp: v.boolean(),
227
+ name: v.optional(v.string()),
228
+ createdAt: v.number(),
229
+ lastUsedAt: v.optional(v.number()),
230
+ });
231
+
232
+ export const vTotpFactorDoc = v.object({
233
+ ...vDocMeta(TABLES.TotpFactor),
234
+ userId: v.id(TABLES.User),
235
+ secret: v.bytes(),
236
+ digits: v.number(),
237
+ period: v.number(),
238
+ verified: v.boolean(),
239
+ name: v.optional(v.string()),
240
+ createdAt: v.number(),
241
+ lastUsedAt: v.optional(v.number()),
242
+ });
243
+
244
+ export const vRateLimitDoc = v.object({
245
+ ...vDocMeta(TABLES.RateLimit),
246
+ identifier: v.string(),
247
+ last_attempt_time: v.number(),
248
+ attempts_left: v.number(),
249
+ });
250
+
251
+ export const vGroupDoc = v.object({
252
+ ...vDocMeta(TABLES.Group),
253
+ name: v.string(),
254
+ slug: v.optional(v.string()),
255
+ type: v.optional(v.string()),
256
+ parentGroupId: v.optional(v.id(TABLES.Group)),
257
+ tags: v.optional(v.array(vTag)),
258
+ extend: v.optional(v.any()),
259
+ });
260
+
261
+ export const vGroupMemberDoc = v.object({
262
+ ...vDocMeta(TABLES.GroupMember),
263
+ groupId: v.id(TABLES.Group),
264
+ userId: v.id(TABLES.User),
265
+ role: v.optional(v.string()),
266
+ roleIds: v.optional(v.array(v.string())),
267
+ status: v.optional(v.string()),
268
+ extend: v.optional(v.any()),
269
+ });
270
+
271
+ export const vGroupInviteDoc = v.object({
272
+ ...vDocMeta(TABLES.GroupInvite),
273
+ groupId: v.optional(v.id(TABLES.Group)),
274
+ invitedByUserId: v.optional(v.id(TABLES.User)),
275
+ email: v.optional(v.string()),
276
+ tokenHash: v.string(),
277
+ role: v.optional(v.string()),
278
+ roleIds: v.optional(v.array(v.string())),
279
+ status: vInviteStatus,
280
+ expiresTime: v.optional(v.number()),
281
+ acceptedByUserId: v.optional(v.id(TABLES.User)),
282
+ acceptedTime: v.optional(v.number()),
283
+ extend: v.optional(v.any()),
284
+ });
285
+
286
+ export const vApiKeyDoc = v.object({
287
+ ...vDocMeta(TABLES.ApiKey),
288
+ userId: v.id(TABLES.User),
289
+ prefix: v.string(),
290
+ hashedKey: v.string(),
291
+ name: v.string(),
292
+ scopes: v.array(vApiKeyScope),
293
+ rateLimit: v.optional(vApiKeyRateLimit),
294
+ rateLimitState: v.optional(vApiKeyRateLimitState),
295
+ expiresAt: v.optional(v.number()),
296
+ lastUsedAt: v.optional(v.number()),
297
+ createdAt: v.number(),
298
+ revoked: v.boolean(),
299
+ metadata: v.optional(v.any()),
300
+ });
301
+
302
+ export const vDeviceCodeDoc = v.object({
303
+ ...vDocMeta(TABLES.DeviceCode),
304
+ deviceCodeHash: v.string(),
305
+ userCode: v.string(),
306
+ expiresAt: v.number(),
307
+ interval: v.number(),
308
+ status: vDeviceStatus,
309
+ userId: v.optional(v.id(TABLES.User)),
310
+ sessionId: v.optional(v.id(TABLES.Session)),
311
+ lastPolledAt: v.optional(v.number()),
312
+ });
313
+
314
+ export const vEnterpriseDoc = v.object({
315
+ ...vDocMeta(TABLES.Enterprise),
316
+ groupId: v.id(TABLES.Group),
317
+ slug: v.optional(v.string()),
318
+ name: v.optional(v.string()),
319
+ status: vEnterpriseStatus,
320
+ policy: v.optional(vEnterprisePolicy),
321
+ config: v.optional(v.any()),
322
+ extend: v.optional(v.any()),
323
+ });
324
+
325
+ export const vEnterpriseDomainDoc = v.object({
326
+ ...vDocMeta(TABLES.EnterpriseDomain),
327
+ enterpriseId: v.id(TABLES.Enterprise),
328
+ groupId: v.id(TABLES.Group),
329
+ domain: v.string(),
330
+ isPrimary: v.boolean(),
331
+ verifiedAt: v.optional(v.number()),
332
+ });
333
+
334
+ export const vEnterpriseDomainVerificationDoc = v.object({
335
+ ...vDocMeta(TABLES.EnterpriseDomainVerification),
336
+ enterpriseId: v.id(TABLES.Enterprise),
337
+ groupId: v.id(TABLES.Group),
338
+ domainId: v.id(TABLES.EnterpriseDomain),
339
+ domain: v.string(),
340
+ recordName: v.string(),
341
+ token: v.string(),
342
+ tokenHash: v.string(),
343
+ requestedAt: v.number(),
344
+ expiresAt: v.number(),
345
+ });
346
+
347
+ export const vEnterpriseSecretDoc = v.object({
348
+ ...vDocMeta(TABLES.EnterpriseSecret),
349
+ enterpriseId: v.id(TABLES.Enterprise),
350
+ groupId: v.id(TABLES.Group),
351
+ kind: vEnterpriseSecretKind,
352
+ ciphertext: v.string(),
353
+ updatedAt: v.number(),
354
+ });
355
+
356
+ export const vEnterpriseScimConfigDoc = v.object({
357
+ ...vDocMeta(TABLES.EnterpriseScimConfig),
358
+ enterpriseId: v.id(TABLES.Enterprise),
359
+ groupId: v.id(TABLES.Group),
360
+ status: vScimStatus,
361
+ basePath: v.string(),
362
+ tokenHash: v.string(),
363
+ lastRotatedAt: v.optional(v.number()),
364
+ extend: v.optional(v.any()),
365
+ });
366
+
367
+ export const vEnterpriseScimIdentityDoc = v.object({
368
+ ...vDocMeta(TABLES.EnterpriseScimIdentity),
369
+ enterpriseId: v.id(TABLES.Enterprise),
370
+ groupId: v.id(TABLES.Group),
371
+ resourceType: vScimResourceType,
372
+ externalId: v.string(),
373
+ userId: v.optional(v.id(TABLES.User)),
374
+ mappedGroupId: v.optional(v.id(TABLES.Group)),
375
+ lastProvisionedAt: v.optional(v.number()),
376
+ active: v.optional(v.boolean()),
377
+ raw: v.optional(v.any()),
378
+ });
379
+
380
+ export const vEnterpriseAuditEventDoc = v.object({
381
+ ...vDocMeta(TABLES.EnterpriseAuditEvent),
382
+ enterpriseId: v.id(TABLES.Enterprise),
383
+ groupId: v.id(TABLES.Group),
384
+ eventType: v.string(),
385
+ actorType: vAuditActorType,
386
+ actorId: v.optional(v.string()),
387
+ subjectType: v.string(),
388
+ subjectId: v.optional(v.string()),
389
+ status: vAuditStatus,
390
+ occurredAt: v.number(),
391
+ requestId: v.optional(v.string()),
392
+ ip: v.optional(v.string()),
393
+ metadata: v.optional(v.any()),
394
+ });
395
+
396
+ export const vEnterpriseWebhookEndpointDoc = v.object({
397
+ ...vDocMeta(TABLES.EnterpriseWebhookEndpoint),
398
+ enterpriseId: v.id(TABLES.Enterprise),
399
+ groupId: v.id(TABLES.Group),
400
+ url: v.string(),
401
+ status: vWebhookEndpointStatus,
402
+ secretHash: v.string(),
403
+ subscriptions: v.array(v.string()),
404
+ createdByUserId: v.optional(v.id(TABLES.User)),
405
+ lastSuccessAt: v.optional(v.number()),
406
+ lastFailureAt: v.optional(v.number()),
407
+ failureCount: v.number(),
408
+ extend: v.optional(v.any()),
409
+ });
410
+
411
+ export const vEnterpriseWebhookDeliveryDoc = v.object({
412
+ ...vDocMeta(TABLES.EnterpriseWebhookDelivery),
413
+ enterpriseId: v.id(TABLES.Enterprise),
414
+ endpointId: v.id(TABLES.EnterpriseWebhookEndpoint),
415
+ auditEventId: v.optional(v.id(TABLES.EnterpriseAuditEvent)),
416
+ eventType: v.string(),
417
+ status: vWebhookDeliveryStatus,
418
+ attemptCount: v.number(),
419
+ nextAttemptAt: v.number(),
420
+ lastAttemptAt: v.optional(v.number()),
421
+ lastResponseStatus: v.optional(v.number()),
422
+ lastError: v.optional(v.string()),
423
+ payload: v.any(),
424
+ });
425
+
426
+ export const vRateLimitResult = v.object({
427
+ ...vDocMeta(TABLES.RateLimit),
428
+ identifier: v.string(),
429
+ last_attempt_time: v.number(),
430
+ attempts_left: v.number(),
431
+ attemptsLeft: v.number(),
432
+ lastAttemptTime: v.number(),
433
+ });
434
+
435
+ export const vInviteAcceptByTokenResult = v.object({
436
+ inviteId: v.id(TABLES.GroupInvite),
437
+ groupId: v.union(v.id(TABLES.Group), v.null()),
438
+ memberId: v.optional(v.id(TABLES.GroupMember)),
439
+ inviteStatus: vInviteTokenAcceptStatus,
440
+ membershipStatus: vMembershipStatus,
441
+ });