@vinetechke/next-error-logger 0.1.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +442 -0
- package/dist/adapters/drizzle.cjs +123 -0
- package/dist/adapters/drizzle.cjs.map +1 -0
- package/dist/adapters/drizzle.d.cts +76 -0
- package/dist/adapters/drizzle.d.ts +76 -0
- package/dist/adapters/drizzle.js +99 -0
- package/dist/adapters/drizzle.js.map +1 -0
- package/dist/adapters/prisma.cjs +120 -0
- package/dist/adapters/prisma.cjs.map +1 -0
- package/dist/adapters/prisma.d.cts +75 -0
- package/dist/adapters/prisma.d.ts +75 -0
- package/dist/adapters/prisma.js +96 -0
- package/dist/adapters/prisma.js.map +1 -0
- package/dist/adapters/sql.cjs +206 -0
- package/dist/adapters/sql.cjs.map +1 -0
- package/dist/adapters/sql.d.cts +111 -0
- package/dist/adapters/sql.d.ts +111 -0
- package/dist/adapters/sql.js +182 -0
- package/dist/adapters/sql.js.map +1 -0
- package/dist/api/index.cjs +257 -0
- package/dist/api/index.cjs.map +1 -0
- package/dist/api/index.d.cts +137 -0
- package/dist/api/index.d.ts +137 -0
- package/dist/api/index.js +231 -0
- package/dist/api/index.js.map +1 -0
- package/dist/auth/clerk.cjs +60 -0
- package/dist/auth/clerk.cjs.map +1 -0
- package/dist/auth/clerk.d.cts +83 -0
- package/dist/auth/clerk.d.ts +83 -0
- package/dist/auth/clerk.js +36 -0
- package/dist/auth/clerk.js.map +1 -0
- package/dist/auth/next-auth.cjs +50 -0
- package/dist/auth/next-auth.cjs.map +1 -0
- package/dist/auth/next-auth.d.cts +53 -0
- package/dist/auth/next-auth.d.ts +53 -0
- package/dist/auth/next-auth.js +26 -0
- package/dist/auth/next-auth.js.map +1 -0
- package/dist/components/index.cjs +1175 -0
- package/dist/components/index.cjs.map +1 -0
- package/dist/components/index.d.cts +141 -0
- package/dist/components/index.d.ts +141 -0
- package/dist/components/index.js +1147 -0
- package/dist/components/index.js.map +1 -0
- package/dist/index.cjs +241 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +109 -0
- package/dist/index.d.ts +109 -0
- package/dist/index.js +212 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/drizzle.cjs +100 -0
- package/dist/schemas/drizzle.cjs.map +1 -0
- package/dist/schemas/drizzle.d.cts +32 -0
- package/dist/schemas/drizzle.d.ts +32 -0
- package/dist/schemas/drizzle.js +74 -0
- package/dist/schemas/drizzle.js.map +1 -0
- package/dist/types-C3x_Ry2e.d.cts +195 -0
- package/dist/types-C3x_Ry2e.d.ts +195 -0
- package/package.json +128 -0
- package/schemas/prisma.prisma +23 -0
- package/schemas/schema.sql +75 -0
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { c as LogViewerProps } from '../types-C3x_Ry2e.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-C3x_Ry2e.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 };
|