@robelest/convex-auth 0.0.4-preview.2 → 0.0.4-preview.21

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