Files
better-auth/docs/lib/plugins.ts

253 lines
6.0 KiB
TypeScript

import { communityPlugins } from "@/lib/community-plugins-data";
import { source } from "@/lib/source";
export interface Plugin {
name: string;
slug: string;
description: string;
tagline: string;
category: string;
type: "official" | "community";
href: string;
author?: string;
icon: string;
}
const pluginMeta: Record<
string,
{ category: string; icon: string; tagline: string }
> = {
// Authentication
"2fa": {
category: "Authentication",
icon: "ScanFace",
tagline: "Two-factor authentication with TOTP and backup codes",
},
username: {
category: "Authentication",
icon: "UserSquare2",
tagline: "Classic username and password authentication",
},
anonymous: {
category: "Authentication",
icon: "UserCircle",
tagline: "Let users try your app without creating an account",
},
"phone-number": {
category: "Authentication",
icon: "Phone",
tagline: "Authenticate users with their phone number via SMS",
},
"magic-link": {
category: "Authentication",
icon: "Mailbox",
tagline: "Passwordless sign-in with email magic links",
},
"email-otp": {
category: "Authentication",
icon: "Mail",
tagline: "One-time passcode verification delivered via email",
},
passkey: {
category: "Authentication",
icon: "Fingerprint",
tagline: "Passwordless login with biometrics and hardware keys",
},
"generic-oauth": {
category: "Authentication",
icon: "Globe",
tagline: "Connect any OAuth 2.0 provider with minimal config",
},
"one-tap": {
category: "Authentication",
icon: "MousePointerClick",
tagline: "Google One Tap sign-in for frictionless login",
},
siwe: {
category: "Authentication",
icon: "Wallet",
tagline: "Sign in with Ethereum wallet for Web3 apps",
},
// Authorization
admin: {
category: "Authorization",
icon: "ShieldCheck",
tagline: "Admin dashboard APIs to manage users and sessions",
},
"api-key": {
category: "Authorization",
icon: "KeyRound",
tagline: "Issue and manage API keys for programmatic access",
},
mcp: {
category: "Authorization",
icon: "Cpu",
tagline: "Model Context Protocol server for AI agent auth",
},
organization: {
category: "Authorization",
icon: "Users2",
tagline: "Multi-tenant organizations with roles and invitations",
},
// Enterprise
"oidc-provider": {
category: "Enterprise",
icon: "Globe",
tagline: "OpenID Connect provider for federated identity",
},
"oauth-provider": {
category: "Enterprise",
icon: "Server",
tagline: "Turn your app into a full OAuth 2.0 provider",
},
sso: {
category: "Enterprise",
icon: "Building2",
tagline: "Enterprise SSO with SAML and OIDC providers",
},
scim: {
category: "Enterprise",
icon: "ArrowLeftRight",
tagline: "Automated user provisioning with SCIM 2.0",
},
// Utility
bearer: {
category: "Utility",
icon: "Key",
tagline: "Bearer token authentication for API access",
},
"device-authorization": {
category: "Utility",
icon: "Monitor",
tagline: "OAuth device flow for TVs and CLI tools",
},
captcha: {
category: "Utility",
icon: "ShieldAlert",
tagline: "Protect forms from bots with CAPTCHA verification",
},
"have-i-been-pwned": {
category: "Utility",
icon: "ShieldAlert",
tagline: "Check passwords against known data breaches",
},
"last-login-method": {
category: "Utility",
icon: "LogIn",
tagline: "Track and display the user's last login method",
},
"multi-session": {
category: "Utility",
icon: "Users",
tagline: "Support multiple active sessions per user",
},
"oauth-proxy": {
category: "Utility",
icon: "ArrowLeftRight",
tagline: "Proxy OAuth requests through your own server",
},
"one-time-token": {
category: "Utility",
icon: "Timer",
tagline: "Generate single-use tokens for secure actions",
},
"open-api": {
category: "Utility",
icon: "FileCode",
tagline: "Auto-generate OpenAPI spec from your auth endpoints",
},
jwt: {
category: "Utility",
icon: "FileKey",
tagline: "JWT session tokens for stateless authentication",
},
dub: {
category: "Utility",
icon: "Link2",
tagline: "Dub referral and link tracking integration",
},
// Payments
stripe: {
category: "Payments",
icon: "StripeIcon",
tagline: "Stripe subscriptions and payments tied to auth",
},
polar: {
category: "Payments",
icon: "PolarIcon",
tagline: "Polar payments and subscriptions integration",
},
autumn: {
category: "Payments",
icon: "AutumnIcon",
tagline: "Autumn billing and subscription management",
},
dodopayments: {
category: "Payments",
icon: "DodoPaymentsIcon",
tagline: "DodoPayments integration for global payments",
},
creem: {
category: "Payments",
icon: "CreemIcon",
tagline: "Creem payment processing for your app",
},
chargebee: {
category: "Payments",
icon: "ChargebeeIcon",
tagline: "Chargebee subscription and billing management",
},
};
export const categories = [
"Authentication",
"Authorization",
"Enterprise",
"Utility",
"Payments",
"Community",
] as const;
export function getOfficialPlugins(): Plugin[] {
const pages = source.getPages();
return pages
.filter(
(page) =>
page.slugs[0] === "plugins" &&
page.slugs.length === 2 &&
page.slugs[1] !== "community-plugins",
)
.map((page) => {
const slug = page.slugs[1];
const meta = pluginMeta[slug];
return {
name: page.data.title,
slug,
description: page.data.description ?? "",
tagline: meta?.tagline ?? page.data.description ?? "",
category: meta?.category ?? "Utility",
type: "official" as const,
href: `/docs/plugins/${slug}`,
icon: meta?.icon ?? "Puzzle",
};
});
}
export function getCommunityPlugins(): Plugin[] {
return communityPlugins.map((p) => ({
name: p.name,
slug: p.name.toLowerCase().replace(/[^a-z0-9]+/g, "-"),
description: p.description,
tagline: p.description,
category: "Community",
type: "community" as const,
href: p.url,
author: p.author.name,
icon: "Package",
}));
}
export function getAllPlugins(): Plugin[] {
return [...getOfficialPlugins(), ...getCommunityPlugins()];
}