@mdxui/auth 1.1.0 → 1.1.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/providers/identity-provider.tsx","../../src/providers/widgets-provider.tsx","../../src/providers/auth-gate.tsx"],"sourcesContent":["'use client'\n\nimport { AuthKitProvider } from '@workos-inc/authkit-react'\nimport type { IdentityProviderProps } from '../types/auth'\nimport { WidgetsProvider } from './widgets-provider'\n\n/**\n * Identity provider that wraps your app with WorkOS AuthKit authentication.\n *\n * This provider sets up authentication context for your application and\n * automatically includes the WidgetsProvider for WorkOS widgets.\n *\n * @example\n * ```tsx\n * import { IdentityProvider } from '@mdxui/auth'\n *\n * function App() {\n * return (\n * <IdentityProvider\n * clientId=\"client_xxx\"\n * devMode={process.env.NODE_ENV === 'development'}\n * >\n * <YourApp />\n * </IdentityProvider>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom redirect URI\n * <IdentityProvider\n * clientId=\"client_xxx\"\n * redirectUri=\"https://app.example.com/dashboard\"\n * onRedirectCallback={() => {\n * // Custom callback after auth redirect\n * }}\n * >\n * <YourApp />\n * </IdentityProvider>\n * ```\n */\nexport function IdentityProvider({\n clientId,\n apiHostname,\n devMode,\n redirectUri,\n onRedirectCallback,\n children,\n}: IdentityProviderProps) {\n // Build redirect URI - defaults to current origin\n const resolvedRedirectUri =\n redirectUri ??\n (typeof window !== 'undefined' ? window.location.origin : undefined)\n\n // Default redirect callback - clear auth params from URL\n const handleRedirectCallback =\n onRedirectCallback ??\n (() => {\n if (typeof window !== 'undefined') {\n const url = new URL(window.location.href)\n url.searchParams.delete('code')\n url.searchParams.delete('state')\n window.history.replaceState({}, '', url.pathname)\n }\n })\n\n return (\n <AuthKitProvider\n clientId={clientId}\n apiHostname={apiHostname}\n devMode={devMode}\n redirectUri={resolvedRedirectUri}\n onRedirectCallback={handleRedirectCallback}\n >\n <WidgetsProvider>{children}</WidgetsProvider>\n </AuthKitProvider>\n )\n}\n\n/**\n * Minimal identity provider without WidgetsProvider\n *\n * Use this if you want to set up widgets separately or don't need them.\n *\n * @example\n * ```tsx\n * import { IdentityProviderMinimal, WidgetsProvider } from '@mdxui/auth'\n *\n * function App() {\n * return (\n * <IdentityProviderMinimal clientId=\"client_xxx\">\n * <WidgetsProvider appearance=\"dark\">\n * <YourApp />\n * </WidgetsProvider>\n * </IdentityProviderMinimal>\n * )\n * }\n * ```\n */\nexport function IdentityProviderMinimal({\n clientId,\n apiHostname,\n devMode,\n redirectUri,\n onRedirectCallback,\n children,\n}: IdentityProviderProps) {\n const resolvedRedirectUri =\n redirectUri ??\n (typeof window !== 'undefined' ? window.location.origin : undefined)\n\n const handleRedirectCallback =\n onRedirectCallback ??\n (() => {\n if (typeof window !== 'undefined') {\n const url = new URL(window.location.href)\n url.searchParams.delete('code')\n url.searchParams.delete('state')\n window.history.replaceState({}, '', url.pathname)\n }\n })\n\n return (\n <AuthKitProvider\n clientId={clientId}\n apiHostname={apiHostname}\n devMode={devMode}\n redirectUri={resolvedRedirectUri}\n onRedirectCallback={handleRedirectCallback}\n >\n {children}\n </AuthKitProvider>\n )\n}\n","'use client'\n\nimport { WorkOsWidgets } from '@workos-inc/widgets'\nimport { useEffect, useState } from 'react'\nimport type { WidgetsProviderProps } from '../types/auth'\n\n/**\n * Hook to detect dark mode from document class or system preference\n *\n * @returns Object with isDark state and mounted flag\n *\n * @example\n * ```tsx\n * const { isDark, mounted } = useThemeDetection()\n * const appearance = mounted ? (isDark ? 'dark' : 'light') : 'inherit'\n * ```\n */\nexport function useThemeDetection() {\n const [mounted, setMounted] = useState(false)\n const [isDark, setIsDark] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n\n const checkDarkMode = () => {\n const isDarkClass = document.documentElement.classList.contains('dark')\n const prefersDark = window.matchMedia(\n '(prefers-color-scheme: dark)'\n ).matches\n setIsDark(\n isDarkClass ||\n (!document.documentElement.classList.contains('light') && prefersDark)\n )\n }\n\n checkDarkMode()\n\n // Watch for class changes on html element\n const observer = new MutationObserver(checkDarkMode)\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n })\n\n // Watch for system preference changes\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n mediaQuery.addEventListener('change', checkDarkMode)\n\n return () => {\n observer.disconnect()\n mediaQuery.removeEventListener('change', checkDarkMode)\n }\n }, [])\n\n return { isDark, mounted }\n}\n\n/**\n * Provider for WorkOS widgets with automatic theme detection\n *\n * Wraps children with WorkOsWidgets context and automatically detects\n * light/dark mode from document classes or system preference.\n *\n * @example\n * ```tsx\n * import { WidgetsProvider } from '@mdxui/auth'\n * import { UserProfile } from '@mdxui/auth/widgets'\n *\n * function App() {\n * return (\n * <WidgetsProvider>\n * <UserProfile authToken={getAccessToken} />\n * </WidgetsProvider>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With explicit theme\n * <WidgetsProvider appearance=\"dark\" radius=\"large\">\n * <UserProfile authToken={token} />\n * </WidgetsProvider>\n * ```\n */\nexport function WidgetsProvider({\n children,\n appearance,\n radius = 'medium',\n scaling = '100%',\n}: WidgetsProviderProps) {\n const { isDark, mounted } = useThemeDetection()\n\n // Use provided appearance, or auto-detect from theme\n // Use \"inherit\" until mounted to avoid hydration mismatch\n const resolvedAppearance =\n appearance ?? (mounted ? (isDark ? 'dark' : 'light') : 'inherit')\n\n return (\n <WorkOsWidgets\n theme={{\n appearance: resolvedAppearance,\n radius,\n scaling,\n }}\n elements={{\n primaryButton: {\n variant: 'solid',\n },\n secondaryButton: {\n variant: 'outline',\n },\n }}\n >\n {children}\n </WorkOsWidgets>\n )\n}\n","'use client'\n\nimport { useAuth } from '@workos-inc/authkit-react'\nimport type { AuthGateProps } from '../types/auth'\n\n/**\n * Default loading component shown while checking authentication\n */\nfunction DefaultLoadingComponent() {\n return (\n <div className=\"min-h-screen bg-background flex items-center justify-center\">\n <div className=\"flex flex-col items-center gap-4\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-primary border-t-transparent\" />\n <p className=\"text-sm text-muted-foreground\">Loading...</p>\n </div>\n </div>\n )\n}\n\n/**\n * Default landing page component shown when user is not authenticated\n */\nfunction DefaultLandingPage() {\n const { signIn } = useAuth()\n\n return (\n <div className=\"min-h-screen bg-background flex flex-col items-center justify-center p-4\">\n <div className=\"text-center max-w-md\">\n <h1 className=\"text-3xl font-bold tracking-tight mb-4\">Welcome</h1>\n <p className=\"text-muted-foreground mb-8\">\n Sign in to access your dashboard.\n </p>\n <button\n type=\"button\"\n onClick={() => signIn()}\n className=\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[var(--radius-md)] text-sm font-medium transition-colors bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-6\"\n >\n Sign In\n </button>\n </div>\n </div>\n )\n}\n\n/**\n * AuthGate handles authentication state and shows appropriate UI:\n * - Loading state while checking auth\n * - Landing page or redirect when not authenticated\n * - Children (protected content) when authenticated\n *\n * @example\n * ```tsx\n * import { AuthGate } from '@mdxui/auth'\n *\n * function App() {\n * return (\n * <AuthGate>\n * <ProtectedDashboard />\n * </AuthGate>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom components\n * <AuthGate\n * loadingComponent={<CustomSpinner />}\n * landingComponent={<CustomLandingPage />}\n * >\n * <Dashboard />\n * </AuthGate>\n * ```\n *\n * @example\n * ```tsx\n * // Allow unauthenticated access\n * <AuthGate required={false}>\n * <PublicContent />\n * </AuthGate>\n * ```\n *\n * @example\n * ```tsx\n * // Redirect to external URL when not authenticated\n * <AuthGate\n * onUnauthenticated=\"redirect\"\n * redirectUrl=\"https://marketing.example.com\"\n * >\n * <Dashboard />\n * </AuthGate>\n * ```\n */\nexport function AuthGate({\n children,\n required = true,\n loadingComponent,\n landingComponent,\n onUnauthenticated = 'landing',\n redirectUrl,\n}: AuthGateProps) {\n const { user, isLoading } = useAuth()\n\n // If auth is not required, always show children\n if (!required) {\n return <>{children}</>\n }\n\n // Show loading state while checking authentication\n if (isLoading) {\n return <>{loadingComponent ?? <DefaultLoadingComponent />}</>\n }\n\n // User is authenticated, show protected content\n if (user) {\n return <>{children}</>\n }\n\n // User is not authenticated - handle based on config\n switch (onUnauthenticated) {\n case 'redirect':\n // Redirect to external URL\n if (redirectUrl && typeof window !== 'undefined') {\n window.location.href = redirectUrl\n return (\n <div className=\"min-h-screen bg-background flex items-center justify-center\">\n <p className=\"text-sm text-muted-foreground\">Redirecting...</p>\n </div>\n )\n }\n // Fall through to landing if no redirect URL\n return <>{landingComponent ?? <DefaultLandingPage />}</>\n\n case 'allow':\n // Allow access even without auth (shows children)\n return <>{children}</>\n\n case 'landing':\n default:\n // Show landing page (custom or default)\n return <>{landingComponent ?? <DefaultLandingPage />}</>\n }\n}\n"],"mappings":"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","names":["jsx","jsx"]}
1
+ {"version":3,"sources":["../../src/providers/identity-provider.tsx","../../src/providers/widgets-provider.tsx","../../src/providers/auth-gate.tsx","../../src/providers/vault-provider.tsx"],"sourcesContent":["'use client'\n\nimport { AuthKitProvider } from '@workos-inc/authkit-react'\nimport type { IdentityProviderProps } from '../types/auth'\nimport { WidgetsProvider } from './widgets-provider'\n\n/**\n * Identity provider that wraps your app with WorkOS AuthKit authentication.\n *\n * This provider sets up authentication context for your application and\n * automatically includes the WidgetsProvider for WorkOS widgets.\n *\n * @example\n * ```tsx\n * import { IdentityProvider } from '@mdxui/auth'\n *\n * function App() {\n * return (\n * <IdentityProvider\n * clientId=\"client_xxx\"\n * devMode={process.env.NODE_ENV === 'development'}\n * >\n * <YourApp />\n * </IdentityProvider>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom redirect URI\n * <IdentityProvider\n * clientId=\"client_xxx\"\n * redirectUri=\"https://app.example.com/dashboard\"\n * onRedirectCallback={() => {\n * // Custom callback after auth redirect\n * }}\n * >\n * <YourApp />\n * </IdentityProvider>\n * ```\n */\nexport function IdentityProvider({\n clientId,\n apiHostname,\n devMode,\n redirectUri,\n onRedirectCallback,\n children,\n}: IdentityProviderProps) {\n // Build redirect URI - defaults to current origin\n const resolvedRedirectUri =\n redirectUri ??\n (typeof window !== 'undefined' ? window.location.origin : undefined)\n\n // Default redirect callback - clear auth params from URL\n const handleRedirectCallback =\n onRedirectCallback ??\n (() => {\n if (typeof window !== 'undefined') {\n const url = new URL(window.location.href)\n url.searchParams.delete('code')\n url.searchParams.delete('state')\n window.history.replaceState({}, '', url.pathname)\n }\n })\n\n return (\n <AuthKitProvider\n clientId={clientId}\n apiHostname={apiHostname}\n devMode={devMode}\n redirectUri={resolvedRedirectUri}\n onRedirectCallback={handleRedirectCallback}\n >\n <WidgetsProvider>{children}</WidgetsProvider>\n </AuthKitProvider>\n )\n}\n\n/**\n * Minimal identity provider without WidgetsProvider\n *\n * Use this if you want to set up widgets separately or don't need them.\n *\n * @example\n * ```tsx\n * import { IdentityProviderMinimal, WidgetsProvider } from '@mdxui/auth'\n *\n * function App() {\n * return (\n * <IdentityProviderMinimal clientId=\"client_xxx\">\n * <WidgetsProvider appearance=\"dark\">\n * <YourApp />\n * </WidgetsProvider>\n * </IdentityProviderMinimal>\n * )\n * }\n * ```\n */\nexport function IdentityProviderMinimal({\n clientId,\n apiHostname,\n devMode,\n redirectUri,\n onRedirectCallback,\n children,\n}: IdentityProviderProps) {\n const resolvedRedirectUri =\n redirectUri ??\n (typeof window !== 'undefined' ? window.location.origin : undefined)\n\n const handleRedirectCallback =\n onRedirectCallback ??\n (() => {\n if (typeof window !== 'undefined') {\n const url = new URL(window.location.href)\n url.searchParams.delete('code')\n url.searchParams.delete('state')\n window.history.replaceState({}, '', url.pathname)\n }\n })\n\n return (\n <AuthKitProvider\n clientId={clientId}\n apiHostname={apiHostname}\n devMode={devMode}\n redirectUri={resolvedRedirectUri}\n onRedirectCallback={handleRedirectCallback}\n >\n {children}\n </AuthKitProvider>\n )\n}\n","'use client'\n\nimport { WorkOsWidgets } from '@workos-inc/widgets'\nimport { useEffect, useState } from 'react'\nimport type { WidgetsProviderProps } from '../types/auth'\n\n/**\n * Hook to detect dark mode from document class or system preference\n *\n * @returns Object with isDark state and mounted flag\n *\n * @example\n * ```tsx\n * const { isDark, mounted } = useThemeDetection()\n * const appearance = mounted ? (isDark ? 'dark' : 'light') : 'inherit'\n * ```\n */\nexport function useThemeDetection() {\n const [mounted, setMounted] = useState(false)\n const [isDark, setIsDark] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n\n const checkDarkMode = () => {\n const isDarkClass = document.documentElement.classList.contains('dark')\n const prefersDark = window.matchMedia(\n '(prefers-color-scheme: dark)'\n ).matches\n setIsDark(\n isDarkClass ||\n (!document.documentElement.classList.contains('light') && prefersDark)\n )\n }\n\n checkDarkMode()\n\n // Watch for class changes on html element\n const observer = new MutationObserver(checkDarkMode)\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n })\n\n // Watch for system preference changes\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n mediaQuery.addEventListener('change', checkDarkMode)\n\n return () => {\n observer.disconnect()\n mediaQuery.removeEventListener('change', checkDarkMode)\n }\n }, [])\n\n return { isDark, mounted }\n}\n\n/**\n * Provider for WorkOS widgets with automatic theme detection\n *\n * Wraps children with WorkOsWidgets context and automatically detects\n * light/dark mode from document classes or system preference.\n *\n * @example\n * ```tsx\n * import { WidgetsProvider } from '@mdxui/auth'\n * import { UserProfile } from '@mdxui/auth/widgets'\n *\n * function App() {\n * return (\n * <WidgetsProvider>\n * <UserProfile authToken={getAccessToken} />\n * </WidgetsProvider>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With explicit theme\n * <WidgetsProvider appearance=\"dark\" radius=\"large\">\n * <UserProfile authToken={token} />\n * </WidgetsProvider>\n * ```\n */\nexport function WidgetsProvider({\n children,\n appearance,\n radius = 'medium',\n scaling = '100%',\n}: WidgetsProviderProps) {\n const { isDark, mounted } = useThemeDetection()\n\n // Use provided appearance, or auto-detect from theme\n // Use \"inherit\" until mounted to avoid hydration mismatch\n const resolvedAppearance =\n appearance ?? (mounted ? (isDark ? 'dark' : 'light') : 'inherit')\n\n return (\n <WorkOsWidgets\n theme={{\n appearance: resolvedAppearance,\n radius,\n scaling,\n }}\n elements={{\n primaryButton: {\n variant: 'solid',\n },\n secondaryButton: {\n variant: 'outline',\n },\n }}\n >\n {children}\n </WorkOsWidgets>\n )\n}\n","'use client'\n\nimport { useAuth } from '@workos-inc/authkit-react'\nimport type { AuthGateProps } from '../types/auth'\n\n/**\n * Default loading component shown while checking authentication\n */\nfunction DefaultLoadingComponent() {\n return (\n <div className=\"min-h-screen bg-background flex items-center justify-center\">\n <div className=\"flex flex-col items-center gap-4\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-primary border-t-transparent\" />\n <p className=\"text-sm text-muted-foreground\">Loading...</p>\n </div>\n </div>\n )\n}\n\n/**\n * Default landing page component shown when user is not authenticated\n */\nfunction DefaultLandingPage() {\n const { signIn } = useAuth()\n\n return (\n <div className=\"min-h-screen bg-background flex flex-col items-center justify-center p-4\">\n <div className=\"text-center max-w-md\">\n <h1 className=\"text-3xl font-bold tracking-tight mb-4\">Welcome</h1>\n <p className=\"text-muted-foreground mb-8\">\n Sign in to access your dashboard.\n </p>\n <button\n type=\"button\"\n onClick={() => signIn()}\n className=\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-[var(--radius-md)] text-sm font-medium transition-colors bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-6\"\n >\n Sign In\n </button>\n </div>\n </div>\n )\n}\n\n/**\n * AuthGate handles authentication state and shows appropriate UI:\n * - Loading state while checking auth\n * - Landing page or redirect when not authenticated\n * - Children (protected content) when authenticated\n *\n * @example\n * ```tsx\n * import { AuthGate } from '@mdxui/auth'\n *\n * function App() {\n * return (\n * <AuthGate>\n * <ProtectedDashboard />\n * </AuthGate>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom components\n * <AuthGate\n * loadingComponent={<CustomSpinner />}\n * landingComponent={<CustomLandingPage />}\n * >\n * <Dashboard />\n * </AuthGate>\n * ```\n *\n * @example\n * ```tsx\n * // Allow unauthenticated access\n * <AuthGate required={false}>\n * <PublicContent />\n * </AuthGate>\n * ```\n *\n * @example\n * ```tsx\n * // Redirect to external URL when not authenticated\n * <AuthGate\n * onUnauthenticated=\"redirect\"\n * redirectUrl=\"https://marketing.example.com\"\n * >\n * <Dashboard />\n * </AuthGate>\n * ```\n */\nexport function AuthGate({\n children,\n required = true,\n loadingComponent,\n landingComponent,\n onUnauthenticated = 'landing',\n redirectUrl,\n}: AuthGateProps) {\n const { user, isLoading } = useAuth()\n\n // If auth is not required, always show children\n if (!required) {\n return <>{children}</>\n }\n\n // Show loading state while checking authentication\n if (isLoading) {\n return <>{loadingComponent ?? <DefaultLoadingComponent />}</>\n }\n\n // User is authenticated, show protected content\n if (user) {\n return <>{children}</>\n }\n\n // User is not authenticated - handle based on config\n switch (onUnauthenticated) {\n case 'redirect':\n // Redirect to external URL\n if (redirectUrl && typeof window !== 'undefined') {\n window.location.href = redirectUrl\n return (\n <div className=\"min-h-screen bg-background flex items-center justify-center\">\n <p className=\"text-sm text-muted-foreground\">Redirecting...</p>\n </div>\n )\n }\n // Fall through to landing if no redirect URL\n return <>{landingComponent ?? <DefaultLandingPage />}</>\n\n case 'allow':\n // Allow access even without auth (shows children)\n return <>{children}</>\n\n case 'landing':\n default:\n // Show landing page (custom or default)\n return <>{landingComponent ?? <DefaultLandingPage />}</>\n }\n}\n","'use client'\n\nimport { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport type { VaultItem, VaultField } from '../vault/types'\n\n/**\n * Vault client interface\n *\n * Defines the contract for a vault backend. The actual implementation\n * can be provided by vault.do SDK or any other vault service.\n */\nexport interface VaultClient {\n /** List all vault items */\n list: () => Promise<VaultItem[]>\n /** Create a new vault item */\n create: (integrationId: string, credentials: Record<string, string>) => Promise<VaultItem>\n /** Rotate credentials for an existing vault item */\n rotate: (id: string, credentials: Record<string, string>) => Promise<VaultItem>\n /** Delete a vault item */\n delete: (id: string) => Promise<void>\n /** Get field configuration for an integration */\n getIntegrationFields?: (integrationId: string) => VaultField[]\n}\n\n/**\n * Vault context state\n */\nexport interface VaultContextState {\n /** The vault client instance */\n client: VaultClient | null\n /** Vault items currently loaded */\n items: VaultItem[]\n /** Whether the vault is currently loading */\n loading: boolean\n /** Error message if vault operations failed */\n error: string | null\n /** Reload vault items */\n reload: () => Promise<void>\n /** Create a new vault item */\n createItem: (integrationId: string, credentials: Record<string, string>) => Promise<void>\n /** Rotate credentials for an existing item */\n rotateItem: (id: string, credentials: Record<string, string>) => Promise<void>\n /** Delete a vault item */\n deleteItem: (id: string) => Promise<void>\n /** Get field configuration for an integration */\n getIntegrationFields: (integrationId: string) => VaultField[]\n}\n\nconst VaultContext = createContext<VaultContextState | null>(null)\n\n/**\n * Props for VaultProvider\n */\nexport interface VaultProviderProps {\n /** Children to render */\n children: ReactNode\n /** Optional vault client implementation */\n client?: VaultClient\n /** Initial items to display (for SSR or static rendering) */\n initialItems?: VaultItem[]\n}\n\n/**\n * Default fields for unknown integrations\n */\nconst defaultFields: VaultField[] = [\n { key: 'api_key', label: 'API Key', type: 'password', required: true }\n]\n\n/**\n * Provider for vault state and operations\n *\n * Provides context for vault components to access the vault client\n * and perform CRUD operations on credentials.\n *\n * The actual vault.do SDK integration will be done in vault.do/react.\n * This provider is designed to be a generic wrapper that can work\n * with any vault backend implementation.\n *\n * @example\n * ```tsx\n * import { VaultProvider } from '@mdxui/auth'\n *\n * // Basic usage with a custom client\n * function App() {\n * return (\n * <VaultProvider client={myVaultClient}>\n * <VaultDashboard />\n * </VaultProvider>\n * )\n * }\n *\n * // Static/SSR usage with initial items\n * function App() {\n * return (\n * <VaultProvider initialItems={serverSideItems}>\n * <VaultDashboard />\n * </VaultProvider>\n * )\n * }\n * ```\n */\nexport function VaultProvider({\n children,\n client,\n initialItems = [],\n}: VaultProviderProps) {\n // Note: In a real implementation, this would use useState and useEffect\n // to manage state and load items from the client. For now, we provide\n // a basic structure that the vault.do SDK can extend.\n\n const contextValue = useMemo<VaultContextState>(() => {\n const getIntegrationFields = (integrationId: string): VaultField[] => {\n if (client?.getIntegrationFields) {\n return client.getIntegrationFields(integrationId)\n }\n return defaultFields\n }\n\n return {\n client: client ?? null,\n items: initialItems,\n loading: false,\n error: null,\n reload: async () => {\n if (!client) {\n console.warn('VaultProvider: No client provided, cannot reload')\n return\n }\n // Implementation would update state here\n await client.list()\n },\n createItem: async (integrationId, credentials) => {\n if (!client) {\n throw new Error('VaultProvider: No client provided')\n }\n await client.create(integrationId, credentials)\n },\n rotateItem: async (id, credentials) => {\n if (!client) {\n throw new Error('VaultProvider: No client provided')\n }\n await client.rotate(id, credentials)\n },\n deleteItem: async (id) => {\n if (!client) {\n throw new Error('VaultProvider: No client provided')\n }\n await client.delete(id)\n },\n getIntegrationFields,\n }\n }, [client, initialItems])\n\n return (\n <VaultContext.Provider value={contextValue}>\n {children}\n </VaultContext.Provider>\n )\n}\n\n/**\n * Hook to access vault context\n *\n * Must be used within a VaultProvider.\n *\n * @throws Error if used outside of VaultProvider\n */\nexport function useVaultContext(): VaultContextState {\n const context = useContext(VaultContext)\n if (!context) {\n throw new Error('useVaultContext must be used within a VaultProvider')\n }\n return context\n}\n\n/**\n * Hook to optionally access vault context\n *\n * Returns null if not within a VaultProvider.\n */\nexport function useVaultContextOptional(): VaultContextState | null {\n return useContext(VaultContext)\n}\n"],"mappings":"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","names":["jsx","jsx","jsx"]}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Vault Types
3
+ *
4
+ * Types for vault UI components. These are standalone types that work
5
+ * with any vault backend - the actual vault.do SDK integration will
6
+ * be done in vault.do/react.
7
+ */
8
+ /**
9
+ * Represents a stored credential item in the vault
10
+ */
11
+ interface VaultItem {
12
+ /** Unique identifier for the vault item */
13
+ id: string;
14
+ /** Display name for the credential (e.g., "OpenAI", "GitHub") */
15
+ name: string;
16
+ /** Integration identifier for field configuration lookup */
17
+ integrationId: string;
18
+ /** Optional logo URL for the integration */
19
+ logoUrl?: string;
20
+ /** When the credential was first created */
21
+ createdAt: Date;
22
+ /** When the credential was last updated/rotated */
23
+ updatedAt: Date;
24
+ }
25
+ /**
26
+ * Field definition for credential input forms
27
+ */
28
+ interface VaultField {
29
+ /** Field key used in the credentials object */
30
+ key: string;
31
+ /** Human-readable label for the field */
32
+ label: string;
33
+ /** Input type for the field */
34
+ type: 'text' | 'password';
35
+ /** Whether the field is required */
36
+ required: boolean;
37
+ /** Optional placeholder text */
38
+ placeholder?: string;
39
+ }
40
+ /**
41
+ * Integration definition for credential forms
42
+ */
43
+ interface VaultIntegration {
44
+ /** Integration identifier */
45
+ id: string;
46
+ /** Display name */
47
+ name: string;
48
+ /** Optional logo URL */
49
+ logoUrl?: string;
50
+ /** Fields required for this integration */
51
+ fields: VaultField[];
52
+ }
53
+ /**
54
+ * Props for vault list component
55
+ */
56
+ interface VaultListProps {
57
+ /** List of vault items to display */
58
+ items: VaultItem[];
59
+ /** Handler for rotating credentials */
60
+ onRotate: (id: string, credentials: Record<string, string>) => Promise<void>;
61
+ /** Handler for deleting credentials */
62
+ onDelete: (id: string) => Promise<void>;
63
+ /** Handler to open the add modal */
64
+ onOpenAddModal: () => void;
65
+ /** Function to get integration fields for a given integration ID */
66
+ getIntegrationFields?: (integrationId: string) => VaultField[];
67
+ }
68
+ /**
69
+ * Props for vault item card component
70
+ */
71
+ interface VaultItemCardProps {
72
+ /** Unique identifier */
73
+ id: string;
74
+ /** Display name */
75
+ name: string;
76
+ /** Optional logo URL */
77
+ logoUrl?: string;
78
+ /** Creation date */
79
+ createdAt: Date;
80
+ /** Last update date */
81
+ updatedAt: Date;
82
+ /** Handler for rotate action */
83
+ onRotate: (id: string) => void;
84
+ /** Handler for delete action */
85
+ onDelete: (id: string) => void;
86
+ }
87
+ /**
88
+ * Props for vault input modal component
89
+ */
90
+ interface VaultInputModalProps {
91
+ /** Whether the modal is open */
92
+ isOpen: boolean;
93
+ /** Handler to close the modal */
94
+ onClose: () => void;
95
+ /** Whether creating new or rotating existing credentials */
96
+ mode: 'create' | 'rotate';
97
+ /** Integration to configure */
98
+ integration?: VaultIntegration;
99
+ /** Handler to save credentials */
100
+ onSave: (credentials: Record<string, string>) => Promise<void>;
101
+ }
102
+ /**
103
+ * Props for vault delete dialog component
104
+ */
105
+ interface VaultDeleteDialogProps {
106
+ /** Whether the dialog is open */
107
+ isOpen: boolean;
108
+ /** Handler to close the dialog */
109
+ onClose: () => void;
110
+ /** Name of the item being deleted */
111
+ itemName: string;
112
+ /** Handler to confirm deletion */
113
+ onConfirm: () => void;
114
+ }
115
+ /**
116
+ * Props for vault empty state component
117
+ */
118
+ interface VaultEmptyStateProps {
119
+ /** Handler for add credential action */
120
+ onAddCredential: () => void;
121
+ }
122
+
123
+ export type { VaultItem as V, VaultField as a, VaultIntegration as b, VaultListProps as c, VaultItemCardProps as d, VaultInputModalProps as e, VaultDeleteDialogProps as f, VaultEmptyStateProps as g };
@@ -0,0 +1,192 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { f as VaultDeleteDialogProps, g as VaultEmptyStateProps, e as VaultInputModalProps, d as VaultItemCardProps, c as VaultListProps } from '../types-8tixck1H.js';
3
+ export { a as VaultField, b as VaultIntegration, V as VaultItem } from '../types-8tixck1H.js';
4
+
5
+ /**
6
+ * Secret type for vault secret management
7
+ */
8
+ interface Secret {
9
+ id: string;
10
+ key: string;
11
+ value: string;
12
+ description?: string;
13
+ environment?: string;
14
+ tags?: string[];
15
+ createdAt: Date;
16
+ updatedAt: Date;
17
+ metadata?: Record<string, unknown>;
18
+ }
19
+ /**
20
+ * Props for the SecretsManager component
21
+ */
22
+ interface SecretsManagerProps {
23
+ /**
24
+ * Secrets to display
25
+ */
26
+ secrets?: Secret[];
27
+ /**
28
+ * Available environments
29
+ */
30
+ environments?: string[];
31
+ /**
32
+ * Current environment filter
33
+ */
34
+ currentEnvironment?: string;
35
+ /**
36
+ * Callback when environment changes
37
+ */
38
+ onEnvironmentChange?: (environment: string) => void;
39
+ /**
40
+ * Callback when a secret is created
41
+ */
42
+ onCreate?: (secret: Omit<Secret, "id" | "createdAt" | "updatedAt">) => void | Promise<void>;
43
+ /**
44
+ * Callback when a secret is updated
45
+ */
46
+ onUpdate?: (id: string, secret: Partial<Secret>) => void | Promise<void>;
47
+ /**
48
+ * Callback when a secret is deleted
49
+ */
50
+ onDelete?: (id: string) => void | Promise<void>;
51
+ /**
52
+ * Whether values are initially hidden
53
+ * @default true
54
+ */
55
+ hideValues?: boolean;
56
+ /**
57
+ * Whether to allow editing
58
+ * @default true
59
+ */
60
+ editable?: boolean;
61
+ /**
62
+ * Additional CSS class
63
+ */
64
+ className?: string;
65
+ }
66
+
67
+ /**
68
+ * SecretsManager Component
69
+ *
70
+ * A comprehensive UI for managing application secrets and environment variables.
71
+ * Provides features for creating, editing, deleting, and viewing secrets with
72
+ * support for multiple environments.
73
+ *
74
+ * @example
75
+ * ```tsx
76
+ * import { SecretsManager } from '@mdxui/auth'
77
+ *
78
+ * function VaultPage() {
79
+ * return (
80
+ * <SecretsManager
81
+ * secrets={secrets}
82
+ * environments={['development', 'staging', 'production']}
83
+ * onCreate={handleCreate}
84
+ * onUpdate={handleUpdate}
85
+ * onDelete={handleDelete}
86
+ * />
87
+ * )
88
+ * }
89
+ * ```
90
+ */
91
+ declare function SecretsManager({ secrets: externalSecrets, environments, currentEnvironment, onEnvironmentChange, onCreate, onUpdate, onDelete, hideValues: initialHideValues, editable, className, }: SecretsManagerProps): react_jsx_runtime.JSX.Element;
92
+
93
+ interface SecretFormProps {
94
+ secret?: Secret;
95
+ environment: string;
96
+ environments: string[];
97
+ onSubmit: (secret: Omit<Secret, "id" | "createdAt" | "updatedAt">) => void;
98
+ onCancel: () => void;
99
+ }
100
+ declare function SecretForm({ secret, environment: defaultEnvironment, environments, onSubmit, onCancel, }: SecretFormProps): react_jsx_runtime.JSX.Element;
101
+
102
+ /**
103
+ * Confirmation dialog for deleting vault credentials
104
+ *
105
+ * @example
106
+ * ```tsx
107
+ * <VaultDeleteDialog
108
+ * isOpen={deleteDialogOpen}
109
+ * onClose={() => setDeleteDialogOpen(false)}
110
+ * itemName="OpenAI"
111
+ * onConfirm={handleDelete}
112
+ * />
113
+ * ```
114
+ */
115
+ declare function VaultDeleteDialog({ isOpen, onClose, itemName, onConfirm }: VaultDeleteDialogProps): react_jsx_runtime.JSX.Element;
116
+
117
+ /**
118
+ * Empty state component shown when the vault has no credentials
119
+ *
120
+ * @example
121
+ * ```tsx
122
+ * <VaultEmptyState onAddCredential={() => setAddModalOpen(true)} />
123
+ * ```
124
+ */
125
+ declare function VaultEmptyState({ onAddCredential }: VaultEmptyStateProps): react_jsx_runtime.JSX.Element;
126
+
127
+ /**
128
+ * Modal for entering or rotating vault credentials
129
+ *
130
+ * Renders input fields based on the integration's field configuration.
131
+ * Supports both creating new credentials and rotating existing ones.
132
+ *
133
+ * @example
134
+ * ```tsx
135
+ * <VaultInputModal
136
+ * isOpen={modalOpen}
137
+ * onClose={() => setModalOpen(false)}
138
+ * mode="create"
139
+ * integration={{
140
+ * id: 'openai',
141
+ * name: 'OpenAI',
142
+ * logoUrl: '...',
143
+ * fields: [{ key: 'api_key', label: 'API Key', type: 'password', required: true }]
144
+ * }}
145
+ * onSave={(credentials) => saveCredentials(credentials)}
146
+ * />
147
+ * ```
148
+ */
149
+ declare function VaultInputModal({ isOpen, onClose, mode, integration, onSave, }: VaultInputModalProps): react_jsx_runtime.JSX.Element | null;
150
+
151
+ /**
152
+ * Card component displaying a single vault credential item
153
+ *
154
+ * Shows the integration logo/icon, name, and creation/rotation date.
155
+ * Provides a dropdown menu with rotate and delete actions.
156
+ *
157
+ * @example
158
+ * ```tsx
159
+ * <VaultItemCard
160
+ * id="1"
161
+ * name="OpenAI"
162
+ * logoUrl="https://..."
163
+ * createdAt={new Date('2024-01-01')}
164
+ * updatedAt={new Date('2024-06-01')}
165
+ * onRotate={(id) => console.log('Rotate', id)}
166
+ * onDelete={(id) => console.log('Delete', id)}
167
+ * />
168
+ * ```
169
+ */
170
+ declare function VaultItemCard({ id, name, logoUrl, createdAt, updatedAt, onRotate, onDelete, }: VaultItemCardProps): react_jsx_runtime.JSX.Element;
171
+
172
+ /**
173
+ * Main vault list component that displays stored credentials
174
+ *
175
+ * Includes the list view, delete confirmation dialog, and credential
176
+ * input modal for rotating credentials. Shows an empty state when
177
+ * no credentials are stored.
178
+ *
179
+ * @example
180
+ * ```tsx
181
+ * <VaultList
182
+ * items={vaultItems}
183
+ * onRotate={async (id, creds) => await rotateCredentials(id, creds)}
184
+ * onDelete={async (id) => await deleteCredentials(id)}
185
+ * onOpenAddModal={() => setAddModalOpen(true)}
186
+ * getIntegrationFields={(id) => integrationFields[id]}
187
+ * />
188
+ * ```
189
+ */
190
+ declare function VaultList({ items, onRotate, onDelete, onOpenAddModal, getIntegrationFields, }: VaultListProps): react_jsx_runtime.JSX.Element;
191
+
192
+ export { type Secret, SecretForm, SecretsManager, type SecretsManagerProps, VaultDeleteDialog, VaultDeleteDialogProps, VaultEmptyState, VaultEmptyStateProps, VaultInputModal, VaultInputModalProps, VaultItemCard, VaultItemCardProps, VaultList, VaultListProps };