convex-zen 0.0.1

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 (142) hide show
  1. package/dist/cli/generate.d.ts +14 -0
  2. package/dist/cli/generate.d.ts.map +1 -0
  3. package/dist/cli/generate.js +297 -0
  4. package/dist/cli/generate.js.map +1 -0
  5. package/dist/cli/index.d.ts +3 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +111 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/client/index.d.ts +300 -0
  10. package/dist/client/index.d.ts.map +1 -0
  11. package/dist/client/index.js +434 -0
  12. package/dist/client/index.js.map +1 -0
  13. package/dist/client/plugins/admin.d.ts +92 -0
  14. package/dist/client/plugins/admin.d.ts.map +1 -0
  15. package/dist/client/plugins/admin.js +165 -0
  16. package/dist/client/plugins/admin.js.map +1 -0
  17. package/dist/client/primitives.d.ts +57 -0
  18. package/dist/client/primitives.d.ts.map +1 -0
  19. package/dist/client/primitives.js +64 -0
  20. package/dist/client/primitives.js.map +1 -0
  21. package/dist/client/providers.d.ts +14 -0
  22. package/dist/client/providers.d.ts.map +1 -0
  23. package/dist/client/providers.js +25 -0
  24. package/dist/client/providers.js.map +1 -0
  25. package/dist/client/react.d.ts +23 -0
  26. package/dist/client/react.d.ts.map +1 -0
  27. package/dist/client/react.js +48 -0
  28. package/dist/client/react.js.map +1 -0
  29. package/dist/client/tanstack-start-client-plugins.d.ts +34 -0
  30. package/dist/client/tanstack-start-client-plugins.d.ts.map +1 -0
  31. package/dist/client/tanstack-start-client-plugins.js +32 -0
  32. package/dist/client/tanstack-start-client-plugins.js.map +1 -0
  33. package/dist/client/tanstack-start-client.d.ts +52 -0
  34. package/dist/client/tanstack-start-client.d.ts.map +1 -0
  35. package/dist/client/tanstack-start-client.js +130 -0
  36. package/dist/client/tanstack-start-client.js.map +1 -0
  37. package/dist/client/tanstack-start-plugins.d.ts +27 -0
  38. package/dist/client/tanstack-start-plugins.d.ts.map +1 -0
  39. package/dist/client/tanstack-start-plugins.js +145 -0
  40. package/dist/client/tanstack-start-plugins.js.map +1 -0
  41. package/dist/client/tanstack-start.d.ts +130 -0
  42. package/dist/client/tanstack-start.d.ts.map +1 -0
  43. package/dist/client/tanstack-start.js +331 -0
  44. package/dist/client/tanstack-start.js.map +1 -0
  45. package/dist/component/_generated/api.d.ts +50 -0
  46. package/dist/component/_generated/api.d.ts.map +1 -0
  47. package/dist/component/_generated/api.js +31 -0
  48. package/dist/component/_generated/api.js.map +1 -0
  49. package/dist/component/_generated/component.d.ts +92 -0
  50. package/dist/component/_generated/component.d.ts.map +1 -0
  51. package/dist/component/_generated/component.js +11 -0
  52. package/dist/component/_generated/component.js.map +1 -0
  53. package/dist/component/_generated/dataModel.d.ts +46 -0
  54. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  55. package/dist/component/_generated/dataModel.js +11 -0
  56. package/dist/component/_generated/dataModel.js.map +1 -0
  57. package/dist/component/_generated/server.d.ts +121 -0
  58. package/dist/component/_generated/server.d.ts.map +1 -0
  59. package/dist/component/_generated/server.js +78 -0
  60. package/dist/component/_generated/server.js.map +1 -0
  61. package/dist/component/convex.config.d.ts +3 -0
  62. package/dist/component/convex.config.d.ts.map +1 -0
  63. package/dist/component/convex.config.js +4 -0
  64. package/dist/component/convex.config.js.map +1 -0
  65. package/dist/component/core/sessions.d.ts +33 -0
  66. package/dist/component/core/sessions.d.ts.map +1 -0
  67. package/dist/component/core/sessions.js +186 -0
  68. package/dist/component/core/sessions.js.map +1 -0
  69. package/dist/component/core/users.d.ts +19 -0
  70. package/dist/component/core/users.d.ts.map +1 -0
  71. package/dist/component/core/users.js +154 -0
  72. package/dist/component/core/users.js.map +1 -0
  73. package/dist/component/core/verifications.d.ts +34 -0
  74. package/dist/component/core/verifications.d.ts.map +1 -0
  75. package/dist/component/core/verifications.js +135 -0
  76. package/dist/component/core/verifications.js.map +1 -0
  77. package/dist/component/gateway.d.ts +16 -0
  78. package/dist/component/gateway.d.ts.map +1 -0
  79. package/dist/component/gateway.js +229 -0
  80. package/dist/component/gateway.js.map +1 -0
  81. package/dist/component/lib/crypto.d.ts +24 -0
  82. package/dist/component/lib/crypto.d.ts.map +1 -0
  83. package/dist/component/lib/crypto.js +57 -0
  84. package/dist/component/lib/crypto.js.map +1 -0
  85. package/dist/component/lib/rateLimit.d.ts +26 -0
  86. package/dist/component/lib/rateLimit.d.ts.map +1 -0
  87. package/dist/component/lib/rateLimit.js +96 -0
  88. package/dist/component/lib/rateLimit.js.map +1 -0
  89. package/dist/component/lib/validators.d.ts +19 -0
  90. package/dist/component/lib/validators.d.ts.map +1 -0
  91. package/dist/component/lib/validators.js +12 -0
  92. package/dist/component/lib/validators.js.map +1 -0
  93. package/dist/component/plugins/admin.d.ts +72 -0
  94. package/dist/component/plugins/admin.d.ts.map +1 -0
  95. package/dist/component/plugins/admin.js +152 -0
  96. package/dist/component/plugins/admin.js.map +1 -0
  97. package/dist/component/providers/emailPassword.d.ts +49 -0
  98. package/dist/component/providers/emailPassword.d.ts.map +1 -0
  99. package/dist/component/providers/emailPassword.js +316 -0
  100. package/dist/component/providers/emailPassword.js.map +1 -0
  101. package/dist/component/providers/oauth.d.ts +33 -0
  102. package/dist/component/providers/oauth.d.ts.map +1 -0
  103. package/dist/component/providers/oauth.js +256 -0
  104. package/dist/component/providers/oauth.js.map +1 -0
  105. package/dist/component/schema.d.ts +132 -0
  106. package/dist/component/schema.d.ts.map +1 -0
  107. package/dist/component/schema.js +82 -0
  108. package/dist/component/schema.js.map +1 -0
  109. package/dist/types.d.ts +67 -0
  110. package/dist/types.d.ts.map +1 -0
  111. package/dist/types.js +5 -0
  112. package/dist/types.js.map +1 -0
  113. package/package.json +121 -0
  114. package/src/cli/generate.ts +360 -0
  115. package/src/cli/index.ts +133 -0
  116. package/src/client/index.ts +707 -0
  117. package/src/client/plugins/admin.ts +205 -0
  118. package/src/client/primitives.ts +100 -0
  119. package/src/client/providers.ts +35 -0
  120. package/src/client/react.ts +97 -0
  121. package/src/client/tanstack-start-client-plugins.ts +113 -0
  122. package/src/client/tanstack-start-client.ts +259 -0
  123. package/src/client/tanstack-start-plugins.ts +203 -0
  124. package/src/client/tanstack-start.ts +535 -0
  125. package/src/component/_generated/api.ts +70 -0
  126. package/src/component/_generated/component.ts +184 -0
  127. package/src/component/_generated/dataModel.ts +60 -0
  128. package/src/component/_generated/server.ts +156 -0
  129. package/src/component/convex.config.ts +5 -0
  130. package/src/component/core/sessions.ts +228 -0
  131. package/src/component/core/users.ts +199 -0
  132. package/src/component/core/verifications.ts +173 -0
  133. package/src/component/gateway.ts +321 -0
  134. package/src/component/lib/crypto.ts +63 -0
  135. package/src/component/lib/internalApi.ts +66 -0
  136. package/src/component/lib/rateLimit.ts +111 -0
  137. package/src/component/lib/validators.ts +12 -0
  138. package/src/component/plugins/admin.ts +178 -0
  139. package/src/component/providers/emailPassword.ts +374 -0
  140. package/src/component/providers/oauth.ts +324 -0
  141. package/src/component/schema.ts +88 -0
  142. package/src/types.ts +68 -0
@@ -0,0 +1,88 @@
1
+ import { defineSchema, defineTable } from "convex/server";
2
+ import { v } from "convex/values";
3
+
4
+ export default defineSchema({
5
+ // Core identity table
6
+ users: defineTable({
7
+ email: v.string(),
8
+ emailVerified: v.boolean(),
9
+ name: v.optional(v.string()),
10
+ image: v.optional(v.string()),
11
+ createdAt: v.number(),
12
+ updatedAt: v.number(),
13
+ // Admin plugin fields (always present, only populated when admin plugin active)
14
+ role: v.optional(v.string()),
15
+ banned: v.optional(v.boolean()),
16
+ banReason: v.optional(v.string()),
17
+ banExpires: v.optional(v.number()),
18
+ })
19
+ .index("by_email", ["email"]),
20
+
21
+ // One row per auth method per user
22
+ accounts: defineTable({
23
+ userId: v.id("users"),
24
+ providerId: v.string(), // "credential" | "google" | "github"
25
+ accountId: v.string(), // email for credential; provider user ID for OAuth
26
+ passwordHash: v.optional(v.string()), // Argon2id, only for credential
27
+ accessToken: v.optional(v.string()),
28
+ refreshToken: v.optional(v.string()),
29
+ accessTokenExpiresAt: v.optional(v.number()),
30
+ createdAt: v.number(),
31
+ updatedAt: v.number(),
32
+ })
33
+ .index("by_userId", ["userId"])
34
+ .index("by_provider_accountId", ["providerId", "accountId"]),
35
+
36
+ // Opaque token stored as SHA-256 hash
37
+ sessions: defineTable({
38
+ userId: v.id("users"),
39
+ tokenHash: v.string(),
40
+ expiresAt: v.number(),
41
+ absoluteExpiresAt: v.number(),
42
+ lastActiveAt: v.number(),
43
+ ipAddress: v.optional(v.string()),
44
+ userAgent: v.optional(v.string()),
45
+ createdAt: v.number(),
46
+ })
47
+ .index("by_tokenHash", ["tokenHash"])
48
+ .index("by_userId", ["userId"])
49
+ .index("by_expiresAt", ["expiresAt"]),
50
+
51
+ // Email verification and password reset codes
52
+ verifications: defineTable({
53
+ identifier: v.string(), // email address
54
+ type: v.string(), // "email-verification" | "password-reset"
55
+ codeHash: v.string(), // SHA-256 of 8-char alphanumeric code
56
+ expiresAt: v.number(),
57
+ attempts: v.number(),
58
+ createdAt: v.number(),
59
+ })
60
+ .index("by_identifier_type", ["identifier", "type"]),
61
+
62
+ // PKCE code verifier + state parameter, short-lived
63
+ oauthStates: defineTable({
64
+ stateHash: v.string(),
65
+ codeVerifier: v.string(),
66
+ provider: v.string(),
67
+ redirectUrl: v.optional(v.string()),
68
+ expiresAt: v.number(),
69
+ createdAt: v.number(),
70
+ })
71
+ .index("by_stateHash", ["stateHash"]),
72
+
73
+ // Sliding window counters for brute force protection
74
+ rateLimits: defineTable({
75
+ key: v.string(), // e.g. "signin:ip:1.2.3.4"
76
+ count: v.number(),
77
+ windowStart: v.number(),
78
+ lockedUntil: v.optional(v.number()),
79
+ })
80
+ .index("by_key", ["key"]),
81
+
82
+ // Plugin and auth configuration
83
+ config: defineTable({
84
+ key: v.string(),
85
+ value: v.string(), // JSON
86
+ })
87
+ .index("by_key", ["key"]),
88
+ });
package/src/types.ts ADDED
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Core interfaces for convex-zen plugin and provider system.
3
+ */
4
+
5
+ /** Interface for sending transactional emails. */
6
+ export interface EmailProvider {
7
+ sendVerificationEmail(to: string, code: string): Promise<void>;
8
+ sendPasswordResetEmail(to: string, code: string): Promise<void>;
9
+ }
10
+
11
+ /** OAuth provider configuration returned by factory functions. */
12
+ export interface OAuthProviderConfig {
13
+ id: string; // "google" | "github"
14
+ clientId: string;
15
+ clientSecret: string;
16
+ authorizationUrl: string;
17
+ tokenUrl: string;
18
+ userInfoUrl: string;
19
+ scopes: string[];
20
+ }
21
+
22
+ /** Base plugin interface. */
23
+ export interface ConvexAuthPlugin {
24
+ id: string;
25
+ }
26
+
27
+ /** Admin plugin configuration. */
28
+ export interface AdminPluginConfig extends ConvexAuthPlugin {
29
+ id: "admin";
30
+ defaultRole?: string;
31
+ adminRole?: string;
32
+ }
33
+
34
+ /** Result of a successful auth operation. */
35
+ export interface AuthResult {
36
+ sessionToken: string;
37
+ userId: string;
38
+ }
39
+
40
+ /** Result of session validation. */
41
+ export interface SessionResult {
42
+ userId: string;
43
+ sessionId: string;
44
+ }
45
+
46
+ /** Email/password sign-up result. */
47
+ export type SignUpResult =
48
+ | { status: "verification_required" }
49
+ | { status: "success"; sessionToken: string; userId: string };
50
+
51
+ /** Verification result. */
52
+ export type VerifyResult =
53
+ | { status: "valid" }
54
+ | { status: "invalid" }
55
+ | { status: "expired" }
56
+ | { status: "too_many_attempts" };
57
+
58
+ /** OAuth authorization URL result. */
59
+ export interface OAuthUrlResult {
60
+ authorizationUrl: string;
61
+ }
62
+
63
+ /** OAuth callback result. */
64
+ export interface OAuthCallbackResult {
65
+ sessionToken: string;
66
+ userId: string;
67
+ redirectUrl?: string;
68
+ }