@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
@@ -11,7 +11,9 @@ import { GenericId } from "convex/values";
11
11
  * minus `component` (which is passed as the first constructor argument).
12
12
  */
13
13
  type AuthConfig = Omit<ConvexAuthConfig, "component">;
14
- type MemberApiWithAuthorization<TAuthorization extends AuthAuthorizationConfig | undefined> = Omit<ReturnType<typeof Auth$1>["auth"]["member"], "create" | "list" | "update" | "resolve"> & {
14
+ /** Canonical user document type exposed by Convex Auth. */
15
+ type UserDoc = Doc<"User">;
16
+ type MemberApiWithAuthorization<TAuthorization extends AuthAuthorizationConfig | undefined> = Omit<ReturnType<typeof Auth$1>["auth"]["member"], "create" | "list" | "update" | "inspect" | "require"> & {
15
17
  create: (ctx: Parameters<ReturnType<typeof Auth$1>["auth"]["member"]["create"]>[0], data: {
16
18
  groupId: string;
17
19
  userId: string;
@@ -19,7 +21,6 @@ type MemberApiWithAuthorization<TAuthorization extends AuthAuthorizationConfig |
19
21
  status?: string;
20
22
  extend?: Record<string, unknown>;
21
23
  }) => Promise<{
22
- ok: true;
23
24
  memberId: string;
24
25
  }>;
25
26
  list: (ctx: Parameters<ReturnType<typeof Auth$1>["auth"]["member"]["list"]>[0], opts?: {
@@ -37,17 +38,22 @@ type MemberApiWithAuthorization<TAuthorization extends AuthAuthorizationConfig |
37
38
  update: (ctx: Parameters<ReturnType<typeof Auth$1>["auth"]["member"]["update"]>[0], memberId: string, data: Record<string, unknown> & {
38
39
  roleIds?: AuthRoleId<TAuthorization>[];
39
40
  }) => Promise<{
40
- ok: true;
41
41
  memberId: string;
42
42
  }>;
43
- resolve: (ctx: Parameters<ReturnType<typeof Auth$1>["auth"]["member"]["resolve"]>[0], opts: {
43
+ inspect: (ctx: Parameters<ReturnType<typeof Auth$1>["auth"]["member"]["inspect"]>[0], opts: {
44
+ userId: string;
45
+ groupId: string;
46
+ ancestry?: boolean;
47
+ maxDepth?: number;
48
+ }) => ReturnType<ReturnType<typeof Auth$1>["auth"]["member"]["inspect"]>;
49
+ require: (ctx: Parameters<ReturnType<typeof Auth$1>["auth"]["member"]["require"]>[0], opts: {
44
50
  userId: string;
45
51
  groupId: string;
46
52
  ancestry?: boolean;
47
53
  roleIds?: AuthRoleId<TAuthorization>[];
48
54
  grants?: AuthGrant<TAuthorization>[];
49
55
  maxDepth?: number;
50
- }) => ReturnType<ReturnType<typeof Auth$1>["auth"]["member"]["resolve"]>;
56
+ }) => ReturnType<ReturnType<typeof Auth$1>["auth"]["member"]["require"]>;
51
57
  };
52
58
  /**
53
59
  * The base auth API surface returned by {@link createAuth}.
@@ -78,30 +84,29 @@ type AuthApiBase<TAuthorization extends AuthAuthorizationConfig | undefined = un
78
84
  key: ReturnType<typeof Auth$1>["auth"]["key"];
79
85
  http: ReturnType<typeof Auth$1>["auth"]["http"];
80
86
  /**
81
- * Resolve the current user's auth context. Framework-agnostic — use
87
+ * Resolve the current request's auth context. Framework-agnostic — use
82
88
  * this in fluent-convex middleware, custom wrappers, or anywhere you
83
- * need the resolved `{ userId, user, groupId, role, grants }` object.
89
+ * need the current `{ userId, user, groupId, role, grants }` object.
84
90
  *
85
- * Returns `null` when unauthenticated. Does not throw.
91
+ * Throws a structured `ConvexError` when unauthenticated.
86
92
  *
87
93
  * @param ctx - Convex query, mutation, or action context.
88
- * @returns The resolved auth context, or `null`.
94
+ * @returns The current auth context.
89
95
  *
90
96
  * @example fluent-convex middleware
91
97
  * ```ts
92
98
  * const withAuth = convex.createMiddleware(async (ctx, next) => {
93
- * return next({ ...ctx, auth: await auth.resolve(ctx) });
99
+ * return next({ ...ctx, auth: await auth.context(ctx) });
94
100
  * });
95
101
  * ```
96
102
  *
97
103
  * @example Direct usage in a handler
98
104
  * ```ts
99
- * const resolved = await auth.resolve(ctx);
100
- * if (!resolved) return { ok: false, code: "NOT_SIGNED_IN" };
101
- * const { userId, grants } = resolved;
105
+ * const authContext = await auth.context(ctx);
106
+ * const { userId, grants } = authContext;
102
107
  * ```
103
108
  */
104
- resolve: (ctx: any) => Promise<AuthResolvedContext | null>;
109
+ context: (ctx: any) => Promise<AuthContext>;
105
110
  /**
106
111
  * Context enrichment for convex-helpers `customQuery` / `customMutation` /
107
112
  * `customAction`.
@@ -110,9 +115,9 @@ type AuthApiBase<TAuthorization extends AuthAuthorizationConfig | undefined = un
110
115
  * and grants, then attaches them to `ctx.auth`. Returns a `Customization`
111
116
  * object compatible with convex-helpers' custom function builders.
112
117
  *
113
- * `ctx.auth` is `{ userId, user, groupId, role, grants }` when
114
- * authenticated, `null` when unauthenticated. No throwing your
115
- * handler decides how to respond.
118
+ * `ctx.auth` is the current request auth context.
119
+ * By default this throws when unauthenticated so handlers can assume
120
+ * `ctx.auth.userId` and `ctx.auth.user` exist.
116
121
  *
117
122
  * @returns A convex-helpers `Customization` object.
118
123
  *
@@ -134,7 +139,6 @@ type AuthApiBase<TAuthorization extends AuthAuthorizationConfig | undefined = un
134
139
  * export const list = authQuery({
135
140
  * args: { workspaceId: v.string() },
136
141
  * handler: async (ctx, args) => {
137
- * if (!ctx.auth) return [];
138
142
  * const { userId, groupId, grants } = ctx.auth;
139
143
  * // business logic
140
144
  * },
@@ -145,26 +149,53 @@ type AuthApiBase<TAuthorization extends AuthAuthorizationConfig | undefined = un
145
149
  args: Record<string, never>;
146
150
  input: (ctx: any) => Promise<{
147
151
  ctx: {
148
- auth: AuthResolvedContext | null;
152
+ auth: AuthContext;
149
153
  };
150
154
  args: Record<string, never>;
151
155
  }>;
152
156
  };
153
157
  };
154
158
  /**
155
- * Resolved auth context injected into `ctx.auth` by `auth.ctx()`.
159
+ * Current request auth context injected into `ctx.auth` by `auth.ctx()` and
160
+ * {@link AuthCtx}. This is the authenticated auth shape returned by
161
+ * {@link createAuth().context}. Optional context builders may still surface
162
+ * nullable fields when `optional: true` is used.
156
163
  *
157
- * - `null` when unauthenticated.
158
164
  * - `groupId` is `null` when the user has no active group set.
159
- * - `role` / `grants` are `null` / `[]` when no active group or no membership.
165
+ * - `role` is `null` when no active group or no membership is resolved.
166
+ * - `grants` is `[]` when no active group or no membership is resolved.
167
+ *
168
+ * @example
169
+ * ```ts
170
+ * import type { AuthContext } from "@robelest/convex-auth/server";
171
+ *
172
+ * const mockAuth: AuthContext = {
173
+ * userId: "user123" as Id<"User">,
174
+ * user: { _id: "user123", email: "test@example.com" },
175
+ * groupId: "group456",
176
+ * role: "admin",
177
+ * grants: ["read", "write"],
178
+ * };
179
+ * ```
160
180
  */
161
- type AuthResolvedContext = {
162
- /** The authenticated user's document ID. */userId: string; /** The authenticated user's full document. */
163
- user: any; /** The user's active group ID, or `null` if none set. */
181
+ type AuthContext = {
182
+ /** The authenticated user's document ID. */userId: GenericId<"User">; /** The authenticated user's full document. */
183
+ user: UserDoc; /** The user's active group ID, or `null` if none set. */
164
184
  groupId: string | null; /** The user's primary role in the active group, or `null`. */
165
185
  role: string | null; /** Resolved grant strings from the user's role definitions. */
166
186
  grants: string[];
167
187
  };
188
+ type AuthCtxBase = {
189
+ getUserIdentity: () => Promise<UserIdentity | null>;
190
+ };
191
+ type RequiredAuthCtxState = AuthCtxBase & AuthContext;
192
+ type OptionalAuthCtxState = AuthCtxBase & {
193
+ userId: GenericId<"User"> | null;
194
+ user: UserDoc | null;
195
+ groupId: string | null;
196
+ role: string | null;
197
+ grants: string[];
198
+ };
168
199
  type InternalSsoApi = ReturnType<typeof Auth$1>["auth"]["sso"];
169
200
  type PublicSsoAdminApi = {
170
201
  connection: InternalSsoApi["connection"] & {
@@ -175,7 +206,6 @@ type PublicSsoAdminApi = {
175
206
  domain: string;
176
207
  isPrimary?: boolean;
177
208
  }>) => Promise<{
178
- ok: true;
179
209
  enterpriseId: string;
180
210
  domains: Array<{
181
211
  domainId: string;
@@ -190,7 +220,6 @@ type PublicSsoAdminApi = {
190
220
  enterpriseId: string;
191
221
  domain: string;
192
222
  }) => Promise<{
193
- ok: true;
194
223
  enterpriseId: string;
195
224
  domain: string;
196
225
  requestedAt: number;
@@ -205,7 +234,6 @@ type PublicSsoAdminApi = {
205
234
  enterpriseId: string;
206
235
  domain: string;
207
236
  }) => Promise<{
208
- ok: boolean;
209
237
  enterpriseId: string;
210
238
  domain: string;
211
239
  verifiedAt?: number;
@@ -299,8 +327,6 @@ declare function createAuth<P extends AuthProviderConfig[], TAuthorization exten
299
327
  providers: P;
300
328
  authorization?: TAuthorization;
301
329
  }): ConvexAuthResult<P, TAuthorization>;
302
- /** Canonical user document type exposed by Convex Auth. */
303
- type UserDoc = Doc<"User">;
304
330
  /**
305
331
  * Configuration for {@link AuthCtx} context enrichment.
306
332
  *
@@ -310,16 +336,42 @@ type UserDoc = Doc<"User">;
310
336
  type AuthCtxConfig<TResolve extends Record<string, unknown> = Record<string, never>> = {
311
337
  /** Allow unauthenticated callers and return `userId: null` / `user: null`. */optional?: boolean;
312
338
  /**
313
- * Attach additional derived fields to the auth context after the user is resolved.
339
+ * Attach additional derived fields to the auth context after the base auth
340
+ * context is resolved.
341
+ */
342
+ resolve?: (ctx: any, user: UserDoc, auth: AuthContext) => Promise<TResolve> | TResolve;
343
+ /**
344
+ * Override or wrap the base auth resolution used by {@link AuthCtx}.
345
+ *
346
+ * Return `undefined` to fall back to the built-in resolver,
347
+ * `null` for an explicit unauthenticated state, or an
348
+ * {@link AuthContext} object to provide a pre-resolved auth state.
349
+ * This is useful for tests, proxy auth, impersonation flows, or any
350
+ * environment that needs to inject auth without depending on the standard
351
+ * Convex auth tables.
352
+ *
353
+ * @param ctx - The Convex function context.
354
+ * @param fallback - The built-in auth resolver used by {@link AuthCtx}.
355
+ * @returns Resolved auth state, `null`, or `undefined` to use the fallback.
356
+ *
357
+ * @example
358
+ * ```ts
359
+ * const authCtx = AuthCtx(auth, {
360
+ * authResolve: async (ctx, fallback) => {
361
+ * const injected = getInjectedAuth(ctx);
362
+ * return injected ?? (await fallback());
363
+ * },
364
+ * });
365
+ * ```
314
366
  */
315
- resolve?: (ctx: any, user: UserDoc) => Promise<TResolve> | TResolve;
367
+ authResolve?: (ctx: any, fallback: () => Promise<AuthContext | null>) => Promise<AuthContext | null | undefined> | AuthContext | null | undefined;
316
368
  };
317
369
  /**
318
370
  * Create a context enrichment for `customQuery` / `customMutation` — optional auth.
319
371
  *
320
372
  * When `optional: true` is set, unauthenticated requests are allowed.
321
- * The enriched `ctx.auth` will have `userId: null` and `user: null`
322
- * for unauthenticated callers.
373
+ * The enriched `ctx.auth` will have `userId: null`, `user: null`,
374
+ * `groupId: null`, `role: null`, and `grants: []` for unauthenticated callers.
323
375
  *
324
376
  * @param auth - The auth API object returned by {@link createAuth}.
325
377
  * @param config - Configuration with `optional: true` and an optional
@@ -343,11 +395,7 @@ declare function AuthCtx<TResolve extends Record<string, unknown> = Record<strin
343
395
  args: {};
344
396
  input: (ctx: any, _args: any, _extra?: any) => Promise<{
345
397
  ctx: {
346
- auth: {
347
- getUserIdentity: () => Promise<UserIdentity | null>;
348
- userId: GenericId<"User"> | null;
349
- user: UserDoc | null;
350
- } & TResolve;
398
+ auth: OptionalAuthCtxState & TResolve;
351
399
  };
352
400
  args: {};
353
401
  }>;
@@ -355,10 +403,8 @@ declare function AuthCtx<TResolve extends Record<string, unknown> = Record<strin
355
403
  /**
356
404
  * Create a context enrichment for `customQuery` / `customMutation` — required auth (default).
357
405
  *
358
- * When `optional` is omitted or `false`, the inferred type is the authenticated
359
- * auth shape. At runtime this helper still resolves instead of throwing, so if
360
- * no user is signed in the returned `ctx.auth.userId` and `ctx.auth.user` are
361
- * `null`.
406
+ * When `optional` is omitted or `false`, unauthenticated requests throw a
407
+ * structured `ConvexError` before your handler runs.
362
408
  *
363
409
  * @param auth - The auth API object returned by {@link createAuth}.
364
410
  * @param config - Optional configuration with a `resolve` callback
@@ -379,11 +425,7 @@ declare function AuthCtx<TResolve extends Record<string, unknown> = Record<strin
379
425
  args: {};
380
426
  input: (ctx: any, _args: any, _extra?: any) => Promise<{
381
427
  ctx: {
382
- auth: {
383
- getUserIdentity: () => Promise<UserIdentity | null>;
384
- userId: GenericId<"User">;
385
- user: UserDoc;
386
- } & TResolve;
428
+ auth: RequiredAuthCtxState & TResolve;
387
429
  };
388
430
  args: {};
389
431
  }>;
@@ -393,9 +435,10 @@ declare function AuthCtx<TResolve extends Record<string, unknown> = Record<strin
393
435
  *
394
436
  * Use this to type function parameters or variables that receive the
395
437
  * enriched auth context produced by `AuthCtx`. The inferred type includes
396
- * `userId`, `user`, `getUserIdentity`, and any additional fields added
397
- * by the `resolve` callback. This is the generic utility for reusing the
398
- * enriched auth shape without manually duplicating conditional auth types.
438
+ * `userId`, `user`, `groupId`, `role`, `grants`, `getUserIdentity`, and any
439
+ * additional fields added by the `resolve` callback. This is the generic
440
+ * utility for reusing the enriched auth shape without manually duplicating
441
+ * conditional auth types.
399
442
  *
400
443
  * @typeParam T - An `AuthCtx` return value (must have an `input` method
401
444
  * that returns `{ ctx: { auth: ... } }`).
@@ -419,5 +462,5 @@ type InferAuth<T extends {
419
462
  }>;
420
463
  }> = Awaited<ReturnType<T["input"]>>["ctx"]["auth"];
421
464
  //#endregion
422
- export { AuthApi, AuthApiBase, AuthConfig, AuthCtx, AuthCtxConfig, AuthResolvedContext, ConvexAuthResult, InferAuth, InferClientApi, UserDoc, createAuth };
465
+ export { AuthApi, AuthApiBase, AuthConfig, AuthContext, AuthCtx, AuthCtxConfig, ConvexAuthResult, InferAuth, InferClientApi, UserDoc, createAuth };
423
466
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","names":[],"sources":["../../src/server/auth.ts"],"mappings":"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"}
1
+ {"version":3,"file":"auth.d.ts","names":[],"sources":["../../src/server/auth.ts"],"mappings":"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"}
@@ -1,9 +1,13 @@
1
- import { AuthError } from "./authError.js";
2
1
  import { Auth } from "./runtime.js";
3
- import { Fx } from "@robelest/fx";
2
+ import { Cv } from "@robelest/fx/convex";
4
3
 
5
4
  //#region src/server/auth.ts
6
5
  /**
6
+ * Auth configuration helpers for Convex Auth.
7
+ *
8
+ * @module
9
+ */
10
+ /**
7
11
  * Create an auth API object.
8
12
  *
9
13
  * When `new SSO()` is included in providers, `auth.sso` and `auth.scim`
@@ -37,9 +41,9 @@ import { Fx } from "@robelest/fx";
37
41
  * 1. `user.id(ctx)` → userId or null (exit early)
38
42
  * 2. `user.get(ctx, userId)` → user doc (cached per-execution)
39
43
  * 3. `user.getActiveGroup(ctx, { userId })` → groupId or null
40
- * 4. If groupId → `member.resolve(ctx, { userId, groupId })` → role + grants
44
+ * 4. If groupId → `member.inspect(ctx, { userId, groupId })` → role + grants
41
45
  */
42
- async function resolveAuthContext(auth, ctx) {
46
+ async function getAuthContext(auth, ctx) {
43
47
  const userId = await auth.user.id(ctx);
44
48
  if (!userId) return null;
45
49
  const user = await auth.user.get(ctx, userId);
@@ -47,7 +51,7 @@ async function resolveAuthContext(auth, ctx) {
47
51
  let role = null;
48
52
  let grants = [];
49
53
  if (groupId) {
50
- const resolved = await auth.member.resolve(ctx, {
54
+ const resolved = await auth.member.inspect(ctx, {
51
55
  userId,
52
56
  groupId
53
57
  });
@@ -73,20 +77,32 @@ function createAuth(component, config) {
73
77
  const { domain: domainApi, scim: scimApi, connection: connectionApi, audit: auditApi, webhook: webhookApi, oidc: oidcApi, saml: samlApi, ...restSso } = authResult.auth.sso;
74
78
  const setEnterpriseDomains = async (ctx, enterpriseId, domains) => {
75
79
  const enterprise = await connectionApi.get(ctx, enterpriseId);
76
- if (enterprise === null) throw new AuthError("INVALID_PARAMETERS", "Enterprise not found.").toConvexError();
80
+ if (enterprise === null) throw Cv.error({
81
+ code: "INVALID_PARAMETERS",
82
+ message: "Enterprise not found."
83
+ });
77
84
  const normalized = domains.map((entry) => ({
78
85
  ...entry,
79
86
  domain: entry.domain.trim().toLowerCase()
80
87
  }));
81
88
  const deduped = /* @__PURE__ */ new Map();
82
89
  for (const entry of normalized) {
83
- if (entry.domain.length === 0) throw new AuthError("INVALID_PARAMETERS", "Domain must not be empty.").toConvexError();
84
- if (deduped.has(entry.domain)) throw new AuthError("INVALID_PARAMETERS", `Duplicate domain: ${entry.domain}`).toConvexError();
90
+ if (entry.domain.length === 0) throw Cv.error({
91
+ code: "INVALID_PARAMETERS",
92
+ message: "Domain must not be empty."
93
+ });
94
+ if (deduped.has(entry.domain)) throw Cv.error({
95
+ code: "INVALID_PARAMETERS",
96
+ message: `Duplicate domain: ${entry.domain}`
97
+ });
85
98
  deduped.set(entry.domain, entry);
86
99
  }
87
100
  const nextDomains = [...deduped.values()];
88
101
  const primaryCount = nextDomains.filter((entry) => entry.isPrimary).length;
89
- if (primaryCount > 1) throw new AuthError("INVALID_PARAMETERS", "Only one primary domain may be set.").toConvexError();
102
+ if (primaryCount > 1) throw Cv.error({
103
+ code: "INVALID_PARAMETERS",
104
+ message: "Only one primary domain may be set."
105
+ });
90
106
  if (nextDomains.length > 0 && primaryCount === 0) nextDomains[0] = {
91
107
  ...nextDomains[0],
92
108
  isPrimary: true
@@ -110,7 +126,6 @@ function createAuth(component, config) {
110
126
  });
111
127
  }
112
128
  return {
113
- ok: true,
114
129
  enterpriseId,
115
130
  domains: (await domainApi.list(ctx, enterpriseId)).map((domain) => ({
116
131
  domainId: domain._id,
@@ -169,12 +184,24 @@ function createAuth(component, config) {
169
184
  validate: scimApi.validate
170
185
  } },
171
186
  http: authResult.auth.http,
172
- resolve: (ctx) => resolveAuthContext(authResult.auth, ctx),
187
+ context: async (ctx) => {
188
+ const authContext = await getAuthContext(authResult.auth, ctx);
189
+ if (authContext === null) throw Cv.error({
190
+ code: "NOT_SIGNED_IN",
191
+ message: "Authentication required."
192
+ });
193
+ return authContext;
194
+ },
173
195
  ctx: () => ({
174
196
  args: {},
175
197
  input: async (ctx) => {
198
+ const authCtx = await getAuthContext(authResult.auth, ctx);
199
+ if (authCtx === null) throw Cv.error({
200
+ code: "NOT_SIGNED_IN",
201
+ message: "Authentication required."
202
+ });
176
203
  return {
177
- ctx: { auth: await resolveAuthContext(authResult.auth, ctx) },
204
+ ctx: { auth: authCtx },
178
205
  args: {}
179
206
  };
180
207
  }
@@ -186,39 +213,32 @@ function AuthCtx(auth, config) {
186
213
  args: {},
187
214
  input: async (ctx, _args, _extra) => {
188
215
  const nativeAuth = ctx.auth;
189
- const modeDispatch = config?.optional === true ? { mode: "optional" } : { mode: "required" };
190
- const userContext = await Fx.run(Fx.match(modeDispatch, modeDispatch.mode, {
191
- optional: async () => {
192
- const userId = await auth.user.id(ctx);
193
- if (!userId) return null;
194
- return {
195
- userId,
196
- user: await auth.user.get(ctx, userId)
197
- };
198
- },
199
- required: async () => {
200
- const userId = await auth.user.id(ctx);
201
- if (!userId) return null;
202
- return {
203
- userId,
204
- user: await auth.user.get(ctx, userId)
205
- };
206
- }
207
- }));
208
- if (userContext === null) return {
209
- ctx: { auth: {
210
- getUserIdentity: nativeAuth.getUserIdentity.bind(nativeAuth),
211
- userId: null,
212
- user: null
213
- } },
214
- args: {}
215
- };
216
- const extra = config?.resolve ? await config.resolve(ctx, userContext.user) : {};
216
+ const getUserIdentity = nativeAuth.getUserIdentity.bind(nativeAuth);
217
+ const fallback = () => getAuthContext(auth, ctx);
218
+ const authOverride = config?.authResolve ? await config.authResolve(ctx, fallback) : void 0;
219
+ const resolved = authOverride === void 0 ? await fallback() : authOverride;
220
+ if (resolved === null) {
221
+ if (config?.optional !== true) throw Cv.error({
222
+ code: "NOT_SIGNED_IN",
223
+ message: "Authentication required."
224
+ });
225
+ return {
226
+ ctx: { auth: {
227
+ getUserIdentity,
228
+ userId: null,
229
+ user: null,
230
+ groupId: null,
231
+ role: null,
232
+ grants: []
233
+ } },
234
+ args: {}
235
+ };
236
+ }
237
+ const extra = config?.resolve ? await config.resolve(ctx, resolved.user, resolved) : {};
217
238
  return {
218
239
  ctx: { auth: {
219
- getUserIdentity: nativeAuth.getUserIdentity.bind(nativeAuth),
220
- userId: userContext.userId,
221
- user: userContext.user,
240
+ getUserIdentity,
241
+ ...resolved,
222
242
  ...extra
223
243
  } },
224
244
  args: {}