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

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 (310) hide show
  1. package/dist/authorization/index.d.ts +1 -1
  2. package/dist/authorization/index.js +1 -1
  3. package/dist/authorization/index.js.map +1 -1
  4. package/dist/client/index.d.ts +1 -2
  5. package/dist/client/index.d.ts.map +1 -1
  6. package/dist/client/index.js +36 -39
  7. package/dist/client/index.js.map +1 -1
  8. package/dist/component/client/index.d.ts +1 -2
  9. package/dist/component/convex.config.d.ts +2 -2
  10. package/dist/component/convex.config.d.ts.map +1 -1
  11. package/dist/component/model.d.ts +5 -5
  12. package/dist/component/model.d.ts.map +1 -1
  13. package/dist/component/public/enterprise/audit.d.ts.map +1 -1
  14. package/dist/component/public/enterprise/audit.js.map +1 -1
  15. package/dist/component/public/enterprise/core.d.ts.map +1 -1
  16. package/dist/component/public/enterprise/core.js.map +1 -1
  17. package/dist/component/public/enterprise/domains.d.ts.map +1 -1
  18. package/dist/component/public/enterprise/domains.js.map +1 -1
  19. package/dist/component/public/enterprise/scim.d.ts.map +1 -1
  20. package/dist/component/public/enterprise/scim.js.map +1 -1
  21. package/dist/component/public/enterprise/secrets.d.ts.map +1 -1
  22. package/dist/component/public/enterprise/secrets.js.map +1 -1
  23. package/dist/component/public/enterprise/webhooks.d.ts.map +1 -1
  24. package/dist/component/public/enterprise/webhooks.js.map +1 -1
  25. package/dist/component/public/factors/devices.d.ts.map +1 -1
  26. package/dist/component/public/factors/devices.js.map +1 -1
  27. package/dist/component/public/factors/passkeys.d.ts.map +1 -1
  28. package/dist/component/public/factors/passkeys.js.map +1 -1
  29. package/dist/component/public/factors/totp.d.ts.map +1 -1
  30. package/dist/component/public/factors/totp.js.map +1 -1
  31. package/dist/component/public/groups/core.js.map +1 -1
  32. package/dist/component/public/groups/invites.d.ts.map +1 -1
  33. package/dist/component/public/groups/invites.js.map +1 -1
  34. package/dist/component/public/groups/members.d.ts.map +1 -1
  35. package/dist/component/public/groups/members.js.map +1 -1
  36. package/dist/component/public/identity/accounts.d.ts.map +1 -1
  37. package/dist/component/public/identity/accounts.js.map +1 -1
  38. package/dist/component/public/identity/codes.d.ts.map +1 -1
  39. package/dist/component/public/identity/codes.js.map +1 -1
  40. package/dist/component/public/identity/sessions.d.ts.map +1 -1
  41. package/dist/component/public/identity/sessions.js.map +1 -1
  42. package/dist/component/public/identity/tokens.d.ts.map +1 -1
  43. package/dist/component/public/identity/tokens.js.map +1 -1
  44. package/dist/component/public/identity/users.d.ts.map +1 -1
  45. package/dist/component/public/identity/users.js.map +1 -1
  46. package/dist/component/public/identity/verifiers.d.ts.map +1 -1
  47. package/dist/component/public/identity/verifiers.js.map +1 -1
  48. package/dist/component/public/security/keys.d.ts.map +1 -1
  49. package/dist/component/public/security/keys.js.map +1 -1
  50. package/dist/component/public/security/limits.d.ts.map +1 -1
  51. package/dist/component/public/security/limits.js.map +1 -1
  52. package/dist/component/schema.d.ts +39 -39
  53. package/dist/component/server/auth.d.ts +95 -52
  54. package/dist/component/server/auth.d.ts.map +1 -1
  55. package/dist/component/server/auth.js +63 -43
  56. package/dist/component/server/auth.js.map +1 -1
  57. package/dist/component/server/core.js +116 -235
  58. package/dist/component/server/core.js.map +1 -1
  59. package/dist/component/server/crypto.js +25 -7
  60. package/dist/component/server/crypto.js.map +1 -1
  61. package/dist/component/server/device.js +58 -15
  62. package/dist/component/server/device.js.map +1 -1
  63. package/dist/component/server/enterprise/domain.js +148 -59
  64. package/dist/component/server/enterprise/domain.js.map +1 -1
  65. package/dist/component/server/enterprise/http.js +36 -15
  66. package/dist/component/server/enterprise/http.js.map +1 -1
  67. package/dist/component/server/enterprise/oidc.js +1 -1
  68. package/dist/component/server/http.js +26 -21
  69. package/dist/component/server/http.js.map +1 -1
  70. package/dist/component/server/identity.js +5 -2
  71. package/dist/component/server/identity.js.map +1 -1
  72. package/dist/component/server/limits.js +21 -30
  73. package/dist/component/server/limits.js.map +1 -1
  74. package/dist/component/server/mutations/account.js +12 -10
  75. package/dist/component/server/mutations/account.js.map +1 -1
  76. package/dist/component/server/mutations/code.js +5 -2
  77. package/dist/component/server/mutations/code.js.map +1 -1
  78. package/dist/component/server/mutations/invalidate.js +1 -1
  79. package/dist/component/server/mutations/invalidate.js.map +1 -1
  80. package/dist/component/server/mutations/oauth.js +10 -4
  81. package/dist/component/server/mutations/oauth.js.map +1 -1
  82. package/dist/component/server/mutations/refresh.js +2 -2
  83. package/dist/component/server/mutations/refresh.js.map +1 -1
  84. package/dist/component/server/mutations/register.js +46 -42
  85. package/dist/component/server/mutations/register.js.map +1 -1
  86. package/dist/component/server/mutations/retrieve.js +21 -25
  87. package/dist/component/server/mutations/retrieve.js.map +1 -1
  88. package/dist/component/server/mutations/signature.js +10 -4
  89. package/dist/component/server/mutations/signature.js.map +1 -1
  90. package/dist/component/server/mutations/signout.js.map +1 -1
  91. package/dist/component/server/mutations/store.js +9 -24
  92. package/dist/component/server/mutations/store.js.map +1 -1
  93. package/dist/component/server/mutations/verifier.js.map +1 -1
  94. package/dist/component/server/mutations/verify.js +1 -1
  95. package/dist/component/server/mutations/verify.js.map +1 -1
  96. package/dist/component/server/oauth.js +53 -16
  97. package/dist/component/server/oauth.js.map +1 -1
  98. package/dist/component/server/passkey.js +115 -31
  99. package/dist/component/server/passkey.js.map +1 -1
  100. package/dist/component/server/redirects.js +9 -3
  101. package/dist/component/server/redirects.js.map +1 -1
  102. package/dist/component/server/refresh.js +10 -7
  103. package/dist/component/server/refresh.js.map +1 -1
  104. package/dist/component/server/runtime.d.ts +3 -3
  105. package/dist/component/server/runtime.d.ts.map +1 -1
  106. package/dist/component/server/runtime.js +62 -20
  107. package/dist/component/server/runtime.js.map +1 -1
  108. package/dist/component/server/signin.js +34 -10
  109. package/dist/component/server/signin.js.map +1 -1
  110. package/dist/component/server/totp.js +79 -19
  111. package/dist/component/server/totp.js.map +1 -1
  112. package/dist/component/server/types.d.ts +12 -20
  113. package/dist/component/server/types.d.ts.map +1 -1
  114. package/dist/component/server/types.js.map +1 -1
  115. package/dist/component/server/users.js +6 -3
  116. package/dist/component/server/users.js.map +1 -1
  117. package/dist/component/server/utils.js +10 -4
  118. package/dist/component/server/utils.js.map +1 -1
  119. package/dist/core/types.d.ts +14 -22
  120. package/dist/core/types.d.ts.map +1 -1
  121. package/dist/factors/device.js +8 -9
  122. package/dist/factors/device.js.map +1 -1
  123. package/dist/factors/passkey.js +18 -21
  124. package/dist/factors/passkey.js.map +1 -1
  125. package/dist/providers/password.js +66 -81
  126. package/dist/providers/password.js.map +1 -1
  127. package/dist/runtime/invite.js +2 -8
  128. package/dist/runtime/invite.js.map +1 -1
  129. package/dist/server/auth.d.ts +95 -52
  130. package/dist/server/auth.d.ts.map +1 -1
  131. package/dist/server/auth.js +63 -43
  132. package/dist/server/auth.js.map +1 -1
  133. package/dist/server/core.d.ts +71 -159
  134. package/dist/server/core.d.ts.map +1 -1
  135. package/dist/server/core.js +116 -235
  136. package/dist/server/core.js.map +1 -1
  137. package/dist/server/crypto.d.ts.map +1 -1
  138. package/dist/server/crypto.js +25 -7
  139. package/dist/server/crypto.js.map +1 -1
  140. package/dist/server/device.js +58 -15
  141. package/dist/server/device.js.map +1 -1
  142. package/dist/server/enterprise/domain.d.ts +0 -8
  143. package/dist/server/enterprise/domain.d.ts.map +1 -1
  144. package/dist/server/enterprise/domain.js +148 -59
  145. package/dist/server/enterprise/domain.js.map +1 -1
  146. package/dist/server/enterprise/http.d.ts.map +1 -1
  147. package/dist/server/enterprise/http.js +35 -14
  148. package/dist/server/enterprise/http.js.map +1 -1
  149. package/dist/server/http.d.ts +2 -2
  150. package/dist/server/http.d.ts.map +1 -1
  151. package/dist/server/http.js +25 -20
  152. package/dist/server/http.js.map +1 -1
  153. package/dist/server/identity.js +5 -2
  154. package/dist/server/identity.js.map +1 -1
  155. package/dist/server/index.d.ts +2 -2
  156. package/dist/server/limits.js +21 -30
  157. package/dist/server/limits.js.map +1 -1
  158. package/dist/server/mounts.d.ts +26 -64
  159. package/dist/server/mounts.d.ts.map +1 -1
  160. package/dist/server/mounts.js +45 -106
  161. package/dist/server/mounts.js.map +1 -1
  162. package/dist/server/mutations/account.d.ts +8 -9
  163. package/dist/server/mutations/account.d.ts.map +1 -1
  164. package/dist/server/mutations/account.js +11 -9
  165. package/dist/server/mutations/account.js.map +1 -1
  166. package/dist/server/mutations/code.d.ts +13 -13
  167. package/dist/server/mutations/code.d.ts.map +1 -1
  168. package/dist/server/mutations/code.js +5 -2
  169. package/dist/server/mutations/code.js.map +1 -1
  170. package/dist/server/mutations/invalidate.d.ts +4 -4
  171. package/dist/server/mutations/invalidate.d.ts.map +1 -1
  172. package/dist/server/mutations/invalidate.js.map +1 -1
  173. package/dist/server/mutations/oauth.d.ts +12 -10
  174. package/dist/server/mutations/oauth.d.ts.map +1 -1
  175. package/dist/server/mutations/oauth.js +9 -3
  176. package/dist/server/mutations/oauth.js.map +1 -1
  177. package/dist/server/mutations/refresh.d.ts +3 -3
  178. package/dist/server/mutations/refresh.d.ts.map +1 -1
  179. package/dist/server/mutations/refresh.js +1 -1
  180. package/dist/server/mutations/refresh.js.map +1 -1
  181. package/dist/server/mutations/register.d.ts +11 -11
  182. package/dist/server/mutations/register.d.ts.map +1 -1
  183. package/dist/server/mutations/register.js +45 -41
  184. package/dist/server/mutations/register.js.map +1 -1
  185. package/dist/server/mutations/retrieve.d.ts +6 -6
  186. package/dist/server/mutations/retrieve.d.ts.map +1 -1
  187. package/dist/server/mutations/retrieve.js +20 -24
  188. package/dist/server/mutations/retrieve.js.map +1 -1
  189. package/dist/server/mutations/signature.d.ts +6 -7
  190. package/dist/server/mutations/signature.d.ts.map +1 -1
  191. package/dist/server/mutations/signature.js +9 -3
  192. package/dist/server/mutations/signature.js.map +1 -1
  193. package/dist/server/mutations/signin.d.ts +5 -5
  194. package/dist/server/mutations/signin.d.ts.map +1 -1
  195. package/dist/server/mutations/signout.js.map +1 -1
  196. package/dist/server/mutations/store.d.ts +97 -97
  197. package/dist/server/mutations/store.d.ts.map +1 -1
  198. package/dist/server/mutations/store.js +8 -23
  199. package/dist/server/mutations/store.js.map +1 -1
  200. package/dist/server/mutations/verifier.js.map +1 -1
  201. package/dist/server/mutations/verify.d.ts +10 -10
  202. package/dist/server/mutations/verify.d.ts.map +1 -1
  203. package/dist/server/mutations/verify.js.map +1 -1
  204. package/dist/server/oauth.js +53 -16
  205. package/dist/server/oauth.js.map +1 -1
  206. package/dist/server/passkey.d.ts +2 -2
  207. package/dist/server/passkey.d.ts.map +1 -1
  208. package/dist/server/passkey.js +114 -30
  209. package/dist/server/passkey.js.map +1 -1
  210. package/dist/server/redirects.js +9 -3
  211. package/dist/server/redirects.js.map +1 -1
  212. package/dist/server/refresh.js +10 -7
  213. package/dist/server/refresh.js.map +1 -1
  214. package/dist/server/runtime.d.ts +14 -14
  215. package/dist/server/runtime.d.ts.map +1 -1
  216. package/dist/server/runtime.js +61 -19
  217. package/dist/server/runtime.js.map +1 -1
  218. package/dist/server/signin.js +34 -10
  219. package/dist/server/signin.js.map +1 -1
  220. package/dist/server/ssr.d.ts.map +1 -1
  221. package/dist/server/ssr.js +175 -184
  222. package/dist/server/ssr.js.map +1 -1
  223. package/dist/server/totp.js +78 -18
  224. package/dist/server/totp.js.map +1 -1
  225. package/dist/server/types.d.ts +13 -21
  226. package/dist/server/types.d.ts.map +1 -1
  227. package/dist/server/types.js.map +1 -1
  228. package/dist/server/users.js +6 -3
  229. package/dist/server/users.js.map +1 -1
  230. package/dist/server/utils.js +10 -4
  231. package/dist/server/utils.js.map +1 -1
  232. package/package.json +2 -6
  233. package/src/authorization/index.ts +1 -1
  234. package/src/cli/index.ts +1 -1
  235. package/src/client/core/types.ts +14 -14
  236. package/src/client/factors/device.ts +10 -12
  237. package/src/client/factors/passkey.ts +23 -26
  238. package/src/client/index.ts +54 -64
  239. package/src/client/runtime/invite.ts +5 -7
  240. package/src/component/index.ts +1 -0
  241. package/src/component/public/enterprise/audit.ts +6 -1
  242. package/src/component/public/enterprise/core.ts +1 -0
  243. package/src/component/public/enterprise/domains.ts +5 -1
  244. package/src/component/public/enterprise/scim.ts +1 -0
  245. package/src/component/public/enterprise/secrets.ts +1 -0
  246. package/src/component/public/enterprise/webhooks.ts +1 -0
  247. package/src/component/public/factors/devices.ts +1 -0
  248. package/src/component/public/factors/passkeys.ts +1 -0
  249. package/src/component/public/factors/totp.ts +1 -0
  250. package/src/component/public/groups/core.ts +1 -1
  251. package/src/component/public/groups/invites.ts +7 -1
  252. package/src/component/public/groups/members.ts +1 -0
  253. package/src/component/public/identity/accounts.ts +1 -0
  254. package/src/component/public/identity/codes.ts +1 -0
  255. package/src/component/public/identity/sessions.ts +1 -0
  256. package/src/component/public/identity/tokens.ts +1 -0
  257. package/src/component/public/identity/users.ts +1 -0
  258. package/src/component/public/identity/verifiers.ts +1 -0
  259. package/src/component/public/security/keys.ts +1 -0
  260. package/src/component/public/security/limits.ts +1 -0
  261. package/src/providers/password.ts +89 -110
  262. package/src/server/auth.ts +177 -111
  263. package/src/server/core.ts +197 -233
  264. package/src/server/crypto.ts +31 -29
  265. package/src/server/device.ts +65 -32
  266. package/src/server/enterprise/domain.ts +158 -170
  267. package/src/server/enterprise/http.ts +46 -39
  268. package/src/server/http.ts +36 -30
  269. package/src/server/identity.ts +5 -5
  270. package/src/server/index.ts +2 -0
  271. package/src/server/limits.ts +53 -80
  272. package/src/server/mounts.ts +47 -74
  273. package/src/server/mutations/account.ts +22 -36
  274. package/src/server/mutations/code.ts +6 -6
  275. package/src/server/mutations/invalidate.ts +1 -1
  276. package/src/server/mutations/oauth.ts +14 -8
  277. package/src/server/mutations/refresh.ts +5 -4
  278. package/src/server/mutations/register.ts +87 -132
  279. package/src/server/mutations/retrieve.ts +44 -44
  280. package/src/server/mutations/signature.ts +13 -6
  281. package/src/server/mutations/signout.ts +1 -1
  282. package/src/server/mutations/store.ts +16 -31
  283. package/src/server/mutations/verifier.ts +1 -1
  284. package/src/server/mutations/verify.ts +3 -5
  285. package/src/server/oauth.ts +60 -69
  286. package/src/server/passkey.ts +567 -517
  287. package/src/server/redirects.ts +10 -6
  288. package/src/server/refresh.ts +14 -18
  289. package/src/server/runtime.ts +70 -55
  290. package/src/server/signin.ts +44 -37
  291. package/src/server/ssr.ts +390 -407
  292. package/src/server/totp.ts +85 -35
  293. package/src/server/types.ts +19 -22
  294. package/src/server/users.ts +7 -6
  295. package/src/server/utils.ts +10 -12
  296. package/dist/component/server/authError.js +0 -34
  297. package/dist/component/server/authError.js.map +0 -1
  298. package/dist/component/server/errors.d.ts +0 -1
  299. package/dist/component/server/errors.js +0 -137
  300. package/dist/component/server/errors.js.map +0 -1
  301. package/dist/server/authError.d.ts +0 -46
  302. package/dist/server/authError.d.ts.map +0 -1
  303. package/dist/server/authError.js +0 -34
  304. package/dist/server/authError.js.map +0 -1
  305. package/dist/server/errors.d.ts +0 -177
  306. package/dist/server/errors.d.ts.map +0 -1
  307. package/dist/server/errors.js +0 -212
  308. package/dist/server/errors.js.map +0 -1
  309. package/src/server/authError.ts +0 -44
  310. package/src/server/errors.ts +0 -290
@@ -1,290 +0,0 @@
1
- /**
2
- * Structured error handling for Convex Auth.
3
- *
4
- * Every error thrown by the auth system uses `ConvexError` with a
5
- * `{ code, message }` payload so clients can distinguish error types
6
- * and display user-friendly messages.
7
- *
8
- * **Consumer API:** Use {@link throwAuthError} to throw structured errors
9
- * from your own Convex functions (e.g. custom authorization checks).
10
- *
11
- * **Internal pattern:** The library itself uses `new AuthError(code)` with
12
- * the `@robelest/fx` effect system (`Fx.fail(new AuthError(code))`).
13
- * You do not need to use `AuthError` directly — it is an implementation detail.
14
- *
15
- * @module
16
- */
17
-
18
- import { ConvexError } from "convex/values";
19
-
20
- // ============================================================================
21
- // Error code → default message map (single source of truth)
22
- // ============================================================================
23
-
24
- /**
25
- * Map of every auth error code to its default human-readable message.
26
- *
27
- * Use the keys as the `code` argument to {@link throwAuthError}.
28
- * Clients can match on these codes for conditional error handling.
29
- *
30
- * @example
31
- * ```ts
32
- * throwAuthError("NOT_SIGNED_IN");
33
- * // ConvexError { data: { code: "NOT_SIGNED_IN", message: "You must be signed in..." } }
34
- * ```
35
- */
36
- export const AUTH_ERRORS = {
37
- // ---- Configuration ----
38
- PROVIDER_NOT_CONFIGURED: "This sign-in method is not available.",
39
- EMAIL_CONFIG_REQUIRED:
40
- "Email transport is not configured. Configure email in createAuth(...).",
41
- MISSING_ENV_VAR: "A required server environment variable is missing.",
42
- MISSING_ACTION_CONTEXT: "Action context is required for this operation.",
43
- INVALID_PARAMETERS: "The provided parameters are invalid.",
44
-
45
- // ---- Authentication ----
46
- NOT_SIGNED_IN: "You must be signed in to perform this action.",
47
- INVALID_VERIFICATION_CODE: "Invalid or expired verification code.",
48
- INVALID_REFRESH_TOKEN: "Your session has expired. Please sign in again.",
49
- AUTH_HANDSHAKE_TIMEOUT:
50
- "Sign-in succeeded but authentication confirmation timed out.",
51
- AUTH_HANDSHAKE_REJECTED:
52
- "Authentication was rejected while confirming the session.",
53
- SIGN_IN_MISSING_PARAMS:
54
- "Cannot sign in: missing provider, code, or refresh token.",
55
- UNSUPPORTED_PROVIDER_TYPE: "This provider type is not supported.",
56
- INVALID_REDIRECT: "Invalid redirect URL.",
57
-
58
- // ---- Email / Phone ----
59
- EMAIL_SEND_FAILED: "Failed to send verification email. Please try again.",
60
-
61
- // ---- API Keys ----
62
- INVALID_API_KEY: "Invalid API key.",
63
- API_KEY_REVOKED: "This API key has been revoked.",
64
- API_KEY_EXPIRED: "This API key has expired.",
65
- API_KEY_RATE_LIMITED: "API key rate limit exceeded. Please try again later.",
66
- API_KEY_INVALID_SCOPE: "Invalid scope requested for API key.",
67
- KEY_NOT_FOUND: "API key not found.",
68
-
69
- // ---- HTTP Bearer Auth ----
70
- MISSING_BEARER_TOKEN: "Missing or malformed Authorization: Bearer header.",
71
- SCOPE_CHECK_FAILED: "This API key does not have the required permissions.",
72
-
73
- // ---- OAuth ----
74
- OAUTH_MISSING_PROVIDER: "Missing OAuth provider ID.",
75
- OAUTH_MISSING_VERIFIER: "Missing sign-in verifier.",
76
- OAUTH_INVALID_STATE: "Invalid OAuth state. Please try signing in again.",
77
- OAUTH_PROVIDER_ERROR: "The sign-in provider returned an error.",
78
- OAUTH_MISSING_ID_TOKEN:
79
- "ID token claims are missing from the provider response.",
80
- OAUTH_INVALID_PROFILE: "The sign-in provider returned an invalid profile.",
81
- OAUTH_UNSUPPORTED_AUTH_METHOD:
82
- "Unsupported OAuth client authentication method.",
83
- OAUTH_NO_USERINFO: "No userinfo endpoint configured for this provider.",
84
-
85
- // ---- Credentials ----
86
- ACCOUNT_ALREADY_EXISTS: "An account with these credentials already exists.",
87
- ACCOUNT_NOT_FOUND: "Account not found.",
88
- INVALID_CREDENTIALS_PROVIDER:
89
- "This provider does not support credential operations.",
90
- MISSING_CRYPTO_FUNCTION:
91
- "This provider is missing a required cryptographic function.",
92
- USER_UPDATE_FAILED: "Could not update the user record.",
93
-
94
- // ---- Verifier ----
95
- INVALID_VERIFIER: "Invalid or expired verifier.",
96
-
97
- // ---- Passkey ----
98
- PASSKEY_MISSING_CONFIG:
99
- "Passkey provider requires SITE_URL or explicit rpId configuration.",
100
- PASSKEY_AUTH_REQUIRED: "Sign in first, then add a passkey to your account.",
101
- PASSKEY_MISSING_VERIFIER: "Missing verifier for passkey operation.",
102
- PASSKEY_INVALID_CLIENT_DATA: "Invalid passkey client data.",
103
- PASSKEY_INVALID_ORIGIN: "Passkey origin does not match the expected value.",
104
- PASSKEY_INVALID_CHALLENGE: "Invalid or expired passkey challenge.",
105
- PASSKEY_RP_MISMATCH: "Relying party ID mismatch.",
106
- PASSKEY_USER_PRESENCE: "User presence flag not set.",
107
- PASSKEY_USER_VERIFICATION: "User verification required but not performed.",
108
- PASSKEY_NO_CREDENTIAL: "No credential in attestation.",
109
- PASSKEY_UNSUPPORTED_ALGORITHM: "Unsupported passkey algorithm.",
110
- PASSKEY_INVALID_SIGNATURE: "Invalid passkey signature.",
111
- PASSKEY_UNKNOWN_CREDENTIAL: "Unknown passkey credential.",
112
- PASSKEY_COUNTER_ERROR:
113
- "Authenticator counter did not increase — possible credential cloning detected.",
114
- PASSKEY_MISSING_FLOW: "Missing passkey flow parameter.",
115
- PASSKEY_UNKNOWN_FLOW: "Unknown passkey flow.",
116
-
117
- // ---- TOTP ----
118
- TOTP_AUTH_REQUIRED: "Sign in first, then set up two-factor authentication.",
119
- TOTP_MISSING_VERIFIER: "Missing verifier for TOTP operation.",
120
- TOTP_MISSING_CODE: "Missing TOTP code.",
121
- TOTP_MISSING_ID: "Missing TOTP enrollment ID.",
122
- TOTP_NOT_FOUND: "TOTP enrollment not found.",
123
- TOTP_ALREADY_VERIFIED: "TOTP enrollment is already verified.",
124
- TOTP_INVALID_CODE: "Invalid TOTP code.",
125
- TOTP_INVALID_VERIFIER: "Invalid or expired TOTP verifier.",
126
- TOTP_NO_ENROLLMENT: "No verified TOTP enrollment found.",
127
- TOTP_MISSING_FLOW: "Missing TOTP flow parameter.",
128
- TOTP_UNKNOWN_FLOW: "Unknown TOTP flow.",
129
-
130
- // ---- Device Authorization (RFC 8628) ----
131
- DEVICE_CODE_EXPIRED:
132
- "The device code has expired. Please start a new authorization request.",
133
- DEVICE_CODE_DENIED: "The authorization request was denied.",
134
- DEVICE_AUTHORIZATION_PENDING: "The user has not yet authorized this device.",
135
- DEVICE_SLOW_DOWN:
136
- "Polling too frequently. Increase the interval between requests.",
137
- DEVICE_INVALID_USER_CODE: "Invalid or expired user code.",
138
- DEVICE_ALREADY_AUTHORIZED: "This device code has already been authorized.",
139
- DEVICE_MISSING_FLOW: "Missing device flow parameter.",
140
- DEVICE_UNKNOWN_FLOW: "Unknown device flow.",
141
-
142
- // ---- Invites ----
143
- INVITE_EXPIRED: "This invitation has expired.",
144
- INVITE_EMAIL_MISMATCH: "This invitation is for a different email.",
145
- INVITE_ALREADY_ACCEPTED: "This invitation has already been accepted.",
146
- DUPLICATE_INVITE:
147
- "A pending invite already exists for this email in this group.",
148
- INVITE_NOT_FOUND: "Invite not found.",
149
- INVITE_NOT_PENDING: "Cannot accept or revoke invite that is not pending.",
150
-
151
- // ---- Groups / Members ----
152
- FORBIDDEN: "Access denied.",
153
- NO_ACTIVE_GROUP: "User has no active group set.",
154
- DUPLICATE_MEMBERSHIP: "User is already a member of this group.",
155
-
156
- // ---- Enterprise ----
157
- ENTERPRISE_ALREADY_EXISTS:
158
- "An enterprise record already exists for this group.",
159
- ENTERPRISE_DOMAIN_TAKEN:
160
- "That domain is already attached to another enterprise.",
161
-
162
- // ---- Internal (should never reach user) ----
163
- INTERNAL_ERROR: "An unexpected error occurred.",
164
- } as const satisfies Record<string, string>;
165
-
166
- /** Union of all recognized auth error code strings (keys of {@link AUTH_ERRORS}). */
167
- export type AuthErrorCode = keyof typeof AUTH_ERRORS;
168
-
169
- // ============================================================================
170
- // Error helpers
171
- // ============================================================================
172
-
173
- /**
174
- * Throw a structured `ConvexError` with `{ code, message }`.
175
- *
176
- * Use this in your own Convex functions (queries, mutations, actions)
177
- * to throw auth-domain errors that clients can match on by `code`.
178
- * The library itself uses `AuthError` internally, but consumers
179
- * should prefer this helper for simplicity.
180
- *
181
- * @param code Machine-readable error code from `AUTH_ERRORS`.
182
- * @param message Optional override for the default human-readable message.
183
- * @param context Optional extra fields merged into the error payload.
184
- *
185
- * @example
186
- * ```ts
187
- * import { throwAuthError } from "@robelest/convex-auth/server";
188
- *
189
- * // In a custom mutation:
190
- * if (!isAdmin) {
191
- * throwAuthError("FORBIDDEN");
192
- * }
193
- * ```
194
- *
195
- * @throws {ConvexError} Always — throws a `ConvexError` with `{ code, message }` payload.
196
- */
197
- export function throwAuthError(
198
- code: AuthErrorCode,
199
- message?: string,
200
- context?: Record<string, unknown>,
201
- ): never {
202
- throw new ConvexError({
203
- code,
204
- message: message ?? AUTH_ERRORS[code],
205
- ...context,
206
- });
207
- }
208
-
209
- /**
210
- * Type guard: check whether a caught value is a structured auth `ConvexError`.
211
- *
212
- * @param error - The caught value (typically from a `catch` block).
213
- * @returns `true` when `error` is a `ConvexError` with `{ code, message }` data.
214
- *
215
- * @example
216
- * ```ts
217
- * try { await auth.signIn('email', { email }); }
218
- * catch (e) {
219
- * if (isAuthError(e)) console.log(e.data.code); // "EMAIL_SEND_FAILED"
220
- * }
221
- * ```
222
- */
223
- export function isAuthError(
224
- error: unknown,
225
- ): error is ConvexError<{ code: AuthErrorCode; message: string }> {
226
- return (
227
- error instanceof ConvexError &&
228
- typeof error.data === "object" &&
229
- error.data !== null &&
230
- "code" in error.data &&
231
- "message" in error.data
232
- );
233
- }
234
-
235
- /**
236
- * Extract `{ code, message }` from a caught error.
237
- *
238
- * Works for `ConvexError` (from Convex actions), plain `Error`
239
- * instances, and structured auth errors. Returns `null` when the
240
- * value is not an error object.
241
- *
242
- * @param error - The caught value to parse.
243
- * @returns `{ code, message }` when extractable, or `null`.
244
- * When `code` is `null`, the error is not a structured auth error
245
- * but `message` still contains the error text.
246
- *
247
- * @example
248
- * ```ts
249
- * try {
250
- * await auth.signIn("email", { email });
251
- * } catch (e) {
252
- * const err = parseAuthError(e);
253
- * if (err?.code === "EMAIL_SEND_FAILED") { ... }
254
- * }
255
- * ```
256
- */
257
- export function parseAuthError(
258
- error: unknown,
259
- ):
260
- | { code: AuthErrorCode; message: string }
261
- | { code: null; message: string }
262
- | null {
263
- if (isAuthError(error)) {
264
- const { code, message } = error.data as {
265
- code: AuthErrorCode;
266
- message: string;
267
- };
268
- return { code, message };
269
- }
270
- // Recognize the Fx-native AuthError class (has _tag + code)
271
- if (
272
- error instanceof Error &&
273
- "_tag" in error &&
274
- (error as any)._tag === "AuthError" &&
275
- "code" in error &&
276
- typeof (error as any).code === "string"
277
- ) {
278
- return {
279
- code: (error as any).code as AuthErrorCode,
280
- message: error.message,
281
- };
282
- }
283
- if (error instanceof ConvexError && typeof error.data === "string") {
284
- return { code: null, message: error.data };
285
- }
286
- if (error instanceof Error) {
287
- return { code: null, message: error.message };
288
- }
289
- return null;
290
- }