@vinetechke/next-error-logger 0.1.0-beta.4 → 0.1.0-beta.5

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/components/index.ts","../../src/components/LogViewer.tsx","../../src/components/ErrorBoundary.tsx"],"sourcesContent":["export { LogViewer } from './LogViewer'\nexport { ErrorBoundary, withErrorBoundary } from './ErrorBoundary'\nexport type { ErrorBoundaryProps } from './ErrorBoundary'\n","'use client'\n\nimport { useState, useEffect, useCallback } from 'react'\nimport type {\n ErrorLogEntry,\n LogLevel,\n LogViewerProps,\n LogViewerTheme,\n} from '../types'\n\nconst defaultTheme: Required<LogViewerTheme> = {\n errorBg: 'rgb(254, 226, 226)',\n errorText: 'rgb(153, 27, 27)',\n warnBg: 'rgb(254, 249, 195)',\n warnText: 'rgb(133, 77, 14)',\n infoBg: 'rgb(219, 234, 254)',\n infoText: 'rgb(30, 64, 175)',\n debugBg: 'rgb(243, 244, 246)',\n debugText: 'rgb(55, 65, 81)',\n}\n\n/**\n * LogViewer component - A complete UI for viewing and managing error logs\n *\n * @example\n * ```tsx\n * // Basic usage\n * import { LogViewer } from '@vinetechke/next-error-logger/components'\n *\n * export default function LogsPage() {\n * return (\n * <div className=\"p-6\">\n * <h1>Error Logs</h1>\n * <LogViewer apiBasePath=\"/api/admin/logs\" />\n * </div>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom theme\n * <LogViewer\n * apiBasePath=\"/api/admin/logs\"\n * theme={{\n * errorBg: '#fee2e2',\n * errorText: '#dc2626',\n * }}\n * pageSize={25}\n * autoRefresh={30}\n * showDelete\n * />\n * ```\n */\nexport function LogViewer({\n apiBasePath = '/api/logs',\n className = '',\n pageSize = 50,\n theme: customTheme,\n onLogSelect,\n showDelete = true,\n autoRefresh = 0,\n}: LogViewerProps) {\n const theme = { ...defaultTheme, ...customTheme }\n\n const [logs, setLogs] = useState<ErrorLogEntry[]>([])\n const [total, setTotal] = useState(0)\n const [loading, setLoading] = useState(true)\n const [page, setPage] = useState(1)\n const [filters, setFilters] = useState({\n level: '' as LogLevel | '',\n search: '',\n userId: '',\n })\n const [selectedLog, setSelectedLog] = useState<ErrorLogEntry | null>(null)\n const [deleting, setDeleting] = useState(false)\n\n const fetchLogs = useCallback(async () => {\n setLoading(true)\n try {\n const params = new URLSearchParams({\n page: page.toString(),\n limit: pageSize.toString(),\n ...(filters.level && { level: filters.level }),\n ...(filters.search && { search: filters.search }),\n ...(filters.userId && { userId: filters.userId }),\n })\n\n const res = await fetch(`${apiBasePath}?${params}`)\n if (!res.ok) throw new Error('Failed to fetch logs')\n\n const data = await res.json()\n setLogs(data.logs)\n setTotal(data.total)\n } catch (error) {\n console.error('Failed to fetch logs:', error)\n } finally {\n setLoading(false)\n }\n }, [apiBasePath, page, pageSize, filters])\n\n useEffect(() => {\n fetchLogs()\n }, [fetchLogs])\n\n // Auto-refresh\n useEffect(() => {\n if (autoRefresh <= 0) return\n\n const interval = setInterval(fetchLogs, autoRefresh * 1000)\n return () => clearInterval(interval)\n }, [autoRefresh, fetchLogs])\n\n const handleDelete = async (id: string) => {\n if (!confirm('Are you sure you want to delete this log?')) return\n\n setDeleting(true)\n try {\n const res = await fetch(`${apiBasePath}/${id}`, {\n method: 'DELETE',\n })\n if (!res.ok) throw new Error('Failed to delete log')\n\n setLogs(prev => prev.filter(log => log.id !== id))\n setTotal(prev => prev - 1)\n if (selectedLog?.id === id) setSelectedLog(null)\n } catch (error) {\n console.error('Failed to delete log:', error)\n alert('Failed to delete log')\n } finally {\n setDeleting(false)\n }\n }\n\n const handleClearAll = async () => {\n const confirmed = confirm(\n 'Are you sure you want to delete ALL logs? This cannot be undone.',\n )\n if (!confirmed) return\n\n setDeleting(true)\n try {\n const res = await fetch(apiBasePath, {\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({}),\n })\n if (!res.ok) throw new Error('Failed to clear logs')\n\n setLogs([])\n setTotal(0)\n setSelectedLog(null)\n } catch (error) {\n console.error('Failed to clear logs:', error)\n alert('Failed to clear logs')\n } finally {\n setDeleting(false)\n }\n }\n\n const getLevelStyle = (level: LogLevel) => {\n switch (level) {\n case 'error':\n return {\n backgroundColor: theme.errorBg,\n color: theme.errorText,\n }\n case 'warn':\n return { backgroundColor: theme.warnBg, color: theme.warnText }\n case 'info':\n return { backgroundColor: theme.infoBg, color: theme.infoText }\n case 'debug':\n return {\n backgroundColor: theme.debugBg,\n color: theme.debugText,\n }\n }\n }\n\n const totalPages = Math.ceil(total / pageSize)\n\n return (\n <div\n className={className}\n style={{ fontFamily: 'system-ui, sans-serif' }}\n >\n {/* Filters */}\n <div\n style={{\n display: 'flex',\n gap: '1rem',\n marginBottom: '1rem',\n flexWrap: 'wrap',\n alignItems: 'center',\n }}\n >\n <select\n value={filters.level}\n onChange={e => {\n setFilters({\n ...filters,\n level: e.target.value as LogLevel | '',\n })\n setPage(1)\n }}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n fontSize: '0.875rem',\n }}\n >\n <option value=\"\">All Levels</option>\n <option value=\"error\">Error</option>\n <option value=\"warn\">Warning</option>\n <option value=\"info\">Info</option>\n <option value=\"debug\">Debug</option>\n </select>\n\n <input\n type=\"text\"\n placeholder=\"Search logs...\"\n value={filters.search}\n onChange={e => {\n setFilters({ ...filters, search: e.target.value })\n setPage(1)\n }}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n flex: 1,\n minWidth: '200px',\n fontSize: '0.875rem',\n }}\n />\n\n <input\n type=\"text\"\n placeholder=\"User ID...\"\n value={filters.userId}\n onChange={e => {\n setFilters({ ...filters, userId: e.target.value })\n setPage(1)\n }}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n width: '150px',\n fontSize: '0.875rem',\n }}\n />\n\n <button\n onClick={fetchLogs}\n disabled={loading}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n backgroundColor: '#3b82f6',\n color: 'white',\n border: 'none',\n cursor: loading ? 'not-allowed' : 'pointer',\n opacity: loading ? 0.7 : 1,\n fontSize: '0.875rem',\n }}\n >\n {loading ? 'Loading...' : 'Refresh'}\n </button>\n\n {showDelete && (\n <button\n onClick={handleClearAll}\n disabled={deleting || total === 0}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n backgroundColor: '#ef4444',\n color: 'white',\n border: 'none',\n cursor:\n deleting || total === 0\n ? 'not-allowed'\n : 'pointer',\n opacity: deleting || total === 0 ? 0.7 : 1,\n fontSize: '0.875rem',\n }}\n >\n Clear All\n </button>\n )}\n </div>\n\n {/* Stats */}\n <div\n style={{\n marginBottom: '1rem',\n fontSize: '0.875rem',\n color: '#6b7280',\n }}\n >\n Showing {logs.length} of {total} logs\n {autoRefresh > 0 && ` • Auto-refreshing every ${autoRefresh}s`}\n </div>\n\n {/* Log Table */}\n <div\n style={{\n border: '1px solid #e5e7eb',\n borderRadius: '0.5rem',\n overflow: 'hidden',\n }}\n >\n <table style={{ width: '100%', borderCollapse: 'collapse' }}>\n <thead>\n <tr style={{ backgroundColor: '#f9fafb' }}>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n Level\n </th>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n Message\n </th>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n User\n </th>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n Path\n </th>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n Time\n </th>\n {showDelete && (\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'center',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n width: '80px',\n }}\n >\n Actions\n </th>\n )}\n </tr>\n </thead>\n <tbody>\n {loading && logs.length === 0 ? (\n <tr>\n <td\n colSpan={showDelete ? 6 : 5}\n style={{\n padding: '2rem',\n textAlign: 'center',\n color: '#6b7280',\n }}\n >\n Loading...\n </td>\n </tr>\n ) : logs.length === 0 ? (\n <tr>\n <td\n colSpan={showDelete ? 6 : 5}\n style={{\n padding: '2rem',\n textAlign: 'center',\n color: '#6b7280',\n }}\n >\n No logs found\n </td>\n </tr>\n ) : (\n logs.map(log => (\n <tr\n key={log.id}\n onClick={() => {\n setSelectedLog(log)\n onLogSelect?.(log)\n }}\n style={{\n cursor: 'pointer',\n backgroundColor:\n selectedLog?.id === log.id\n ? '#f3f4f6'\n : 'white',\n }}\n onMouseEnter={e => {\n if (selectedLog?.id !== log.id) {\n e.currentTarget.style.backgroundColor =\n '#f9fafb'\n }\n }}\n onMouseLeave={e => {\n if (selectedLog?.id !== log.id) {\n e.currentTarget.style.backgroundColor =\n 'white'\n }\n }}\n >\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n <span\n style={{\n ...getLevelStyle(log.level),\n padding: '0.25rem 0.5rem',\n borderRadius: '0.25rem',\n fontSize: '0.75rem',\n fontWeight: 500,\n textTransform: 'uppercase',\n }}\n >\n {log.level}\n </span>\n </td>\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n fontSize: '0.875rem',\n maxWidth: '300px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {log.message}\n </td>\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n fontSize: '0.875rem',\n color: '#6b7280',\n }}\n >\n {log.userEmail ||\n log.userName ||\n log.userId ||\n '-'}\n </td>\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n fontSize: '0.875rem',\n color: '#6b7280',\n }}\n >\n {log.path || '-'}\n </td>\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n fontSize: '0.875rem',\n color: '#6b7280',\n whiteSpace: 'nowrap',\n }}\n >\n {new Date(\n log.createdAt,\n ).toLocaleString()}\n </td>\n {showDelete && (\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom:\n '1px solid #e5e7eb',\n textAlign: 'center',\n }}\n >\n <button\n onClick={e => {\n e.stopPropagation()\n handleDelete(log.id)\n }}\n disabled={deleting}\n style={{\n padding: '0.25rem 0.5rem',\n borderRadius: '0.25rem',\n backgroundColor:\n 'transparent',\n color: '#ef4444',\n border: '1px solid #ef4444',\n cursor: deleting\n ? 'not-allowed'\n : 'pointer',\n fontSize: '0.75rem',\n }}\n >\n Delete\n </button>\n </td>\n )}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n {/* Pagination */}\n {totalPages > 1 && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginTop: '1rem',\n }}\n >\n <span style={{ fontSize: '0.875rem', color: '#6b7280' }}>\n Page {page} of {totalPages}\n </span>\n <div style={{ display: 'flex', gap: '0.5rem' }}>\n <button\n onClick={() => setPage(1)}\n disabled={page === 1}\n style={{\n padding: '0.5rem 0.75rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n backgroundColor: 'white',\n cursor: page === 1 ? 'not-allowed' : 'pointer',\n opacity: page === 1 ? 0.5 : 1,\n fontSize: '0.875rem',\n }}\n >\n First\n </button>\n <button\n onClick={() => setPage(Math.max(1, page - 1))}\n disabled={page === 1}\n style={{\n padding: '0.5rem 0.75rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n backgroundColor: 'white',\n cursor: page === 1 ? 'not-allowed' : 'pointer',\n opacity: page === 1 ? 0.5 : 1,\n fontSize: '0.875rem',\n }}\n >\n Previous\n </button>\n <button\n onClick={() =>\n setPage(Math.min(totalPages, page + 1))\n }\n disabled={page === totalPages}\n style={{\n padding: '0.5rem 0.75rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n backgroundColor: 'white',\n cursor:\n page === totalPages\n ? 'not-allowed'\n : 'pointer',\n opacity: page === totalPages ? 0.5 : 1,\n fontSize: '0.875rem',\n }}\n >\n Next\n </button>\n <button\n onClick={() => setPage(totalPages)}\n disabled={page === totalPages}\n style={{\n padding: '0.5rem 0.75rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n backgroundColor: 'white',\n cursor:\n page === totalPages\n ? 'not-allowed'\n : 'pointer',\n opacity: page === totalPages ? 0.5 : 1,\n fontSize: '0.875rem',\n }}\n >\n Last\n </button>\n </div>\n </div>\n )}\n\n {/* Detail Modal */}\n {selectedLog && (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '1rem',\n zIndex: 50,\n }}\n onClick={() => setSelectedLog(null)}\n >\n <div\n style={{\n backgroundColor: 'white',\n borderRadius: '0.5rem',\n maxWidth: '48rem',\n width: '100%',\n maxHeight: '80vh',\n overflow: 'auto',\n padding: '1.5rem',\n }}\n onClick={e => e.stopPropagation()}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n marginBottom: '1rem',\n }}\n >\n <h2\n style={{\n fontSize: '1.125rem',\n fontWeight: 600,\n margin: 0,\n }}\n >\n Log Details\n </h2>\n <button\n onClick={() => setSelectedLog(null)}\n style={{\n background: 'none',\n border: 'none',\n fontSize: '1.5rem',\n cursor: 'pointer',\n color: '#6b7280',\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </div>\n\n <dl style={{ display: 'grid', gap: '1rem' }}>\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Level\n </dt>\n <dd style={{ margin: 0 }}>\n <span\n style={{\n ...getLevelStyle(selectedLog.level),\n padding: '0.25rem 0.5rem',\n borderRadius: '0.25rem',\n fontSize: '0.75rem',\n fontWeight: 500,\n textTransform: 'uppercase',\n }}\n >\n {selectedLog.level}\n </span>\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Message\n </dt>\n <dd style={{ margin: 0, fontSize: '0.875rem' }}>\n {selectedLog.message}\n </dd>\n </div>\n\n {selectedLog.stack && (\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Stack Trace\n </dt>\n <dd style={{ margin: 0 }}>\n <pre\n style={{\n fontSize: '0.75rem',\n fontFamily: 'monospace',\n backgroundColor: '#f3f4f6',\n padding: '0.75rem',\n borderRadius: '0.375rem',\n overflow: 'auto',\n maxHeight: '200px',\n margin: 0,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-all',\n }}\n >\n {selectedLog.stack}\n </pre>\n </dd>\n </div>\n )}\n\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: '1rem',\n }}\n >\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n User\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.userEmail ||\n selectedLog.userName ||\n selectedLog.userId ||\n '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n User ID\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.userId || '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Path\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.path || '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Method\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.method || '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n IP Address\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.ip || '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Time\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {new Date(\n selectedLog.createdAt,\n ).toLocaleString()}\n </dd>\n </div>\n </div>\n\n {selectedLog.userAgent && (\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n User Agent\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.75rem',\n color: '#6b7280',\n wordBreak: 'break-all',\n }}\n >\n {selectedLog.userAgent}\n </dd>\n </div>\n )}\n\n {selectedLog.metadata &&\n Object.keys(selectedLog.metadata).length >\n 0 && (\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Metadata\n </dt>\n <dd style={{ margin: 0 }}>\n <pre\n style={{\n fontSize: '0.75rem',\n fontFamily: 'monospace',\n backgroundColor: '#f3f4f6',\n padding: '0.75rem',\n borderRadius: '0.375rem',\n overflow: 'auto',\n maxHeight: '150px',\n margin: 0,\n }}\n >\n {JSON.stringify(\n selectedLog.metadata,\n null,\n 2,\n )}\n </pre>\n </dd>\n </div>\n )}\n </dl>\n\n {showDelete && (\n <div\n style={{\n marginTop: '1.5rem',\n textAlign: 'right',\n }}\n >\n <button\n onClick={() => {\n handleDelete(selectedLog.id)\n }}\n disabled={deleting}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n backgroundColor: '#ef4444',\n color: 'white',\n border: 'none',\n cursor: deleting\n ? 'not-allowed'\n : 'pointer',\n opacity: deleting ? 0.7 : 1,\n fontSize: '0.875rem',\n }}\n >\n Delete This Log\n </button>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n )\n}\n","'use client'\n\nimport { Component, type ReactNode, type ErrorInfo } from 'react'\n\n/**\n * Props for the ErrorBoundary component\n */\nexport interface ErrorBoundaryProps {\n /** Child components to wrap */\n children: ReactNode\n /** Custom fallback UI to show when an error occurs */\n fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode)\n /** Callback when an error is caught */\n onError?: (error: Error, errorInfo: ErrorInfo) => void\n /** Whether to log errors to the console (default: true in development) */\n logToConsole?: boolean\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean\n error: Error | null\n}\n\n/**\n * ErrorBoundary component - Catches and logs React errors\n *\n * Use this to wrap your application or specific components to catch\n * unhandled errors and log them via the error logger.\n *\n * @example\n * ```tsx\n * // Basic usage\n * import { ErrorBoundary } from '@vinetechke/next-error-logger/components'\n *\n * export default function Layout({ children }) {\n * return (\n * <ErrorBoundary>\n * {children}\n * </ErrorBoundary>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom fallback\n * <ErrorBoundary\n * fallback={(error, reset) => (\n * <div>\n * <h2>Something went wrong!</h2>\n * <button onClick={reset}>Try again</button>\n * </div>\n * )}\n * onError={(error, info) => {\n * // Custom error handling\n * console.error('Caught error:', error)\n * }}\n * >\n * <MyComponent />\n * </ErrorBoundary>\n * ```\n *\n * @example\n * ```tsx\n * // With error logger integration\n * import { ErrorBoundary } from '@vinetechke/next-error-logger/components'\n * import { errorLogger } from '@/lib/error-logger'\n *\n * <ErrorBoundary\n * onError={async (error, info) => {\n * await errorLogger.error('React render error', error, {\n * metadata: { componentStack: info.componentStack },\n * })\n * }}\n * >\n * {children}\n * </ErrorBoundary>\n * ```\n */\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props)\n this.state = { hasError: false, error: null }\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error }\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n const {\n onError,\n logToConsole = process.env.NODE_ENV === 'development',\n } = this.props\n\n // Log to console in development\n if (logToConsole) {\n console.error('ErrorBoundary caught an error:', error)\n console.error('Component stack:', errorInfo.componentStack)\n }\n\n // Call custom error handler\n onError?.(error, errorInfo)\n }\n\n reset = (): void => {\n this.setState({ hasError: false, error: null })\n }\n\n render(): ReactNode {\n const { hasError, error } = this.state\n const { children, fallback } = this.props\n\n if (hasError && error) {\n // Custom fallback\n if (typeof fallback === 'function') {\n return fallback(error, this.reset)\n }\n\n if (fallback) {\n return fallback\n }\n\n // Default fallback\n return (\n <div\n style={{\n padding: '2rem',\n textAlign: 'center',\n fontFamily: 'system-ui, sans-serif',\n }}\n >\n <h2\n style={{\n fontSize: '1.5rem',\n fontWeight: 600,\n color: '#dc2626',\n marginBottom: '1rem',\n }}\n >\n Something went wrong\n </h2>\n <p\n style={{\n color: '#6b7280',\n marginBottom: '1rem',\n }}\n >\n An unexpected error occurred. Please try again.\n </p>\n <details\n style={{\n marginBottom: '1rem',\n textAlign: 'left',\n maxWidth: '600px',\n margin: '0 auto 1rem',\n }}\n >\n <summary\n style={{\n cursor: 'pointer',\n color: '#3b82f6',\n marginBottom: '0.5rem',\n }}\n >\n Error details\n </summary>\n <pre\n style={{\n fontSize: '0.75rem',\n fontFamily: 'monospace',\n backgroundColor: '#f3f4f6',\n padding: '1rem',\n borderRadius: '0.5rem',\n overflow: 'auto',\n textAlign: 'left',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-all',\n }}\n >\n {error.message}\n {'\\n\\n'}\n {error.stack}\n </pre>\n </details>\n <button\n onClick={this.reset}\n style={{\n padding: '0.75rem 1.5rem',\n backgroundColor: '#3b82f6',\n color: 'white',\n border: 'none',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n fontSize: '1rem',\n }}\n >\n Try again\n </button>\n </div>\n )\n }\n\n return children\n }\n}\n\n/**\n * Hook-based error boundary wrapper for functional components\n *\n * @example\n * ```tsx\n * import { withErrorBoundary } from '@vinetechke/next-error-logger/components'\n *\n * function MyComponent() {\n * // Component that might throw\n * }\n *\n * export default withErrorBoundary(MyComponent, {\n * fallback: <div>Error loading component</div>,\n * })\n * ```\n */\nexport function withErrorBoundary<P extends object>(\n Component: React.ComponentType<P>,\n errorBoundaryProps?: Omit<ErrorBoundaryProps, 'children'>,\n) {\n const WrappedComponent = (props: P) => (\n <ErrorBoundary {...errorBoundaryProps}>\n <Component {...props} />\n </ErrorBoundary>\n )\n\n WrappedComponent.displayName = `withErrorBoundary(${Component.displayName || Component.name || 'Component'})`\n\n return WrappedComponent\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime","Component"]}
1
+ {"version":3,"sources":["../../src/components/index.ts","../../src/components/LogViewer.tsx","../../src/components/ErrorBoundary.tsx"],"sourcesContent":["export { LogViewer } from './LogViewer'\nexport { ErrorBoundary, withErrorBoundary } from './ErrorBoundary'\nexport type { ErrorBoundaryProps } from './ErrorBoundary'\n","'use client'\n\nimport { useState, useEffect, useCallback } from 'react'\nimport type {\n ErrorLogEntry,\n LogLevel,\n LogViewerProps,\n LogViewerTheme,\n} from '../types'\n\nconst defaultTheme: Required<LogViewerTheme> = {\n errorBg: 'rgb(254, 226, 226)',\n errorText: 'rgb(153, 27, 27)',\n warnBg: 'rgb(254, 249, 195)',\n warnText: 'rgb(133, 77, 14)',\n infoBg: 'rgb(219, 234, 254)',\n infoText: 'rgb(30, 64, 175)',\n debugBg: 'rgb(243, 244, 246)',\n debugText: 'rgb(55, 65, 81)',\n}\n\n/**\n * LogViewer component - A complete UI for viewing and managing error logs\n *\n * @example\n * ```tsx\n * // Basic usage\n * import { LogViewer } from '@vinetechke/next-error-logger/components'\n *\n * export default function LogsPage() {\n * return (\n * <div className=\"p-6\">\n * <h1>Error Logs</h1>\n * <LogViewer apiBasePath=\"/api/admin/logs\" />\n * </div>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom theme\n * <LogViewer\n * apiBasePath=\"/api/admin/logs\"\n * theme={{\n * errorBg: '#fee2e2',\n * errorText: '#dc2626',\n * }}\n * pageSize={25}\n * autoRefresh={30}\n * showDelete\n * />\n * ```\n */\nexport function LogViewer({\n apiBasePath = '/api/logs',\n className = '',\n pageSize = 50,\n theme: customTheme,\n onLogSelect,\n showDelete = true,\n autoRefresh = 0,\n}: LogViewerProps) {\n const theme = { ...defaultTheme, ...customTheme }\n\n const [logs, setLogs] = useState<ErrorLogEntry[]>([])\n const [total, setTotal] = useState(0)\n const [loading, setLoading] = useState(true)\n const [page, setPage] = useState(1)\n const [filters, setFilters] = useState({\n level: '' as LogLevel | '',\n search: '',\n userId: '',\n })\n const [selectedLog, setSelectedLog] = useState<ErrorLogEntry | null>(null)\n const [deleting, setDeleting] = useState(false)\n\n const fetchLogs = useCallback(async () => {\n setLoading(true)\n try {\n const params = new URLSearchParams({\n page: page.toString(),\n limit: pageSize.toString(),\n ...(filters.level && { level: filters.level }),\n ...(filters.search && { search: filters.search }),\n ...(filters.userId && { userId: filters.userId }),\n })\n\n const res = await fetch(`${apiBasePath}?${params}`)\n if (!res.ok) throw new Error('Failed to fetch logs')\n\n const data = await res.json()\n setLogs(data.logs)\n setTotal(data.total)\n } catch (error) {\n console.error('Failed to fetch logs:', error)\n } finally {\n setLoading(false)\n }\n }, [apiBasePath, page, pageSize, filters])\n\n useEffect(() => {\n fetchLogs()\n }, [fetchLogs])\n\n // Auto-refresh\n useEffect(() => {\n if (autoRefresh <= 0) return\n\n const interval = setInterval(fetchLogs, autoRefresh * 1000)\n return () => clearInterval(interval)\n }, [autoRefresh, fetchLogs])\n\n const handleDelete = async (id: string) => {\n if (!confirm('Are you sure you want to delete this log?')) return\n\n setDeleting(true)\n try {\n const res = await fetch(`${apiBasePath}/${id}`, {\n method: 'DELETE',\n })\n if (!res.ok) throw new Error('Failed to delete log')\n\n setLogs(prev => prev.filter(log => log.id !== id))\n setTotal(prev => prev - 1)\n if (selectedLog?.id === id) setSelectedLog(null)\n } catch (error) {\n console.error('Failed to delete log:', error)\n alert('Failed to delete log')\n } finally {\n setDeleting(false)\n }\n }\n\n const handleClearAll = async () => {\n const confirmed = confirm(\n 'Are you sure you want to delete ALL logs? This cannot be undone.',\n )\n if (!confirmed) return\n\n setDeleting(true)\n try {\n const res = await fetch(apiBasePath, {\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({}),\n })\n if (!res.ok) throw new Error('Failed to clear logs')\n\n setLogs([])\n setTotal(0)\n setSelectedLog(null)\n } catch (error) {\n console.error('Failed to clear logs:', error)\n alert('Failed to clear logs')\n } finally {\n setDeleting(false)\n }\n }\n\n const getLevelStyle = (level: LogLevel) => {\n switch (level) {\n case 'error':\n return {\n backgroundColor: theme.errorBg,\n color: theme.errorText,\n }\n case 'warn':\n return { backgroundColor: theme.warnBg, color: theme.warnText }\n case 'info':\n return { backgroundColor: theme.infoBg, color: theme.infoText }\n case 'debug':\n return {\n backgroundColor: theme.debugBg,\n color: theme.debugText,\n }\n }\n }\n\n const totalPages = Math.ceil(total / pageSize)\n\n return (\n <div\n className={className}\n style={{ fontFamily: 'system-ui, sans-serif' }}\n >\n {/* Filters */}\n <div\n style={{\n display: 'flex',\n gap: '1rem',\n marginBottom: '1rem',\n flexWrap: 'wrap',\n alignItems: 'center',\n }}\n >\n <select\n value={filters.level}\n onChange={e => {\n setFilters({\n ...filters,\n level: e.target.value as LogLevel | '',\n })\n setPage(1)\n }}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n fontSize: '0.875rem',\n }}\n >\n <option value=\"\">All Levels</option>\n <option value=\"error\">Error</option>\n <option value=\"warn\">Warning</option>\n <option value=\"info\">Info</option>\n <option value=\"debug\">Debug</option>\n </select>\n\n <input\n type=\"text\"\n placeholder=\"Search logs...\"\n value={filters.search}\n onChange={e => {\n setFilters({ ...filters, search: e.target.value })\n setPage(1)\n }}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n flex: 1,\n minWidth: '200px',\n fontSize: '0.875rem',\n }}\n />\n\n <input\n type=\"text\"\n placeholder=\"User ID...\"\n value={filters.userId}\n onChange={e => {\n setFilters({ ...filters, userId: e.target.value })\n setPage(1)\n }}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n width: '150px',\n fontSize: '0.875rem',\n }}\n />\n\n <button\n onClick={fetchLogs}\n disabled={loading}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n backgroundColor: '#3b82f6',\n color: 'white',\n border: 'none',\n cursor: loading ? 'not-allowed' : 'pointer',\n opacity: loading ? 0.7 : 1,\n fontSize: '0.875rem',\n }}\n >\n {loading ? 'Loading...' : 'Refresh'}\n </button>\n\n {showDelete && (\n <button\n onClick={handleClearAll}\n disabled={deleting || total === 0}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n backgroundColor: '#ef4444',\n color: 'white',\n border: 'none',\n cursor:\n deleting || total === 0\n ? 'not-allowed'\n : 'pointer',\n opacity: deleting || total === 0 ? 0.7 : 1,\n fontSize: '0.875rem',\n }}\n >\n Clear All\n </button>\n )}\n </div>\n\n {/* Stats */}\n <div\n style={{\n marginBottom: '1rem',\n fontSize: '0.875rem',\n color: '#6b7280',\n }}\n >\n Showing {logs.length} of {total} logs\n {autoRefresh > 0 && ` • Auto-refreshing every ${autoRefresh}s`}\n </div>\n\n {/* Log Table */}\n <div\n style={{\n border: '1px solid #e5e7eb',\n borderRadius: '0.5rem',\n overflow: 'hidden',\n }}\n >\n <table style={{ width: '100%', borderCollapse: 'collapse' }}>\n <thead>\n <tr style={{ backgroundColor: '#f9fafb' }}>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n Level\n </th>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n Message\n </th>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n User\n </th>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n Path\n </th>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n Time\n </th>\n {showDelete && (\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'center',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n width: '80px',\n }}\n >\n Actions\n </th>\n )}\n </tr>\n </thead>\n <tbody>\n {loading && logs.length === 0 ? (\n <tr>\n <td\n colSpan={showDelete ? 6 : 5}\n style={{\n padding: '2rem',\n textAlign: 'center',\n color: '#6b7280',\n }}\n >\n Loading...\n </td>\n </tr>\n ) : logs.length === 0 ? (\n <tr>\n <td\n colSpan={showDelete ? 6 : 5}\n style={{\n padding: '2rem',\n textAlign: 'center',\n color: '#6b7280',\n }}\n >\n No logs found\n </td>\n </tr>\n ) : (\n logs.map(log => (\n <tr\n key={log.id}\n onClick={() => {\n setSelectedLog(log)\n onLogSelect?.(log)\n }}\n style={{\n cursor: 'pointer',\n backgroundColor:\n selectedLog?.id === log.id\n ? '#f3f4f6'\n : 'white',\n }}\n onMouseEnter={e => {\n if (selectedLog?.id !== log.id) {\n e.currentTarget.style.backgroundColor =\n '#f9fafb'\n }\n }}\n onMouseLeave={e => {\n if (selectedLog?.id !== log.id) {\n e.currentTarget.style.backgroundColor =\n 'white'\n }\n }}\n >\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n <span\n style={{\n ...getLevelStyle(log.level),\n padding: '0.25rem 0.5rem',\n borderRadius: '0.25rem',\n fontSize: '0.75rem',\n fontWeight: 500,\n textTransform: 'uppercase',\n }}\n >\n {log.level}\n </span>\n </td>\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n fontSize: '0.875rem',\n maxWidth: '300px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {log.message}\n </td>\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n fontSize: '0.875rem',\n color: '#6b7280',\n }}\n >\n {log.userEmail ||\n log.userName ||\n log.userId ||\n '-'}\n </td>\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n fontSize: '0.875rem',\n color: '#6b7280',\n }}\n >\n {log.path || '-'}\n </td>\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n fontSize: '0.875rem',\n color: '#6b7280',\n whiteSpace: 'nowrap',\n }}\n >\n {new Date(\n log.createdAt,\n ).toLocaleString()}\n </td>\n {showDelete && (\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom:\n '1px solid #e5e7eb',\n textAlign: 'center',\n }}\n >\n <button\n onClick={e => {\n e.stopPropagation()\n handleDelete(log.id)\n }}\n disabled={deleting}\n style={{\n padding: '0.25rem 0.5rem',\n borderRadius: '0.25rem',\n backgroundColor:\n 'transparent',\n color: '#ef4444',\n border: '1px solid #ef4444',\n cursor: deleting\n ? 'not-allowed'\n : 'pointer',\n fontSize: '0.75rem',\n }}\n >\n Delete\n </button>\n </td>\n )}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n {/* Pagination */}\n {totalPages > 1 && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginTop: '1rem',\n }}\n >\n <span style={{ fontSize: '0.875rem', color: '#6b7280' }}>\n Page {page} of {totalPages}\n </span>\n <div style={{ display: 'flex', gap: '0.5rem' }}>\n <button\n onClick={() => setPage(1)}\n disabled={page === 1}\n style={{\n padding: '0.5rem 0.75rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n backgroundColor: 'white',\n cursor: page === 1 ? 'not-allowed' : 'pointer',\n opacity: page === 1 ? 0.5 : 1,\n fontSize: '0.875rem',\n }}\n >\n First\n </button>\n <button\n onClick={() => setPage(Math.max(1, page - 1))}\n disabled={page === 1}\n style={{\n padding: '0.5rem 0.75rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n backgroundColor: 'white',\n cursor: page === 1 ? 'not-allowed' : 'pointer',\n opacity: page === 1 ? 0.5 : 1,\n fontSize: '0.875rem',\n }}\n >\n Previous\n </button>\n <button\n onClick={() =>\n setPage(Math.min(totalPages, page + 1))\n }\n disabled={page === totalPages}\n style={{\n padding: '0.5rem 0.75rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n backgroundColor: 'white',\n cursor:\n page === totalPages\n ? 'not-allowed'\n : 'pointer',\n opacity: page === totalPages ? 0.5 : 1,\n fontSize: '0.875rem',\n }}\n >\n Next\n </button>\n <button\n onClick={() => setPage(totalPages)}\n disabled={page === totalPages}\n style={{\n padding: '0.5rem 0.75rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n backgroundColor: 'white',\n cursor:\n page === totalPages\n ? 'not-allowed'\n : 'pointer',\n opacity: page === totalPages ? 0.5 : 1,\n fontSize: '0.875rem',\n }}\n >\n Last\n </button>\n </div>\n </div>\n )}\n\n {/* Detail Modal */}\n {selectedLog && (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '1rem',\n zIndex: 50,\n }}\n onClick={() => setSelectedLog(null)}\n >\n <div\n style={{\n backgroundColor: 'white',\n borderRadius: '0.5rem',\n maxWidth: '48rem',\n width: '100%',\n maxHeight: '80vh',\n overflow: 'auto',\n padding: '1.5rem',\n }}\n onClick={e => e.stopPropagation()}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n marginBottom: '1rem',\n }}\n >\n <h2\n style={{\n fontSize: '1.125rem',\n fontWeight: 600,\n margin: 0,\n }}\n >\n Log Details\n </h2>\n <button\n onClick={() => setSelectedLog(null)}\n style={{\n background: 'none',\n border: 'none',\n fontSize: '1.5rem',\n cursor: 'pointer',\n color: '#6b7280',\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </div>\n\n <dl style={{ display: 'grid', gap: '1rem' }}>\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Level\n </dt>\n <dd style={{ margin: 0 }}>\n <span\n style={{\n ...getLevelStyle(selectedLog.level),\n padding: '0.25rem 0.5rem',\n borderRadius: '0.25rem',\n fontSize: '0.75rem',\n fontWeight: 500,\n textTransform: 'uppercase',\n }}\n >\n {selectedLog.level}\n </span>\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Message\n </dt>\n <dd style={{ margin: 0, fontSize: '0.875rem' }}>\n {selectedLog.message}\n </dd>\n </div>\n\n {selectedLog.stack && (\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Stack Trace\n </dt>\n <dd style={{ margin: 0 }}>\n <pre\n style={{\n fontSize: '0.75rem',\n fontFamily: 'monospace',\n backgroundColor: '#f3f4f6',\n padding: '0.75rem',\n borderRadius: '0.375rem',\n overflow: 'auto',\n maxHeight: '200px',\n margin: 0,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-all',\n }}\n >\n {selectedLog.stack}\n </pre>\n </dd>\n </div>\n )}\n\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: '1rem',\n }}\n >\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n User\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.userEmail ||\n selectedLog.userName ||\n selectedLog.userId ||\n '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n User ID\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.userId || '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Path\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.path || '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Method\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.method || '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n IP Address\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.ip || '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Time\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {new Date(\n selectedLog.createdAt,\n ).toLocaleString()}\n </dd>\n </div>\n </div>\n\n {selectedLog.userAgent && (\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n User Agent\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.75rem',\n color: '#6b7280',\n wordBreak: 'break-all',\n }}\n >\n {selectedLog.userAgent}\n </dd>\n </div>\n )}\n\n {selectedLog.metadata &&\n Object.keys(selectedLog.metadata).length >\n 0 && (\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Metadata\n </dt>\n <dd style={{ margin: 0 }}>\n <pre\n style={{\n fontSize: '0.75rem',\n fontFamily: 'monospace',\n backgroundColor: '#f3f4f6',\n padding: '0.75rem',\n borderRadius: '0.375rem',\n overflow: 'auto',\n maxHeight: '150px',\n margin: 0,\n }}\n >\n {JSON.stringify(\n selectedLog.metadata,\n null,\n 2,\n )}\n </pre>\n </dd>\n </div>\n )}\n </dl>\n\n {showDelete && (\n <div\n style={{\n marginTop: '1.5rem',\n textAlign: 'right',\n }}\n >\n <button\n onClick={() => {\n handleDelete(selectedLog.id)\n }}\n disabled={deleting}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n backgroundColor: '#ef4444',\n color: 'white',\n border: 'none',\n cursor: deleting\n ? 'not-allowed'\n : 'pointer',\n opacity: deleting ? 0.7 : 1,\n fontSize: '0.875rem',\n }}\n >\n Delete This Log\n </button>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n )\n}\n","'use client'\n\nimport { Component, type ReactNode, type ErrorInfo } from 'react'\n\n/**\n * Props for the ErrorBoundary component\n */\nexport interface ErrorBoundaryProps {\n /** Child components to wrap */\n children: ReactNode\n /** Custom fallback UI to show when an error occurs */\n fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode)\n /** Callback when an error is caught */\n onError?: (error: Error, errorInfo: ErrorInfo) => void\n /** Whether to log errors to the console (default: true in development) */\n logToConsole?: boolean\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean\n error: Error | null\n}\n\n/**\n * ErrorBoundary component - Catches and logs React errors\n *\n * Use this to wrap your application or specific components to catch\n * unhandled errors and log them via the error logger.\n *\n * @example\n * ```tsx\n * // Basic usage\n * import { ErrorBoundary } from '@vinetechke/next-error-logger/components'\n *\n * export default function Layout({ children }) {\n * return (\n * <ErrorBoundary>\n * {children}\n * </ErrorBoundary>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom fallback\n * <ErrorBoundary\n * fallback={(error, reset) => (\n * <div>\n * <h2>Something went wrong!</h2>\n * <button onClick={reset}>Try again</button>\n * </div>\n * )}\n * onError={(error, info) => {\n * // Custom error handling\n * console.error('Caught error:', error)\n * }}\n * >\n * <MyComponent />\n * </ErrorBoundary>\n * ```\n *\n * @example\n * ```tsx\n * // With error logger integration\n * import { ErrorBoundary } from '@vinetechke/next-error-logger/components'\n * import { errorLogger } from '@/lib/error-logger'\n *\n * <ErrorBoundary\n * onError={async (error, info) => {\n * await errorLogger.error('React render error', error, {\n * metadata: { componentStack: info.componentStack },\n * })\n * }}\n * >\n * {children}\n * </ErrorBoundary>\n * ```\n */\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props)\n this.state = { hasError: false, error: null }\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error }\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n const {\n onError,\n logToConsole = process.env.NODE_ENV === 'development',\n } = this.props\n\n // Log to console in development\n if (logToConsole) {\n console.error('ErrorBoundary caught an error:', error)\n console.error('Component stack:', errorInfo.componentStack)\n }\n\n // Call custom error handler\n onError?.(error, errorInfo)\n }\n\n reset = (): void => {\n this.setState({ hasError: false, error: null })\n }\n\n render(): ReactNode {\n const { hasError, error } = this.state\n const { children, fallback } = this.props\n\n if (hasError && error) {\n // Custom fallback\n if (typeof fallback === 'function') {\n return fallback(error, this.reset)\n }\n\n if (fallback) {\n return fallback\n }\n\n // Default fallback\n return (\n <div\n style={{\n padding: '2rem',\n textAlign: 'center',\n fontFamily: 'system-ui, sans-serif',\n }}\n >\n <h2\n style={{\n fontSize: '1.5rem',\n fontWeight: 600,\n color: '#dc2626',\n marginBottom: '1rem',\n }}\n >\n Something went wrong\n </h2>\n <p\n style={{\n color: '#6b7280',\n marginBottom: '1rem',\n }}\n >\n An unexpected error occurred. Please try again.\n </p>\n <details\n style={{\n marginBottom: '1rem',\n textAlign: 'left',\n maxWidth: '600px',\n margin: '0 auto 1rem',\n }}\n >\n <summary\n style={{\n cursor: 'pointer',\n color: '#3b82f6',\n marginBottom: '0.5rem',\n }}\n >\n Error details\n </summary>\n <pre\n style={{\n fontSize: '0.75rem',\n fontFamily: 'monospace',\n backgroundColor: '#f3f4f6',\n padding: '1rem',\n borderRadius: '0.5rem',\n overflow: 'auto',\n textAlign: 'left',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-all',\n }}\n >\n {error.message}\n {'\\n\\n'}\n {error.stack}\n </pre>\n </details>\n <button\n onClick={this.reset}\n style={{\n padding: '0.75rem 1.5rem',\n backgroundColor: '#3b82f6',\n color: 'white',\n border: 'none',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n fontSize: '1rem',\n }}\n >\n Try again\n </button>\n </div>\n )\n }\n\n return children\n }\n}\n\n/**\n * Hook-based error boundary wrapper for functional components\n *\n * @example\n * ```tsx\n * import { withErrorBoundary } from '@vinetechke/next-error-logger/components'\n *\n * function MyComponent() {\n * // Component that might throw\n * }\n *\n * export default withErrorBoundary(MyComponent, {\n * fallback: <div>Error loading component</div>,\n * })\n * ```\n */\nexport function withErrorBoundary<P extends object>(\n Component: React.ComponentType<P>,\n errorBoundaryProps?: Omit<ErrorBoundaryProps, 'children'>,\n) {\n const WrappedComponent = (props: P) => (\n <ErrorBoundary {...errorBoundaryProps}>\n <Component {...props} />\n </ErrorBoundary>\n )\n\n WrappedComponent.displayName = `withErrorBoundary(${Component.displayName || Component.name || 'Component'})`\n\n return WrappedComponent\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime","Component"]}
@@ -0,0 +1,141 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { c as LogViewerProps } from '../types-B0X4rdDR.cjs';
3
+ import { Component, ReactNode, ErrorInfo } from 'react';
4
+
5
+ /**
6
+ * LogViewer component - A complete UI for viewing and managing error logs
7
+ *
8
+ * @example
9
+ * ```tsx
10
+ * // Basic usage
11
+ * import { LogViewer } from '@vinetechke/next-error-logger/components'
12
+ *
13
+ * export default function LogsPage() {
14
+ * return (
15
+ * <div className="p-6">
16
+ * <h1>Error Logs</h1>
17
+ * <LogViewer apiBasePath="/api/admin/logs" />
18
+ * </div>
19
+ * )
20
+ * }
21
+ * ```
22
+ *
23
+ * @example
24
+ * ```tsx
25
+ * // With custom theme
26
+ * <LogViewer
27
+ * apiBasePath="/api/admin/logs"
28
+ * theme={{
29
+ * errorBg: '#fee2e2',
30
+ * errorText: '#dc2626',
31
+ * }}
32
+ * pageSize={25}
33
+ * autoRefresh={30}
34
+ * showDelete
35
+ * />
36
+ * ```
37
+ */
38
+ declare function LogViewer({ apiBasePath, className, pageSize, theme: customTheme, onLogSelect, showDelete, autoRefresh, }: LogViewerProps): react_jsx_runtime.JSX.Element;
39
+
40
+ /**
41
+ * Props for the ErrorBoundary component
42
+ */
43
+ interface ErrorBoundaryProps {
44
+ /** Child components to wrap */
45
+ children: ReactNode;
46
+ /** Custom fallback UI to show when an error occurs */
47
+ fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode);
48
+ /** Callback when an error is caught */
49
+ onError?: (error: Error, errorInfo: ErrorInfo) => void;
50
+ /** Whether to log errors to the console (default: true in development) */
51
+ logToConsole?: boolean;
52
+ }
53
+ interface ErrorBoundaryState {
54
+ hasError: boolean;
55
+ error: Error | null;
56
+ }
57
+ /**
58
+ * ErrorBoundary component - Catches and logs React errors
59
+ *
60
+ * Use this to wrap your application or specific components to catch
61
+ * unhandled errors and log them via the error logger.
62
+ *
63
+ * @example
64
+ * ```tsx
65
+ * // Basic usage
66
+ * import { ErrorBoundary } from '@vinetechke/next-error-logger/components'
67
+ *
68
+ * export default function Layout({ children }) {
69
+ * return (
70
+ * <ErrorBoundary>
71
+ * {children}
72
+ * </ErrorBoundary>
73
+ * )
74
+ * }
75
+ * ```
76
+ *
77
+ * @example
78
+ * ```tsx
79
+ * // With custom fallback
80
+ * <ErrorBoundary
81
+ * fallback={(error, reset) => (
82
+ * <div>
83
+ * <h2>Something went wrong!</h2>
84
+ * <button onClick={reset}>Try again</button>
85
+ * </div>
86
+ * )}
87
+ * onError={(error, info) => {
88
+ * // Custom error handling
89
+ * console.error('Caught error:', error)
90
+ * }}
91
+ * >
92
+ * <MyComponent />
93
+ * </ErrorBoundary>
94
+ * ```
95
+ *
96
+ * @example
97
+ * ```tsx
98
+ * // With error logger integration
99
+ * import { ErrorBoundary } from '@vinetechke/next-error-logger/components'
100
+ * import { errorLogger } from '@/lib/error-logger'
101
+ *
102
+ * <ErrorBoundary
103
+ * onError={async (error, info) => {
104
+ * await errorLogger.error('React render error', error, {
105
+ * metadata: { componentStack: info.componentStack },
106
+ * })
107
+ * }}
108
+ * >
109
+ * {children}
110
+ * </ErrorBoundary>
111
+ * ```
112
+ */
113
+ declare class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
114
+ constructor(props: ErrorBoundaryProps);
115
+ static getDerivedStateFromError(error: Error): ErrorBoundaryState;
116
+ componentDidCatch(error: Error, errorInfo: ErrorInfo): void;
117
+ reset: () => void;
118
+ render(): ReactNode;
119
+ }
120
+ /**
121
+ * Hook-based error boundary wrapper for functional components
122
+ *
123
+ * @example
124
+ * ```tsx
125
+ * import { withErrorBoundary } from '@vinetechke/next-error-logger/components'
126
+ *
127
+ * function MyComponent() {
128
+ * // Component that might throw
129
+ * }
130
+ *
131
+ * export default withErrorBoundary(MyComponent, {
132
+ * fallback: <div>Error loading component</div>,
133
+ * })
134
+ * ```
135
+ */
136
+ declare function withErrorBoundary<P extends object>(Component: React.ComponentType<P>, errorBoundaryProps?: Omit<ErrorBoundaryProps, 'children'>): {
137
+ (props: P): react_jsx_runtime.JSX.Element;
138
+ displayName: string;
139
+ };
140
+
141
+ export { ErrorBoundary, type ErrorBoundaryProps, LogViewer, withErrorBoundary };
@@ -0,0 +1,141 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { c as LogViewerProps } from '../types-B0X4rdDR.js';
3
+ import { Component, ReactNode, ErrorInfo } from 'react';
4
+
5
+ /**
6
+ * LogViewer component - A complete UI for viewing and managing error logs
7
+ *
8
+ * @example
9
+ * ```tsx
10
+ * // Basic usage
11
+ * import { LogViewer } from '@vinetechke/next-error-logger/components'
12
+ *
13
+ * export default function LogsPage() {
14
+ * return (
15
+ * <div className="p-6">
16
+ * <h1>Error Logs</h1>
17
+ * <LogViewer apiBasePath="/api/admin/logs" />
18
+ * </div>
19
+ * )
20
+ * }
21
+ * ```
22
+ *
23
+ * @example
24
+ * ```tsx
25
+ * // With custom theme
26
+ * <LogViewer
27
+ * apiBasePath="/api/admin/logs"
28
+ * theme={{
29
+ * errorBg: '#fee2e2',
30
+ * errorText: '#dc2626',
31
+ * }}
32
+ * pageSize={25}
33
+ * autoRefresh={30}
34
+ * showDelete
35
+ * />
36
+ * ```
37
+ */
38
+ declare function LogViewer({ apiBasePath, className, pageSize, theme: customTheme, onLogSelect, showDelete, autoRefresh, }: LogViewerProps): react_jsx_runtime.JSX.Element;
39
+
40
+ /**
41
+ * Props for the ErrorBoundary component
42
+ */
43
+ interface ErrorBoundaryProps {
44
+ /** Child components to wrap */
45
+ children: ReactNode;
46
+ /** Custom fallback UI to show when an error occurs */
47
+ fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode);
48
+ /** Callback when an error is caught */
49
+ onError?: (error: Error, errorInfo: ErrorInfo) => void;
50
+ /** Whether to log errors to the console (default: true in development) */
51
+ logToConsole?: boolean;
52
+ }
53
+ interface ErrorBoundaryState {
54
+ hasError: boolean;
55
+ error: Error | null;
56
+ }
57
+ /**
58
+ * ErrorBoundary component - Catches and logs React errors
59
+ *
60
+ * Use this to wrap your application or specific components to catch
61
+ * unhandled errors and log them via the error logger.
62
+ *
63
+ * @example
64
+ * ```tsx
65
+ * // Basic usage
66
+ * import { ErrorBoundary } from '@vinetechke/next-error-logger/components'
67
+ *
68
+ * export default function Layout({ children }) {
69
+ * return (
70
+ * <ErrorBoundary>
71
+ * {children}
72
+ * </ErrorBoundary>
73
+ * )
74
+ * }
75
+ * ```
76
+ *
77
+ * @example
78
+ * ```tsx
79
+ * // With custom fallback
80
+ * <ErrorBoundary
81
+ * fallback={(error, reset) => (
82
+ * <div>
83
+ * <h2>Something went wrong!</h2>
84
+ * <button onClick={reset}>Try again</button>
85
+ * </div>
86
+ * )}
87
+ * onError={(error, info) => {
88
+ * // Custom error handling
89
+ * console.error('Caught error:', error)
90
+ * }}
91
+ * >
92
+ * <MyComponent />
93
+ * </ErrorBoundary>
94
+ * ```
95
+ *
96
+ * @example
97
+ * ```tsx
98
+ * // With error logger integration
99
+ * import { ErrorBoundary } from '@vinetechke/next-error-logger/components'
100
+ * import { errorLogger } from '@/lib/error-logger'
101
+ *
102
+ * <ErrorBoundary
103
+ * onError={async (error, info) => {
104
+ * await errorLogger.error('React render error', error, {
105
+ * metadata: { componentStack: info.componentStack },
106
+ * })
107
+ * }}
108
+ * >
109
+ * {children}
110
+ * </ErrorBoundary>
111
+ * ```
112
+ */
113
+ declare class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
114
+ constructor(props: ErrorBoundaryProps);
115
+ static getDerivedStateFromError(error: Error): ErrorBoundaryState;
116
+ componentDidCatch(error: Error, errorInfo: ErrorInfo): void;
117
+ reset: () => void;
118
+ render(): ReactNode;
119
+ }
120
+ /**
121
+ * Hook-based error boundary wrapper for functional components
122
+ *
123
+ * @example
124
+ * ```tsx
125
+ * import { withErrorBoundary } from '@vinetechke/next-error-logger/components'
126
+ *
127
+ * function MyComponent() {
128
+ * // Component that might throw
129
+ * }
130
+ *
131
+ * export default withErrorBoundary(MyComponent, {
132
+ * fallback: <div>Error loading component</div>,
133
+ * })
134
+ * ```
135
+ */
136
+ declare function withErrorBoundary<P extends object>(Component: React.ComponentType<P>, errorBoundaryProps?: Omit<ErrorBoundaryProps, 'children'>): {
137
+ (props: P): react_jsx_runtime.JSX.Element;
138
+ displayName: string;
139
+ };
140
+
141
+ export { ErrorBoundary, type ErrorBoundaryProps, LogViewer, withErrorBoundary };
@@ -1,5 +1,4 @@
1
1
  "use client";
2
-
3
2
  // src/components/LogViewer.tsx
4
3
  import { useState, useEffect, useCallback } from "react";
5
4
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/LogViewer.tsx","../../src/components/ErrorBoundary.tsx"],"sourcesContent":["'use client'\n\nimport { useState, useEffect, useCallback } from 'react'\nimport type {\n ErrorLogEntry,\n LogLevel,\n LogViewerProps,\n LogViewerTheme,\n} from '../types'\n\nconst defaultTheme: Required<LogViewerTheme> = {\n errorBg: 'rgb(254, 226, 226)',\n errorText: 'rgb(153, 27, 27)',\n warnBg: 'rgb(254, 249, 195)',\n warnText: 'rgb(133, 77, 14)',\n infoBg: 'rgb(219, 234, 254)',\n infoText: 'rgb(30, 64, 175)',\n debugBg: 'rgb(243, 244, 246)',\n debugText: 'rgb(55, 65, 81)',\n}\n\n/**\n * LogViewer component - A complete UI for viewing and managing error logs\n *\n * @example\n * ```tsx\n * // Basic usage\n * import { LogViewer } from '@vinetechke/next-error-logger/components'\n *\n * export default function LogsPage() {\n * return (\n * <div className=\"p-6\">\n * <h1>Error Logs</h1>\n * <LogViewer apiBasePath=\"/api/admin/logs\" />\n * </div>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom theme\n * <LogViewer\n * apiBasePath=\"/api/admin/logs\"\n * theme={{\n * errorBg: '#fee2e2',\n * errorText: '#dc2626',\n * }}\n * pageSize={25}\n * autoRefresh={30}\n * showDelete\n * />\n * ```\n */\nexport function LogViewer({\n apiBasePath = '/api/logs',\n className = '',\n pageSize = 50,\n theme: customTheme,\n onLogSelect,\n showDelete = true,\n autoRefresh = 0,\n}: LogViewerProps) {\n const theme = { ...defaultTheme, ...customTheme }\n\n const [logs, setLogs] = useState<ErrorLogEntry[]>([])\n const [total, setTotal] = useState(0)\n const [loading, setLoading] = useState(true)\n const [page, setPage] = useState(1)\n const [filters, setFilters] = useState({\n level: '' as LogLevel | '',\n search: '',\n userId: '',\n })\n const [selectedLog, setSelectedLog] = useState<ErrorLogEntry | null>(null)\n const [deleting, setDeleting] = useState(false)\n\n const fetchLogs = useCallback(async () => {\n setLoading(true)\n try {\n const params = new URLSearchParams({\n page: page.toString(),\n limit: pageSize.toString(),\n ...(filters.level && { level: filters.level }),\n ...(filters.search && { search: filters.search }),\n ...(filters.userId && { userId: filters.userId }),\n })\n\n const res = await fetch(`${apiBasePath}?${params}`)\n if (!res.ok) throw new Error('Failed to fetch logs')\n\n const data = await res.json()\n setLogs(data.logs)\n setTotal(data.total)\n } catch (error) {\n console.error('Failed to fetch logs:', error)\n } finally {\n setLoading(false)\n }\n }, [apiBasePath, page, pageSize, filters])\n\n useEffect(() => {\n fetchLogs()\n }, [fetchLogs])\n\n // Auto-refresh\n useEffect(() => {\n if (autoRefresh <= 0) return\n\n const interval = setInterval(fetchLogs, autoRefresh * 1000)\n return () => clearInterval(interval)\n }, [autoRefresh, fetchLogs])\n\n const handleDelete = async (id: string) => {\n if (!confirm('Are you sure you want to delete this log?')) return\n\n setDeleting(true)\n try {\n const res = await fetch(`${apiBasePath}/${id}`, {\n method: 'DELETE',\n })\n if (!res.ok) throw new Error('Failed to delete log')\n\n setLogs(prev => prev.filter(log => log.id !== id))\n setTotal(prev => prev - 1)\n if (selectedLog?.id === id) setSelectedLog(null)\n } catch (error) {\n console.error('Failed to delete log:', error)\n alert('Failed to delete log')\n } finally {\n setDeleting(false)\n }\n }\n\n const handleClearAll = async () => {\n const confirmed = confirm(\n 'Are you sure you want to delete ALL logs? This cannot be undone.',\n )\n if (!confirmed) return\n\n setDeleting(true)\n try {\n const res = await fetch(apiBasePath, {\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({}),\n })\n if (!res.ok) throw new Error('Failed to clear logs')\n\n setLogs([])\n setTotal(0)\n setSelectedLog(null)\n } catch (error) {\n console.error('Failed to clear logs:', error)\n alert('Failed to clear logs')\n } finally {\n setDeleting(false)\n }\n }\n\n const getLevelStyle = (level: LogLevel) => {\n switch (level) {\n case 'error':\n return {\n backgroundColor: theme.errorBg,\n color: theme.errorText,\n }\n case 'warn':\n return { backgroundColor: theme.warnBg, color: theme.warnText }\n case 'info':\n return { backgroundColor: theme.infoBg, color: theme.infoText }\n case 'debug':\n return {\n backgroundColor: theme.debugBg,\n color: theme.debugText,\n }\n }\n }\n\n const totalPages = Math.ceil(total / pageSize)\n\n return (\n <div\n className={className}\n style={{ fontFamily: 'system-ui, sans-serif' }}\n >\n {/* Filters */}\n <div\n style={{\n display: 'flex',\n gap: '1rem',\n marginBottom: '1rem',\n flexWrap: 'wrap',\n alignItems: 'center',\n }}\n >\n <select\n value={filters.level}\n onChange={e => {\n setFilters({\n ...filters,\n level: e.target.value as LogLevel | '',\n })\n setPage(1)\n }}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n fontSize: '0.875rem',\n }}\n >\n <option value=\"\">All Levels</option>\n <option value=\"error\">Error</option>\n <option value=\"warn\">Warning</option>\n <option value=\"info\">Info</option>\n <option value=\"debug\">Debug</option>\n </select>\n\n <input\n type=\"text\"\n placeholder=\"Search logs...\"\n value={filters.search}\n onChange={e => {\n setFilters({ ...filters, search: e.target.value })\n setPage(1)\n }}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n flex: 1,\n minWidth: '200px',\n fontSize: '0.875rem',\n }}\n />\n\n <input\n type=\"text\"\n placeholder=\"User ID...\"\n value={filters.userId}\n onChange={e => {\n setFilters({ ...filters, userId: e.target.value })\n setPage(1)\n }}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n width: '150px',\n fontSize: '0.875rem',\n }}\n />\n\n <button\n onClick={fetchLogs}\n disabled={loading}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n backgroundColor: '#3b82f6',\n color: 'white',\n border: 'none',\n cursor: loading ? 'not-allowed' : 'pointer',\n opacity: loading ? 0.7 : 1,\n fontSize: '0.875rem',\n }}\n >\n {loading ? 'Loading...' : 'Refresh'}\n </button>\n\n {showDelete && (\n <button\n onClick={handleClearAll}\n disabled={deleting || total === 0}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n backgroundColor: '#ef4444',\n color: 'white',\n border: 'none',\n cursor:\n deleting || total === 0\n ? 'not-allowed'\n : 'pointer',\n opacity: deleting || total === 0 ? 0.7 : 1,\n fontSize: '0.875rem',\n }}\n >\n Clear All\n </button>\n )}\n </div>\n\n {/* Stats */}\n <div\n style={{\n marginBottom: '1rem',\n fontSize: '0.875rem',\n color: '#6b7280',\n }}\n >\n Showing {logs.length} of {total} logs\n {autoRefresh > 0 && ` • Auto-refreshing every ${autoRefresh}s`}\n </div>\n\n {/* Log Table */}\n <div\n style={{\n border: '1px solid #e5e7eb',\n borderRadius: '0.5rem',\n overflow: 'hidden',\n }}\n >\n <table style={{ width: '100%', borderCollapse: 'collapse' }}>\n <thead>\n <tr style={{ backgroundColor: '#f9fafb' }}>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n Level\n </th>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n Message\n </th>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n User\n </th>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n Path\n </th>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n Time\n </th>\n {showDelete && (\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'center',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n width: '80px',\n }}\n >\n Actions\n </th>\n )}\n </tr>\n </thead>\n <tbody>\n {loading && logs.length === 0 ? (\n <tr>\n <td\n colSpan={showDelete ? 6 : 5}\n style={{\n padding: '2rem',\n textAlign: 'center',\n color: '#6b7280',\n }}\n >\n Loading...\n </td>\n </tr>\n ) : logs.length === 0 ? (\n <tr>\n <td\n colSpan={showDelete ? 6 : 5}\n style={{\n padding: '2rem',\n textAlign: 'center',\n color: '#6b7280',\n }}\n >\n No logs found\n </td>\n </tr>\n ) : (\n logs.map(log => (\n <tr\n key={log.id}\n onClick={() => {\n setSelectedLog(log)\n onLogSelect?.(log)\n }}\n style={{\n cursor: 'pointer',\n backgroundColor:\n selectedLog?.id === log.id\n ? '#f3f4f6'\n : 'white',\n }}\n onMouseEnter={e => {\n if (selectedLog?.id !== log.id) {\n e.currentTarget.style.backgroundColor =\n '#f9fafb'\n }\n }}\n onMouseLeave={e => {\n if (selectedLog?.id !== log.id) {\n e.currentTarget.style.backgroundColor =\n 'white'\n }\n }}\n >\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n <span\n style={{\n ...getLevelStyle(log.level),\n padding: '0.25rem 0.5rem',\n borderRadius: '0.25rem',\n fontSize: '0.75rem',\n fontWeight: 500,\n textTransform: 'uppercase',\n }}\n >\n {log.level}\n </span>\n </td>\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n fontSize: '0.875rem',\n maxWidth: '300px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {log.message}\n </td>\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n fontSize: '0.875rem',\n color: '#6b7280',\n }}\n >\n {log.userEmail ||\n log.userName ||\n log.userId ||\n '-'}\n </td>\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n fontSize: '0.875rem',\n color: '#6b7280',\n }}\n >\n {log.path || '-'}\n </td>\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n fontSize: '0.875rem',\n color: '#6b7280',\n whiteSpace: 'nowrap',\n }}\n >\n {new Date(\n log.createdAt,\n ).toLocaleString()}\n </td>\n {showDelete && (\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom:\n '1px solid #e5e7eb',\n textAlign: 'center',\n }}\n >\n <button\n onClick={e => {\n e.stopPropagation()\n handleDelete(log.id)\n }}\n disabled={deleting}\n style={{\n padding: '0.25rem 0.5rem',\n borderRadius: '0.25rem',\n backgroundColor:\n 'transparent',\n color: '#ef4444',\n border: '1px solid #ef4444',\n cursor: deleting\n ? 'not-allowed'\n : 'pointer',\n fontSize: '0.75rem',\n }}\n >\n Delete\n </button>\n </td>\n )}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n {/* Pagination */}\n {totalPages > 1 && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginTop: '1rem',\n }}\n >\n <span style={{ fontSize: '0.875rem', color: '#6b7280' }}>\n Page {page} of {totalPages}\n </span>\n <div style={{ display: 'flex', gap: '0.5rem' }}>\n <button\n onClick={() => setPage(1)}\n disabled={page === 1}\n style={{\n padding: '0.5rem 0.75rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n backgroundColor: 'white',\n cursor: page === 1 ? 'not-allowed' : 'pointer',\n opacity: page === 1 ? 0.5 : 1,\n fontSize: '0.875rem',\n }}\n >\n First\n </button>\n <button\n onClick={() => setPage(Math.max(1, page - 1))}\n disabled={page === 1}\n style={{\n padding: '0.5rem 0.75rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n backgroundColor: 'white',\n cursor: page === 1 ? 'not-allowed' : 'pointer',\n opacity: page === 1 ? 0.5 : 1,\n fontSize: '0.875rem',\n }}\n >\n Previous\n </button>\n <button\n onClick={() =>\n setPage(Math.min(totalPages, page + 1))\n }\n disabled={page === totalPages}\n style={{\n padding: '0.5rem 0.75rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n backgroundColor: 'white',\n cursor:\n page === totalPages\n ? 'not-allowed'\n : 'pointer',\n opacity: page === totalPages ? 0.5 : 1,\n fontSize: '0.875rem',\n }}\n >\n Next\n </button>\n <button\n onClick={() => setPage(totalPages)}\n disabled={page === totalPages}\n style={{\n padding: '0.5rem 0.75rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n backgroundColor: 'white',\n cursor:\n page === totalPages\n ? 'not-allowed'\n : 'pointer',\n opacity: page === totalPages ? 0.5 : 1,\n fontSize: '0.875rem',\n }}\n >\n Last\n </button>\n </div>\n </div>\n )}\n\n {/* Detail Modal */}\n {selectedLog && (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '1rem',\n zIndex: 50,\n }}\n onClick={() => setSelectedLog(null)}\n >\n <div\n style={{\n backgroundColor: 'white',\n borderRadius: '0.5rem',\n maxWidth: '48rem',\n width: '100%',\n maxHeight: '80vh',\n overflow: 'auto',\n padding: '1.5rem',\n }}\n onClick={e => e.stopPropagation()}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n marginBottom: '1rem',\n }}\n >\n <h2\n style={{\n fontSize: '1.125rem',\n fontWeight: 600,\n margin: 0,\n }}\n >\n Log Details\n </h2>\n <button\n onClick={() => setSelectedLog(null)}\n style={{\n background: 'none',\n border: 'none',\n fontSize: '1.5rem',\n cursor: 'pointer',\n color: '#6b7280',\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </div>\n\n <dl style={{ display: 'grid', gap: '1rem' }}>\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Level\n </dt>\n <dd style={{ margin: 0 }}>\n <span\n style={{\n ...getLevelStyle(selectedLog.level),\n padding: '0.25rem 0.5rem',\n borderRadius: '0.25rem',\n fontSize: '0.75rem',\n fontWeight: 500,\n textTransform: 'uppercase',\n }}\n >\n {selectedLog.level}\n </span>\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Message\n </dt>\n <dd style={{ margin: 0, fontSize: '0.875rem' }}>\n {selectedLog.message}\n </dd>\n </div>\n\n {selectedLog.stack && (\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Stack Trace\n </dt>\n <dd style={{ margin: 0 }}>\n <pre\n style={{\n fontSize: '0.75rem',\n fontFamily: 'monospace',\n backgroundColor: '#f3f4f6',\n padding: '0.75rem',\n borderRadius: '0.375rem',\n overflow: 'auto',\n maxHeight: '200px',\n margin: 0,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-all',\n }}\n >\n {selectedLog.stack}\n </pre>\n </dd>\n </div>\n )}\n\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: '1rem',\n }}\n >\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n User\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.userEmail ||\n selectedLog.userName ||\n selectedLog.userId ||\n '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n User ID\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.userId || '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Path\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.path || '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Method\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.method || '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n IP Address\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.ip || '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Time\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {new Date(\n selectedLog.createdAt,\n ).toLocaleString()}\n </dd>\n </div>\n </div>\n\n {selectedLog.userAgent && (\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n User Agent\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.75rem',\n color: '#6b7280',\n wordBreak: 'break-all',\n }}\n >\n {selectedLog.userAgent}\n </dd>\n </div>\n )}\n\n {selectedLog.metadata &&\n Object.keys(selectedLog.metadata).length >\n 0 && (\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Metadata\n </dt>\n <dd style={{ margin: 0 }}>\n <pre\n style={{\n fontSize: '0.75rem',\n fontFamily: 'monospace',\n backgroundColor: '#f3f4f6',\n padding: '0.75rem',\n borderRadius: '0.375rem',\n overflow: 'auto',\n maxHeight: '150px',\n margin: 0,\n }}\n >\n {JSON.stringify(\n selectedLog.metadata,\n null,\n 2,\n )}\n </pre>\n </dd>\n </div>\n )}\n </dl>\n\n {showDelete && (\n <div\n style={{\n marginTop: '1.5rem',\n textAlign: 'right',\n }}\n >\n <button\n onClick={() => {\n handleDelete(selectedLog.id)\n }}\n disabled={deleting}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n backgroundColor: '#ef4444',\n color: 'white',\n border: 'none',\n cursor: deleting\n ? 'not-allowed'\n : 'pointer',\n opacity: deleting ? 0.7 : 1,\n fontSize: '0.875rem',\n }}\n >\n Delete This Log\n </button>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n )\n}\n","'use client'\n\nimport { Component, type ReactNode, type ErrorInfo } from 'react'\n\n/**\n * Props for the ErrorBoundary component\n */\nexport interface ErrorBoundaryProps {\n /** Child components to wrap */\n children: ReactNode\n /** Custom fallback UI to show when an error occurs */\n fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode)\n /** Callback when an error is caught */\n onError?: (error: Error, errorInfo: ErrorInfo) => void\n /** Whether to log errors to the console (default: true in development) */\n logToConsole?: boolean\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean\n error: Error | null\n}\n\n/**\n * ErrorBoundary component - Catches and logs React errors\n *\n * Use this to wrap your application or specific components to catch\n * unhandled errors and log them via the error logger.\n *\n * @example\n * ```tsx\n * // Basic usage\n * import { ErrorBoundary } from '@vinetechke/next-error-logger/components'\n *\n * export default function Layout({ children }) {\n * return (\n * <ErrorBoundary>\n * {children}\n * </ErrorBoundary>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom fallback\n * <ErrorBoundary\n * fallback={(error, reset) => (\n * <div>\n * <h2>Something went wrong!</h2>\n * <button onClick={reset}>Try again</button>\n * </div>\n * )}\n * onError={(error, info) => {\n * // Custom error handling\n * console.error('Caught error:', error)\n * }}\n * >\n * <MyComponent />\n * </ErrorBoundary>\n * ```\n *\n * @example\n * ```tsx\n * // With error logger integration\n * import { ErrorBoundary } from '@vinetechke/next-error-logger/components'\n * import { errorLogger } from '@/lib/error-logger'\n *\n * <ErrorBoundary\n * onError={async (error, info) => {\n * await errorLogger.error('React render error', error, {\n * metadata: { componentStack: info.componentStack },\n * })\n * }}\n * >\n * {children}\n * </ErrorBoundary>\n * ```\n */\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props)\n this.state = { hasError: false, error: null }\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error }\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n const {\n onError,\n logToConsole = process.env.NODE_ENV === 'development',\n } = this.props\n\n // Log to console in development\n if (logToConsole) {\n console.error('ErrorBoundary caught an error:', error)\n console.error('Component stack:', errorInfo.componentStack)\n }\n\n // Call custom error handler\n onError?.(error, errorInfo)\n }\n\n reset = (): void => {\n this.setState({ hasError: false, error: null })\n }\n\n render(): ReactNode {\n const { hasError, error } = this.state\n const { children, fallback } = this.props\n\n if (hasError && error) {\n // Custom fallback\n if (typeof fallback === 'function') {\n return fallback(error, this.reset)\n }\n\n if (fallback) {\n return fallback\n }\n\n // Default fallback\n return (\n <div\n style={{\n padding: '2rem',\n textAlign: 'center',\n fontFamily: 'system-ui, sans-serif',\n }}\n >\n <h2\n style={{\n fontSize: '1.5rem',\n fontWeight: 600,\n color: '#dc2626',\n marginBottom: '1rem',\n }}\n >\n Something went wrong\n </h2>\n <p\n style={{\n color: '#6b7280',\n marginBottom: '1rem',\n }}\n >\n An unexpected error occurred. Please try again.\n </p>\n <details\n style={{\n marginBottom: '1rem',\n textAlign: 'left',\n maxWidth: '600px',\n margin: '0 auto 1rem',\n }}\n >\n <summary\n style={{\n cursor: 'pointer',\n color: '#3b82f6',\n marginBottom: '0.5rem',\n }}\n >\n Error details\n </summary>\n <pre\n style={{\n fontSize: '0.75rem',\n fontFamily: 'monospace',\n backgroundColor: '#f3f4f6',\n padding: '1rem',\n borderRadius: '0.5rem',\n overflow: 'auto',\n textAlign: 'left',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-all',\n }}\n >\n {error.message}\n {'\\n\\n'}\n {error.stack}\n </pre>\n </details>\n <button\n onClick={this.reset}\n style={{\n padding: '0.75rem 1.5rem',\n backgroundColor: '#3b82f6',\n color: 'white',\n border: 'none',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n fontSize: '1rem',\n }}\n >\n Try again\n </button>\n </div>\n )\n }\n\n return children\n }\n}\n\n/**\n * Hook-based error boundary wrapper for functional components\n *\n * @example\n * ```tsx\n * import { withErrorBoundary } from '@vinetechke/next-error-logger/components'\n *\n * function MyComponent() {\n * // Component that might throw\n * }\n *\n * export default withErrorBoundary(MyComponent, {\n * fallback: <div>Error loading component</div>,\n * })\n * ```\n */\nexport function withErrorBoundary<P extends object>(\n Component: React.ComponentType<P>,\n errorBoundaryProps?: Omit<ErrorBoundaryProps, 'children'>,\n) {\n const WrappedComponent = (props: P) => (\n <ErrorBoundary {...errorBoundaryProps}>\n <Component {...props} />\n </ErrorBoundary>\n )\n\n WrappedComponent.displayName = `withErrorBoundary(${Component.displayName || Component.name || 'Component'})`\n\n return WrappedComponent\n}\n"],"mappings":"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","names":["jsx","jsxs","Component"]}
1
+ {"version":3,"sources":["../../src/components/LogViewer.tsx","../../src/components/ErrorBoundary.tsx"],"sourcesContent":["'use client'\n\nimport { useState, useEffect, useCallback } from 'react'\nimport type {\n ErrorLogEntry,\n LogLevel,\n LogViewerProps,\n LogViewerTheme,\n} from '../types'\n\nconst defaultTheme: Required<LogViewerTheme> = {\n errorBg: 'rgb(254, 226, 226)',\n errorText: 'rgb(153, 27, 27)',\n warnBg: 'rgb(254, 249, 195)',\n warnText: 'rgb(133, 77, 14)',\n infoBg: 'rgb(219, 234, 254)',\n infoText: 'rgb(30, 64, 175)',\n debugBg: 'rgb(243, 244, 246)',\n debugText: 'rgb(55, 65, 81)',\n}\n\n/**\n * LogViewer component - A complete UI for viewing and managing error logs\n *\n * @example\n * ```tsx\n * // Basic usage\n * import { LogViewer } from '@vinetechke/next-error-logger/components'\n *\n * export default function LogsPage() {\n * return (\n * <div className=\"p-6\">\n * <h1>Error Logs</h1>\n * <LogViewer apiBasePath=\"/api/admin/logs\" />\n * </div>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom theme\n * <LogViewer\n * apiBasePath=\"/api/admin/logs\"\n * theme={{\n * errorBg: '#fee2e2',\n * errorText: '#dc2626',\n * }}\n * pageSize={25}\n * autoRefresh={30}\n * showDelete\n * />\n * ```\n */\nexport function LogViewer({\n apiBasePath = '/api/logs',\n className = '',\n pageSize = 50,\n theme: customTheme,\n onLogSelect,\n showDelete = true,\n autoRefresh = 0,\n}: LogViewerProps) {\n const theme = { ...defaultTheme, ...customTheme }\n\n const [logs, setLogs] = useState<ErrorLogEntry[]>([])\n const [total, setTotal] = useState(0)\n const [loading, setLoading] = useState(true)\n const [page, setPage] = useState(1)\n const [filters, setFilters] = useState({\n level: '' as LogLevel | '',\n search: '',\n userId: '',\n })\n const [selectedLog, setSelectedLog] = useState<ErrorLogEntry | null>(null)\n const [deleting, setDeleting] = useState(false)\n\n const fetchLogs = useCallback(async () => {\n setLoading(true)\n try {\n const params = new URLSearchParams({\n page: page.toString(),\n limit: pageSize.toString(),\n ...(filters.level && { level: filters.level }),\n ...(filters.search && { search: filters.search }),\n ...(filters.userId && { userId: filters.userId }),\n })\n\n const res = await fetch(`${apiBasePath}?${params}`)\n if (!res.ok) throw new Error('Failed to fetch logs')\n\n const data = await res.json()\n setLogs(data.logs)\n setTotal(data.total)\n } catch (error) {\n console.error('Failed to fetch logs:', error)\n } finally {\n setLoading(false)\n }\n }, [apiBasePath, page, pageSize, filters])\n\n useEffect(() => {\n fetchLogs()\n }, [fetchLogs])\n\n // Auto-refresh\n useEffect(() => {\n if (autoRefresh <= 0) return\n\n const interval = setInterval(fetchLogs, autoRefresh * 1000)\n return () => clearInterval(interval)\n }, [autoRefresh, fetchLogs])\n\n const handleDelete = async (id: string) => {\n if (!confirm('Are you sure you want to delete this log?')) return\n\n setDeleting(true)\n try {\n const res = await fetch(`${apiBasePath}/${id}`, {\n method: 'DELETE',\n })\n if (!res.ok) throw new Error('Failed to delete log')\n\n setLogs(prev => prev.filter(log => log.id !== id))\n setTotal(prev => prev - 1)\n if (selectedLog?.id === id) setSelectedLog(null)\n } catch (error) {\n console.error('Failed to delete log:', error)\n alert('Failed to delete log')\n } finally {\n setDeleting(false)\n }\n }\n\n const handleClearAll = async () => {\n const confirmed = confirm(\n 'Are you sure you want to delete ALL logs? This cannot be undone.',\n )\n if (!confirmed) return\n\n setDeleting(true)\n try {\n const res = await fetch(apiBasePath, {\n method: 'DELETE',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({}),\n })\n if (!res.ok) throw new Error('Failed to clear logs')\n\n setLogs([])\n setTotal(0)\n setSelectedLog(null)\n } catch (error) {\n console.error('Failed to clear logs:', error)\n alert('Failed to clear logs')\n } finally {\n setDeleting(false)\n }\n }\n\n const getLevelStyle = (level: LogLevel) => {\n switch (level) {\n case 'error':\n return {\n backgroundColor: theme.errorBg,\n color: theme.errorText,\n }\n case 'warn':\n return { backgroundColor: theme.warnBg, color: theme.warnText }\n case 'info':\n return { backgroundColor: theme.infoBg, color: theme.infoText }\n case 'debug':\n return {\n backgroundColor: theme.debugBg,\n color: theme.debugText,\n }\n }\n }\n\n const totalPages = Math.ceil(total / pageSize)\n\n return (\n <div\n className={className}\n style={{ fontFamily: 'system-ui, sans-serif' }}\n >\n {/* Filters */}\n <div\n style={{\n display: 'flex',\n gap: '1rem',\n marginBottom: '1rem',\n flexWrap: 'wrap',\n alignItems: 'center',\n }}\n >\n <select\n value={filters.level}\n onChange={e => {\n setFilters({\n ...filters,\n level: e.target.value as LogLevel | '',\n })\n setPage(1)\n }}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n fontSize: '0.875rem',\n }}\n >\n <option value=\"\">All Levels</option>\n <option value=\"error\">Error</option>\n <option value=\"warn\">Warning</option>\n <option value=\"info\">Info</option>\n <option value=\"debug\">Debug</option>\n </select>\n\n <input\n type=\"text\"\n placeholder=\"Search logs...\"\n value={filters.search}\n onChange={e => {\n setFilters({ ...filters, search: e.target.value })\n setPage(1)\n }}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n flex: 1,\n minWidth: '200px',\n fontSize: '0.875rem',\n }}\n />\n\n <input\n type=\"text\"\n placeholder=\"User ID...\"\n value={filters.userId}\n onChange={e => {\n setFilters({ ...filters, userId: e.target.value })\n setPage(1)\n }}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n width: '150px',\n fontSize: '0.875rem',\n }}\n />\n\n <button\n onClick={fetchLogs}\n disabled={loading}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n backgroundColor: '#3b82f6',\n color: 'white',\n border: 'none',\n cursor: loading ? 'not-allowed' : 'pointer',\n opacity: loading ? 0.7 : 1,\n fontSize: '0.875rem',\n }}\n >\n {loading ? 'Loading...' : 'Refresh'}\n </button>\n\n {showDelete && (\n <button\n onClick={handleClearAll}\n disabled={deleting || total === 0}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n backgroundColor: '#ef4444',\n color: 'white',\n border: 'none',\n cursor:\n deleting || total === 0\n ? 'not-allowed'\n : 'pointer',\n opacity: deleting || total === 0 ? 0.7 : 1,\n fontSize: '0.875rem',\n }}\n >\n Clear All\n </button>\n )}\n </div>\n\n {/* Stats */}\n <div\n style={{\n marginBottom: '1rem',\n fontSize: '0.875rem',\n color: '#6b7280',\n }}\n >\n Showing {logs.length} of {total} logs\n {autoRefresh > 0 && ` • Auto-refreshing every ${autoRefresh}s`}\n </div>\n\n {/* Log Table */}\n <div\n style={{\n border: '1px solid #e5e7eb',\n borderRadius: '0.5rem',\n overflow: 'hidden',\n }}\n >\n <table style={{ width: '100%', borderCollapse: 'collapse' }}>\n <thead>\n <tr style={{ backgroundColor: '#f9fafb' }}>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n Level\n </th>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n Message\n </th>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n User\n </th>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n Path\n </th>\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'left',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n Time\n </th>\n {showDelete && (\n <th\n style={{\n padding: '0.75rem 1rem',\n textAlign: 'center',\n fontSize: '0.875rem',\n fontWeight: 500,\n borderBottom: '1px solid #e5e7eb',\n width: '80px',\n }}\n >\n Actions\n </th>\n )}\n </tr>\n </thead>\n <tbody>\n {loading && logs.length === 0 ? (\n <tr>\n <td\n colSpan={showDelete ? 6 : 5}\n style={{\n padding: '2rem',\n textAlign: 'center',\n color: '#6b7280',\n }}\n >\n Loading...\n </td>\n </tr>\n ) : logs.length === 0 ? (\n <tr>\n <td\n colSpan={showDelete ? 6 : 5}\n style={{\n padding: '2rem',\n textAlign: 'center',\n color: '#6b7280',\n }}\n >\n No logs found\n </td>\n </tr>\n ) : (\n logs.map(log => (\n <tr\n key={log.id}\n onClick={() => {\n setSelectedLog(log)\n onLogSelect?.(log)\n }}\n style={{\n cursor: 'pointer',\n backgroundColor:\n selectedLog?.id === log.id\n ? '#f3f4f6'\n : 'white',\n }}\n onMouseEnter={e => {\n if (selectedLog?.id !== log.id) {\n e.currentTarget.style.backgroundColor =\n '#f9fafb'\n }\n }}\n onMouseLeave={e => {\n if (selectedLog?.id !== log.id) {\n e.currentTarget.style.backgroundColor =\n 'white'\n }\n }}\n >\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n <span\n style={{\n ...getLevelStyle(log.level),\n padding: '0.25rem 0.5rem',\n borderRadius: '0.25rem',\n fontSize: '0.75rem',\n fontWeight: 500,\n textTransform: 'uppercase',\n }}\n >\n {log.level}\n </span>\n </td>\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n fontSize: '0.875rem',\n maxWidth: '300px',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {log.message}\n </td>\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n fontSize: '0.875rem',\n color: '#6b7280',\n }}\n >\n {log.userEmail ||\n log.userName ||\n log.userId ||\n '-'}\n </td>\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n fontSize: '0.875rem',\n color: '#6b7280',\n }}\n >\n {log.path || '-'}\n </td>\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom: '1px solid #e5e7eb',\n fontSize: '0.875rem',\n color: '#6b7280',\n whiteSpace: 'nowrap',\n }}\n >\n {new Date(\n log.createdAt,\n ).toLocaleString()}\n </td>\n {showDelete && (\n <td\n style={{\n padding: '0.75rem 1rem',\n borderBottom:\n '1px solid #e5e7eb',\n textAlign: 'center',\n }}\n >\n <button\n onClick={e => {\n e.stopPropagation()\n handleDelete(log.id)\n }}\n disabled={deleting}\n style={{\n padding: '0.25rem 0.5rem',\n borderRadius: '0.25rem',\n backgroundColor:\n 'transparent',\n color: '#ef4444',\n border: '1px solid #ef4444',\n cursor: deleting\n ? 'not-allowed'\n : 'pointer',\n fontSize: '0.75rem',\n }}\n >\n Delete\n </button>\n </td>\n )}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n {/* Pagination */}\n {totalPages > 1 && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginTop: '1rem',\n }}\n >\n <span style={{ fontSize: '0.875rem', color: '#6b7280' }}>\n Page {page} of {totalPages}\n </span>\n <div style={{ display: 'flex', gap: '0.5rem' }}>\n <button\n onClick={() => setPage(1)}\n disabled={page === 1}\n style={{\n padding: '0.5rem 0.75rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n backgroundColor: 'white',\n cursor: page === 1 ? 'not-allowed' : 'pointer',\n opacity: page === 1 ? 0.5 : 1,\n fontSize: '0.875rem',\n }}\n >\n First\n </button>\n <button\n onClick={() => setPage(Math.max(1, page - 1))}\n disabled={page === 1}\n style={{\n padding: '0.5rem 0.75rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n backgroundColor: 'white',\n cursor: page === 1 ? 'not-allowed' : 'pointer',\n opacity: page === 1 ? 0.5 : 1,\n fontSize: '0.875rem',\n }}\n >\n Previous\n </button>\n <button\n onClick={() =>\n setPage(Math.min(totalPages, page + 1))\n }\n disabled={page === totalPages}\n style={{\n padding: '0.5rem 0.75rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n backgroundColor: 'white',\n cursor:\n page === totalPages\n ? 'not-allowed'\n : 'pointer',\n opacity: page === totalPages ? 0.5 : 1,\n fontSize: '0.875rem',\n }}\n >\n Next\n </button>\n <button\n onClick={() => setPage(totalPages)}\n disabled={page === totalPages}\n style={{\n padding: '0.5rem 0.75rem',\n borderRadius: '0.375rem',\n border: '1px solid #d1d5db',\n backgroundColor: 'white',\n cursor:\n page === totalPages\n ? 'not-allowed'\n : 'pointer',\n opacity: page === totalPages ? 0.5 : 1,\n fontSize: '0.875rem',\n }}\n >\n Last\n </button>\n </div>\n </div>\n )}\n\n {/* Detail Modal */}\n {selectedLog && (\n <div\n style={{\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '1rem',\n zIndex: 50,\n }}\n onClick={() => setSelectedLog(null)}\n >\n <div\n style={{\n backgroundColor: 'white',\n borderRadius: '0.5rem',\n maxWidth: '48rem',\n width: '100%',\n maxHeight: '80vh',\n overflow: 'auto',\n padding: '1.5rem',\n }}\n onClick={e => e.stopPropagation()}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n marginBottom: '1rem',\n }}\n >\n <h2\n style={{\n fontSize: '1.125rem',\n fontWeight: 600,\n margin: 0,\n }}\n >\n Log Details\n </h2>\n <button\n onClick={() => setSelectedLog(null)}\n style={{\n background: 'none',\n border: 'none',\n fontSize: '1.5rem',\n cursor: 'pointer',\n color: '#6b7280',\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </div>\n\n <dl style={{ display: 'grid', gap: '1rem' }}>\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Level\n </dt>\n <dd style={{ margin: 0 }}>\n <span\n style={{\n ...getLevelStyle(selectedLog.level),\n padding: '0.25rem 0.5rem',\n borderRadius: '0.25rem',\n fontSize: '0.75rem',\n fontWeight: 500,\n textTransform: 'uppercase',\n }}\n >\n {selectedLog.level}\n </span>\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Message\n </dt>\n <dd style={{ margin: 0, fontSize: '0.875rem' }}>\n {selectedLog.message}\n </dd>\n </div>\n\n {selectedLog.stack && (\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Stack Trace\n </dt>\n <dd style={{ margin: 0 }}>\n <pre\n style={{\n fontSize: '0.75rem',\n fontFamily: 'monospace',\n backgroundColor: '#f3f4f6',\n padding: '0.75rem',\n borderRadius: '0.375rem',\n overflow: 'auto',\n maxHeight: '200px',\n margin: 0,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-all',\n }}\n >\n {selectedLog.stack}\n </pre>\n </dd>\n </div>\n )}\n\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: '1rem',\n }}\n >\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n User\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.userEmail ||\n selectedLog.userName ||\n selectedLog.userId ||\n '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n User ID\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.userId || '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Path\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.path || '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Method\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.method || '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n IP Address\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {selectedLog.ip || '-'}\n </dd>\n </div>\n\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Time\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.875rem',\n }}\n >\n {new Date(\n selectedLog.createdAt,\n ).toLocaleString()}\n </dd>\n </div>\n </div>\n\n {selectedLog.userAgent && (\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n User Agent\n </dt>\n <dd\n style={{\n margin: 0,\n fontSize: '0.75rem',\n color: '#6b7280',\n wordBreak: 'break-all',\n }}\n >\n {selectedLog.userAgent}\n </dd>\n </div>\n )}\n\n {selectedLog.metadata &&\n Object.keys(selectedLog.metadata).length >\n 0 && (\n <div>\n <dt\n style={{\n fontSize: '0.875rem',\n fontWeight: 500,\n color: '#6b7280',\n marginBottom: '0.25rem',\n }}\n >\n Metadata\n </dt>\n <dd style={{ margin: 0 }}>\n <pre\n style={{\n fontSize: '0.75rem',\n fontFamily: 'monospace',\n backgroundColor: '#f3f4f6',\n padding: '0.75rem',\n borderRadius: '0.375rem',\n overflow: 'auto',\n maxHeight: '150px',\n margin: 0,\n }}\n >\n {JSON.stringify(\n selectedLog.metadata,\n null,\n 2,\n )}\n </pre>\n </dd>\n </div>\n )}\n </dl>\n\n {showDelete && (\n <div\n style={{\n marginTop: '1.5rem',\n textAlign: 'right',\n }}\n >\n <button\n onClick={() => {\n handleDelete(selectedLog.id)\n }}\n disabled={deleting}\n style={{\n padding: '0.5rem 1rem',\n borderRadius: '0.375rem',\n backgroundColor: '#ef4444',\n color: 'white',\n border: 'none',\n cursor: deleting\n ? 'not-allowed'\n : 'pointer',\n opacity: deleting ? 0.7 : 1,\n fontSize: '0.875rem',\n }}\n >\n Delete This Log\n </button>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n )\n}\n","'use client'\n\nimport { Component, type ReactNode, type ErrorInfo } from 'react'\n\n/**\n * Props for the ErrorBoundary component\n */\nexport interface ErrorBoundaryProps {\n /** Child components to wrap */\n children: ReactNode\n /** Custom fallback UI to show when an error occurs */\n fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode)\n /** Callback when an error is caught */\n onError?: (error: Error, errorInfo: ErrorInfo) => void\n /** Whether to log errors to the console (default: true in development) */\n logToConsole?: boolean\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean\n error: Error | null\n}\n\n/**\n * ErrorBoundary component - Catches and logs React errors\n *\n * Use this to wrap your application or specific components to catch\n * unhandled errors and log them via the error logger.\n *\n * @example\n * ```tsx\n * // Basic usage\n * import { ErrorBoundary } from '@vinetechke/next-error-logger/components'\n *\n * export default function Layout({ children }) {\n * return (\n * <ErrorBoundary>\n * {children}\n * </ErrorBoundary>\n * )\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With custom fallback\n * <ErrorBoundary\n * fallback={(error, reset) => (\n * <div>\n * <h2>Something went wrong!</h2>\n * <button onClick={reset}>Try again</button>\n * </div>\n * )}\n * onError={(error, info) => {\n * // Custom error handling\n * console.error('Caught error:', error)\n * }}\n * >\n * <MyComponent />\n * </ErrorBoundary>\n * ```\n *\n * @example\n * ```tsx\n * // With error logger integration\n * import { ErrorBoundary } from '@vinetechke/next-error-logger/components'\n * import { errorLogger } from '@/lib/error-logger'\n *\n * <ErrorBoundary\n * onError={async (error, info) => {\n * await errorLogger.error('React render error', error, {\n * metadata: { componentStack: info.componentStack },\n * })\n * }}\n * >\n * {children}\n * </ErrorBoundary>\n * ```\n */\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n constructor(props: ErrorBoundaryProps) {\n super(props)\n this.state = { hasError: false, error: null }\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { hasError: true, error }\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo): void {\n const {\n onError,\n logToConsole = process.env.NODE_ENV === 'development',\n } = this.props\n\n // Log to console in development\n if (logToConsole) {\n console.error('ErrorBoundary caught an error:', error)\n console.error('Component stack:', errorInfo.componentStack)\n }\n\n // Call custom error handler\n onError?.(error, errorInfo)\n }\n\n reset = (): void => {\n this.setState({ hasError: false, error: null })\n }\n\n render(): ReactNode {\n const { hasError, error } = this.state\n const { children, fallback } = this.props\n\n if (hasError && error) {\n // Custom fallback\n if (typeof fallback === 'function') {\n return fallback(error, this.reset)\n }\n\n if (fallback) {\n return fallback\n }\n\n // Default fallback\n return (\n <div\n style={{\n padding: '2rem',\n textAlign: 'center',\n fontFamily: 'system-ui, sans-serif',\n }}\n >\n <h2\n style={{\n fontSize: '1.5rem',\n fontWeight: 600,\n color: '#dc2626',\n marginBottom: '1rem',\n }}\n >\n Something went wrong\n </h2>\n <p\n style={{\n color: '#6b7280',\n marginBottom: '1rem',\n }}\n >\n An unexpected error occurred. Please try again.\n </p>\n <details\n style={{\n marginBottom: '1rem',\n textAlign: 'left',\n maxWidth: '600px',\n margin: '0 auto 1rem',\n }}\n >\n <summary\n style={{\n cursor: 'pointer',\n color: '#3b82f6',\n marginBottom: '0.5rem',\n }}\n >\n Error details\n </summary>\n <pre\n style={{\n fontSize: '0.75rem',\n fontFamily: 'monospace',\n backgroundColor: '#f3f4f6',\n padding: '1rem',\n borderRadius: '0.5rem',\n overflow: 'auto',\n textAlign: 'left',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-all',\n }}\n >\n {error.message}\n {'\\n\\n'}\n {error.stack}\n </pre>\n </details>\n <button\n onClick={this.reset}\n style={{\n padding: '0.75rem 1.5rem',\n backgroundColor: '#3b82f6',\n color: 'white',\n border: 'none',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n fontSize: '1rem',\n }}\n >\n Try again\n </button>\n </div>\n )\n }\n\n return children\n }\n}\n\n/**\n * Hook-based error boundary wrapper for functional components\n *\n * @example\n * ```tsx\n * import { withErrorBoundary } from '@vinetechke/next-error-logger/components'\n *\n * function MyComponent() {\n * // Component that might throw\n * }\n *\n * export default withErrorBoundary(MyComponent, {\n * fallback: <div>Error loading component</div>,\n * })\n * ```\n */\nexport function withErrorBoundary<P extends object>(\n Component: React.ComponentType<P>,\n errorBoundaryProps?: Omit<ErrorBoundaryProps, 'children'>,\n) {\n const WrappedComponent = (props: P) => (\n <ErrorBoundary {...errorBoundaryProps}>\n <Component {...props} />\n </ErrorBoundary>\n )\n\n WrappedComponent.displayName = `withErrorBoundary(${Component.displayName || Component.name || 'Component'})`\n\n return WrappedComponent\n}\n"],"mappings":"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","names":["jsx","jsxs","Component"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vinetechke/next-error-logger",
3
- "version": "0.1.0-beta.4",
3
+ "version": "0.1.0-beta.5",
4
4
  "description": "Simple error logging for Next.js apps with user context, multiple database adapters, and a built-in dashboard.",
5
5
  "author": "VineTechKE",
6
6
  "license": "MIT",