@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 };
|
package/dist/components/index.js
CHANGED
|
@@ -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.
|
|
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",
|