@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.
Files changed (61) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +442 -0
  3. package/dist/adapters/drizzle.cjs +123 -0
  4. package/dist/adapters/drizzle.cjs.map +1 -0
  5. package/dist/adapters/drizzle.d.cts +76 -0
  6. package/dist/adapters/drizzle.d.ts +76 -0
  7. package/dist/adapters/drizzle.js +99 -0
  8. package/dist/adapters/drizzle.js.map +1 -0
  9. package/dist/adapters/prisma.cjs +120 -0
  10. package/dist/adapters/prisma.cjs.map +1 -0
  11. package/dist/adapters/prisma.d.cts +75 -0
  12. package/dist/adapters/prisma.d.ts +75 -0
  13. package/dist/adapters/prisma.js +96 -0
  14. package/dist/adapters/prisma.js.map +1 -0
  15. package/dist/adapters/sql.cjs +206 -0
  16. package/dist/adapters/sql.cjs.map +1 -0
  17. package/dist/adapters/sql.d.cts +111 -0
  18. package/dist/adapters/sql.d.ts +111 -0
  19. package/dist/adapters/sql.js +182 -0
  20. package/dist/adapters/sql.js.map +1 -0
  21. package/dist/api/index.cjs +257 -0
  22. package/dist/api/index.cjs.map +1 -0
  23. package/dist/api/index.d.cts +137 -0
  24. package/dist/api/index.d.ts +137 -0
  25. package/dist/api/index.js +231 -0
  26. package/dist/api/index.js.map +1 -0
  27. package/dist/auth/clerk.cjs +60 -0
  28. package/dist/auth/clerk.cjs.map +1 -0
  29. package/dist/auth/clerk.d.cts +83 -0
  30. package/dist/auth/clerk.d.ts +83 -0
  31. package/dist/auth/clerk.js +36 -0
  32. package/dist/auth/clerk.js.map +1 -0
  33. package/dist/auth/next-auth.cjs +50 -0
  34. package/dist/auth/next-auth.cjs.map +1 -0
  35. package/dist/auth/next-auth.d.cts +53 -0
  36. package/dist/auth/next-auth.d.ts +53 -0
  37. package/dist/auth/next-auth.js +26 -0
  38. package/dist/auth/next-auth.js.map +1 -0
  39. package/dist/components/index.cjs +1175 -0
  40. package/dist/components/index.cjs.map +1 -0
  41. package/dist/components/index.d.cts +141 -0
  42. package/dist/components/index.d.ts +141 -0
  43. package/dist/components/index.js +1147 -0
  44. package/dist/components/index.js.map +1 -0
  45. package/dist/index.cjs +241 -0
  46. package/dist/index.cjs.map +1 -0
  47. package/dist/index.d.cts +109 -0
  48. package/dist/index.d.ts +109 -0
  49. package/dist/index.js +212 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/schemas/drizzle.cjs +100 -0
  52. package/dist/schemas/drizzle.cjs.map +1 -0
  53. package/dist/schemas/drizzle.d.cts +32 -0
  54. package/dist/schemas/drizzle.d.ts +32 -0
  55. package/dist/schemas/drizzle.js +74 -0
  56. package/dist/schemas/drizzle.js.map +1 -0
  57. package/dist/types-C3x_Ry2e.d.cts +195 -0
  58. package/dist/types-C3x_Ry2e.d.ts +195 -0
  59. package/package.json +128 -0
  60. package/schemas/prisma.prisma +23 -0
  61. package/schemas/schema.sql +75 -0
@@ -0,0 +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"]}
package/dist/index.cjs ADDED
@@ -0,0 +1,241 @@
1
+ "use client";
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/index.ts
22
+ var src_exports = {};
23
+ __export(src_exports, {
24
+ errorLogger: () => errorLogger,
25
+ getConfig: () => getConfig,
26
+ initErrorLogger: () => initErrorLogger,
27
+ isInitialized: () => isInitialized
28
+ });
29
+ module.exports = __toCommonJS(src_exports);
30
+
31
+ // src/logger.ts
32
+ var config = null;
33
+ function initErrorLogger(cfg) {
34
+ config = {
35
+ consoleInDev: true,
36
+ retentionDays: 30,
37
+ ...cfg
38
+ };
39
+ }
40
+ function getConfig() {
41
+ if (!config) {
42
+ throw new Error(
43
+ "[@vinetechke/next-error-logger] Logger not initialized. Call initErrorLogger() first."
44
+ );
45
+ }
46
+ return config;
47
+ }
48
+ function isInitialized() {
49
+ return config !== null;
50
+ }
51
+ async function log(level, message, error, context) {
52
+ try {
53
+ const cfg = getConfig();
54
+ if (cfg.levels && !cfg.levels.includes(level)) {
55
+ return { success: true };
56
+ }
57
+ if (cfg.consoleInDev && process.env.NODE_ENV === "development") {
58
+ const consoleMethod = level === "error" ? "error" : level === "warn" ? "warn" : "log";
59
+ console[consoleMethod](
60
+ `[${level.toUpperCase()}]`,
61
+ message,
62
+ error || "",
63
+ context || ""
64
+ );
65
+ }
66
+ let user = null;
67
+ if (cfg.authAdapter) {
68
+ try {
69
+ user = await cfg.authAdapter.getUser();
70
+ } catch {
71
+ }
72
+ }
73
+ const entry = await cfg.adapter.create({
74
+ level,
75
+ message,
76
+ stack: error?.stack || null,
77
+ userId: user?.id || null,
78
+ userEmail: user?.email || null,
79
+ userName: user?.name || null,
80
+ path: context?.path || null,
81
+ method: context?.method || null,
82
+ userAgent: context?.userAgent || null,
83
+ ip: context?.ip || null,
84
+ metadata: context?.metadata || null
85
+ });
86
+ return { success: true, entry };
87
+ } catch (err) {
88
+ console.error("[@vinetechke/next-error-logger] Failed to log:", err);
89
+ return {
90
+ success: false,
91
+ error: err instanceof Error ? err.message : "Unknown error"
92
+ };
93
+ }
94
+ }
95
+ function extractRequestContext(request) {
96
+ const url = new URL(request.url);
97
+ return {
98
+ path: url.pathname,
99
+ method: request.method,
100
+ userAgent: request.headers.get("user-agent") || void 0,
101
+ ip: request.headers.get("x-forwarded-for")?.split(",")[0]?.trim() || request.headers.get("x-real-ip") || void 0
102
+ };
103
+ }
104
+ var errorLogger = {
105
+ /**
106
+ * Log an error with optional Error object and context
107
+ */
108
+ error: (message, error, context) => log("error", message, error, context),
109
+ /**
110
+ * Log a warning with optional Error object and context
111
+ */
112
+ warn: (message, error, context) => log("warn", message, error, context),
113
+ /**
114
+ * Log an info message with optional context
115
+ */
116
+ info: (message, context) => log("info", message, null, context),
117
+ /**
118
+ * Log a debug message with optional context
119
+ */
120
+ debug: (message, context) => log("debug", message, null, context),
121
+ /**
122
+ * Create a logger instance bound to a specific request
123
+ * Automatically extracts path, method, user agent, and IP
124
+ *
125
+ * @example
126
+ * ```ts
127
+ * export async function POST(request: Request) {
128
+ * const log = errorLogger.fromRequest(request)
129
+ *
130
+ * try {
131
+ * // ... your code
132
+ * } catch (error) {
133
+ * await log.error('Failed to process', error as Error, { orderId: '123' })
134
+ * return new Response('Error', { status: 500 })
135
+ * }
136
+ * }
137
+ * ```
138
+ */
139
+ fromRequest: (request) => {
140
+ const baseContext = extractRequestContext(request);
141
+ return {
142
+ error: (message, error, metadata) => log("error", message, error, { ...baseContext, metadata }),
143
+ warn: (message, metadata) => log("warn", message, null, { ...baseContext, metadata }),
144
+ info: (message, metadata) => log("info", message, null, { ...baseContext, metadata }),
145
+ debug: (message, metadata) => log("debug", message, null, { ...baseContext, metadata })
146
+ };
147
+ },
148
+ /**
149
+ * Log with explicit user context (when auth adapter is not available)
150
+ *
151
+ * @example
152
+ * ```ts
153
+ * await errorLogger.withUser({ id: 'user-123', email: 'user@example.com' })
154
+ * .error('User action failed', error)
155
+ * ```
156
+ */
157
+ withUser: (user) => {
158
+ return {
159
+ error: async (message, error, context) => {
160
+ const cfg = getConfig();
161
+ try {
162
+ const entry = await cfg.adapter.create({
163
+ level: "error",
164
+ message,
165
+ stack: error?.stack || null,
166
+ userId: user.id,
167
+ userEmail: user.email || null,
168
+ userName: user.name || null,
169
+ path: context?.path || null,
170
+ method: context?.method || null,
171
+ userAgent: context?.userAgent || null,
172
+ ip: context?.ip || null,
173
+ metadata: context?.metadata || null
174
+ });
175
+ return { success: true, entry };
176
+ } catch (err) {
177
+ return {
178
+ success: false,
179
+ error: err instanceof Error ? err.message : "Unknown error"
180
+ };
181
+ }
182
+ },
183
+ warn: async (message, context) => {
184
+ const cfg = getConfig();
185
+ try {
186
+ const entry = await cfg.adapter.create({
187
+ level: "warn",
188
+ message,
189
+ stack: null,
190
+ userId: user.id,
191
+ userEmail: user.email || null,
192
+ userName: user.name || null,
193
+ path: context?.path || null,
194
+ method: context?.method || null,
195
+ userAgent: context?.userAgent || null,
196
+ ip: context?.ip || null,
197
+ metadata: context?.metadata || null
198
+ });
199
+ return { success: true, entry };
200
+ } catch (err) {
201
+ return {
202
+ success: false,
203
+ error: err instanceof Error ? err.message : "Unknown error"
204
+ };
205
+ }
206
+ },
207
+ info: async (message, context) => {
208
+ const cfg = getConfig();
209
+ try {
210
+ const entry = await cfg.adapter.create({
211
+ level: "info",
212
+ message,
213
+ stack: null,
214
+ userId: user.id,
215
+ userEmail: user.email || null,
216
+ userName: user.name || null,
217
+ path: context?.path || null,
218
+ method: context?.method || null,
219
+ userAgent: context?.userAgent || null,
220
+ ip: context?.ip || null,
221
+ metadata: context?.metadata || null
222
+ });
223
+ return { success: true, entry };
224
+ } catch (err) {
225
+ return {
226
+ success: false,
227
+ error: err instanceof Error ? err.message : "Unknown error"
228
+ };
229
+ }
230
+ }
231
+ };
232
+ }
233
+ };
234
+ // Annotate the CommonJS export names for ESM import in node:
235
+ 0 && (module.exports = {
236
+ errorLogger,
237
+ getConfig,
238
+ initErrorLogger,
239
+ isInitialized
240
+ });
241
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/logger.ts"],"sourcesContent":["// Core logger\nexport {\n initErrorLogger,\n errorLogger,\n getConfig,\n isInitialized,\n} from './logger'\n\n// Types\nexport type {\n ErrorLoggerConfig,\n ErrorLogEntry,\n LogLevel,\n DatabaseAdapter,\n AuthAdapter,\n QueryOptions,\n RequestContext,\n LogResult,\n LogViewerProps,\n LogViewerTheme,\n} from './types'\n","import type {\n ErrorLoggerConfig,\n LogLevel,\n ErrorLogEntry,\n RequestContext,\n LogResult,\n} from './types'\n\nlet config: ErrorLoggerConfig | null = null\n\n/**\n * Initialize the error logger with your configuration\n * Must be called before using errorLogger\n *\n * @example\n * ```ts\n * import { initErrorLogger } from '@vinetechke/next-error-logger'\n * import { createPrismaAdapter } from '@vinetechke/next-error-logger/adapters/prisma'\n * import { createNextAuthAdapter } from '@vinetechke/next-error-logger/auth/next-auth'\n * import { prisma } from '@/lib/prisma'\n * import { auth } from '@/auth'\n *\n * initErrorLogger({\n * adapter: createPrismaAdapter(prisma),\n * authAdapter: createNextAuthAdapter(auth),\n * retentionDays: 30,\n * })\n * ```\n */\nexport function initErrorLogger(cfg: ErrorLoggerConfig): void {\n config = {\n consoleInDev: true,\n retentionDays: 30,\n ...cfg,\n }\n}\n\n/**\n * Get the current logger configuration\n * @throws Error if logger is not initialized\n */\nexport function getConfig(): ErrorLoggerConfig {\n if (!config) {\n throw new Error(\n '[@vinetechke/next-error-logger] Logger not initialized. Call initErrorLogger() first.',\n )\n }\n return config\n}\n\n/**\n * Check if logger is initialized\n */\nexport function isInitialized(): boolean {\n return config !== null\n}\n\n/**\n * Internal logging function\n */\nasync function log(\n level: LogLevel,\n message: string,\n error?: Error | null,\n context?: RequestContext,\n): Promise<LogResult> {\n try {\n const cfg = getConfig()\n\n // Check if this level should be captured\n if (cfg.levels && !cfg.levels.includes(level)) {\n return { success: true }\n }\n\n // Console output in development\n if (cfg.consoleInDev && process.env.NODE_ENV === 'development') {\n const consoleMethod =\n level === 'error' ? 'error' : level === 'warn' ? 'warn' : 'log'\n console[consoleMethod](\n `[${level.toUpperCase()}]`,\n message,\n error || '',\n context || '',\n )\n }\n\n // Get user context if auth adapter is provided\n let user: { id: string; email?: string; name?: string } | null = null\n if (cfg.authAdapter) {\n try {\n user = await cfg.authAdapter.getUser()\n } catch {\n // Silently ignore auth errors - user context is optional\n }\n }\n\n // Create the log entry\n const entry = await cfg.adapter.create({\n level,\n message,\n stack: error?.stack || null,\n userId: user?.id || null,\n userEmail: user?.email || null,\n userName: user?.name || null,\n path: context?.path || null,\n method: context?.method || null,\n userAgent: context?.userAgent || null,\n ip: context?.ip || null,\n metadata: context?.metadata || null,\n })\n\n return { success: true, entry }\n } catch (err) {\n // Don't throw on logging failures - just return error result\n console.error('[@vinetechke/next-error-logger] Failed to log:', err)\n return {\n success: false,\n error: err instanceof Error ? err.message : 'Unknown error',\n }\n }\n}\n\n/**\n * Extract request context from a Next.js Request object\n */\nfunction extractRequestContext(request: Request): RequestContext {\n const url = new URL(request.url)\n return {\n path: url.pathname,\n method: request.method,\n userAgent: request.headers.get('user-agent') || undefined,\n ip:\n request.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ||\n request.headers.get('x-real-ip') ||\n undefined,\n }\n}\n\n/**\n * Main error logger instance\n *\n * @example\n * ```ts\n * // Simple logging\n * await errorLogger.error('Something went wrong', error)\n * await errorLogger.warn('Deprecated API used')\n * await errorLogger.info('User completed checkout')\n *\n * // With request context (in API routes)\n * const log = errorLogger.fromRequest(request)\n * await log.error('API failed', error, { orderId: '123' })\n * ```\n */\nexport const errorLogger = {\n /**\n * Log an error with optional Error object and context\n */\n error: (\n message: string,\n error?: Error,\n context?: RequestContext,\n ): Promise<LogResult> => log('error', message, error, context),\n\n /**\n * Log a warning with optional Error object and context\n */\n warn: (\n message: string,\n error?: Error,\n context?: RequestContext,\n ): Promise<LogResult> => log('warn', message, error, context),\n\n /**\n * Log an info message with optional context\n */\n info: (message: string, context?: RequestContext): Promise<LogResult> =>\n log('info', message, null, context),\n\n /**\n * Log a debug message with optional context\n */\n debug: (message: string, context?: RequestContext): Promise<LogResult> =>\n log('debug', message, null, context),\n\n /**\n * Create a logger instance bound to a specific request\n * Automatically extracts path, method, user agent, and IP\n *\n * @example\n * ```ts\n * export async function POST(request: Request) {\n * const log = errorLogger.fromRequest(request)\n *\n * try {\n * // ... your code\n * } catch (error) {\n * await log.error('Failed to process', error as Error, { orderId: '123' })\n * return new Response('Error', { status: 500 })\n * }\n * }\n * ```\n */\n fromRequest: (request: Request) => {\n const baseContext = extractRequestContext(request)\n\n return {\n error: (\n message: string,\n error?: Error,\n metadata?: Record<string, unknown>,\n ): Promise<LogResult> =>\n log('error', message, error, { ...baseContext, metadata }),\n\n warn: (\n message: string,\n metadata?: Record<string, unknown>,\n ): Promise<LogResult> =>\n log('warn', message, null, { ...baseContext, metadata }),\n\n info: (\n message: string,\n metadata?: Record<string, unknown>,\n ): Promise<LogResult> =>\n log('info', message, null, { ...baseContext, metadata }),\n\n debug: (\n message: string,\n metadata?: Record<string, unknown>,\n ): Promise<LogResult> =>\n log('debug', message, null, { ...baseContext, metadata }),\n }\n },\n\n /**\n * Log with explicit user context (when auth adapter is not available)\n *\n * @example\n * ```ts\n * await errorLogger.withUser({ id: 'user-123', email: 'user@example.com' })\n * .error('User action failed', error)\n * ```\n */\n withUser: (user: { id: string; email?: string; name?: string }) => {\n return {\n error: async (\n message: string,\n error?: Error,\n context?: RequestContext,\n ): Promise<LogResult> => {\n const cfg = getConfig()\n try {\n const entry = await cfg.adapter.create({\n level: 'error',\n message,\n stack: error?.stack || null,\n userId: user.id,\n userEmail: user.email || null,\n userName: user.name || null,\n path: context?.path || null,\n method: context?.method || null,\n userAgent: context?.userAgent || null,\n ip: context?.ip || null,\n metadata: context?.metadata || null,\n })\n return { success: true, entry }\n } catch (err) {\n return {\n success: false,\n error:\n err instanceof Error\n ? err.message\n : 'Unknown error',\n }\n }\n },\n\n warn: async (\n message: string,\n context?: RequestContext,\n ): Promise<LogResult> => {\n const cfg = getConfig()\n try {\n const entry = await cfg.adapter.create({\n level: 'warn',\n message,\n stack: null,\n userId: user.id,\n userEmail: user.email || null,\n userName: user.name || null,\n path: context?.path || null,\n method: context?.method || null,\n userAgent: context?.userAgent || null,\n ip: context?.ip || null,\n metadata: context?.metadata || null,\n })\n return { success: true, entry }\n } catch (err) {\n return {\n success: false,\n error:\n err instanceof Error\n ? err.message\n : 'Unknown error',\n }\n }\n },\n\n info: async (\n message: string,\n context?: RequestContext,\n ): Promise<LogResult> => {\n const cfg = getConfig()\n try {\n const entry = await cfg.adapter.create({\n level: 'info',\n message,\n stack: null,\n userId: user.id,\n userEmail: user.email || null,\n userName: user.name || null,\n path: context?.path || null,\n method: context?.method || null,\n userAgent: context?.userAgent || null,\n ip: context?.ip || null,\n metadata: context?.metadata || null,\n })\n return { success: true, entry }\n } catch (err) {\n return {\n success: false,\n error:\n err instanceof Error\n ? err.message\n : 'Unknown error',\n }\n }\n },\n }\n },\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,109 @@
1
+ import { R as RequestContext, L as LogResult, E as ErrorLoggerConfig } from './types-C3x_Ry2e.cjs';
2
+ export { A as AuthAdapter, D as DatabaseAdapter, a as ErrorLogEntry, b as LogLevel, c as LogViewerProps, d as LogViewerTheme, Q as QueryOptions } from './types-C3x_Ry2e.cjs';
3
+
4
+ /**
5
+ * Initialize the error logger with your configuration
6
+ * Must be called before using errorLogger
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { initErrorLogger } from '@vinetechke/next-error-logger'
11
+ * import { createPrismaAdapter } from '@vinetechke/next-error-logger/adapters/prisma'
12
+ * import { createNextAuthAdapter } from '@vinetechke/next-error-logger/auth/next-auth'
13
+ * import { prisma } from '@/lib/prisma'
14
+ * import { auth } from '@/auth'
15
+ *
16
+ * initErrorLogger({
17
+ * adapter: createPrismaAdapter(prisma),
18
+ * authAdapter: createNextAuthAdapter(auth),
19
+ * retentionDays: 30,
20
+ * })
21
+ * ```
22
+ */
23
+ declare function initErrorLogger(cfg: ErrorLoggerConfig): void;
24
+ /**
25
+ * Get the current logger configuration
26
+ * @throws Error if logger is not initialized
27
+ */
28
+ declare function getConfig(): ErrorLoggerConfig;
29
+ /**
30
+ * Check if logger is initialized
31
+ */
32
+ declare function isInitialized(): boolean;
33
+ /**
34
+ * Main error logger instance
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * // Simple logging
39
+ * await errorLogger.error('Something went wrong', error)
40
+ * await errorLogger.warn('Deprecated API used')
41
+ * await errorLogger.info('User completed checkout')
42
+ *
43
+ * // With request context (in API routes)
44
+ * const log = errorLogger.fromRequest(request)
45
+ * await log.error('API failed', error, { orderId: '123' })
46
+ * ```
47
+ */
48
+ declare const errorLogger: {
49
+ /**
50
+ * Log an error with optional Error object and context
51
+ */
52
+ error: (message: string, error?: Error, context?: RequestContext) => Promise<LogResult>;
53
+ /**
54
+ * Log a warning with optional Error object and context
55
+ */
56
+ warn: (message: string, error?: Error, context?: RequestContext) => Promise<LogResult>;
57
+ /**
58
+ * Log an info message with optional context
59
+ */
60
+ info: (message: string, context?: RequestContext) => Promise<LogResult>;
61
+ /**
62
+ * Log a debug message with optional context
63
+ */
64
+ debug: (message: string, context?: RequestContext) => Promise<LogResult>;
65
+ /**
66
+ * Create a logger instance bound to a specific request
67
+ * Automatically extracts path, method, user agent, and IP
68
+ *
69
+ * @example
70
+ * ```ts
71
+ * export async function POST(request: Request) {
72
+ * const log = errorLogger.fromRequest(request)
73
+ *
74
+ * try {
75
+ * // ... your code
76
+ * } catch (error) {
77
+ * await log.error('Failed to process', error as Error, { orderId: '123' })
78
+ * return new Response('Error', { status: 500 })
79
+ * }
80
+ * }
81
+ * ```
82
+ */
83
+ fromRequest: (request: Request) => {
84
+ error: (message: string, error?: Error, metadata?: Record<string, unknown>) => Promise<LogResult>;
85
+ warn: (message: string, metadata?: Record<string, unknown>) => Promise<LogResult>;
86
+ info: (message: string, metadata?: Record<string, unknown>) => Promise<LogResult>;
87
+ debug: (message: string, metadata?: Record<string, unknown>) => Promise<LogResult>;
88
+ };
89
+ /**
90
+ * Log with explicit user context (when auth adapter is not available)
91
+ *
92
+ * @example
93
+ * ```ts
94
+ * await errorLogger.withUser({ id: 'user-123', email: 'user@example.com' })
95
+ * .error('User action failed', error)
96
+ * ```
97
+ */
98
+ withUser: (user: {
99
+ id: string;
100
+ email?: string;
101
+ name?: string;
102
+ }) => {
103
+ error: (message: string, error?: Error, context?: RequestContext) => Promise<LogResult>;
104
+ warn: (message: string, context?: RequestContext) => Promise<LogResult>;
105
+ info: (message: string, context?: RequestContext) => Promise<LogResult>;
106
+ };
107
+ };
108
+
109
+ export { ErrorLoggerConfig, LogResult, RequestContext, errorLogger, getConfig, initErrorLogger, isInitialized };