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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/README.md +140 -9
  2. package/dist/bin.cjs +5957 -5478
  3. package/dist/client/index.d.ts +3 -7
  4. package/dist/client/index.d.ts.map +1 -1
  5. package/dist/client/index.js +27 -26
  6. package/dist/client/index.js.map +1 -1
  7. package/dist/component/_generated/api.d.ts +14 -0
  8. package/dist/component/_generated/api.d.ts.map +1 -1
  9. package/dist/component/_generated/api.js.map +1 -1
  10. package/dist/component/_generated/component.d.ts +1672 -24
  11. package/dist/component/_generated/component.d.ts.map +1 -1
  12. package/dist/component/convex.config.d.ts +2 -2
  13. package/dist/component/convex.config.d.ts.map +1 -1
  14. package/dist/component/index.d.ts +1 -1
  15. package/dist/component/index.js +2 -2
  16. package/dist/component/model.d.ts +153 -0
  17. package/dist/component/model.d.ts.map +1 -0
  18. package/dist/component/model.js +343 -0
  19. package/dist/component/model.js.map +1 -0
  20. package/dist/component/providers/sso.d.ts +1 -1
  21. package/dist/component/public/enterprise.d.ts +54 -0
  22. package/dist/component/public/enterprise.d.ts.map +1 -0
  23. package/dist/component/public/enterprise.js +515 -0
  24. package/dist/component/public/enterprise.js.map +1 -0
  25. package/dist/component/public/factors.d.ts +52 -0
  26. package/dist/component/public/factors.d.ts.map +1 -0
  27. package/dist/component/public/factors.js +285 -0
  28. package/dist/component/public/factors.js.map +1 -0
  29. package/dist/component/public/groups.d.ts +116 -0
  30. package/dist/component/public/groups.d.ts.map +1 -0
  31. package/dist/component/public/groups.js +596 -0
  32. package/dist/component/public/groups.js.map +1 -0
  33. package/dist/component/public/identity.d.ts +93 -0
  34. package/dist/component/public/identity.d.ts.map +1 -0
  35. package/dist/component/public/identity.js +426 -0
  36. package/dist/component/public/identity.js.map +1 -0
  37. package/dist/component/public/keys.d.ts +41 -0
  38. package/dist/component/public/keys.d.ts.map +1 -0
  39. package/dist/component/public/keys.js +157 -0
  40. package/dist/component/public/keys.js.map +1 -0
  41. package/dist/component/public/shared.d.ts +26 -0
  42. package/dist/component/public/shared.d.ts.map +1 -0
  43. package/dist/component/public/shared.js +32 -0
  44. package/dist/component/public/shared.js.map +1 -0
  45. package/dist/component/public.d.ts +9 -321
  46. package/dist/component/public.d.ts.map +1 -1
  47. package/dist/component/public.js +6 -2145
  48. package/dist/component/schema.d.ts +406 -260
  49. package/dist/component/schema.js +37 -32
  50. package/dist/component/schema.js.map +1 -1
  51. package/dist/component/server/auth.d.ts +161 -15
  52. package/dist/component/server/auth.d.ts.map +1 -1
  53. package/dist/component/server/auth.js +100 -7
  54. package/dist/component/server/auth.js.map +1 -1
  55. package/dist/component/server/cookies.js +3 -0
  56. package/dist/component/server/cookies.js.map +1 -1
  57. package/dist/component/server/db.js +1 -0
  58. package/dist/component/server/db.js.map +1 -1
  59. package/dist/component/server/device.js +3 -1
  60. package/dist/component/server/device.js.map +1 -1
  61. package/dist/component/server/domains/core.js +629 -0
  62. package/dist/component/server/domains/core.js.map +1 -0
  63. package/dist/component/server/domains/sso.js +884 -0
  64. package/dist/component/server/domains/sso.js.map +1 -0
  65. package/dist/component/server/factory.d.ts +136 -0
  66. package/dist/component/server/factory.d.ts.map +1 -0
  67. package/dist/component/server/factory.js +1134 -0
  68. package/dist/component/server/factory.js.map +1 -0
  69. package/dist/component/server/fx.js +2 -1
  70. package/dist/component/server/fx.js.map +1 -1
  71. package/dist/component/server/http.js +287 -0
  72. package/dist/component/server/http.js.map +1 -0
  73. package/dist/component/server/identity.js +13 -0
  74. package/dist/component/server/identity.js.map +1 -0
  75. package/dist/component/server/keys.js +4 -0
  76. package/dist/component/server/keys.js.map +1 -1
  77. package/dist/component/server/mutations/account.js +1 -1
  78. package/dist/component/server/mutations/index.js +2 -2
  79. package/dist/component/server/mutations/index.js.map +1 -1
  80. package/dist/component/server/mutations/invalidate.js +1 -1
  81. package/dist/component/server/mutations/oauth.js +10 -7
  82. package/dist/component/server/mutations/oauth.js.map +1 -1
  83. package/dist/component/server/mutations/refresh.js +1 -1
  84. package/dist/component/server/mutations/register.js +1 -1
  85. package/dist/component/server/mutations/retrieve.js +1 -1
  86. package/dist/component/server/mutations/signature.js +1 -1
  87. package/dist/component/server/mutations/store.js +6 -3
  88. package/dist/component/server/mutations/store.js.map +1 -1
  89. package/dist/component/server/mutations/verify.js +1 -1
  90. package/dist/component/server/oauth.js +3 -0
  91. package/dist/component/server/oauth.js.map +1 -1
  92. package/dist/component/server/passkey.js +3 -2
  93. package/dist/component/server/passkey.js.map +1 -1
  94. package/dist/component/server/provider.js +2 -0
  95. package/dist/component/server/provider.js.map +1 -1
  96. package/dist/component/server/providers.js +10 -0
  97. package/dist/component/server/providers.js.map +1 -1
  98. package/dist/component/server/ratelimit.js +3 -0
  99. package/dist/component/server/ratelimit.js.map +1 -1
  100. package/dist/component/server/redirects.js +2 -0
  101. package/dist/component/server/redirects.js.map +1 -1
  102. package/dist/component/server/refresh.js +5 -0
  103. package/dist/component/server/refresh.js.map +1 -1
  104. package/dist/component/server/sessions.js +5 -0
  105. package/dist/component/server/sessions.js.map +1 -1
  106. package/dist/component/server/signin.js +2 -1
  107. package/dist/component/server/signin.js.map +1 -1
  108. package/dist/component/server/sso.js +166 -19
  109. package/dist/component/server/sso.js.map +1 -1
  110. package/dist/component/server/tokens.js +1 -0
  111. package/dist/component/server/tokens.js.map +1 -1
  112. package/dist/component/server/totp.js +4 -2
  113. package/dist/component/server/totp.js.map +1 -1
  114. package/dist/component/server/types.d.ts +106 -38
  115. package/dist/component/server/types.d.ts.map +1 -1
  116. package/dist/component/server/types.js.map +1 -1
  117. package/dist/component/server/users.js +1 -0
  118. package/dist/component/server/users.js.map +1 -1
  119. package/dist/component/server/utils.js +44 -2
  120. package/dist/component/server/utils.js.map +1 -1
  121. package/dist/providers/anonymous.d.ts +1 -1
  122. package/dist/providers/credentials.d.ts +1 -1
  123. package/dist/providers/password.d.ts +1 -1
  124. package/dist/providers/sso.d.ts +1 -1
  125. package/dist/providers/sso.js.map +1 -1
  126. package/dist/server/auth.d.ts +163 -17
  127. package/dist/server/auth.d.ts.map +1 -1
  128. package/dist/server/auth.js +100 -7
  129. package/dist/server/auth.js.map +1 -1
  130. package/dist/server/cookies.d.ts +1 -38
  131. package/dist/server/cookies.js +3 -0
  132. package/dist/server/cookies.js.map +1 -1
  133. package/dist/server/db.d.ts +1 -125
  134. package/dist/server/db.js +1 -0
  135. package/dist/server/db.js.map +1 -1
  136. package/dist/server/device.d.ts +1 -24
  137. package/dist/server/device.js +3 -1
  138. package/dist/server/device.js.map +1 -1
  139. package/dist/server/domains/core.d.ts +434 -0
  140. package/dist/server/domains/core.d.ts.map +1 -0
  141. package/dist/server/domains/core.js +629 -0
  142. package/dist/server/domains/core.js.map +1 -0
  143. package/dist/server/domains/sso.d.ts +409 -0
  144. package/dist/server/domains/sso.d.ts.map +1 -0
  145. package/dist/server/domains/sso.js +884 -0
  146. package/dist/server/domains/sso.js.map +1 -0
  147. package/dist/server/enterpriseValidators.d.ts +1 -0
  148. package/dist/server/enterpriseValidators.js +60 -0
  149. package/dist/server/enterpriseValidators.js.map +1 -0
  150. package/dist/server/factory.d.ts +136 -0
  151. package/dist/server/factory.d.ts.map +1 -0
  152. package/dist/server/factory.js +1134 -0
  153. package/dist/server/factory.js.map +1 -0
  154. package/dist/server/fx.d.ts +1 -16
  155. package/dist/server/fx.d.ts.map +1 -1
  156. package/dist/server/fx.js +1 -0
  157. package/dist/server/fx.js.map +1 -1
  158. package/dist/server/http.d.ts +59 -0
  159. package/dist/server/http.d.ts.map +1 -0
  160. package/dist/server/http.js +287 -0
  161. package/dist/server/http.js.map +1 -0
  162. package/dist/server/identity.d.ts +1 -0
  163. package/dist/server/identity.js +13 -0
  164. package/dist/server/identity.js.map +1 -0
  165. package/dist/server/index.d.ts +468 -1
  166. package/dist/server/index.d.ts.map +1 -1
  167. package/dist/server/index.js +530 -36
  168. package/dist/server/index.js.map +1 -1
  169. package/dist/server/keys.d.ts +1 -57
  170. package/dist/server/keys.js +4 -0
  171. package/dist/server/keys.js.map +1 -1
  172. package/dist/server/mutations/account.d.ts +7 -7
  173. package/dist/server/mutations/account.d.ts.map +1 -1
  174. package/dist/server/mutations/code.d.ts +13 -13
  175. package/dist/server/mutations/code.d.ts.map +1 -1
  176. package/dist/server/mutations/index.d.ts +107 -107
  177. package/dist/server/mutations/index.d.ts.map +1 -1
  178. package/dist/server/mutations/index.js +1 -1
  179. package/dist/server/mutations/index.js.map +1 -1
  180. package/dist/server/mutations/invalidate.d.ts +5 -5
  181. package/dist/server/mutations/invalidate.d.ts.map +1 -1
  182. package/dist/server/mutations/oauth.d.ts +10 -10
  183. package/dist/server/mutations/oauth.d.ts.map +1 -1
  184. package/dist/server/mutations/oauth.js +9 -6
  185. package/dist/server/mutations/oauth.js.map +1 -1
  186. package/dist/server/mutations/refresh.d.ts +4 -4
  187. package/dist/server/mutations/register.d.ts +12 -12
  188. package/dist/server/mutations/register.d.ts.map +1 -1
  189. package/dist/server/mutations/retrieve.d.ts +7 -7
  190. package/dist/server/mutations/signature.d.ts +5 -5
  191. package/dist/server/mutations/signin.d.ts +6 -6
  192. package/dist/server/mutations/signin.d.ts.map +1 -1
  193. package/dist/server/mutations/signout.d.ts +1 -1
  194. package/dist/server/mutations/store.d.ts +3 -2
  195. package/dist/server/mutations/store.d.ts.map +1 -1
  196. package/dist/server/mutations/store.js +6 -3
  197. package/dist/server/mutations/store.js.map +1 -1
  198. package/dist/server/mutations/verifier.d.ts +1 -1
  199. package/dist/server/mutations/verify.d.ts +11 -11
  200. package/dist/server/mutations/verify.d.ts.map +1 -1
  201. package/dist/server/oauth.d.ts +1 -59
  202. package/dist/server/oauth.js +3 -0
  203. package/dist/server/oauth.js.map +1 -1
  204. package/dist/server/passkey.d.ts.map +1 -1
  205. package/dist/server/passkey.js +3 -2
  206. package/dist/server/passkey.js.map +1 -1
  207. package/dist/server/provider.d.ts +1 -14
  208. package/dist/server/provider.d.ts.map +1 -1
  209. package/dist/server/provider.js +2 -0
  210. package/dist/server/provider.js.map +1 -1
  211. package/dist/server/providers.js +10 -0
  212. package/dist/server/providers.js.map +1 -1
  213. package/dist/server/ratelimit.d.ts +1 -22
  214. package/dist/server/ratelimit.js +3 -0
  215. package/dist/server/ratelimit.js.map +1 -1
  216. package/dist/server/redirects.d.ts +1 -10
  217. package/dist/server/redirects.js +2 -0
  218. package/dist/server/redirects.js.map +1 -1
  219. package/dist/server/refresh.d.ts +1 -37
  220. package/dist/server/refresh.js +5 -0
  221. package/dist/server/refresh.js.map +1 -1
  222. package/dist/server/sessions.d.ts +1 -28
  223. package/dist/server/sessions.js +5 -0
  224. package/dist/server/sessions.js.map +1 -1
  225. package/dist/server/signin.d.ts +1 -55
  226. package/dist/server/signin.js +2 -1
  227. package/dist/server/signin.js.map +1 -1
  228. package/dist/server/sso.d.ts +1 -348
  229. package/dist/server/sso.js +165 -18
  230. package/dist/server/sso.js.map +1 -1
  231. package/dist/server/templates.d.ts +1 -21
  232. package/dist/server/templates.js +1 -0
  233. package/dist/server/templates.js.map +1 -1
  234. package/dist/server/tokens.d.ts +1 -11
  235. package/dist/server/tokens.js +1 -0
  236. package/dist/server/tokens.js.map +1 -1
  237. package/dist/server/totp.d.ts +1 -23
  238. package/dist/server/totp.js +4 -2
  239. package/dist/server/totp.js.map +1 -1
  240. package/dist/server/types.d.ts +114 -77
  241. package/dist/server/types.d.ts.map +1 -1
  242. package/dist/server/types.js.map +1 -1
  243. package/dist/server/users.d.ts +1 -31
  244. package/dist/server/users.js +1 -0
  245. package/dist/server/users.js.map +1 -1
  246. package/dist/server/utils.d.ts +1 -27
  247. package/dist/server/utils.js +44 -2
  248. package/dist/server/utils.js.map +1 -1
  249. package/dist/server/version.d.ts +1 -1
  250. package/dist/server/version.js +1 -1
  251. package/dist/server/version.js.map +1 -1
  252. package/package.json +4 -5
  253. package/src/cli/bin.ts +5 -0
  254. package/src/cli/index.ts +22 -9
  255. package/src/cli/keys.ts +3 -0
  256. package/src/client/index.ts +36 -37
  257. package/src/component/_generated/api.ts +14 -0
  258. package/src/component/_generated/component.ts +2106 -9
  259. package/src/component/index.ts +3 -1
  260. package/src/component/model.ts +441 -0
  261. package/src/component/public/enterprise.ts +753 -0
  262. package/src/component/public/factors.ts +332 -0
  263. package/src/component/public/groups.ts +932 -0
  264. package/src/component/public/identity.ts +566 -0
  265. package/src/component/public/keys.ts +209 -0
  266. package/src/component/public/shared.ts +119 -0
  267. package/src/component/public.ts +5 -2965
  268. package/src/component/schema.ts +68 -63
  269. package/src/providers/sso.ts +1 -1
  270. package/src/server/auth.ts +413 -18
  271. package/src/server/cookies.ts +3 -0
  272. package/src/server/db.ts +3 -0
  273. package/src/server/device.ts +3 -1
  274. package/src/server/domains/core.ts +1071 -0
  275. package/src/server/domains/sso.ts +1749 -0
  276. package/src/server/enterpriseValidators.ts +93 -0
  277. package/src/server/factory.ts +2181 -0
  278. package/src/server/fx.ts +1 -0
  279. package/src/server/http.ts +529 -0
  280. package/src/server/identity.ts +18 -0
  281. package/src/server/index.ts +806 -40
  282. package/src/server/keys.ts +4 -0
  283. package/src/server/mutations/index.ts +1 -1
  284. package/src/server/mutations/oauth.ts +36 -8
  285. package/src/server/mutations/store.ts +6 -3
  286. package/src/server/oauth.ts +6 -0
  287. package/src/server/passkey.ts +3 -2
  288. package/src/server/provider.ts +2 -0
  289. package/src/server/providers.ts +20 -0
  290. package/src/server/ratelimit.ts +3 -0
  291. package/src/server/redirects.ts +2 -0
  292. package/src/server/refresh.ts +5 -0
  293. package/src/server/sessions.ts +5 -0
  294. package/src/server/signin.ts +1 -0
  295. package/src/server/sso.ts +259 -17
  296. package/src/server/templates.ts +1 -0
  297. package/src/server/tokens.ts +1 -0
  298. package/src/server/totp.ts +4 -2
  299. package/src/server/types.ts +178 -83
  300. package/src/server/users.ts +1 -0
  301. package/src/server/utils.ts +71 -1
  302. package/src/server/version.ts +1 -1
  303. package/dist/component/public.js.map +0 -1
  304. package/dist/component/server/implementation.d.ts +0 -1264
  305. package/dist/component/server/implementation.d.ts.map +0 -1
  306. package/dist/component/server/implementation.js +0 -2365
  307. package/dist/component/server/implementation.js.map +0 -1
  308. package/dist/server/cookies.d.ts.map +0 -1
  309. package/dist/server/db.d.ts.map +0 -1
  310. package/dist/server/device.d.ts.map +0 -1
  311. package/dist/server/implementation.d.ts +0 -1264
  312. package/dist/server/implementation.d.ts.map +0 -1
  313. package/dist/server/implementation.js +0 -2365
  314. package/dist/server/implementation.js.map +0 -1
  315. package/dist/server/keys.d.ts.map +0 -1
  316. package/dist/server/oauth.d.ts.map +0 -1
  317. package/dist/server/ratelimit.d.ts.map +0 -1
  318. package/dist/server/redirects.d.ts.map +0 -1
  319. package/dist/server/refresh.d.ts.map +0 -1
  320. package/dist/server/sessions.d.ts.map +0 -1
  321. package/dist/server/signin.d.ts.map +0 -1
  322. package/dist/server/sso.d.ts.map +0 -1
  323. package/dist/server/templates.d.ts.map +0 -1
  324. package/dist/server/tokens.d.ts.map +0 -1
  325. package/dist/server/totp.d.ts.map +0 -1
  326. package/dist/server/users.d.ts.map +0 -1
  327. package/dist/server/utils.d.ts.map +0 -1
  328. package/src/server/implementation.ts +0 -5336
@@ -12,8 +12,17 @@ import {
12
12
  RegisteredQuery,
13
13
  TableNamesInDataModel,
14
14
  } from "convex/server";
15
+ import type { Infer } from "convex/values";
15
16
  import { GenericId, Value } from "convex/values";
16
17
 
18
+ import {
19
+ vApiKeyDoc,
20
+ vAuthVerifierDoc,
21
+ vDeviceCodeDoc,
22
+ vPasskeyDoc,
23
+ vTotpFactorDoc,
24
+ vUserDoc,
25
+ } from "../component/model";
17
26
  import schema from "../component/schema";
18
27
  import { CredentialsUserConfig } from "../providers/credentials";
19
28
 
@@ -24,6 +33,30 @@ import { CredentialsUserConfig } from "../providers/credentials";
24
33
  /** A value that is either `T` or a `PromiseLike<T>`. */
25
34
  export type Awaitable<T> = T | PromiseLike<T>;
26
35
 
36
+ export type AuthRoleDefinition = {
37
+ id?: string;
38
+ label?: string;
39
+ grants: string[];
40
+ };
41
+
42
+ export type AuthAuthorizationConfig = {
43
+ roles: Record<string, AuthRoleDefinition>;
44
+ };
45
+
46
+ export type AuthRoleId<
47
+ TAuthorization extends AuthAuthorizationConfig | undefined,
48
+ > = TAuthorization extends { roles: infer TRoles extends Record<string, any> }
49
+ ? keyof TRoles & string
50
+ : string;
51
+
52
+ export type AuthGrant<
53
+ TAuthorization extends AuthAuthorizationConfig | undefined,
54
+ > = TAuthorization extends {
55
+ roles: infer TRoles extends Record<string, { grants: readonly any[] }>;
56
+ }
57
+ ? TRoles[keyof TRoles]["grants"][number] & string
58
+ : string;
59
+
27
60
  /**
28
61
  * The config for the Convex Auth library, passed to `createAuth`.
29
62
  */
@@ -238,6 +271,18 @@ export type ConvexAuthConfig = {
238
271
  },
239
272
  ) => Promise<void>;
240
273
  };
274
+ /**
275
+ * Application-defined role and grant model used by membership access checks.
276
+ */
277
+ authorization?: {
278
+ roles: Record<
279
+ string,
280
+ {
281
+ label?: string;
282
+ grants: string[];
283
+ }
284
+ >;
285
+ };
241
286
  };
242
287
 
243
288
  /**
@@ -282,6 +327,62 @@ export interface SSOProviderConfig {
282
327
  type: "sso";
283
328
  }
284
329
 
330
+ export type EnterpriseAccountLinkingPolicy = "verifiedEmail" | "none";
331
+
332
+ export type EnterpriseScimReuseUserPolicy = "externalId" | "none";
333
+
334
+ export type EnterpriseJitProvisioningMode =
335
+ | "off"
336
+ | "createUser"
337
+ | "createUserAndMembership";
338
+
339
+ export type EnterpriseDeprovisionMode = "soft" | "hard";
340
+
341
+ export interface EnterprisePolicy {
342
+ version: 1;
343
+ identity: {
344
+ accountLinking: {
345
+ oidc: EnterpriseAccountLinkingPolicy;
346
+ saml: EnterpriseAccountLinkingPolicy;
347
+ };
348
+ };
349
+ provisioning: {
350
+ scimReuse: {
351
+ user: EnterpriseScimReuseUserPolicy;
352
+ };
353
+ jit: {
354
+ mode: EnterpriseJitProvisioningMode;
355
+ defaultRoleIds: string[];
356
+ };
357
+ deprovision: {
358
+ mode: EnterpriseDeprovisionMode;
359
+ };
360
+ };
361
+ extend?: Record<string, unknown>;
362
+ }
363
+
364
+ export interface EnterprisePolicyPatch {
365
+ identity?: {
366
+ accountLinking?: {
367
+ oidc?: EnterpriseAccountLinkingPolicy;
368
+ saml?: EnterpriseAccountLinkingPolicy;
369
+ };
370
+ };
371
+ provisioning?: {
372
+ scimReuse?: {
373
+ user?: EnterpriseScimReuseUserPolicy;
374
+ };
375
+ jit?: {
376
+ mode?: EnterpriseJitProvisioningMode;
377
+ defaultRoleIds?: string[];
378
+ };
379
+ deprovision?: {
380
+ mode?: EnterpriseDeprovisionMode;
381
+ };
382
+ };
383
+ extend?: Record<string, unknown>;
384
+ }
385
+
285
386
  /**
286
387
  * Email provider config for magic link / OTP sign-in.
287
388
  */
@@ -567,6 +668,7 @@ export type AuthServerHelpers = {
567
668
  ctx: GenericActionCtx<any>,
568
669
  args: AuthCreateAccountArgs,
569
670
  ) => Promise<{
671
+ ok: true;
570
672
  account: GenericDoc<GenericDataModel, "Account">;
571
673
  user: GenericDoc<GenericDataModel, "User">;
572
674
  }>;
@@ -580,7 +682,7 @@ export type AuthServerHelpers = {
580
682
  update: (
581
683
  ctx: GenericActionCtx<any>,
582
684
  args: AuthUpdateAccountArgs,
583
- ) => Promise<void>;
685
+ ) => Promise<{ ok: true; accountId: GenericId<"Account"> }>;
584
686
  };
585
687
  session: {
586
688
  current: (ctx: {
@@ -589,7 +691,32 @@ export type AuthServerHelpers = {
589
691
  invalidate: (
590
692
  ctx: GenericActionCtx<any>,
591
693
  args: AuthInvalidateSessionsArgs,
592
- ) => Promise<void>;
694
+ ) => Promise<{
695
+ ok: true;
696
+ userId: GenericId<"User">;
697
+ except: GenericId<"Session">[];
698
+ }>;
699
+ };
700
+ access: {
701
+ check: (
702
+ ctx: GenericActionCtx<any>,
703
+ args: {
704
+ userId: GenericId<"User">;
705
+ groupId: GenericId<"Group">;
706
+ grants: string[];
707
+ maxDepth?: number;
708
+ },
709
+ ) => Promise<{
710
+ ok: boolean;
711
+ grants: string[];
712
+ missingGrants: string[];
713
+ roleIds: string[];
714
+ matchedGroupId: GenericId<"Group"> | null;
715
+ membership: GenericDoc<GenericDataModel, "GroupMember"> | null;
716
+ isDirect: boolean;
717
+ isInherited: boolean;
718
+ depth: number | null;
719
+ }>;
593
720
  };
594
721
  provider: {
595
722
  signIn: (
@@ -621,7 +748,7 @@ export type ConvexAuthMaterializedConfig = {
621
748
  providers: AuthProviderMaterializedConfig[];
622
749
  } & Pick<
623
750
  ConvexAuthConfig,
624
- "component" | "session" | "jwt" | "signIn" | "callbacks"
751
+ "component" | "session" | "jwt" | "signIn" | "callbacks" | "authorization"
625
752
  >;
626
753
 
627
754
  export interface SAMLAttributeMapping {
@@ -857,12 +984,12 @@ export type GroupOrderBy = "_creationTime" | "name" | "slug" | "type";
857
984
  export type MemberWhere = {
858
985
  groupId?: string;
859
986
  userId?: string;
860
- role?: string;
987
+ roleId?: string;
861
988
  status?: string;
862
989
  };
863
990
 
864
991
  /** Sortable fields for `auth.member.list()`. */
865
- export type MemberOrderBy = "_creationTime" | "role" | "status";
992
+ export type MemberOrderBy = "_creationTime" | "status";
866
993
 
867
994
  /** Filter fields for `auth.invite.list()`. All optional. */
868
995
  export type InviteWhere = {
@@ -871,7 +998,7 @@ export type InviteWhere = {
871
998
  status?: "pending" | "accepted" | "revoked" | "expired";
872
999
  email?: string;
873
1000
  invitedByUserId?: string;
874
- role?: string;
1001
+ roleId?: string;
875
1002
  acceptedByUserId?: string;
876
1003
  };
877
1004
 
@@ -1055,6 +1182,28 @@ export type AuthComponentApi = {
1055
1182
  enterpriseDomainAdd: FunctionReference<"mutation", "internal", any, any>;
1056
1183
  enterpriseDomainList: FunctionReference<"query", "internal", any, any>;
1057
1184
  enterpriseDomainDelete: FunctionReference<"mutation", "internal", any, any>;
1185
+ enterpriseDomainVerificationGet: FunctionReference<
1186
+ "query",
1187
+ "internal",
1188
+ any,
1189
+ any
1190
+ >;
1191
+ enterpriseDomainVerificationUpsert: FunctionReference<
1192
+ "mutation",
1193
+ "internal",
1194
+ any,
1195
+ any
1196
+ >;
1197
+ enterpriseDomainVerificationDelete: FunctionReference<
1198
+ "mutation",
1199
+ "internal",
1200
+ any,
1201
+ any
1202
+ >;
1203
+ enterpriseDomainVerify: FunctionReference<"mutation", "internal", any, any>;
1204
+ enterpriseSecretUpsert: FunctionReference<"mutation", "internal", any, any>;
1205
+ enterpriseSecretGet: FunctionReference<"query", "internal", any, any>;
1206
+ enterpriseSecretDelete: FunctionReference<"mutation", "internal", any, any>;
1058
1207
  enterpriseScimConfigUpsert: FunctionReference<
1059
1208
  "mutation",
1060
1209
  "internal",
@@ -1080,6 +1229,12 @@ export type AuthComponentApi = {
1080
1229
  any,
1081
1230
  any
1082
1231
  >;
1232
+ enterpriseScimIdentityGetByEnterpriseAndUser: FunctionReference<
1233
+ "query",
1234
+ "internal",
1235
+ any,
1236
+ any
1237
+ >;
1083
1238
  enterpriseScimIdentityGetByMappedGroup: FunctionReference<
1084
1239
  "query",
1085
1240
  "internal",
@@ -1123,6 +1278,12 @@ export type AuthComponentApi = {
1123
1278
  any,
1124
1279
  any
1125
1280
  >;
1281
+ enterpriseWebhookEndpointGet: FunctionReference<
1282
+ "query",
1283
+ "internal",
1284
+ any,
1285
+ any
1286
+ >;
1126
1287
  enterpriseWebhookEndpointUpdate: FunctionReference<
1127
1288
  "mutation",
1128
1289
  "internal",
@@ -1243,80 +1404,25 @@ export type SessionInfoWithTokens = {
1243
1404
  // code can work with typed results from cross-component queries/mutations
1244
1405
  // instead of casting to `any` at every field access.
1245
1406
 
1246
- export interface TotpDoc {
1247
- _id: string;
1248
- _creationTime: number;
1249
- userId: string;
1250
- secret: ArrayBuffer;
1251
- digits: number;
1252
- period: number;
1253
- verified: boolean;
1254
- name?: string;
1255
- createdAt: number;
1256
- lastUsedAt?: number;
1257
- }
1407
+ export type TotpDoc = Infer<typeof vTotpFactorDoc>;
1258
1408
 
1259
- export interface PasskeyDoc {
1260
- _id: string;
1261
- _creationTime: number;
1262
- userId: string;
1263
- credentialId: string;
1264
- publicKey: ArrayBuffer;
1265
- algorithm: number;
1266
- counter: number;
1267
- transports?: string[];
1268
- deviceType: string;
1269
- backedUp: boolean;
1270
- name?: string;
1271
- createdAt: number;
1272
- lastUsedAt?: number;
1273
- }
1409
+ export type PasskeyDoc = Infer<typeof vPasskeyDoc>;
1274
1410
 
1275
- export interface VerifierDoc {
1276
- _id: string;
1277
- _creationTime: number;
1278
- signature?: string;
1279
- sessionId?: string;
1280
- }
1411
+ export type VerifierDoc = Infer<typeof vAuthVerifierDoc>;
1281
1412
 
1282
1413
  /**
1283
- * Plain cross-component user document shape with `string` IDs.
1414
+ * Cross-component user document shape inferred from the component validator.
1284
1415
  *
1285
- * Used by internal typed wrappers (`queryUserById`, etc.) that operate
1286
- * across the component boundary where Convex `Id<"User">` is erased
1287
- * to a plain string. Not intended for consumer use consumers should
1288
- * use `UserDoc` (exported from `@robelest/convex-auth/component`)
1289
- * which preserves typed `Id<"User">`.
1416
+ * Used by internal typed wrappers (`queryUserById`, etc.) so server code stays
1417
+ * aligned with the component runtime contract. Not intended for consumer use —
1418
+ * consumers should use `UserDoc` (exported from
1419
+ * `@robelest/convex-auth/component`).
1290
1420
  *
1291
1421
  * @internal
1292
1422
  */
1293
- export interface CrossComponentUserDoc {
1294
- _id: string;
1295
- _creationTime: number;
1296
- email?: string;
1297
- emailVerificationTime?: number;
1298
- phone?: string;
1299
- phoneVerificationTime?: number;
1300
- name?: string;
1301
- image?: string;
1302
- isAnonymous?: boolean;
1303
- }
1423
+ export type CrossComponentUserDoc = Infer<typeof vUserDoc>;
1304
1424
 
1305
- export interface KeyDoc {
1306
- _id: string;
1307
- _creationTime: number;
1308
- userId: string;
1309
- prefix: string;
1310
- hashedKey: string;
1311
- name: string;
1312
- scopes: Array<{ resource: string; actions: string[] }>;
1313
- rateLimit?: { maxRequests: number; windowMs: number };
1314
- rateLimitState?: { attemptsLeft: number; lastAttemptTime: number };
1315
- expiresAt?: number;
1316
- lastUsedAt?: number;
1317
- createdAt: number;
1318
- revoked: boolean;
1319
- }
1425
+ export type KeyDoc = Infer<typeof vApiKeyDoc>;
1320
1426
 
1321
1427
  // ---------------------------------------------------------------------------
1322
1428
  // Cross-component wrapper context
@@ -1555,18 +1661,7 @@ export async function mutateKeyDelete(
1555
1661
 
1556
1662
  // -- Device authorization queries / mutations --
1557
1663
 
1558
- export interface DeviceDoc {
1559
- _id: string;
1560
- _creationTime: number;
1561
- deviceCodeHash: string;
1562
- userCode: string;
1563
- expiresAt: number;
1564
- interval: number;
1565
- status: "pending" | "authorized" | "denied";
1566
- userId?: string;
1567
- sessionId?: string;
1568
- lastPolledAt?: number;
1569
- }
1664
+ export type DeviceDoc = Infer<typeof vDeviceCodeDoc>;
1570
1665
 
1571
1666
  export async function mutateDeviceInsert(
1572
1667
  ctx: ComponentCallCtx,
@@ -37,6 +37,7 @@ function mergeExtend(
37
37
  return existingRecord ? { ...existingRecord, ...incoming } : incoming;
38
38
  }
39
39
 
40
+ /** @internal */
40
41
  export async function upsertUserAndAccount(
41
42
  ctx: MutationCtx,
42
43
  sessionId: GenericId<"Session"> | null,
@@ -3,7 +3,11 @@ import {
3
3
  generateRandomString as osloGenerateRandomString,
4
4
  } from "@oslojs/crypto/random";
5
5
  import { sha256 as rawSha256 } from "@oslojs/crypto/sha2";
6
- import { encodeHexLowerCase } from "@oslojs/encoding";
6
+ import {
7
+ decodeBase64urlIgnorePadding,
8
+ encodeBase64urlNoPadding,
9
+ encodeHexLowerCase,
10
+ } from "@oslojs/encoding";
7
11
 
8
12
  import { AuthError } from "./fx";
9
13
 
@@ -13,6 +17,7 @@ import { AuthError } from "./fx";
13
17
  * Uses `AuthError.toConvexError()` directly since this is a synchronous guard
14
18
  * called inline in many expressions — not suitable for Fx pipeline wrapping.
15
19
  */
20
+ /** @internal */
16
21
  export function requireEnv(name: string) {
17
22
  const value = process.env[name];
18
23
  if (value === undefined) {
@@ -25,6 +30,7 @@ export function requireEnv(name: string) {
25
30
  return value;
26
31
  }
27
32
 
33
+ /** @internal */
28
34
  export function isLocalHost(host?: string) {
29
35
  if (host === undefined) {
30
36
  return false;
@@ -45,13 +51,17 @@ export function isLocalHost(host?: string) {
45
51
 
46
52
  // Internal server utilities (merged from former internalUtils.ts)
47
53
 
54
+ /** @internal */
48
55
  export const TOKEN_SUB_CLAIM_DIVIDER = "|";
56
+ /** @internal */
49
57
  export const REFRESH_TOKEN_DIVIDER = "|";
50
58
 
59
+ /** @internal */
51
60
  export async function sha256(input: string) {
52
61
  return encodeHexLowerCase(rawSha256(new TextEncoder().encode(input)));
53
62
  }
54
63
 
64
+ /** @internal */
55
65
  export function generateRandomString(length: number, alphabet: string) {
56
66
  const random: RandomReader = {
57
67
  read(bytes) {
@@ -62,10 +72,12 @@ export function generateRandomString(length: number, alphabet: string) {
62
72
  return osloGenerateRandomString(random, alphabet, length);
63
73
  }
64
74
 
75
+ /** @internal */
65
76
  export function errorMessage(error: unknown) {
66
77
  return error instanceof Error ? error.message : String(error);
67
78
  }
68
79
 
80
+ /** @internal */
69
81
  export function logError(error: unknown) {
70
82
  logWithLevel(
71
83
  LOG_LEVELS.ERROR,
@@ -75,6 +87,7 @@ export function logError(error: unknown) {
75
87
  );
76
88
  }
77
89
 
90
+ /** @internal */
78
91
  export const LOG_LEVELS = {
79
92
  ERROR: "ERROR",
80
93
  WARN: "WARN",
@@ -83,6 +96,7 @@ export const LOG_LEVELS = {
83
96
  } as const;
84
97
  type LogLevel = keyof typeof LOG_LEVELS;
85
98
 
99
+ /** @internal */
86
100
  export function logWithLevel(level: LogLevel, ...args: unknown[]) {
87
101
  const configuredLogLevel =
88
102
  LOG_LEVELS[
@@ -111,6 +125,7 @@ export function logWithLevel(level: LogLevel, ...args: unknown[]) {
111
125
  }
112
126
 
113
127
  const UNREDACTED_LENGTH = 5;
128
+ /** @internal */
114
129
  export function maybeRedact(value: string) {
115
130
  if (value === "") {
116
131
  return "";
@@ -129,3 +144,58 @@ export function maybeRedact(value: string) {
129
144
  return value;
130
145
  }
131
146
  }
147
+
148
+ const SECRET_KEY_ENV = "AUTH_SECRET_ENCRYPTION_KEY";
149
+ const SECRET_IV_LENGTH = 12;
150
+
151
+ function toArrayBuffer(bytes: Uint8Array) {
152
+ return bytes.buffer.slice(
153
+ bytes.byteOffset,
154
+ bytes.byteOffset + bytes.byteLength,
155
+ ) as ArrayBuffer;
156
+ }
157
+
158
+ async function getSecretCryptoKey() {
159
+ const material = requireEnv(SECRET_KEY_ENV);
160
+ const rawKey = rawSha256(new TextEncoder().encode(material));
161
+ return await crypto.subtle.importKey(
162
+ "raw",
163
+ toArrayBuffer(rawKey),
164
+ { name: "AES-GCM" },
165
+ false,
166
+ ["encrypt", "decrypt"],
167
+ );
168
+ }
169
+
170
+ /** @internal */
171
+ export async function encryptSecret(value: string) {
172
+ const key = await getSecretCryptoKey();
173
+ const iv = crypto.getRandomValues(new Uint8Array(SECRET_IV_LENGTH));
174
+ const encrypted = await crypto.subtle.encrypt(
175
+ { name: "AES-GCM", iv: toArrayBuffer(iv) },
176
+ key,
177
+ toArrayBuffer(new TextEncoder().encode(value)),
178
+ );
179
+ return `${encodeBase64urlNoPadding(iv)}.${encodeBase64urlNoPadding(new Uint8Array(encrypted))}`;
180
+ }
181
+
182
+ /** @internal */
183
+ export async function decryptSecret(ciphertext: string) {
184
+ const [ivEncoded, payloadEncoded] = ciphertext.split(".");
185
+ if (!ivEncoded || !payloadEncoded) {
186
+ throw new AuthError(
187
+ "INVALID_PARAMETERS",
188
+ "Stored enterprise secret is malformed.",
189
+ ).toConvexError();
190
+ }
191
+ const key = await getSecretCryptoKey();
192
+ const decrypted = await crypto.subtle.decrypt(
193
+ {
194
+ name: "AES-GCM",
195
+ iv: toArrayBuffer(decodeBase64urlIgnorePadding(ivEncoded)),
196
+ },
197
+ key,
198
+ toArrayBuffer(decodeBase64urlIgnorePadding(payloadEncoded)),
199
+ );
200
+ return new TextDecoder().decode(decrypted);
201
+ }
@@ -1,2 +1,2 @@
1
1
  // Auto-generated by scripts/generate-version.js — do not edit.
2
- export const AUTH_VERSION = "0.0.4-preview.13";
2
+ export const AUTH_VERSION = "0.0.4-preview.16";