@robelest/convex-auth 0.0.2-preview.1 → 0.0.2

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 (145) hide show
  1. package/dist/bin.cjs +466 -63
  2. package/dist/client/index.d.ts +211 -30
  3. package/dist/client/index.d.ts.map +1 -1
  4. package/dist/client/index.js +673 -59
  5. package/dist/client/index.js.map +1 -1
  6. package/dist/component/_generated/api.d.ts +56 -1
  7. package/dist/component/_generated/api.d.ts.map +1 -1
  8. package/dist/component/_generated/api.js.map +1 -1
  9. package/dist/component/_generated/component.d.ts +93 -3
  10. package/dist/component/_generated/component.d.ts.map +1 -1
  11. package/dist/component/convex.config.d.ts.map +1 -1
  12. package/dist/component/convex.config.js +2 -0
  13. package/dist/component/convex.config.js.map +1 -1
  14. package/dist/component/index.d.ts +5 -3
  15. package/dist/component/index.d.ts.map +1 -1
  16. package/dist/component/index.js +5 -3
  17. package/dist/component/index.js.map +1 -1
  18. package/dist/component/portalBridge.d.ts +80 -0
  19. package/dist/component/portalBridge.d.ts.map +1 -0
  20. package/dist/component/portalBridge.js +102 -0
  21. package/dist/component/portalBridge.js.map +1 -0
  22. package/dist/component/public.d.ts +193 -9
  23. package/dist/component/public.d.ts.map +1 -1
  24. package/dist/component/public.js +204 -33
  25. package/dist/component/public.js.map +1 -1
  26. package/dist/component/schema.d.ts +89 -9
  27. package/dist/component/schema.d.ts.map +1 -1
  28. package/dist/component/schema.js +68 -7
  29. package/dist/component/schema.js.map +1 -1
  30. package/dist/providers/{Anonymous.d.ts → anonymous.d.ts} +8 -8
  31. package/dist/providers/{Anonymous.d.ts.map → anonymous.d.ts.map} +1 -1
  32. package/dist/providers/{Anonymous.js → anonymous.js} +9 -10
  33. package/dist/providers/anonymous.js.map +1 -0
  34. package/dist/providers/{ConvexCredentials.d.ts → credentials.d.ts} +11 -11
  35. package/dist/providers/credentials.d.ts.map +1 -0
  36. package/dist/providers/{ConvexCredentials.js → credentials.js} +8 -8
  37. package/dist/providers/credentials.js.map +1 -0
  38. package/dist/providers/{Email.d.ts → email.d.ts} +6 -6
  39. package/dist/providers/email.d.ts.map +1 -0
  40. package/dist/providers/{Email.js → email.js} +6 -6
  41. package/dist/providers/email.js.map +1 -0
  42. package/dist/providers/passkey.d.ts +20 -0
  43. package/dist/providers/passkey.d.ts.map +1 -0
  44. package/dist/providers/passkey.js +32 -0
  45. package/dist/providers/passkey.js.map +1 -0
  46. package/dist/providers/{Password.d.ts → password.d.ts} +10 -10
  47. package/dist/providers/{Password.d.ts.map → password.d.ts.map} +1 -1
  48. package/dist/providers/{Password.js → password.js} +19 -20
  49. package/dist/providers/password.js.map +1 -0
  50. package/dist/providers/{Phone.d.ts → phone.d.ts} +3 -3
  51. package/dist/providers/{Phone.d.ts.map → phone.d.ts.map} +1 -1
  52. package/dist/providers/{Phone.js → phone.js} +3 -3
  53. package/dist/providers/{Phone.js.map → phone.js.map} +1 -1
  54. package/dist/providers/totp.d.ts +14 -0
  55. package/dist/providers/totp.d.ts.map +1 -0
  56. package/dist/providers/totp.js +23 -0
  57. package/dist/providers/totp.js.map +1 -0
  58. package/dist/server/convex-auth.d.ts +243 -0
  59. package/dist/server/convex-auth.d.ts.map +1 -0
  60. package/dist/server/convex-auth.js +365 -0
  61. package/dist/server/convex-auth.js.map +1 -0
  62. package/dist/server/implementation/index.d.ts +153 -166
  63. package/dist/server/implementation/index.d.ts.map +1 -1
  64. package/dist/server/implementation/index.js +162 -105
  65. package/dist/server/implementation/index.js.map +1 -1
  66. package/dist/server/implementation/passkey.d.ts +33 -0
  67. package/dist/server/implementation/passkey.d.ts.map +1 -0
  68. package/dist/server/implementation/passkey.js +450 -0
  69. package/dist/server/implementation/passkey.js.map +1 -0
  70. package/dist/server/implementation/redirects.d.ts.map +1 -1
  71. package/dist/server/implementation/redirects.js +4 -9
  72. package/dist/server/implementation/redirects.js.map +1 -1
  73. package/dist/server/implementation/sessions.d.ts +2 -20
  74. package/dist/server/implementation/sessions.d.ts.map +1 -1
  75. package/dist/server/implementation/sessions.js +2 -20
  76. package/dist/server/implementation/sessions.js.map +1 -1
  77. package/dist/server/implementation/signIn.d.ts +13 -0
  78. package/dist/server/implementation/signIn.d.ts.map +1 -1
  79. package/dist/server/implementation/signIn.js +26 -1
  80. package/dist/server/implementation/signIn.js.map +1 -1
  81. package/dist/server/implementation/totp.d.ts +40 -0
  82. package/dist/server/implementation/totp.d.ts.map +1 -0
  83. package/dist/server/implementation/totp.js +211 -0
  84. package/dist/server/implementation/totp.js.map +1 -0
  85. package/dist/server/index.d.ts +18 -0
  86. package/dist/server/index.d.ts.map +1 -1
  87. package/dist/server/index.js +255 -0
  88. package/dist/server/index.js.map +1 -1
  89. package/dist/server/portal-email.d.ts +19 -0
  90. package/dist/server/portal-email.d.ts.map +1 -0
  91. package/dist/server/portal-email.js +89 -0
  92. package/dist/server/portal-email.js.map +1 -0
  93. package/dist/server/portal.d.ts +116 -0
  94. package/dist/server/portal.d.ts.map +1 -0
  95. package/dist/server/portal.js +294 -0
  96. package/dist/server/portal.js.map +1 -0
  97. package/dist/server/provider_utils.d.ts +1 -1
  98. package/dist/server/provider_utils.d.ts.map +1 -1
  99. package/dist/server/provider_utils.js +39 -1
  100. package/dist/server/provider_utils.js.map +1 -1
  101. package/dist/server/types.d.ts +128 -11
  102. package/dist/server/types.d.ts.map +1 -1
  103. package/package.json +7 -7
  104. package/src/cli/index.ts +48 -6
  105. package/src/cli/portal-link.ts +112 -0
  106. package/src/cli/portal-upload.ts +411 -0
  107. package/src/client/index.ts +823 -109
  108. package/src/component/_generated/api.ts +72 -1
  109. package/src/component/_generated/component.ts +180 -4
  110. package/src/component/convex.config.ts +3 -0
  111. package/src/component/index.ts +5 -10
  112. package/src/component/portalBridge.ts +116 -0
  113. package/src/component/public.ts +231 -37
  114. package/src/component/schema.ts +70 -7
  115. package/src/providers/{Anonymous.ts → anonymous.ts} +10 -11
  116. package/src/providers/{ConvexCredentials.ts → credentials.ts} +11 -11
  117. package/src/providers/{Email.ts → email.ts} +5 -5
  118. package/src/providers/passkey.ts +35 -0
  119. package/src/providers/{Password.ts → password.ts} +22 -27
  120. package/src/providers/{Phone.ts → phone.ts} +2 -2
  121. package/src/providers/totp.ts +26 -0
  122. package/src/server/convex-auth.ts +470 -0
  123. package/src/server/implementation/index.ts +228 -239
  124. package/src/server/implementation/passkey.ts +650 -0
  125. package/src/server/implementation/redirects.ts +4 -11
  126. package/src/server/implementation/sessions.ts +2 -20
  127. package/src/server/implementation/signIn.ts +39 -1
  128. package/src/server/implementation/totp.ts +366 -0
  129. package/src/server/index.ts +373 -0
  130. package/src/server/portal-email.ts +95 -0
  131. package/src/server/portal.ts +375 -0
  132. package/src/server/provider_utils.ts +42 -1
  133. package/src/server/types.ts +161 -10
  134. package/dist/providers/Anonymous.js.map +0 -1
  135. package/dist/providers/ConvexCredentials.d.ts.map +0 -1
  136. package/dist/providers/ConvexCredentials.js.map +0 -1
  137. package/dist/providers/Email.d.ts.map +0 -1
  138. package/dist/providers/Email.js.map +0 -1
  139. package/dist/providers/Password.js.map +0 -1
  140. package/providers/Anonymous/package.json +0 -6
  141. package/providers/ConvexCredentials/package.json +0 -6
  142. package/providers/Email/package.json +0 -6
  143. package/providers/Password/package.json +0 -6
  144. package/providers/Phone/package.json +0 -6
  145. package/server/package.json +0 -6
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Styled dark-theme magic link email template for the Convex Auth Portal.
3
+ *
4
+ * Matches the portal's design system:
5
+ * - Background: #1e1c1a (body), #2a2825 (card)
6
+ * - Accent: #63a8f8 (Convex blue)
7
+ * - Text: #ffffff (headings), #b9b1aa (secondary), #8f8780 (muted)
8
+ * - Border: #4a4743
9
+ *
10
+ * @module
11
+ */
12
+ /**
13
+ * Generate the styled magic link email HTML.
14
+ *
15
+ * @param url - The magic link URL the user clicks to sign in.
16
+ * @param expiresInHours - How long the link is valid (shown in the email).
17
+ */
18
+ export declare function portalMagicLinkEmail(url: string, expiresInHours?: number): string;
19
+ //# sourceMappingURL=portal-email.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal-email.d.ts","sourceRoot":"","sources":["../../src/server/portal-email.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,cAAc,GAAE,MAAW,GAC1B,MAAM,CAuER"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Styled dark-theme magic link email template for the Convex Auth Portal.
3
+ *
4
+ * Matches the portal's design system:
5
+ * - Background: #1e1c1a (body), #2a2825 (card)
6
+ * - Accent: #63a8f8 (Convex blue)
7
+ * - Text: #ffffff (headings), #b9b1aa (secondary), #8f8780 (muted)
8
+ * - Border: #4a4743
9
+ *
10
+ * @module
11
+ */
12
+ const SHIELD_SVG = `<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="#63a8f8" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"/></svg>`;
13
+ /**
14
+ * Generate the styled magic link email HTML.
15
+ *
16
+ * @param url - The magic link URL the user clicks to sign in.
17
+ * @param expiresInHours - How long the link is valid (shown in the email).
18
+ */
19
+ export function portalMagicLinkEmail(url, expiresInHours = 24) {
20
+ const expiryText = expiresInHours >= 24
21
+ ? `${Math.floor(expiresInHours / 24)} day${Math.floor(expiresInHours / 24) > 1 ? "s" : ""}`
22
+ : `${expiresInHours} hour${expiresInHours > 1 ? "s" : ""}`;
23
+ return `<!DOCTYPE html>
24
+ <html lang="en">
25
+ <head>
26
+ <meta charset="utf-8" />
27
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
28
+ <meta name="color-scheme" content="dark" />
29
+ <meta name="supported-color-schemes" content="dark" />
30
+ <title>Sign in to Convex Auth Portal</title>
31
+ </head>
32
+ <body style="margin:0;padding:0;background-color:#1e1c1a;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;">
33
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background-color:#1e1c1a;padding:40px 16px;">
34
+ <tr>
35
+ <td align="center">
36
+ <table role="presentation" width="480" cellpadding="0" cellspacing="0" style="background-color:#2a2825;border:1px solid #4a4743;border-radius:8px;overflow:hidden;">
37
+ <!-- Header -->
38
+ <tr>
39
+ <td style="padding:32px 32px 0 32px;text-align:center;">
40
+ ${SHIELD_SVG}
41
+ <h1 style="margin:16px 0 0 0;font-size:20px;font-weight:600;color:#ffffff;line-height:1.3;">
42
+ Convex Auth Portal
43
+ </h1>
44
+ </td>
45
+ </tr>
46
+
47
+ <!-- Body -->
48
+ <tr>
49
+ <td style="padding:24px 32px;">
50
+ <p style="margin:0 0 20px 0;font-size:15px;line-height:1.6;color:#b9b1aa;">
51
+ Click the button below to sign in to the admin portal. This link will expire in ${expiryText}.
52
+ </p>
53
+
54
+ <!-- CTA Button -->
55
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0">
56
+ <tr>
57
+ <td align="center" style="padding:8px 0 24px 0;">
58
+ <a href="${url}" target="_blank" style="display:inline-block;background-color:#63a8f8;color:#0a0a0b;font-size:15px;font-weight:600;text-decoration:none;padding:12px 32px;border-radius:6px;line-height:1;">
59
+ Sign in to Portal
60
+ </a>
61
+ </td>
62
+ </tr>
63
+ </table>
64
+
65
+ <p style="margin:0 0 16px 0;font-size:13px;line-height:1.6;color:#8f8780;">
66
+ If the button doesn't work, copy and paste this URL into your browser:
67
+ </p>
68
+ <p style="margin:0;font-size:13px;line-height:1.5;color:#63a8f8;word-break:break-all;">
69
+ ${url}
70
+ </p>
71
+ </td>
72
+ </tr>
73
+
74
+ <!-- Footer -->
75
+ <tr>
76
+ <td style="padding:20px 32px;border-top:1px solid #4a4743;">
77
+ <p style="margin:0;font-size:12px;line-height:1.5;color:#8f8780;text-align:center;">
78
+ If you didn't request this email, you can safely ignore it.
79
+ </p>
80
+ </td>
81
+ </tr>
82
+ </table>
83
+ </td>
84
+ </tr>
85
+ </table>
86
+ </body>
87
+ </html>`;
88
+ }
89
+ //# sourceMappingURL=portal-email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal-email.js","sourceRoot":"","sources":["../../src/server/portal-email.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,UAAU,GAAG,sWAAsW,CAAC;AAE1X;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,GAAW,EACX,iBAAyB,EAAE;IAE3B,MAAM,UAAU,GACd,cAAc,IAAI,EAAE;QAClB,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3F,CAAC,CAAC,GAAG,cAAc,QAAQ,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAE/D,OAAO;;;;;;;;;;;;;;;;;gBAiBO,UAAU;;;;;;;;;;;kGAWwE,UAAU;;;;;;;+BAO7E,GAAG;;;;;;;;;;;kBAWhB,GAAG;;;;;;;;;;;;;;;;;;QAkBb,CAAC;AACT,CAAC"}
@@ -0,0 +1,116 @@
1
+ import type { HttpRouter } from "convex/server";
2
+ import type { ComponentApi as AuthComponentApi } from "../component/_generated/component.js";
3
+ /**
4
+ * Configure the Convex Auth Portal. Returns all the functions needed to
5
+ * serve the portal admin UI, manage invite links, and query auth data.
6
+ *
7
+ * The portal dogfoods the same `Auth()` instance as your app. Portal admins
8
+ * sign in via email magic link and are identified by accepted invites with
9
+ * `role: "portalAdmin"`.
10
+ *
11
+ * ```ts filename="convex/portal.ts"
12
+ * import { Portal } from "@robelest/convex-auth/component";
13
+ * import { auth } from "./auth";
14
+ * import { components } from "./_generated/api";
15
+ *
16
+ * export const {
17
+ * hosting, getCurrentDeployment,
18
+ * portalQuery, portalMutation,
19
+ * validateInvite, acceptInvite, createPortalInvite,
20
+ * portal,
21
+ * } = Portal(components.auth, components.selfHosting, auth);
22
+ * ```
23
+ *
24
+ * ## Setup
25
+ *
26
+ * 1. Configure an email provider in your `Auth()` config (e.g. Resend).
27
+ * 2. Generate an admin invite link:
28
+ * `npx @robelest/convex-auth portal link [--prod]`
29
+ * 3. Visit the link, enter your email, click the magic link, and you're in.
30
+ *
31
+ * The portal URL is auto-derived from `CONVEX_SITE_URL` (always set by Convex).
32
+ * Override with `options.portalUrl` if you need a custom URL.
33
+ */
34
+ export declare function Portal(authComponent: AuthComponentApi, selfHostingComponent: any, auth: any, options?: {
35
+ portalUrl?: string;
36
+ }): {
37
+ /**
38
+ * Combined internal mutation for self-hosting operations.
39
+ * Used by the CLI (`@robelest/convex-auth portal upload`) to
40
+ * upload static assets and manage deployments.
41
+ */
42
+ hosting: import("convex/server").RegisteredMutation<"internal", any, Promise<any>>;
43
+ getCurrentDeployment: import("convex/server").RegisteredQuery<"public", {}, Promise<any>>;
44
+ /**
45
+ * Validate an invite token. Returns the invite if valid and pending,
46
+ * or `null` otherwise. Used by the portal UI to check if an invite
47
+ * link is valid before showing the registration form.
48
+ */
49
+ validateInvite: import("convex/server").RegisteredQuery<"public", {
50
+ tokenHash: string;
51
+ }, Promise<{
52
+ _id: any;
53
+ role: any;
54
+ } | null>>;
55
+ /**
56
+ * Accept a portal invite. Must be called by an authenticated user.
57
+ * Marks the invite as accepted and records the accepting user's ID.
58
+ *
59
+ * The portal UI calls this after the user has signed in via magic link
60
+ * following an invite link.
61
+ */
62
+ acceptInvite: import("convex/server").RegisteredMutation<"public", {
63
+ tokenHash: string;
64
+ }, Promise<void>>;
65
+ /**
66
+ * Create a portal admin invite. Internal mutation called by the CLI
67
+ * (`npx @robelest/convex-auth portal link`).
68
+ */
69
+ createPortalInvite: import("convex/server").RegisteredMutation<"internal", {
70
+ tokenHash: string;
71
+ }, Promise<{
72
+ portalUrl: string;
73
+ }>>;
74
+ /**
75
+ * Combined portal query for all auth data reads.
76
+ * Requires the caller to be an authenticated portal admin.
77
+ *
78
+ * Actions:
79
+ * - `listUsers` — List all users
80
+ * - `listSessions` — List all sessions
81
+ * - `getUser` — Get a single user by ID (requires `userId`)
82
+ * - `getUserSessions` — List sessions for a user (requires `userId`)
83
+ * - `getUserAccounts` — List auth accounts for a user (requires `userId`)
84
+ * - `isAdmin` — Check if the current user is a portal admin
85
+ */
86
+ portalQuery: import("convex/server").RegisteredQuery<"public", {
87
+ action: string;
88
+ userId?: string;
89
+ }, Promise<any>>;
90
+ /**
91
+ * Combined portal mutation for all auth data writes.
92
+ * Requires the caller to be an authenticated portal admin.
93
+ *
94
+ * Actions:
95
+ * - `revokeSession` — Revoke (delete) a session (requires `sessionId`)
96
+ */
97
+ portalMutation: import("convex/server").RegisteredMutation<"public", {
98
+ action: string;
99
+ sessionId?: string;
100
+ }, Promise<void>>;
101
+ portal: {
102
+ /**
103
+ * The URL where the portal is served. Used by the Svelte client
104
+ * as the `redirectTo` for magic link sign-in.
105
+ */
106
+ portalUrl: string;
107
+ /**
108
+ * Register HTTP routes that serve the portal static UI.
109
+ */
110
+ addHttpRoutes: (http: HttpRouter, opts?: {
111
+ pathPrefix?: string;
112
+ spaFallback?: boolean;
113
+ }) => void;
114
+ };
115
+ };
116
+ //# sourceMappingURL=portal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal.d.ts","sourceRoot":"","sources":["../../src/server/portal.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,KAAK,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAiC7F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,MAAM,CACpB,aAAa,EAAE,gBAAgB,EAC/B,oBAAoB,EAAE,GAAG,EACzB,IAAI,EAAE,GAAG,EACT,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE;IAW9B;;;;OAIG;;;IAoFH;;;;OAIG;;mBAGqD,MAAM;;;;;IAe9D;;;;;;OAMG;;mBAGqD,MAAM;;IAwB9D;;;OAGG;;mBAGqD,MAAM;;;;IAY9D;;;;;;;;;;;OAWG;;gBAQ+B,MAAM;iBAAW,MAAM;;IAkDzD;;;;;;OAMG;;gBAQkC,MAAM;oBAAc,MAAM;;;QAqB7D;;;WAGG;;QAGH;;WAEG;8BAEK,UAAU,SACT;YAAE,UAAU,CAAC,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,OAAO,CAAA;SAAE;;EAY5D"}
@@ -0,0 +1,294 @@
1
+ import { queryGeneric, mutationGeneric, internalMutationGeneric, } from "convex/server";
2
+ import { v } from "convex/values";
3
+ import { registerStaticRoutes } from "@convex-dev/self-hosting";
4
+ // ============================================================================
5
+ // Helpers
6
+ // ============================================================================
7
+ /**
8
+ * Check if the authenticated user is a portal admin.
9
+ * Portal admins are identified by having an accepted invite
10
+ * with `role: "portalAdmin"`.
11
+ */
12
+ async function requirePortalAdmin(ctx, authComponent, userId) {
13
+ const invites = await ctx.runQuery(authComponent.public.inviteList, {
14
+ status: "accepted",
15
+ });
16
+ const isAdmin = invites.some((invite) => invite.role === "portalAdmin" && invite.acceptedByUserId === userId);
17
+ if (!isAdmin) {
18
+ throw new Error("Not authorized: portal admin access required");
19
+ }
20
+ }
21
+ // ============================================================================
22
+ // Portal() factory
23
+ // ============================================================================
24
+ /**
25
+ * Configure the Convex Auth Portal. Returns all the functions needed to
26
+ * serve the portal admin UI, manage invite links, and query auth data.
27
+ *
28
+ * The portal dogfoods the same `Auth()` instance as your app. Portal admins
29
+ * sign in via email magic link and are identified by accepted invites with
30
+ * `role: "portalAdmin"`.
31
+ *
32
+ * ```ts filename="convex/portal.ts"
33
+ * import { Portal } from "@robelest/convex-auth/component";
34
+ * import { auth } from "./auth";
35
+ * import { components } from "./_generated/api";
36
+ *
37
+ * export const {
38
+ * hosting, getCurrentDeployment,
39
+ * portalQuery, portalMutation,
40
+ * validateInvite, acceptInvite, createPortalInvite,
41
+ * portal,
42
+ * } = Portal(components.auth, components.selfHosting, auth);
43
+ * ```
44
+ *
45
+ * ## Setup
46
+ *
47
+ * 1. Configure an email provider in your `Auth()` config (e.g. Resend).
48
+ * 2. Generate an admin invite link:
49
+ * `npx @robelest/convex-auth portal link [--prod]`
50
+ * 3. Visit the link, enter your email, click the magic link, and you're in.
51
+ *
52
+ * The portal URL is auto-derived from `CONVEX_SITE_URL` (always set by Convex).
53
+ * Override with `options.portalUrl` if you need a custom URL.
54
+ */
55
+ export function Portal(authComponent, selfHostingComponent, auth, options) {
56
+ const portalUrl = options?.portalUrl ??
57
+ (process.env.CONVEX_SITE_URL
58
+ ? `${process.env.CONVEX_SITE_URL.replace(/\/$/, "")}/portal`
59
+ : "/portal");
60
+ return {
61
+ // ---- Self-hosting: combined internal mutation for CLI ----
62
+ /**
63
+ * Combined internal mutation for self-hosting operations.
64
+ * Used by the CLI (`@robelest/convex-auth portal upload`) to
65
+ * upload static assets and manage deployments.
66
+ */
67
+ hosting: internalMutationGeneric({
68
+ args: {
69
+ action: v.string(),
70
+ path: v.optional(v.string()),
71
+ storageId: v.optional(v.string()),
72
+ blobId: v.optional(v.string()),
73
+ contentType: v.optional(v.string()),
74
+ deploymentId: v.optional(v.string()),
75
+ currentDeploymentId: v.optional(v.string()),
76
+ limit: v.optional(v.number()),
77
+ },
78
+ handler: async (ctx, args) => {
79
+ switch (args.action) {
80
+ case "generateUploadUrl": {
81
+ return await ctx.storage.generateUploadUrl();
82
+ }
83
+ case "recordAsset": {
84
+ const { oldStorageId, oldBlobId } = await ctx.runMutation(selfHostingComponent.lib.recordAsset, {
85
+ path: args.path,
86
+ ...(args.storageId ? { storageId: args.storageId } : {}),
87
+ ...(args.blobId ? { blobId: args.blobId } : {}),
88
+ contentType: args.contentType,
89
+ deploymentId: args.deploymentId,
90
+ });
91
+ if (oldStorageId) {
92
+ try {
93
+ await ctx.storage.delete(oldStorageId);
94
+ }
95
+ catch {
96
+ // Ignore — old file may have been in different storage
97
+ }
98
+ }
99
+ return oldBlobId ?? null;
100
+ }
101
+ case "gcOldAssets": {
102
+ const { storageIds, blobIds } = await ctx.runMutation(selfHostingComponent.lib.gcOldAssets, { currentDeploymentId: args.currentDeploymentId });
103
+ for (const storageId of storageIds) {
104
+ try {
105
+ await ctx.storage.delete(storageId);
106
+ }
107
+ catch {
108
+ // Ignore
109
+ }
110
+ }
111
+ await ctx.runMutation(selfHostingComponent.lib.setCurrentDeployment, { deploymentId: args.currentDeploymentId });
112
+ return { deleted: storageIds.length, blobIds };
113
+ }
114
+ case "listAssets": {
115
+ return await ctx.runQuery(selfHostingComponent.lib.listAssets, {
116
+ limit: args.limit,
117
+ });
118
+ }
119
+ default:
120
+ throw new Error(`Unknown hosting action: ${args.action}`);
121
+ }
122
+ },
123
+ }),
124
+ // ---- Deployment query (public, for client live-reload) ----
125
+ getCurrentDeployment: queryGeneric({
126
+ args: {},
127
+ handler: async (ctx) => {
128
+ return await ctx.runQuery(selfHostingComponent.lib.getCurrentDeployment, {});
129
+ },
130
+ }),
131
+ // ---- Invite management ----
132
+ /**
133
+ * Validate an invite token. Returns the invite if valid and pending,
134
+ * or `null` otherwise. Used by the portal UI to check if an invite
135
+ * link is valid before showing the registration form.
136
+ */
137
+ validateInvite: queryGeneric({
138
+ args: { tokenHash: v.string() },
139
+ handler: async (ctx, { tokenHash }) => {
140
+ const invite = await ctx.runQuery(authComponent.public.inviteGetByTokenHash, { tokenHash });
141
+ if (!invite || invite.status !== "pending") {
142
+ return null;
143
+ }
144
+ if (invite.expiresTime && invite.expiresTime < Date.now()) {
145
+ return null;
146
+ }
147
+ return { _id: invite._id, role: invite.role };
148
+ },
149
+ }),
150
+ /**
151
+ * Accept a portal invite. Must be called by an authenticated user.
152
+ * Marks the invite as accepted and records the accepting user's ID.
153
+ *
154
+ * The portal UI calls this after the user has signed in via magic link
155
+ * following an invite link.
156
+ */
157
+ acceptInvite: mutationGeneric({
158
+ args: { tokenHash: v.string() },
159
+ handler: async (ctx, { tokenHash }) => {
160
+ const userId = await auth.user.require(ctx);
161
+ const invite = await ctx.runQuery(authComponent.public.inviteGetByTokenHash, { tokenHash });
162
+ if (!invite) {
163
+ throw new Error("Invalid invite token");
164
+ }
165
+ if (invite.status !== "pending") {
166
+ throw new Error(`Invite already ${invite.status}`);
167
+ }
168
+ if (invite.expiresTime && invite.expiresTime < Date.now()) {
169
+ throw new Error("Invite has expired");
170
+ }
171
+ await ctx.runMutation(authComponent.public.inviteAccept, {
172
+ inviteId: invite._id,
173
+ acceptedByUserId: userId,
174
+ });
175
+ },
176
+ }),
177
+ /**
178
+ * Create a portal admin invite. Internal mutation called by the CLI
179
+ * (`npx @robelest/convex-auth portal link`).
180
+ */
181
+ createPortalInvite: internalMutationGeneric({
182
+ args: { tokenHash: v.string() },
183
+ handler: async (ctx, { tokenHash }) => {
184
+ await ctx.runMutation(authComponent.public.inviteCreate, {
185
+ tokenHash,
186
+ role: "portalAdmin",
187
+ status: "pending",
188
+ });
189
+ return { portalUrl };
190
+ },
191
+ }),
192
+ // ---- Portal data query (auth-gated) ----
193
+ /**
194
+ * Combined portal query for all auth data reads.
195
+ * Requires the caller to be an authenticated portal admin.
196
+ *
197
+ * Actions:
198
+ * - `listUsers` — List all users
199
+ * - `listSessions` — List all sessions
200
+ * - `getUser` — Get a single user by ID (requires `userId`)
201
+ * - `getUserSessions` — List sessions for a user (requires `userId`)
202
+ * - `getUserAccounts` — List auth accounts for a user (requires `userId`)
203
+ * - `isAdmin` — Check if the current user is a portal admin
204
+ */
205
+ portalQuery: queryGeneric({
206
+ args: {
207
+ action: v.string(),
208
+ userId: v.optional(v.string()),
209
+ },
210
+ handler: async (ctx, { action, userId }) => {
211
+ const currentUserId = await auth.user.require(ctx);
212
+ // Allow isAdmin check without admin requirement
213
+ if (action === "isAdmin") {
214
+ try {
215
+ await requirePortalAdmin(ctx, authComponent, currentUserId);
216
+ return true;
217
+ }
218
+ catch {
219
+ return false;
220
+ }
221
+ }
222
+ await requirePortalAdmin(ctx, authComponent, currentUserId);
223
+ switch (action) {
224
+ case "listUsers":
225
+ return await ctx.runQuery(authComponent.public.userList);
226
+ case "listSessions":
227
+ return await ctx.runQuery(authComponent.public.sessionList);
228
+ case "getUser":
229
+ return await ctx.runQuery(authComponent.public.userGetById, {
230
+ userId: userId,
231
+ });
232
+ case "getUserSessions":
233
+ return await ctx.runQuery(authComponent.public.sessionListByUser, {
234
+ userId: userId,
235
+ });
236
+ case "getUserAccounts": {
237
+ const accounts = await ctx.runQuery(authComponent.public.accountListByUser, { userId: userId });
238
+ // Strip secrets — never send password hashes to the frontend
239
+ return accounts.map(({ secret: _, ...rest }) => rest);
240
+ }
241
+ default:
242
+ throw new Error(`Unknown portal query action: ${action}`);
243
+ }
244
+ },
245
+ }),
246
+ // ---- Portal mutation (auth-gated) ----
247
+ /**
248
+ * Combined portal mutation for all auth data writes.
249
+ * Requires the caller to be an authenticated portal admin.
250
+ *
251
+ * Actions:
252
+ * - `revokeSession` — Revoke (delete) a session (requires `sessionId`)
253
+ */
254
+ portalMutation: mutationGeneric({
255
+ args: {
256
+ action: v.string(),
257
+ sessionId: v.optional(v.string()),
258
+ },
259
+ handler: async (ctx, { action, sessionId }) => {
260
+ const currentUserId = await auth.user.require(ctx);
261
+ await requirePortalAdmin(ctx, authComponent, currentUserId);
262
+ switch (action) {
263
+ case "revokeSession":
264
+ await ctx.runMutation(authComponent.public.sessionDelete, {
265
+ sessionId: sessionId,
266
+ });
267
+ return;
268
+ default:
269
+ throw new Error(`Unknown portal mutation action: ${action}`);
270
+ }
271
+ },
272
+ }),
273
+ // ---- Portal namespace ----
274
+ portal: {
275
+ /**
276
+ * The URL where the portal is served. Used by the Svelte client
277
+ * as the `redirectTo` for magic link sign-in.
278
+ */
279
+ portalUrl,
280
+ /**
281
+ * Register HTTP routes that serve the portal static UI.
282
+ */
283
+ addHttpRoutes: (http, opts) => {
284
+ const prefix = opts?.pathPrefix ?? "/portal";
285
+ // Static file serving
286
+ registerStaticRoutes(http, selfHostingComponent, {
287
+ pathPrefix: prefix,
288
+ spaFallback: opts?.spaFallback ?? true,
289
+ });
290
+ },
291
+ },
292
+ };
293
+ }
294
+ //# sourceMappingURL=portal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal.js","sourceRoot":"","sources":["../../src/server/portal.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ import { AuthProviderConfig, AuthProviderMaterializedConfig, ConvexAuthConfig }
6
6
  export declare function configDefaults(config_: ConvexAuthConfig): {
7
7
  extraProviders: AuthProviderMaterializedConfig[];
8
8
  theme: import("@auth/core/types.js").Theme;
9
- providers: (OIDCConfig<any> | OAuth2Config<any> | import("./types.js").ConvexCredentialsConfig | import("./types.js").EmailConfig<import("convex/server").GenericDataModel> | import("./types.js").PhoneConfig<import("convex/server").GenericDataModel>)[];
9
+ providers: (OIDCConfig<any> | OAuth2Config<any> | import("./types.js").ConvexCredentialsConfig | import("./types.js").PasskeyProviderConfig | import("./types.js").TotpProviderConfig | import("./types.js").EmailConfig<import("convex/server").GenericDataModel> | import("./types.js").PhoneConfig<import("convex/server").GenericDataModel>)[];
10
10
  component: import("./types.js").AuthComponentApi;
11
11
  session?: {
12
12
  totalDurationMs?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"provider_utils.d.ts","sourceRoot":"","sources":["../../src/server/provider_utils.ts"],"names":[],"mappings":"AAmBA,OAAO,EAEL,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,UAAU,EAEX,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,kBAAkB,EAClB,8BAA8B,EAC9B,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,gBAAgB;;;;;;uBAGlB,CAAC;0BAM3B,CAAC;;;kBAWZ,CAAC;;;+BAUe,CAAC;;;gBAuCiB,CAAC;;;0BAiBhC,CAAC;;;;;qBAyCwB,CAAA;qBAAyB,CAAC;6BAC1B,CAAC;6BACtB,CAAA;;sBAG6B,CAAC;;iCAyB9B,CAAJ;;;;;;qBA4Bqd,CAAC;qBAAyB,CAAC;6BAAiC,CAAC;6BAAkC,CAAC;;sBAAgI,CAAC;;;EAvKzrB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,kBAAkB,GAGhC,8BAA8B,CAC7D;AAwFD,eAAO,MAAM,oBAAoB,0BAA0B,CAAC;AAI5D,wBAAgB,iBAAiB,CAC/B,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAC,EACvC,MAAM,CAAC,EAAE,MAAM;;;;;;;;cAmBhB;AAID;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,CAgBzD;AAMD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,EACzC,mBAAmB,EAAE,OAAO,UAQ7B"}
1
+ {"version":3,"file":"provider_utils.d.ts","sourceRoot":"","sources":["../../src/server/provider_utils.ts"],"names":[],"mappings":"AAmBA,OAAO,EAEL,YAAY,EACZ,WAAW,EACX,iBAAiB,EACjB,UAAU,EAEX,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,kBAAkB,EAClB,8BAA8B,EAC9B,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,gBAAgB;;;;;;uBAGpC,CAAC;0BAKhB,CAAC;;;kBAOc,CAAC;;;+BAenB,CAAF;;;gBAoC8C,CAAC;;;0BAgBzC,CAAA;;;;;qBA+BoD,CAAC;qBAChD,CAAA;6BACN,CAAC;6BACJ,CAAF;;sBAKqC,CAAC;;iCAsBxB,CAAC;;;;;;qBA+CU,CAAC;qBAAyB,CAAC;6BAC5B,CAAC;6BACJ,CAAC;;sBAKd,CAAL;;;EAnLF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,kBAAkB,GAGhC,8BAA8B,CAC7D;AAiID,eAAO,MAAM,oBAAoB,0BAA0B,CAAC;AAI5D,wBAAgB,iBAAiB,CAC/B,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAC,EACvC,MAAM,CAAC,EAAE,MAAM;;;;;;;;cAmBhB;AAID;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,CAgBzD;AAMD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,EACzC,mBAAmB,EAAE,OAAO,UAQ7B"}
@@ -55,8 +55,38 @@ function materializeAndDefaultProviders(config_) {
55
55
  // Have to materialize first so that the correct env variables are used
56
56
  const providers = config_.providers.map((provider) => providerDefaults(typeof provider === "function" ? provider() : provider));
57
57
  const config = { ...config_, providers };
58
+ // setEnvDefaults is from Auth.js and only works with Auth.js provider types.
59
+ // Filter out passkey and TOTP providers before passing to setEnvDefaults,
60
+ // then reinsert them at their original positions.
61
+ const passkeyIndices = [];
62
+ const passkeyProviders = [];
63
+ const totpIndices = [];
64
+ const totpProviders = [];
65
+ const filteredProviders = config.providers.filter((p, i) => {
66
+ if (p.type === "passkey") {
67
+ passkeyIndices.push(i);
68
+ passkeyProviders.push(p);
69
+ return false;
70
+ }
71
+ if (p.type === "totp") {
72
+ totpIndices.push(i);
73
+ totpProviders.push(p);
74
+ return false;
75
+ }
76
+ return true;
77
+ });
58
78
  // Unfortunately mutates its argument
59
- setEnvDefaults(process.env, config);
79
+ const tempConfig = { ...config, providers: filteredProviders };
80
+ setEnvDefaults(process.env, tempConfig);
81
+ // Reinsert passkey and TOTP providers at their original positions
82
+ const merged = [...tempConfig.providers];
83
+ for (let i = 0; i < passkeyIndices.length; i++) {
84
+ merged.splice(passkeyIndices[i], 0, passkeyProviders[i]);
85
+ }
86
+ for (let i = 0; i < totpIndices.length; i++) {
87
+ merged.splice(totpIndices[i], 0, totpProviders[i]);
88
+ }
89
+ config.providers = merged;
60
90
  // Manually do this for new provider type
61
91
  config.providers.forEach((provider) => {
62
92
  if (provider.type === "phone") {
@@ -69,6 +99,14 @@ function materializeAndDefaultProviders(config_) {
69
99
  return config;
70
100
  }
71
101
  function providerDefaults(provider) {
102
+ // Passkey providers don't use Auth.js options merge or OAuth normalization
103
+ if (provider.type === "passkey") {
104
+ return provider;
105
+ }
106
+ // TOTP providers don't use Auth.js options merge or OAuth normalization
107
+ if (provider.type === "totp") {
108
+ return provider;
109
+ }
72
110
  // TODO: Add `redirectProxyUrl` to oauth providers
73
111
  const merged = merge(provider, provider.options);
74
112
  return merged.type === "oauth" || merged.type === "oidc"