@robelest/convex-auth 0.0.4-preview.25 → 0.0.4-preview.28

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 (666) hide show
  1. package/README.md +43 -36
  2. package/dist/bin.js +5765 -4880
  3. package/dist/browser/index.d.ts +30 -0
  4. package/dist/browser/index.js +93 -0
  5. package/dist/browser/locks.js +11 -0
  6. package/dist/browser/navigation.js +14 -0
  7. package/dist/{factors → browser}/passkey.js +23 -32
  8. package/dist/browser/runtime.js +92 -0
  9. package/dist/client/core/types.d.ts +452 -5
  10. package/dist/client/core/types.js +17 -0
  11. package/dist/client/errors.js +19 -0
  12. package/dist/client/factors/device.js +94 -0
  13. package/dist/{factors → client/factors}/totp.js +12 -4
  14. package/dist/client/index.d.ts +47 -1
  15. package/dist/client/index.js +269 -232
  16. package/dist/client/runtime/mutex.js +24 -0
  17. package/dist/client/runtime/proxy.js +30 -0
  18. package/dist/client/runtime/storage.js +45 -0
  19. package/dist/client/services/adapters.js +7 -0
  20. package/dist/client/services/http.js +6 -0
  21. package/dist/client/services/resolve.js +13 -0
  22. package/dist/client/services/runtime.js +6 -0
  23. package/dist/component/_generated/component.d.ts +1355 -1399
  24. package/dist/component/convex.config.d.ts +2 -2
  25. package/dist/component/index.d.ts +4 -26
  26. package/dist/component/index.js +1 -1
  27. package/dist/component/model.d.ts +26 -112
  28. package/dist/component/model.js +76 -54
  29. package/dist/component/modules.js +38 -0
  30. package/dist/component/public/factors/devices.js +1 -1
  31. package/dist/component/public/factors/passkeys.js +1 -1
  32. package/dist/component/public/factors/totp.js +1 -1
  33. package/dist/component/public/groups/core.js +2 -2
  34. package/dist/component/public/groups/invites.js +1 -1
  35. package/dist/component/public/groups/members.js +1 -1
  36. package/dist/component/public/identity/accounts.js +1 -1
  37. package/dist/component/public/identity/codes.js +1 -1
  38. package/dist/component/public/identity/sessions.js +39 -2
  39. package/dist/component/public/identity/tokens.js +82 -4
  40. package/dist/component/public/identity/users.js +1 -1
  41. package/dist/component/public/identity/verifiers.js +10 -4
  42. package/dist/component/public/security/keys.js +1 -1
  43. package/dist/component/public/security/limits.js +1 -1
  44. package/dist/component/public/{enterprise → sso}/audit.js +26 -26
  45. package/dist/component/public/sso/core.js +263 -0
  46. package/dist/component/public/sso/domains.js +280 -0
  47. package/dist/component/public/{enterprise → sso}/scim.js +87 -87
  48. package/dist/component/public/sso/secrets.js +125 -0
  49. package/dist/component/public/{enterprise → sso}/webhooks.js +59 -59
  50. package/dist/component/public.js +9 -9
  51. package/dist/component/schema.d.ts +472 -393
  52. package/dist/component/schema.js +36 -35
  53. package/dist/core/index.d.ts +380 -0
  54. package/dist/core/index.js +83 -0
  55. package/dist/otel.d.ts +69 -0
  56. package/dist/otel.js +82 -0
  57. package/dist/providers/anonymous.d.ts +15 -34
  58. package/dist/providers/anonymous.js +27 -35
  59. package/dist/providers/apple.d.ts +59 -0
  60. package/dist/providers/apple.js +58 -0
  61. package/dist/providers/credentials.d.ts +18 -34
  62. package/dist/providers/credentials.js +16 -27
  63. package/dist/providers/custom.d.ts +94 -0
  64. package/dist/providers/custom.js +119 -0
  65. package/dist/providers/device.d.ts +15 -49
  66. package/dist/providers/device.js +17 -34
  67. package/dist/providers/email.d.ts +21 -38
  68. package/dist/providers/email.js +36 -55
  69. package/dist/providers/github.d.ts +54 -0
  70. package/dist/providers/github.js +75 -0
  71. package/dist/providers/google.d.ts +54 -0
  72. package/dist/providers/google.js +61 -0
  73. package/dist/providers/index.d.ts +16 -12
  74. package/dist/providers/index.js +15 -11
  75. package/dist/providers/microsoft.d.ts +57 -0
  76. package/dist/providers/microsoft.js +101 -0
  77. package/dist/providers/passkey.d.ts +19 -35
  78. package/dist/providers/passkey.js +20 -30
  79. package/dist/providers/password.d.ts +17 -18
  80. package/dist/providers/password.js +121 -143
  81. package/dist/providers/phone.d.ts +13 -28
  82. package/dist/providers/phone.js +21 -46
  83. package/dist/providers/sso.d.ts +16 -36
  84. package/dist/providers/sso.js +21 -22
  85. package/dist/providers/totp.d.ts +13 -29
  86. package/dist/providers/totp.js +17 -27
  87. package/dist/server/auth-context.d.ts +204 -0
  88. package/dist/server/auth-context.js +76 -0
  89. package/dist/server/auth.d.ts +99 -244
  90. package/dist/server/auth.js +56 -152
  91. package/dist/server/componentContext.d.ts +12 -0
  92. package/dist/server/componentContext.js +1 -0
  93. package/dist/server/config.js +6 -67
  94. package/dist/server/constants.js +6 -0
  95. package/dist/server/contract.d.ts +105 -0
  96. package/dist/server/contract.js +43 -0
  97. package/dist/server/cookies.js +3 -2
  98. package/dist/server/core.js +31 -36
  99. package/dist/server/crypto.js +34 -44
  100. package/dist/server/db.js +6 -1
  101. package/dist/server/device.js +96 -130
  102. package/dist/server/env.js +48 -0
  103. package/dist/server/errors.js +20 -0
  104. package/dist/server/http.d.ts +15 -59
  105. package/dist/server/http.js +136 -120
  106. package/dist/server/identity.js +2 -2
  107. package/dist/server/index.d.ts +5 -4
  108. package/dist/server/index.js +3 -3
  109. package/dist/server/keys.js +10 -1
  110. package/dist/server/limits.js +26 -26
  111. package/dist/server/log.js +28 -0
  112. package/dist/server/mounts.d.ts +1107 -296
  113. package/dist/server/mounts.js +315 -196
  114. package/dist/server/mutations/account.js +11 -14
  115. package/dist/server/mutations/code.js +6 -5
  116. package/dist/server/mutations/invalidate.js +9 -11
  117. package/dist/server/mutations/oauth.js +112 -73
  118. package/dist/server/mutations/refresh.js +47 -97
  119. package/dist/server/mutations/register.js +37 -35
  120. package/dist/server/mutations/retrieve.js +16 -16
  121. package/dist/server/mutations/signature.js +15 -18
  122. package/dist/server/mutations/signin.js +10 -5
  123. package/dist/server/mutations/signout.js +11 -14
  124. package/dist/server/mutations/store.js +25 -18
  125. package/dist/server/mutations/verifier.js +11 -8
  126. package/dist/server/mutations/verify.js +53 -41
  127. package/dist/server/oauth/factory.js +44 -0
  128. package/dist/server/oauth/index.js +12 -0
  129. package/dist/server/oauth/runtime.js +248 -0
  130. package/dist/server/passkey.js +331 -365
  131. package/dist/server/payloads.d.ts +16 -0
  132. package/dist/server/payloads.js +30 -0
  133. package/dist/server/{ssr.d.ts → prefetch.d.ts} +2 -2
  134. package/dist/server/prefetch.js +635 -0
  135. package/dist/server/random.js +19 -0
  136. package/dist/server/redirects.js +10 -5
  137. package/dist/server/refresh.js +14 -86
  138. package/dist/server/runtime.d.ts +531 -31
  139. package/dist/server/runtime.js +106 -267
  140. package/dist/server/secret.js +44 -0
  141. package/dist/server/services/config.js +10 -0
  142. package/dist/server/services/group.js +211 -0
  143. package/dist/server/services/logger.js +8 -0
  144. package/dist/server/services/providers.js +22 -0
  145. package/dist/server/services/refresh.js +8 -0
  146. package/dist/server/services/resolve.js +27 -0
  147. package/dist/server/services/signin.js +8 -0
  148. package/dist/server/sessions.js +35 -34
  149. package/dist/server/signin.js +229 -140
  150. package/dist/server/{enterprise → sso}/config.js +10 -3
  151. package/dist/server/sso/domain.d.ts +614 -0
  152. package/dist/server/sso/domain.js +1175 -0
  153. package/dist/server/sso/http.js +1060 -0
  154. package/dist/server/sso/oidc.js +324 -0
  155. package/dist/server/sso/policies.js +59 -0
  156. package/dist/server/sso/policy.js +139 -0
  157. package/dist/server/sso/profile.js +22 -0
  158. package/dist/server/sso/provision.js +179 -0
  159. package/dist/{component/server/enterprise → server/sso}/saml.js +142 -56
  160. package/dist/{component/server/enterprise → server/sso}/scim.js +13 -7
  161. package/dist/server/sso/shared.js +74 -0
  162. package/dist/server/sso/validators.js +88 -0
  163. package/dist/server/sso/webhook.js +94 -0
  164. package/dist/server/tokens.js +16 -4
  165. package/dist/server/totp.js +155 -164
  166. package/dist/server/types.d.ts +306 -296
  167. package/dist/server/types.js +1 -30
  168. package/dist/server/url.js +32 -0
  169. package/dist/server/users.js +74 -40
  170. package/dist/server/utils/cache.js +51 -0
  171. package/dist/server/utils/dispatch.js +36 -0
  172. package/dist/server/utils/retry.js +24 -0
  173. package/dist/server/utils/span.js +32 -0
  174. package/dist/shared/errors.js +19 -0
  175. package/dist/shared/log.js +45 -0
  176. package/{src/test.ts → dist/test.d.ts} +21 -22
  177. package/dist/test.js +51 -0
  178. package/package.json +70 -42
  179. package/dist/authorization/index.d.ts.map +0 -1
  180. package/dist/authorization/index.js.map +0 -1
  181. package/dist/client/core/types.d.ts.map +0 -1
  182. package/dist/client/index.d.ts.map +0 -1
  183. package/dist/client/index.js.map +0 -1
  184. package/dist/component/_generated/api.d.ts +0 -75
  185. package/dist/component/_generated/api.d.ts.map +0 -1
  186. package/dist/component/_generated/api.js.map +0 -1
  187. package/dist/component/_generated/component.d.ts.map +0 -1
  188. package/dist/component/_generated/dataModel.d.ts +0 -42
  189. package/dist/component/_generated/dataModel.d.ts.map +0 -1
  190. package/dist/component/_generated/server.d.ts +0 -117
  191. package/dist/component/_generated/server.d.ts.map +0 -1
  192. package/dist/component/_generated/server.js.map +0 -1
  193. package/dist/component/_virtual/rolldown_runtime.js +0 -18
  194. package/dist/component/client/core/types.d.ts +0 -2
  195. package/dist/component/client/index.d.ts +0 -1
  196. package/dist/component/convex.config.d.ts.map +0 -1
  197. package/dist/component/convex.config.js.map +0 -1
  198. package/dist/component/functions.d.ts +0 -25
  199. package/dist/component/functions.d.ts.map +0 -1
  200. package/dist/component/functions.js.map +0 -1
  201. package/dist/component/index.d.ts.map +0 -1
  202. package/dist/component/model.d.ts.map +0 -1
  203. package/dist/component/model.js.map +0 -1
  204. package/dist/component/providers/anonymous.d.ts +0 -54
  205. package/dist/component/providers/anonymous.d.ts.map +0 -1
  206. package/dist/component/providers/credentials.d.ts +0 -38
  207. package/dist/component/providers/credentials.d.ts.map +0 -1
  208. package/dist/component/providers/device.d.ts +0 -67
  209. package/dist/component/providers/device.d.ts.map +0 -1
  210. package/dist/component/providers/email.d.ts +0 -62
  211. package/dist/component/providers/email.d.ts.map +0 -1
  212. package/dist/component/providers/oauth.d.ts +0 -25
  213. package/dist/component/providers/oauth.d.ts.map +0 -1
  214. package/dist/component/providers/oauth.js +0 -13
  215. package/dist/component/providers/oauth.js.map +0 -1
  216. package/dist/component/providers/passkey.d.ts +0 -57
  217. package/dist/component/providers/passkey.d.ts.map +0 -1
  218. package/dist/component/providers/password.d.ts +0 -88
  219. package/dist/component/providers/password.d.ts.map +0 -1
  220. package/dist/component/providers/phone.d.ts +0 -48
  221. package/dist/component/providers/phone.d.ts.map +0 -1
  222. package/dist/component/providers/sso.d.ts +0 -50
  223. package/dist/component/providers/sso.d.ts.map +0 -1
  224. package/dist/component/providers/totp.d.ts +0 -45
  225. package/dist/component/providers/totp.d.ts.map +0 -1
  226. package/dist/component/public/enterprise/audit.d.ts +0 -73
  227. package/dist/component/public/enterprise/audit.d.ts.map +0 -1
  228. package/dist/component/public/enterprise/audit.js.map +0 -1
  229. package/dist/component/public/enterprise/core.d.ts +0 -176
  230. package/dist/component/public/enterprise/core.d.ts.map +0 -1
  231. package/dist/component/public/enterprise/core.js +0 -292
  232. package/dist/component/public/enterprise/core.js.map +0 -1
  233. package/dist/component/public/enterprise/domains.d.ts +0 -174
  234. package/dist/component/public/enterprise/domains.d.ts.map +0 -1
  235. package/dist/component/public/enterprise/domains.js +0 -271
  236. package/dist/component/public/enterprise/domains.js.map +0 -1
  237. package/dist/component/public/enterprise/scim.d.ts +0 -245
  238. package/dist/component/public/enterprise/scim.d.ts.map +0 -1
  239. package/dist/component/public/enterprise/scim.js.map +0 -1
  240. package/dist/component/public/enterprise/secrets.d.ts +0 -78
  241. package/dist/component/public/enterprise/secrets.d.ts.map +0 -1
  242. package/dist/component/public/enterprise/secrets.js +0 -118
  243. package/dist/component/public/enterprise/secrets.js.map +0 -1
  244. package/dist/component/public/enterprise/webhooks.d.ts +0 -211
  245. package/dist/component/public/enterprise/webhooks.d.ts.map +0 -1
  246. package/dist/component/public/enterprise/webhooks.js.map +0 -1
  247. package/dist/component/public/factors/devices.d.ts +0 -157
  248. package/dist/component/public/factors/devices.d.ts.map +0 -1
  249. package/dist/component/public/factors/devices.js.map +0 -1
  250. package/dist/component/public/factors/passkeys.d.ts +0 -175
  251. package/dist/component/public/factors/passkeys.d.ts.map +0 -1
  252. package/dist/component/public/factors/passkeys.js.map +0 -1
  253. package/dist/component/public/factors/totp.d.ts +0 -189
  254. package/dist/component/public/factors/totp.d.ts.map +0 -1
  255. package/dist/component/public/factors/totp.js.map +0 -1
  256. package/dist/component/public/groups/core.d.ts +0 -137
  257. package/dist/component/public/groups/core.d.ts.map +0 -1
  258. package/dist/component/public/groups/core.js.map +0 -1
  259. package/dist/component/public/groups/invites.d.ts +0 -217
  260. package/dist/component/public/groups/invites.d.ts.map +0 -1
  261. package/dist/component/public/groups/invites.js.map +0 -1
  262. package/dist/component/public/groups/members.d.ts +0 -204
  263. package/dist/component/public/groups/members.d.ts.map +0 -1
  264. package/dist/component/public/groups/members.js.map +0 -1
  265. package/dist/component/public/identity/accounts.d.ts +0 -147
  266. package/dist/component/public/identity/accounts.d.ts.map +0 -1
  267. package/dist/component/public/identity/accounts.js.map +0 -1
  268. package/dist/component/public/identity/codes.d.ts +0 -104
  269. package/dist/component/public/identity/codes.d.ts.map +0 -1
  270. package/dist/component/public/identity/codes.js.map +0 -1
  271. package/dist/component/public/identity/sessions.d.ts +0 -128
  272. package/dist/component/public/identity/sessions.d.ts.map +0 -1
  273. package/dist/component/public/identity/sessions.js.map +0 -1
  274. package/dist/component/public/identity/tokens.d.ts +0 -169
  275. package/dist/component/public/identity/tokens.d.ts.map +0 -1
  276. package/dist/component/public/identity/tokens.js.map +0 -1
  277. package/dist/component/public/identity/users.d.ts +0 -212
  278. package/dist/component/public/identity/users.d.ts.map +0 -1
  279. package/dist/component/public/identity/users.js.map +0 -1
  280. package/dist/component/public/identity/verifiers.d.ts +0 -116
  281. package/dist/component/public/identity/verifiers.d.ts.map +0 -1
  282. package/dist/component/public/identity/verifiers.js.map +0 -1
  283. package/dist/component/public/security/keys.d.ts +0 -209
  284. package/dist/component/public/security/keys.d.ts.map +0 -1
  285. package/dist/component/public/security/keys.js.map +0 -1
  286. package/dist/component/public/security/limits.d.ts +0 -114
  287. package/dist/component/public/security/limits.d.ts.map +0 -1
  288. package/dist/component/public/security/limits.js.map +0 -1
  289. package/dist/component/public.d.ts +0 -28
  290. package/dist/component/public.d.ts.map +0 -1
  291. package/dist/component/schema.d.ts.map +0 -1
  292. package/dist/component/schema.js.map +0 -1
  293. package/dist/component/server/auth.d.ts +0 -447
  294. package/dist/component/server/auth.d.ts.map +0 -1
  295. package/dist/component/server/auth.js +0 -254
  296. package/dist/component/server/auth.js.map +0 -1
  297. package/dist/component/server/config.js +0 -121
  298. package/dist/component/server/config.js.map +0 -1
  299. package/dist/component/server/context.js +0 -53
  300. package/dist/component/server/context.js.map +0 -1
  301. package/dist/component/server/cookies.js +0 -47
  302. package/dist/component/server/cookies.js.map +0 -1
  303. package/dist/component/server/core.js +0 -576
  304. package/dist/component/server/core.js.map +0 -1
  305. package/dist/component/server/crypto.js +0 -56
  306. package/dist/component/server/crypto.js.map +0 -1
  307. package/dist/component/server/db.js +0 -87
  308. package/dist/component/server/db.js.map +0 -1
  309. package/dist/component/server/device.js +0 -152
  310. package/dist/component/server/device.js.map +0 -1
  311. package/dist/component/server/enterprise/config.js +0 -46
  312. package/dist/component/server/enterprise/config.js.map +0 -1
  313. package/dist/component/server/enterprise/domain.js +0 -974
  314. package/dist/component/server/enterprise/domain.js.map +0 -1
  315. package/dist/component/server/enterprise/http.js +0 -787
  316. package/dist/component/server/enterprise/http.js.map +0 -1
  317. package/dist/component/server/enterprise/oidc.js +0 -248
  318. package/dist/component/server/enterprise/oidc.js.map +0 -1
  319. package/dist/component/server/enterprise/policy.js +0 -85
  320. package/dist/component/server/enterprise/policy.js.map +0 -1
  321. package/dist/component/server/enterprise/saml.js.map +0 -1
  322. package/dist/component/server/enterprise/scim.js.map +0 -1
  323. package/dist/component/server/enterprise/shared.js +0 -51
  324. package/dist/component/server/enterprise/shared.js.map +0 -1
  325. package/dist/component/server/http.d.ts +0 -85
  326. package/dist/component/server/http.d.ts.map +0 -1
  327. package/dist/component/server/http.js +0 -351
  328. package/dist/component/server/http.js.map +0 -1
  329. package/dist/component/server/identity.js +0 -16
  330. package/dist/component/server/identity.js.map +0 -1
  331. package/dist/component/server/keys.js +0 -96
  332. package/dist/component/server/keys.js.map +0 -1
  333. package/dist/component/server/limits.js +0 -52
  334. package/dist/component/server/limits.js.map +0 -1
  335. package/dist/component/server/mutations/account.js +0 -46
  336. package/dist/component/server/mutations/account.js.map +0 -1
  337. package/dist/component/server/mutations/code.js +0 -68
  338. package/dist/component/server/mutations/code.js.map +0 -1
  339. package/dist/component/server/mutations/invalidate.js +0 -32
  340. package/dist/component/server/mutations/invalidate.js.map +0 -1
  341. package/dist/component/server/mutations/oauth.js +0 -116
  342. package/dist/component/server/mutations/oauth.js.map +0 -1
  343. package/dist/component/server/mutations/refresh.js +0 -119
  344. package/dist/component/server/mutations/refresh.js.map +0 -1
  345. package/dist/component/server/mutations/register.js +0 -87
  346. package/dist/component/server/mutations/register.js.map +0 -1
  347. package/dist/component/server/mutations/retrieve.js +0 -61
  348. package/dist/component/server/mutations/retrieve.js.map +0 -1
  349. package/dist/component/server/mutations/signature.js +0 -38
  350. package/dist/component/server/mutations/signature.js.map +0 -1
  351. package/dist/component/server/mutations/signin.js +0 -27
  352. package/dist/component/server/mutations/signin.js.map +0 -1
  353. package/dist/component/server/mutations/signout.js +0 -27
  354. package/dist/component/server/mutations/signout.js.map +0 -1
  355. package/dist/component/server/mutations/store/refs.js +0 -15
  356. package/dist/component/server/mutations/store/refs.js.map +0 -1
  357. package/dist/component/server/mutations/store.js +0 -70
  358. package/dist/component/server/mutations/store.js.map +0 -1
  359. package/dist/component/server/mutations/verifier.js +0 -18
  360. package/dist/component/server/mutations/verifier.js.map +0 -1
  361. package/dist/component/server/mutations/verify.js +0 -98
  362. package/dist/component/server/mutations/verify.js.map +0 -1
  363. package/dist/component/server/oauth.js +0 -242
  364. package/dist/component/server/oauth.js.map +0 -1
  365. package/dist/component/server/passkey.js +0 -415
  366. package/dist/component/server/passkey.js.map +0 -1
  367. package/dist/component/server/redirects.js +0 -40
  368. package/dist/component/server/redirects.js.map +0 -1
  369. package/dist/component/server/refresh.js +0 -99
  370. package/dist/component/server/refresh.js.map +0 -1
  371. package/dist/component/server/runtime.d.ts +0 -136
  372. package/dist/component/server/runtime.d.ts.map +0 -1
  373. package/dist/component/server/runtime.js +0 -456
  374. package/dist/component/server/runtime.js.map +0 -1
  375. package/dist/component/server/sessions.js +0 -71
  376. package/dist/component/server/sessions.js.map +0 -1
  377. package/dist/component/server/signin.js +0 -225
  378. package/dist/component/server/signin.js.map +0 -1
  379. package/dist/component/server/tokens.js +0 -17
  380. package/dist/component/server/tokens.js.map +0 -1
  381. package/dist/component/server/totp.js +0 -208
  382. package/dist/component/server/totp.js.map +0 -1
  383. package/dist/component/server/types.d.ts +0 -949
  384. package/dist/component/server/types.d.ts.map +0 -1
  385. package/dist/component/server/types.js +0 -79
  386. package/dist/component/server/types.js.map +0 -1
  387. package/dist/component/server/users.js +0 -123
  388. package/dist/component/server/users.js.map +0 -1
  389. package/dist/component/server/utils.js +0 -140
  390. package/dist/component/server/utils.js.map +0 -1
  391. package/dist/core/types.d.ts +0 -361
  392. package/dist/core/types.d.ts.map +0 -1
  393. package/dist/factors/device.js +0 -104
  394. package/dist/factors/device.js.map +0 -1
  395. package/dist/factors/passkey.js.map +0 -1
  396. package/dist/factors/totp.js.map +0 -1
  397. package/dist/providers/anonymous.d.ts.map +0 -1
  398. package/dist/providers/anonymous.js.map +0 -1
  399. package/dist/providers/credentials.d.ts.map +0 -1
  400. package/dist/providers/credentials.js.map +0 -1
  401. package/dist/providers/device.d.ts.map +0 -1
  402. package/dist/providers/device.js.map +0 -1
  403. package/dist/providers/email.d.ts.map +0 -1
  404. package/dist/providers/email.js.map +0 -1
  405. package/dist/providers/oauth.d.ts +0 -69
  406. package/dist/providers/oauth.d.ts.map +0 -1
  407. package/dist/providers/oauth.js +0 -43
  408. package/dist/providers/oauth.js.map +0 -1
  409. package/dist/providers/passkey.d.ts.map +0 -1
  410. package/dist/providers/passkey.js.map +0 -1
  411. package/dist/providers/password.d.ts.map +0 -1
  412. package/dist/providers/password.js.map +0 -1
  413. package/dist/providers/phone.d.ts.map +0 -1
  414. package/dist/providers/phone.js.map +0 -1
  415. package/dist/providers/sso.d.ts.map +0 -1
  416. package/dist/providers/sso.js.map +0 -1
  417. package/dist/providers/totp.d.ts.map +0 -1
  418. package/dist/providers/totp.js.map +0 -1
  419. package/dist/runtime/browser.js +0 -68
  420. package/dist/runtime/browser.js.map +0 -1
  421. package/dist/runtime/invite.js.map +0 -1
  422. package/dist/runtime/proxy.js +0 -70
  423. package/dist/runtime/proxy.js.map +0 -1
  424. package/dist/runtime/storage.js +0 -37
  425. package/dist/runtime/storage.js.map +0 -1
  426. package/dist/server/auth.d.ts.map +0 -1
  427. package/dist/server/auth.js.map +0 -1
  428. package/dist/server/config.d.ts +0 -1
  429. package/dist/server/config.js.map +0 -1
  430. package/dist/server/context.d.ts +0 -1
  431. package/dist/server/context.js.map +0 -1
  432. package/dist/server/cookies.d.ts +0 -1
  433. package/dist/server/cookies.js.map +0 -1
  434. package/dist/server/core.d.ts +0 -1315
  435. package/dist/server/core.d.ts.map +0 -1
  436. package/dist/server/core.js.map +0 -1
  437. package/dist/server/crypto.d.ts +0 -8
  438. package/dist/server/crypto.d.ts.map +0 -1
  439. package/dist/server/crypto.js.map +0 -1
  440. package/dist/server/db.d.ts +0 -1
  441. package/dist/server/db.js.map +0 -1
  442. package/dist/server/device.d.ts +0 -1
  443. package/dist/server/device.js.map +0 -1
  444. package/dist/server/enterprise/config.d.ts +0 -1
  445. package/dist/server/enterprise/config.js.map +0 -1
  446. package/dist/server/enterprise/domain.d.ts +0 -401
  447. package/dist/server/enterprise/domain.d.ts.map +0 -1
  448. package/dist/server/enterprise/domain.js +0 -974
  449. package/dist/server/enterprise/domain.js.map +0 -1
  450. package/dist/server/enterprise/http.d.ts +0 -26
  451. package/dist/server/enterprise/http.d.ts.map +0 -1
  452. package/dist/server/enterprise/http.js +0 -787
  453. package/dist/server/enterprise/http.js.map +0 -1
  454. package/dist/server/enterprise/oidc.d.ts +0 -1
  455. package/dist/server/enterprise/oidc.js +0 -248
  456. package/dist/server/enterprise/oidc.js.map +0 -1
  457. package/dist/server/enterprise/policy.d.ts +0 -1
  458. package/dist/server/enterprise/policy.js +0 -85
  459. package/dist/server/enterprise/policy.js.map +0 -1
  460. package/dist/server/enterprise/saml.d.ts +0 -1
  461. package/dist/server/enterprise/saml.js +0 -338
  462. package/dist/server/enterprise/saml.js.map +0 -1
  463. package/dist/server/enterprise/scim.d.ts +0 -1
  464. package/dist/server/enterprise/scim.js +0 -97
  465. package/dist/server/enterprise/scim.js.map +0 -1
  466. package/dist/server/enterprise/shared.d.ts +0 -5
  467. package/dist/server/enterprise/shared.d.ts.map +0 -1
  468. package/dist/server/enterprise/shared.js +0 -51
  469. package/dist/server/enterprise/shared.js.map +0 -1
  470. package/dist/server/enterprise/validators.d.ts +0 -1
  471. package/dist/server/enterprise/validators.js +0 -60
  472. package/dist/server/enterprise/validators.js.map +0 -1
  473. package/dist/server/http.d.ts.map +0 -1
  474. package/dist/server/http.js.map +0 -1
  475. package/dist/server/identity.d.ts +0 -1
  476. package/dist/server/identity.js.map +0 -1
  477. package/dist/server/keys.d.ts +0 -1
  478. package/dist/server/keys.js.map +0 -1
  479. package/dist/server/limits.d.ts +0 -1
  480. package/dist/server/limits.js.map +0 -1
  481. package/dist/server/mounts.d.ts.map +0 -1
  482. package/dist/server/mounts.js.map +0 -1
  483. package/dist/server/mutations/account.d.ts +0 -29
  484. package/dist/server/mutations/account.d.ts.map +0 -1
  485. package/dist/server/mutations/account.js.map +0 -1
  486. package/dist/server/mutations/code.d.ts +0 -30
  487. package/dist/server/mutations/code.d.ts.map +0 -1
  488. package/dist/server/mutations/code.js.map +0 -1
  489. package/dist/server/mutations/index.d.ts +0 -14
  490. package/dist/server/mutations/invalidate.d.ts +0 -20
  491. package/dist/server/mutations/invalidate.d.ts.map +0 -1
  492. package/dist/server/mutations/invalidate.js.map +0 -1
  493. package/dist/server/mutations/oauth.d.ts +0 -30
  494. package/dist/server/mutations/oauth.d.ts.map +0 -1
  495. package/dist/server/mutations/oauth.js.map +0 -1
  496. package/dist/server/mutations/refresh.d.ts +0 -21
  497. package/dist/server/mutations/refresh.d.ts.map +0 -1
  498. package/dist/server/mutations/refresh.js.map +0 -1
  499. package/dist/server/mutations/register.d.ts +0 -38
  500. package/dist/server/mutations/register.d.ts.map +0 -1
  501. package/dist/server/mutations/register.js.map +0 -1
  502. package/dist/server/mutations/retrieve.d.ts +0 -33
  503. package/dist/server/mutations/retrieve.d.ts.map +0 -1
  504. package/dist/server/mutations/retrieve.js.map +0 -1
  505. package/dist/server/mutations/signature.d.ts +0 -21
  506. package/dist/server/mutations/signature.d.ts.map +0 -1
  507. package/dist/server/mutations/signature.js.map +0 -1
  508. package/dist/server/mutations/signin.d.ts +0 -22
  509. package/dist/server/mutations/signin.d.ts.map +0 -1
  510. package/dist/server/mutations/signin.js.map +0 -1
  511. package/dist/server/mutations/signout.d.ts +0 -16
  512. package/dist/server/mutations/signout.d.ts.map +0 -1
  513. package/dist/server/mutations/signout.js.map +0 -1
  514. package/dist/server/mutations/store/refs.d.ts +0 -12
  515. package/dist/server/mutations/store/refs.d.ts.map +0 -1
  516. package/dist/server/mutations/store/refs.js.map +0 -1
  517. package/dist/server/mutations/store.d.ts +0 -306
  518. package/dist/server/mutations/store.d.ts.map +0 -1
  519. package/dist/server/mutations/store.js.map +0 -1
  520. package/dist/server/mutations/verifier.d.ts +0 -13
  521. package/dist/server/mutations/verifier.d.ts.map +0 -1
  522. package/dist/server/mutations/verifier.js.map +0 -1
  523. package/dist/server/mutations/verify.d.ts +0 -26
  524. package/dist/server/mutations/verify.d.ts.map +0 -1
  525. package/dist/server/mutations/verify.js.map +0 -1
  526. package/dist/server/oauth.d.ts +0 -1
  527. package/dist/server/oauth.js +0 -242
  528. package/dist/server/oauth.js.map +0 -1
  529. package/dist/server/passkey.d.ts +0 -27
  530. package/dist/server/passkey.d.ts.map +0 -1
  531. package/dist/server/passkey.js.map +0 -1
  532. package/dist/server/redirects.d.ts +0 -1
  533. package/dist/server/redirects.js.map +0 -1
  534. package/dist/server/refresh.d.ts +0 -1
  535. package/dist/server/refresh.js.map +0 -1
  536. package/dist/server/runtime.d.ts.map +0 -1
  537. package/dist/server/runtime.js.map +0 -1
  538. package/dist/server/sessions.d.ts +0 -1
  539. package/dist/server/sessions.js.map +0 -1
  540. package/dist/server/signin.d.ts +0 -1
  541. package/dist/server/signin.js.map +0 -1
  542. package/dist/server/ssr.d.ts.map +0 -1
  543. package/dist/server/ssr.js +0 -777
  544. package/dist/server/ssr.js.map +0 -1
  545. package/dist/server/templates.d.ts +0 -1
  546. package/dist/server/templates.js.map +0 -1
  547. package/dist/server/tokens.d.ts +0 -1
  548. package/dist/server/tokens.js.map +0 -1
  549. package/dist/server/totp.d.ts +0 -1
  550. package/dist/server/totp.js.map +0 -1
  551. package/dist/server/types.d.ts.map +0 -1
  552. package/dist/server/types.js.map +0 -1
  553. package/dist/server/users.d.ts +0 -1
  554. package/dist/server/users.js.map +0 -1
  555. package/dist/server/utils.d.ts +0 -1
  556. package/dist/server/utils.js +0 -140
  557. package/dist/server/utils.js.map +0 -1
  558. package/src/authorization/index.ts +0 -83
  559. package/src/cli/bin.ts +0 -5
  560. package/src/cli/command.ts +0 -70
  561. package/src/cli/index.ts +0 -1112
  562. package/src/cli/keys.ts +0 -23
  563. package/src/client/core/types.ts +0 -437
  564. package/src/client/factors/device.ts +0 -158
  565. package/src/client/factors/passkey.ts +0 -279
  566. package/src/client/factors/totp.ts +0 -150
  567. package/src/client/index.ts +0 -1124
  568. package/src/client/runtime/browser.ts +0 -112
  569. package/src/client/runtime/invite.ts +0 -63
  570. package/src/client/runtime/proxy.ts +0 -111
  571. package/src/client/runtime/storage.ts +0 -79
  572. package/src/component/_generated/api.ts +0 -96
  573. package/src/component/_generated/component.ts +0 -3774
  574. package/src/component/_generated/dataModel.ts +0 -60
  575. package/src/component/_generated/server.ts +0 -156
  576. package/src/component/convex.config.ts +0 -5
  577. package/src/component/functions.ts +0 -104
  578. package/src/component/index.ts +0 -42
  579. package/src/component/model.ts +0 -449
  580. package/src/component/public/enterprise/audit.ts +0 -125
  581. package/src/component/public/enterprise/core.ts +0 -355
  582. package/src/component/public/enterprise/domains.ts +0 -327
  583. package/src/component/public/enterprise/scim.ts +0 -397
  584. package/src/component/public/enterprise/secrets.ts +0 -133
  585. package/src/component/public/enterprise/webhooks.ts +0 -307
  586. package/src/component/public/factors/devices.ts +0 -224
  587. package/src/component/public/factors/passkeys.ts +0 -243
  588. package/src/component/public/factors/totp.ts +0 -259
  589. package/src/component/public/groups/core.ts +0 -481
  590. package/src/component/public/groups/invites.ts +0 -608
  591. package/src/component/public/groups/members.ts +0 -410
  592. package/src/component/public/identity/accounts.ts +0 -207
  593. package/src/component/public/identity/codes.ts +0 -149
  594. package/src/component/public/identity/sessions.ts +0 -210
  595. package/src/component/public/identity/tokens.ts +0 -251
  596. package/src/component/public/identity/users.ts +0 -355
  597. package/src/component/public/identity/verifiers.ts +0 -158
  598. package/src/component/public/security/keys.ts +0 -366
  599. package/src/component/public/security/limits.ts +0 -174
  600. package/src/component/public.ts +0 -27
  601. package/src/component/schema.ts +0 -505
  602. package/src/providers/anonymous.ts +0 -99
  603. package/src/providers/credentials.ts +0 -102
  604. package/src/providers/device.ts +0 -87
  605. package/src/providers/email.ts +0 -99
  606. package/src/providers/index.ts +0 -31
  607. package/src/providers/oauth.ts +0 -117
  608. package/src/providers/passkey.ts +0 -77
  609. package/src/providers/password.ts +0 -441
  610. package/src/providers/phone.ts +0 -93
  611. package/src/providers/sso.ts +0 -54
  612. package/src/providers/totp.ts +0 -62
  613. package/src/samlify.d.ts +0 -53
  614. package/src/server/auth.ts +0 -949
  615. package/src/server/config.ts +0 -200
  616. package/src/server/context.ts +0 -90
  617. package/src/server/cookies.ts +0 -49
  618. package/src/server/core.ts +0 -2004
  619. package/src/server/crypto.ts +0 -90
  620. package/src/server/db.ts +0 -203
  621. package/src/server/device.ts +0 -254
  622. package/src/server/enterprise/config.ts +0 -51
  623. package/src/server/enterprise/domain.ts +0 -1739
  624. package/src/server/enterprise/http.ts +0 -1331
  625. package/src/server/enterprise/oidc.ts +0 -500
  626. package/src/server/enterprise/policy.ts +0 -128
  627. package/src/server/enterprise/saml.ts +0 -578
  628. package/src/server/enterprise/scim.ts +0 -135
  629. package/src/server/enterprise/shared.ts +0 -134
  630. package/src/server/enterprise/validators.ts +0 -93
  631. package/src/server/http.ts +0 -790
  632. package/src/server/identity.ts +0 -18
  633. package/src/server/index.ts +0 -40
  634. package/src/server/keys.ts +0 -158
  635. package/src/server/limits.ts +0 -107
  636. package/src/server/mounts.ts +0 -924
  637. package/src/server/mutations/account.ts +0 -62
  638. package/src/server/mutations/code.ts +0 -119
  639. package/src/server/mutations/index.ts +0 -13
  640. package/src/server/mutations/invalidate.ts +0 -50
  641. package/src/server/mutations/oauth.ts +0 -243
  642. package/src/server/mutations/refresh.ts +0 -299
  643. package/src/server/mutations/register.ts +0 -155
  644. package/src/server/mutations/retrieve.ts +0 -109
  645. package/src/server/mutations/signature.ts +0 -57
  646. package/src/server/mutations/signin.ts +0 -54
  647. package/src/server/mutations/signout.ts +0 -43
  648. package/src/server/mutations/store/refs.ts +0 -10
  649. package/src/server/mutations/store.ts +0 -123
  650. package/src/server/mutations/verifier.ts +0 -34
  651. package/src/server/mutations/verify.ts +0 -200
  652. package/src/server/oauth.ts +0 -418
  653. package/src/server/passkey.ts +0 -838
  654. package/src/server/redirects.ts +0 -59
  655. package/src/server/refresh.ts +0 -218
  656. package/src/server/runtime.ts +0 -918
  657. package/src/server/sessions.ts +0 -132
  658. package/src/server/signin.ts +0 -445
  659. package/src/server/ssr.ts +0 -1747
  660. package/src/server/templates.ts +0 -82
  661. package/src/server/tokens.ts +0 -35
  662. package/src/server/totp.ts +0 -399
  663. package/src/server/types.ts +0 -1942
  664. package/src/server/users.ts +0 -291
  665. package/src/server/utils.ts +0 -220
  666. /package/dist/{runtime → client/runtime}/invite.js +0 -0
@@ -1,608 +0,0 @@
1
- import { ConvexError, v } from "convex/values";
2
-
3
- import type { Id } from "../../_generated/dataModel";
4
- import { mutation, query } from "../../functions";
5
- import {
6
- vGroupInviteDoc,
7
- vInviteAcceptByTokenResult,
8
- vInviteStatus,
9
- vPaginated,
10
- } from "../../model";
11
-
12
- /**
13
- * Create a new platform-level invitation. Optionally set `groupId` to tie
14
- * the invite to a specific group. The invitation is sent to an email address
15
- * and includes a hashed token for secure acceptance.
16
- *
17
- * Throws `ConvexError` with code `DUPLICATE_INVITE` when a pending invite
18
- * already exists for the same email and scope:
19
- * - group invite: same `email` + same `groupId`
20
- * - platform invite: same `email` with no `groupId`
21
- *
22
- * When a duplicate check finds an existing invite that has passed its
23
- * `expiresTime`, that invite is automatically marked as `"expired"` and the
24
- * new invite is allowed through. CLI-generated invites (no email) skip
25
- * duplicate detection entirely.
26
- *
27
- * @param args.groupId - Optional `Id<"Group">` to scope this invite to a specific group. Omit for a platform-wide invite.
28
- * @param args.invitedByUserId - Optional `Id<"User">` of the user who issued the invitation.
29
- * @param args.email - Optional email address of the invitee. When provided, duplicate detection is enforced.
30
- * @param args.tokenHash - A pre-hashed token string used for secure, URL-safe invite acceptance.
31
- * @param args.roleIds - Optional array of application-defined role identifiers to assign upon acceptance.
32
- * @param args.status - The initial status of the invite (typically `"pending"`).
33
- * @param args.expiresTime - Optional Unix timestamp (ms) after which the invite is considered expired.
34
- * @param args.extend - Optional arbitrary payload for application-specific metadata.
35
- * @returns The `Id<"GroupInvite">` of the newly created invite document.
36
- *
37
- * @example
38
- * ```ts
39
- * const inviteId = await ctx.runMutation(
40
- * components.auth.groups.inviteCreate,
41
- * {
42
- * groupId: teamGroupId,
43
- * invitedByUserId: currentUserId,
44
- * email: "alice@example.com",
45
- * tokenHash: hashedToken,
46
- * roleIds: ["editor"],
47
- * status: "pending",
48
- * expiresTime: Date.now() + 7 * 24 * 60 * 60 * 1000, // 7 days
49
- * },
50
- * );
51
- * ```
52
- */
53
- export const inviteCreate = mutation({
54
- args: {
55
- groupId: v.optional(v.id("Group")),
56
- invitedByUserId: v.optional(v.id("User")),
57
- email: v.optional(v.string()),
58
- tokenHash: v.string(),
59
- roleIds: v.optional(v.array(v.string())),
60
- status: vInviteStatus,
61
- expiresTime: v.optional(v.number()),
62
- extend: v.optional(v.any()),
63
- },
64
- returns: v.id("GroupInvite"),
65
- handler: async (ctx, args) => {
66
- const now = Date.now();
67
-
68
- // Only check for duplicates when an email is provided.
69
- // CLI-generated invites (no email) are always allowed.
70
- if (args.email !== undefined) {
71
- if (args.groupId !== undefined) {
72
- const existingGroupInvites = await ctx.db
73
- .query("GroupInvite")
74
- .withIndex("group_id_status", (q) =>
75
- q.eq("groupId", args.groupId).eq("status", "pending"),
76
- )
77
- .filter((q) => q.eq(q.field("email"), args.email))
78
- .collect();
79
-
80
- for (const existingGroupInvite of existingGroupInvites) {
81
- const isExpired =
82
- existingGroupInvite.expiresTime !== undefined &&
83
- existingGroupInvite.expiresTime <= now;
84
- if (isExpired) {
85
- await ctx.db.patch("GroupInvite", existingGroupInvite._id, {
86
- status: "expired",
87
- });
88
- continue;
89
- }
90
- throw new ConvexError({
91
- code: "DUPLICATE_INVITE",
92
- message:
93
- "A pending invite already exists for this email in this group",
94
- email: args.email,
95
- groupId: args.groupId,
96
- existingInviteId: existingGroupInvite._id,
97
- });
98
- }
99
- } else {
100
- const existingPlatformInvites = await ctx.db
101
- .query("GroupInvite")
102
- .withIndex("email_status", (q) =>
103
- q.eq("email", args.email).eq("status", "pending"),
104
- )
105
- .filter((q) => q.eq(q.field("groupId"), undefined))
106
- .collect();
107
-
108
- for (const existingPlatformInvite of existingPlatformInvites) {
109
- const isExpired =
110
- existingPlatformInvite.expiresTime !== undefined &&
111
- existingPlatformInvite.expiresTime <= now;
112
- if (isExpired) {
113
- await ctx.db.patch("GroupInvite", existingPlatformInvite._id, {
114
- status: "expired",
115
- });
116
- continue;
117
- }
118
- throw new ConvexError({
119
- code: "DUPLICATE_INVITE",
120
- message: "A pending platform invite already exists for this email",
121
- email: args.email,
122
- existingInviteId: existingPlatformInvite._id,
123
- });
124
- }
125
- }
126
- }
127
- return await ctx.db.insert("GroupInvite", args);
128
- },
129
- });
130
-
131
- /**
132
- * Retrieve an invite by its document ID.
133
- *
134
- * Performs a direct lookup in the `GroupInvite` table and returns the full
135
- * invite document, or `null` if no invite exists with the given ID.
136
- *
137
- * @param args.inviteId - The `Id<"GroupInvite">` of the invite to retrieve.
138
- * @returns The invite document (including `email`, `status`, `groupId`, `tokenHash`, etc.) or `null` if not found.
139
- *
140
- * @example
141
- * ```ts
142
- * const invite = await ctx.runQuery(components.auth.groups.inviteGet, {
143
- * inviteId: existingInviteId,
144
- * });
145
- * if (invite !== null) {
146
- * console.log(invite.email, invite.status);
147
- * }
148
- * ```
149
- */
150
- export const inviteGet = query({
151
- args: { inviteId: v.id("GroupInvite") },
152
- returns: v.union(vGroupInviteDoc, v.null()),
153
- handler: async (ctx, { inviteId }) => {
154
- return await ctx.db.get("GroupInvite", inviteId);
155
- },
156
- });
157
-
158
- /**
159
- * Retrieve an invite by its hashed token.
160
- *
161
- * Looks up the `GroupInvite` table using the `token_hash` index. This is
162
- * the primary mechanism for resolving an invite from a URL-embedded token.
163
- * Returns `null` if no invite matches the given hash.
164
- *
165
- * @param args.tokenHash - The hashed token string to look up (must match the value stored at creation time).
166
- * @returns The invite document or `null` if no invite exists with the given token hash.
167
- *
168
- * @example
169
- * ```ts
170
- * const invite = await ctx.runQuery(
171
- * components.auth.groups.inviteGetByTokenHash,
172
- * { tokenHash: "sha256_abc123..." },
173
- * );
174
- * if (invite !== null && invite.status === "pending") {
175
- * // proceed with acceptance flow
176
- * }
177
- * ```
178
- */
179
- export const inviteGetByTokenHash = query({
180
- args: { tokenHash: v.string() },
181
- returns: v.union(vGroupInviteDoc, v.null()),
182
- handler: async (ctx, { tokenHash }) => {
183
- return await ctx.db
184
- .query("GroupInvite")
185
- .withIndex("token_hash", (q) => q.eq("tokenHash", tokenHash))
186
- .first();
187
- },
188
- });
189
-
190
- /**
191
- * List invites with optional filtering, sorting, and pagination.
192
- *
193
- * Returns `{ items, nextCursor }`. Supports filtering by `groupId`,
194
- * `status`, `email`, `invitedByUserId`, `roleId`, `acceptedByUserId`, and
195
- * `tokenHash`. The query engine automatically selects the best compound
196
- * index based on the combination of filter fields provided. The `roleId`
197
- * filter is applied in-memory after the index scan because role IDs are
198
- * stored as an array.
199
- *
200
- * @param args.where - Optional filter criteria for narrowing results.
201
- * @param args.where.tokenHash - Match invites with this exact hashed token.
202
- * @param args.where.groupId - Match invites scoped to this group.
203
- * @param args.where.status - Match invites with this status (e.g. `"pending"`, `"accepted"`, `"revoked"`).
204
- * @param args.where.email - Match invites sent to this email address.
205
- * @param args.where.invitedByUserId - Match invites created by this user.
206
- * @param args.where.roleId - Match invites that include this role identifier in their `roleIds` array.
207
- * @param args.where.acceptedByUserId - Match invites accepted by this specific user.
208
- * @param args.limit - Maximum number of items per page (clamped to 1..100, defaults to 50).
209
- * @param args.cursor - An opaque cursor string from a previous response's `nextCursor` to fetch the next page, or `null` to start from the beginning.
210
- * @param args.orderBy - The field to sort by: `"_creationTime"`, `"status"`, `"email"`, `"expiresTime"`, or `"acceptedTime"`.
211
- * @param args.order - Sort direction: `"asc"` or `"desc"` (defaults to `"desc"`).
212
- * @returns An object `{ items, nextCursor }` where `items` is an array of invite documents and `nextCursor` is `null` when there are no more pages.
213
- *
214
- * @example
215
- * ```ts
216
- * const { items, nextCursor } = await ctx.runQuery(
217
- * components.auth.groups.inviteList,
218
- * {
219
- * where: { groupId: teamGroupId, status: "pending" },
220
- * limit: 25,
221
- * order: "desc",
222
- * },
223
- * );
224
- * ```
225
- */
226
- export const inviteList = query({
227
- args: {
228
- where: v.optional(
229
- v.object({
230
- tokenHash: v.optional(v.string()),
231
- groupId: v.optional(v.id("Group")),
232
- status: v.optional(vInviteStatus),
233
- email: v.optional(v.string()),
234
- invitedByUserId: v.optional(v.id("User")),
235
- roleId: v.optional(v.string()),
236
- acceptedByUserId: v.optional(v.id("User")),
237
- }),
238
- ),
239
- limit: v.optional(v.number()),
240
- cursor: v.optional(v.union(v.string(), v.null())),
241
- orderBy: v.optional(
242
- v.union(
243
- v.literal("_creationTime"),
244
- v.literal("status"),
245
- v.literal("email"),
246
- v.literal("expiresTime"),
247
- v.literal("acceptedTime"),
248
- ),
249
- ),
250
- order: v.optional(v.union(v.literal("asc"), v.literal("desc"))),
251
- },
252
- returns: vPaginated(vGroupInviteDoc),
253
- handler: async (ctx, args) => {
254
- const where = args.where ?? {};
255
- const limit = Math.min(Math.max(args.limit ?? 50, 1), 100);
256
- const order = args.order ?? "desc";
257
-
258
- // Pick best index
259
- let q;
260
- if (where.tokenHash !== undefined) {
261
- q = ctx.db
262
- .query("GroupInvite")
263
- .withIndex("token_hash", (idx) =>
264
- idx.eq("tokenHash", where.tokenHash!),
265
- );
266
- } else if (where.groupId !== undefined && where.status !== undefined) {
267
- q = ctx.db
268
- .query("GroupInvite")
269
- .withIndex("group_id_status", (idx) =>
270
- idx.eq("groupId", where.groupId!).eq("status", where.status!),
271
- );
272
- } else if (where.email !== undefined && where.status !== undefined) {
273
- q = ctx.db
274
- .query("GroupInvite")
275
- .withIndex("email_status", (idx) =>
276
- idx.eq("email", where.email!).eq("status", where.status!),
277
- );
278
- } else if (
279
- where.invitedByUserId !== undefined &&
280
- where.status !== undefined
281
- ) {
282
- q = ctx.db
283
- .query("GroupInvite")
284
- .withIndex("invited_by_user_id_status", (idx) =>
285
- idx
286
- .eq("invitedByUserId", where.invitedByUserId!)
287
- .eq("status", where.status!),
288
- );
289
- } else if (where.groupId !== undefined) {
290
- q = ctx.db
291
- .query("GroupInvite")
292
- .withIndex("group_id", (idx) => idx.eq("groupId", where.groupId!));
293
- } else if (where.status !== undefined) {
294
- q = ctx.db
295
- .query("GroupInvite")
296
- .withIndex("status", (idx) => idx.eq("status", where.status!));
297
- } else {
298
- q = ctx.db.query("GroupInvite");
299
- }
300
-
301
- // Apply remaining filters
302
- if (where.groupId !== undefined) {
303
- q = q.filter((f) => f.eq(f.field("groupId"), where.groupId!));
304
- }
305
- if (where.status !== undefined) {
306
- q = q.filter((f) => f.eq(f.field("status"), where.status!));
307
- }
308
- if (where.email !== undefined) {
309
- q = q.filter((f) => f.eq(f.field("email"), where.email!));
310
- }
311
- if (where.invitedByUserId !== undefined) {
312
- q = q.filter((f) =>
313
- f.eq(f.field("invitedByUserId"), where.invitedByUserId!),
314
- );
315
- }
316
- if (where.acceptedByUserId !== undefined) {
317
- q = q.filter((f) =>
318
- f.eq(f.field("acceptedByUserId"), where.acceptedByUserId!),
319
- );
320
- }
321
- if (where.tokenHash !== undefined) {
322
- q = q.filter((f) => f.eq(f.field("tokenHash"), where.tokenHash!));
323
- }
324
-
325
- q = q.order(order);
326
-
327
- let all = await q.collect();
328
- if (where.roleId !== undefined) {
329
- all = all.filter((doc) => (doc.roleIds ?? []).includes(where.roleId!));
330
- }
331
- let startIdx = 0;
332
- if (args.cursor) {
333
- const cursorIdx = all.findIndex((doc) => doc._id === args.cursor);
334
- if (cursorIdx !== -1) {
335
- startIdx = cursorIdx + 1;
336
- }
337
- }
338
- const page = all.slice(startIdx, startIdx + limit + 1);
339
- const hasMore = page.length > limit;
340
- const items = hasMore ? page.slice(0, limit) : page;
341
- const nextCursor = hasMore ? items[items.length - 1]._id : null;
342
- return { items, nextCursor };
343
- },
344
- });
345
-
346
- /**
347
- * Accept a pending invitation.
348
- *
349
- * Marks the invite as `"accepted"` and records the acceptance timestamp.
350
- * Throws a structured `ConvexError` when the invite doesn't exist or is not
351
- * currently pending. If the invite has passed its `expiresTime`, it is
352
- * automatically transitioned to `"expired"` and the acceptance is rejected.
353
- *
354
- * The caller is responsible for creating the corresponding member record
355
- * (see {@link inviteAcceptByToken} for an all-in-one alternative that also
356
- * handles membership).
357
- *
358
- * @param args.inviteId - The `Id<"GroupInvite">` of the invite to accept.
359
- * @param args.acceptedByUserId - Optional `Id<"User">` of the user accepting the invite. Stored on the invite for audit purposes.
360
- * @returns `null` on success.
361
- * @throws `ConvexError` with code `INVITE_NOT_FOUND` if the invite does not exist.
362
- * @throws `ConvexError` with code `INVITE_NOT_PENDING` if the invite has already been accepted, revoked, or otherwise finalized.
363
- * @throws `ConvexError` with code `INVITE_EXPIRED` if the invite's `expiresTime` has passed.
364
- *
365
- * @example
366
- * ```ts
367
- * await ctx.runMutation(components.auth.groups.inviteAccept, {
368
- * inviteId: pendingInviteId,
369
- * acceptedByUserId: currentUserId,
370
- * });
371
- * ```
372
- */
373
- export const inviteAccept = mutation({
374
- args: {
375
- inviteId: v.id("GroupInvite"),
376
- acceptedByUserId: v.optional(v.id("User")),
377
- },
378
- returns: v.null(),
379
- handler: async (ctx, { inviteId, acceptedByUserId }) => {
380
- const invite = await ctx.db.get("GroupInvite", inviteId);
381
- if (invite === null) {
382
- throw new ConvexError({
383
- code: "INVITE_NOT_FOUND",
384
- message: "Invite not found",
385
- inviteId,
386
- });
387
- }
388
- if (invite.status !== "pending") {
389
- throw new ConvexError({
390
- code: "INVITE_NOT_PENDING",
391
- message: `Cannot accept invite with status "${invite.status}"`,
392
- inviteId,
393
- currentStatus: invite.status,
394
- });
395
- }
396
- if (invite.expiresTime !== undefined && invite.expiresTime <= Date.now()) {
397
- await ctx.db.patch("GroupInvite", inviteId, {
398
- status: "expired",
399
- });
400
- throw new ConvexError({
401
- code: "INVITE_EXPIRED",
402
- message: "Invite has expired",
403
- inviteId,
404
- });
405
- }
406
- await ctx.db.patch("GroupInvite", inviteId, {
407
- status: "accepted",
408
- acceptedTime: Date.now(),
409
- ...(acceptedByUserId ? { acceptedByUserId } : {}),
410
- });
411
- return null;
412
- },
413
- });
414
-
415
- /**
416
- * Accept an invitation by raw token hash and atomically join group membership.
417
- *
418
- * This is the primary token-based acceptance flow. It looks up the invite by
419
- * `tokenHash`, validates status and expiry, verifies the accepting user's
420
- * email matches the invite email (when set), and — if the invite is scoped
421
- * to a group — creates a `GroupMember` record in the same transaction.
422
- *
423
- * The operation is idempotent: if the invite was already accepted by the
424
- * same user, it returns a result with `inviteStatus: "already_accepted"`
425
- * and the existing membership information.
426
- *
427
- * @param args.tokenHash - The hashed token string that identifies the invite (typically extracted from an invite URL).
428
- * @param args.acceptedByUserId - The `Id<"User">` of the user accepting the invitation. Their email must match the invite's email when one was specified.
429
- * @returns An object describing the outcome:
430
- * - `inviteId` — the ID of the accepted invite.
431
- * - `groupId` — the group the invite targets, or `null` for platform invites.
432
- * - `memberId` — the ID of the created (or existing) member record, or `undefined` for platform invites.
433
- * - `inviteStatus` — `"accepted"` for a fresh acceptance, `"already_accepted"` for idempotent replays.
434
- * - `membershipStatus` — `"joined"`, `"already_joined"`, or `"not_applicable"`.
435
- * @throws `ConvexError` with code `INVITE_NOT_FOUND` if no invite matches the token hash.
436
- * @throws `ConvexError` with code `INVITE_EXPIRED` if the invite's `expiresTime` has passed.
437
- * @throws `ConvexError` with code `INVITE_ALREADY_ACCEPTED` if the invite was accepted by a different user.
438
- * @throws `ConvexError` with code `INVITE_NOT_PENDING` if the invite has been revoked or is in another non-pending state.
439
- * @throws `ConvexError` with code `INVITE_EMAIL_MISMATCH` if the accepting user's email does not match the invite's email.
440
- *
441
- * @example
442
- * ```ts
443
- * const result = await ctx.runMutation(
444
- * components.auth.groups.inviteAcceptByToken,
445
- * {
446
- * tokenHash: "sha256_abc123...",
447
- * acceptedByUserId: currentUserId,
448
- * },
449
- * );
450
- * if (result.membershipStatus === "joined") {
451
- * console.log("Joined group", result.groupId, "as member", result.memberId);
452
- * }
453
- * ```
454
- */
455
- export const inviteAcceptByToken = mutation({
456
- args: {
457
- tokenHash: v.string(),
458
- acceptedByUserId: v.id("User"),
459
- },
460
- returns: vInviteAcceptByTokenResult,
461
- handler: async (ctx, { tokenHash, acceptedByUserId }) => {
462
- const invite = await ctx.db
463
- .query("GroupInvite")
464
- .withIndex("token_hash", (q) => q.eq("tokenHash", tokenHash))
465
- .first();
466
-
467
- if (invite === null) {
468
- throw new ConvexError({
469
- code: "INVITE_NOT_FOUND",
470
- message: "Invite not found",
471
- });
472
- }
473
-
474
- const now = Date.now();
475
- if (invite.status === "pending") {
476
- if (invite.expiresTime !== undefined && invite.expiresTime <= now) {
477
- await ctx.db.patch("GroupInvite", invite._id, { status: "expired" });
478
- throw new ConvexError({
479
- code: "INVITE_EXPIRED",
480
- message: "Invite has expired",
481
- inviteId: invite._id,
482
- });
483
- }
484
- } else if (invite.status === "accepted") {
485
- if (invite.acceptedByUserId !== acceptedByUserId) {
486
- throw new ConvexError({
487
- code: "INVITE_ALREADY_ACCEPTED",
488
- message: "Invite already accepted by another user",
489
- inviteId: invite._id,
490
- });
491
- }
492
- } else {
493
- throw new ConvexError({
494
- code: "INVITE_NOT_PENDING",
495
- message: `Cannot accept invite with status "${invite.status}"`,
496
- inviteId: invite._id,
497
- currentStatus: invite.status,
498
- });
499
- }
500
-
501
- if (invite.email !== undefined) {
502
- const user = await ctx.db.get("User", acceptedByUserId);
503
- const normalizedInviteEmail = invite.email.trim().toLowerCase();
504
- const normalizedUserEmail = user?.email?.trim().toLowerCase();
505
-
506
- if (
507
- normalizedUserEmail === undefined ||
508
- normalizedUserEmail !== normalizedInviteEmail
509
- ) {
510
- throw new ConvexError({
511
- code: "INVITE_EMAIL_MISMATCH",
512
- message: "Invite email does not match accepting user's email",
513
- inviteId: invite._id,
514
- });
515
- }
516
- }
517
-
518
- let membershipStatus: "joined" | "already_joined" | "not_applicable" =
519
- "not_applicable";
520
- let memberId: Id<"GroupMember"> | undefined;
521
-
522
- if (invite.groupId !== undefined) {
523
- const existingMembership = await ctx.db
524
- .query("GroupMember")
525
- .withIndex("group_id_user_id", (q) =>
526
- q.eq("groupId", invite.groupId!).eq("userId", acceptedByUserId),
527
- )
528
- .unique();
529
-
530
- if (existingMembership !== null) {
531
- membershipStatus = "already_joined";
532
- memberId = existingMembership._id;
533
- } else {
534
- memberId = await ctx.db.insert("GroupMember", {
535
- groupId: invite.groupId,
536
- userId: acceptedByUserId,
537
- roleIds: invite.roleIds,
538
- status: "active",
539
- });
540
- membershipStatus = "joined";
541
- }
542
- }
543
-
544
- if (invite.status === "pending") {
545
- await ctx.db.patch("GroupInvite", invite._id, {
546
- status: "accepted",
547
- acceptedByUserId,
548
- acceptedTime: now,
549
- });
550
- }
551
-
552
- const inviteStatus: "accepted" | "already_accepted" =
553
- invite.status === "accepted" ? "already_accepted" : "accepted";
554
-
555
- return {
556
- inviteId: invite._id,
557
- groupId: invite.groupId ?? null,
558
- memberId,
559
- inviteStatus,
560
- membershipStatus,
561
- };
562
- },
563
- });
564
-
565
- /**
566
- * Revoke a pending invitation.
567
- *
568
- * Marks the invite as `"revoked"`. Only invites with status `"pending"` can
569
- * be revoked. Throws a structured `ConvexError` when the invite doesn't
570
- * exist or is not currently pending. Once revoked, the invite's token can
571
- * no longer be used for acceptance.
572
- *
573
- * @param args.inviteId - The `Id<"GroupInvite">` of the invite to revoke.
574
- * @returns `null` on success.
575
- * @throws `ConvexError` with code `INVITE_NOT_FOUND` if the invite does not exist.
576
- * @throws `ConvexError` with code `INVITE_NOT_PENDING` if the invite has already been accepted, revoked, or expired.
577
- *
578
- * @example
579
- * ```ts
580
- * await ctx.runMutation(components.auth.groups.inviteRevoke, {
581
- * inviteId: pendingInviteId,
582
- * });
583
- * ```
584
- */
585
- export const inviteRevoke = mutation({
586
- args: { inviteId: v.id("GroupInvite") },
587
- returns: v.null(),
588
- handler: async (ctx, { inviteId }) => {
589
- const invite = await ctx.db.get("GroupInvite", inviteId);
590
- if (invite === null) {
591
- throw new ConvexError({
592
- code: "INVITE_NOT_FOUND",
593
- message: "Invite not found",
594
- inviteId,
595
- });
596
- }
597
- if (invite.status !== "pending") {
598
- throw new ConvexError({
599
- code: "INVITE_NOT_PENDING",
600
- message: `Cannot revoke invite with status "${invite.status}"`,
601
- inviteId,
602
- currentStatus: invite.status,
603
- });
604
- }
605
- await ctx.db.patch("GroupInvite", inviteId, { status: "revoked" });
606
- return null;
607
- },
608
- });