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.
- package/dist/cli/generate.d.ts +14 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +297 -0
- package/dist/cli/generate.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +111 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/client/index.d.ts +300 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +434 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/plugins/admin.d.ts +92 -0
- package/dist/client/plugins/admin.d.ts.map +1 -0
- package/dist/client/plugins/admin.js +165 -0
- package/dist/client/plugins/admin.js.map +1 -0
- package/dist/client/primitives.d.ts +57 -0
- package/dist/client/primitives.d.ts.map +1 -0
- package/dist/client/primitives.js +64 -0
- package/dist/client/primitives.js.map +1 -0
- package/dist/client/providers.d.ts +14 -0
- package/dist/client/providers.d.ts.map +1 -0
- package/dist/client/providers.js +25 -0
- package/dist/client/providers.js.map +1 -0
- package/dist/client/react.d.ts +23 -0
- package/dist/client/react.d.ts.map +1 -0
- package/dist/client/react.js +48 -0
- package/dist/client/react.js.map +1 -0
- package/dist/client/tanstack-start-client-plugins.d.ts +34 -0
- package/dist/client/tanstack-start-client-plugins.d.ts.map +1 -0
- package/dist/client/tanstack-start-client-plugins.js +32 -0
- package/dist/client/tanstack-start-client-plugins.js.map +1 -0
- package/dist/client/tanstack-start-client.d.ts +52 -0
- package/dist/client/tanstack-start-client.d.ts.map +1 -0
- package/dist/client/tanstack-start-client.js +130 -0
- package/dist/client/tanstack-start-client.js.map +1 -0
- package/dist/client/tanstack-start-plugins.d.ts +27 -0
- package/dist/client/tanstack-start-plugins.d.ts.map +1 -0
- package/dist/client/tanstack-start-plugins.js +145 -0
- package/dist/client/tanstack-start-plugins.js.map +1 -0
- package/dist/client/tanstack-start.d.ts +130 -0
- package/dist/client/tanstack-start.d.ts.map +1 -0
- package/dist/client/tanstack-start.js +331 -0
- package/dist/client/tanstack-start.js.map +1 -0
- package/dist/component/_generated/api.d.ts +50 -0
- package/dist/component/_generated/api.d.ts.map +1 -0
- package/dist/component/_generated/api.js +31 -0
- package/dist/component/_generated/api.js.map +1 -0
- package/dist/component/_generated/component.d.ts +92 -0
- package/dist/component/_generated/component.d.ts.map +1 -0
- package/dist/component/_generated/component.js +11 -0
- package/dist/component/_generated/component.js.map +1 -0
- package/dist/component/_generated/dataModel.d.ts +46 -0
- package/dist/component/_generated/dataModel.d.ts.map +1 -0
- package/dist/component/_generated/dataModel.js +11 -0
- package/dist/component/_generated/dataModel.js.map +1 -0
- package/dist/component/_generated/server.d.ts +121 -0
- package/dist/component/_generated/server.d.ts.map +1 -0
- package/dist/component/_generated/server.js +78 -0
- package/dist/component/_generated/server.js.map +1 -0
- package/dist/component/convex.config.d.ts +3 -0
- package/dist/component/convex.config.d.ts.map +1 -0
- package/dist/component/convex.config.js +4 -0
- package/dist/component/convex.config.js.map +1 -0
- package/dist/component/core/sessions.d.ts +33 -0
- package/dist/component/core/sessions.d.ts.map +1 -0
- package/dist/component/core/sessions.js +186 -0
- package/dist/component/core/sessions.js.map +1 -0
- package/dist/component/core/users.d.ts +19 -0
- package/dist/component/core/users.d.ts.map +1 -0
- package/dist/component/core/users.js +154 -0
- package/dist/component/core/users.js.map +1 -0
- package/dist/component/core/verifications.d.ts +34 -0
- package/dist/component/core/verifications.d.ts.map +1 -0
- package/dist/component/core/verifications.js +135 -0
- package/dist/component/core/verifications.js.map +1 -0
- package/dist/component/gateway.d.ts +16 -0
- package/dist/component/gateway.d.ts.map +1 -0
- package/dist/component/gateway.js +229 -0
- package/dist/component/gateway.js.map +1 -0
- package/dist/component/lib/crypto.d.ts +24 -0
- package/dist/component/lib/crypto.d.ts.map +1 -0
- package/dist/component/lib/crypto.js +57 -0
- package/dist/component/lib/crypto.js.map +1 -0
- package/dist/component/lib/rateLimit.d.ts +26 -0
- package/dist/component/lib/rateLimit.d.ts.map +1 -0
- package/dist/component/lib/rateLimit.js +96 -0
- package/dist/component/lib/rateLimit.js.map +1 -0
- package/dist/component/lib/validators.d.ts +19 -0
- package/dist/component/lib/validators.d.ts.map +1 -0
- package/dist/component/lib/validators.js +12 -0
- package/dist/component/lib/validators.js.map +1 -0
- package/dist/component/plugins/admin.d.ts +72 -0
- package/dist/component/plugins/admin.d.ts.map +1 -0
- package/dist/component/plugins/admin.js +152 -0
- package/dist/component/plugins/admin.js.map +1 -0
- package/dist/component/providers/emailPassword.d.ts +49 -0
- package/dist/component/providers/emailPassword.d.ts.map +1 -0
- package/dist/component/providers/emailPassword.js +316 -0
- package/dist/component/providers/emailPassword.js.map +1 -0
- package/dist/component/providers/oauth.d.ts +33 -0
- package/dist/component/providers/oauth.d.ts.map +1 -0
- package/dist/component/providers/oauth.js +256 -0
- package/dist/component/providers/oauth.js.map +1 -0
- package/dist/component/schema.d.ts +132 -0
- package/dist/component/schema.d.ts.map +1 -0
- package/dist/component/schema.js +82 -0
- package/dist/component/schema.js.map +1 -0
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +121 -0
- package/src/cli/generate.ts +360 -0
- package/src/cli/index.ts +133 -0
- package/src/client/index.ts +707 -0
- package/src/client/plugins/admin.ts +205 -0
- package/src/client/primitives.ts +100 -0
- package/src/client/providers.ts +35 -0
- package/src/client/react.ts +97 -0
- package/src/client/tanstack-start-client-plugins.ts +113 -0
- package/src/client/tanstack-start-client.ts +259 -0
- package/src/client/tanstack-start-plugins.ts +203 -0
- package/src/client/tanstack-start.ts +535 -0
- package/src/component/_generated/api.ts +70 -0
- package/src/component/_generated/component.ts +184 -0
- package/src/component/_generated/dataModel.ts +60 -0
- package/src/component/_generated/server.ts +156 -0
- package/src/component/convex.config.ts +5 -0
- package/src/component/core/sessions.ts +228 -0
- package/src/component/core/users.ts +199 -0
- package/src/component/core/verifications.ts +173 -0
- package/src/component/gateway.ts +321 -0
- package/src/component/lib/crypto.ts +63 -0
- package/src/component/lib/internalApi.ts +66 -0
- package/src/component/lib/rateLimit.ts +111 -0
- package/src/component/lib/validators.ts +12 -0
- package/src/component/plugins/admin.ts +178 -0
- package/src/component/providers/emailPassword.ts +374 -0
- package/src/component/providers/oauth.ts +324 -0
- package/src/component/schema.ts +88 -0
- 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
|
+
}
|