{"_id":"@6digit/browser-error-reporter","_rev":"5-31007d15e1b1c1a42fc98b392dac48c8","name":"@6digit/browser-error-reporter","dist-tags":{"latest":"1.2.1"},"versions":{"1.0.0":{"name":"@6digit/browser-error-reporter","version":"1.0.0","keywords":["error","logging","browser","debugging","javascript","typescript","frontend","monitoring"],"author":"","license":"MIT","_id":"@6digit/browser-error-reporter@1.0.0","maintainers":[{"name":"cocporn","email":"cocporn@gmail.com"}],"dist":{"shasum":"ff4fe74405526310dacbe7d4e0b74c631bd9e26e","tarball":"https://registry.npmjs.org/@6digit/browser-error-reporter/-/browser-error-reporter-1.0.0.tgz","fileCount":11,"integrity":"sha512-NjRq+5mpzzWcdkl1EcJGt6vymb3YFpWWSBw3Wzp3Rwj8SXGAKHFRPMWE3T782YY1idUGXpCUbYAKA4JXPjACHQ==","signatures":[{"sig":"MEUCIQD771DeDkHFeQ/dTGyLbGszLUWyU0fw5B/ZsifBCC3jkwIgEdin1o1EAPl200L7nbnIIP5ju3uOlCqNQRqxTASzdkU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64020},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.esm.js","gitHead":"f6527aec39bfcff3d08ddf3d3fb250d7805dd285","scripts":{"dev":"rollup -c -w","lint":"eslint src --ext .ts,.js","test":"jest","build":"rollup -c","prepare":"npm run build","test:watch":"jest --watch"},"_npmUser":{"name":"cocporn","email":"cocporn@gmail.com"},"_npmVersion":"11.4.2","description":"A lightweight, platform-agnostic runtime error tracking package for browser-based applications","directories":{},"sideEffects":false,"_nodeVersion":"23.2.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.37.0","rollup":"^3.21.0","ts-jest":"^29.4.0","typescript":"^5.0.0","@types/jest":"^29.5.14","jest-environment-jsdom":"^29.5.0","@rollup/plugin-typescript":"^11.1.0","@typescript-eslint/parser":"^5.57.1","@typescript-eslint/eslint-plugin":"^5.57.1"},"_npmOperationalInternal":{"tmp":"tmp/browser-error-reporter_1.0.0_1754218625587_0.25447200999259234","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@6digit/browser-error-reporter","version":"1.0.1","keywords":["error","logging","browser","debugging","javascript","typescript","frontend","monitoring"],"author":"","license":"MIT","_id":"@6digit/browser-error-reporter@1.0.1","maintainers":[{"name":"cocporn","email":"cocporn@gmail.com"}],"dist":{"shasum":"1787ef34bdd17e3146fe7f26c788bd488c19526d","tarball":"https://registry.npmjs.org/@6digit/browser-error-reporter/-/browser-error-reporter-1.0.1.tgz","fileCount":11,"integrity":"sha512-JL7belqnBJn0B76KsRVS9EsW6EATQ2j4mDIa7TKICCWme4q6B88C/+GS/WjEs7Z4hWr8PCJPi/GF6O9Z/cAUbg==","signatures":[{"sig":"MEQCIA68UShq+ZvkZ86y18PAqohDgBtvYkqErEwILTMjMUlFAiBaQQG5d1pPPZ7Qesl8YJZg9D1wdQhuxh9CmnMtjoiLVw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":64992},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.esm.js","gitHead":"f6527aec39bfcff3d08ddf3d3fb250d7805dd285","scripts":{"dev":"rollup -c -w","lint":"eslint src --ext .ts,.js","test":"jest","build":"rollup -c","prepare":"npm run build","test:watch":"jest --watch"},"_npmUser":{"name":"cocporn","email":"cocporn@gmail.com"},"_npmVersion":"11.4.2","description":"A lightweight, platform-agnostic runtime error tracking package for browser-based applications","directories":{},"sideEffects":false,"_nodeVersion":"23.2.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.37.0","rollup":"^3.21.0","ts-jest":"^29.4.0","typescript":"^5.0.0","@types/jest":"^29.5.14","jest-environment-jsdom":"^29.5.0","@rollup/plugin-typescript":"^11.1.0","@typescript-eslint/parser":"^5.57.1","@typescript-eslint/eslint-plugin":"^5.57.1"},"_npmOperationalInternal":{"tmp":"tmp/browser-error-reporter_1.0.1_1754232842803_0.5179752787115941","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@6digit/browser-error-reporter","version":"1.0.2","keywords":["error","logging","browser","debugging","javascript","typescript","frontend","monitoring"],"author":"","license":"MIT","_id":"@6digit/browser-error-reporter@1.0.2","maintainers":[{"name":"cocporn","email":"cocporn@gmail.com"}],"dist":{"shasum":"5c6b7f4a6b32b9e958760ce5815e1560bf205721","tarball":"https://registry.npmjs.org/@6digit/browser-error-reporter/-/browser-error-reporter-1.0.2.tgz","fileCount":11,"integrity":"sha512-fZVv5lo7Rti63n+ScLEMK0k+yifIB6QxoxKKejQ/31PwvhUyh33N4+c0x96Y0Ye+IPN4UmimcvLNf2KrYvb2GA==","signatures":[{"sig":"MEYCIQCfOfDOCSdt8s4XU0045sIkLrNSGQ+j6sReX1Pq36i2tAIhAK1OWQkp30eLI5EFbcxeFs8pEb7A1vR8ofZaJe1z7tav","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":79572},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.esm.js","gitHead":"f6527aec39bfcff3d08ddf3d3fb250d7805dd285","scripts":{"dev":"rollup -c -w","lint":"eslint src --ext .ts,.js","test":"jest","build":"rollup -c","prepare":"npm run build","test:watch":"jest --watch"},"_npmUser":{"name":"cocporn","email":"cocporn@gmail.com"},"_npmVersion":"11.4.2","description":"A lightweight, platform-agnostic runtime error tracking package for browser-based applications","directories":{},"sideEffects":false,"_nodeVersion":"23.2.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.37.0","rollup":"^3.21.0","ts-jest":"^29.4.0","typescript":"^5.0.0","@types/jest":"^29.5.14","jest-environment-jsdom":"^29.5.0","@rollup/plugin-typescript":"^11.1.0","@typescript-eslint/parser":"^5.57.1","@typescript-eslint/eslint-plugin":"^5.57.1"},"_npmOperationalInternal":{"tmp":"tmp/browser-error-reporter_1.0.2_1754235291942_0.5883296935039666","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@6digit/browser-error-reporter","version":"1.1.0","keywords":["error","logging","browser","debugging","javascript","typescript","frontend","monitoring"],"author":"","license":"MIT","_id":"@6digit/browser-error-reporter@1.1.0","maintainers":[{"name":"cocporn","email":"cocporn@gmail.com"}],"dist":{"shasum":"b60abc83340a2184d08cdb3638b4dbf68eda3bbf","tarball":"https://registry.npmjs.org/@6digit/browser-error-reporter/-/browser-error-reporter-1.1.0.tgz","fileCount":11,"integrity":"sha512-t3FdSwgC0QVjY7F25fvEu3pX09zTyPjAz16Yb71sobNUI6GTXy3nD9JpReGJ+pGM6/dTdDz8h1uyhkv5/h5jHQ==","signatures":[{"sig":"MEUCIH2B9O3wHXJgwWeA/z6hoAKD0xms8rTnrAnx/duGCbhiAiEAi1L5SBrU4/0Zo2ovTjrLAIHpHJyC2rr2o+ejPOb7QRY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":83092},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.esm.js","gitHead":"f6527aec39bfcff3d08ddf3d3fb250d7805dd285","scripts":{"dev":"rollup -c -w","lint":"eslint src --ext .ts,.js","test":"jest","build":"rollup -c","prepare":"npm run build","test:watch":"jest --watch"},"_npmUser":{"name":"cocporn","email":"cocporn@gmail.com"},"_npmVersion":"11.4.2","description":"A lightweight, platform-agnostic runtime error tracking package for browser-based applications","directories":{},"sideEffects":false,"_nodeVersion":"23.2.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.37.0","rollup":"^3.21.0","ts-jest":"^29.4.0","typescript":"^5.0.0","@types/jest":"^29.5.14","jest-environment-jsdom":"^29.5.0","@rollup/plugin-typescript":"^11.1.0","@typescript-eslint/parser":"^5.57.1","@typescript-eslint/eslint-plugin":"^5.57.1"},"_npmOperationalInternal":{"tmp":"tmp/browser-error-reporter_1.1.0_1754235485273_0.7453586653993196","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@6digit/browser-error-reporter","version":"1.2.1","description":"A lightweight, platform-agnostic runtime error tracking package for browser-based applications","main":"dist/index.js","module":"dist/index.esm.js","types":"dist/index.d.ts","scripts":{"build":"rollup -c","dev":"rollup -c -w","test":"jest","test:watch":"jest --watch","lint":"eslint src --ext .ts,.js","prepare":"npm run build"},"keywords":["error","logging","browser","debugging","javascript","typescript","frontend","monitoring"],"author":"","license":"MIT","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"devDependencies":{"@rollup/plugin-typescript":"^11.1.0","@types/jest":"^29.5.14","@typescript-eslint/eslint-plugin":"^5.57.1","@typescript-eslint/parser":"^5.57.1","eslint":"^8.37.0","jest":"^29.5.0","jest-environment-jsdom":"^29.5.0","rollup":"^3.21.0","ts-jest":"^29.4.0","typescript":"^5.0.0"},"sideEffects":false,"_id":"@6digit/browser-error-reporter@1.2.1","gitHead":"f6527aec39bfcff3d08ddf3d3fb250d7805dd285","_nodeVersion":"23.2.0","_npmVersion":"11.4.2","dist":{"integrity":"sha512-ri6Nkkz3WGWMp02fLRmbo8pXek14zWk5L+DZU8gJLyhf9B3YH4NDrqIkWls2V/4i4GyoHbIcVcR2QR+Yl6GcGw==","shasum":"1ff05489bc1a666d81c8b0606cc0db6c7720d6db","tarball":"https://registry.npmjs.org/@6digit/browser-error-reporter/-/browser-error-reporter-1.2.1.tgz","fileCount":11,"unpackedSize":103573,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDy1QllEbKVKaIX6JJtj0tMXdsWmL5CaCqfyX2D7ke9mAIhAKNZveMU+u1JYZD+Pg/BbQ3a/8TXTOViaFyN4e0U/nUJ"}]},"_npmUser":{"name":"cocporn","email":"cocporn@gmail.com"},"directories":{},"maintainers":[{"name":"cocporn","email":"cocporn@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/browser-error-reporter_1.2.1_1754301630919_0.8787795652819466"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-03T10:57:05.532Z","modified":"2025-08-04T10:00:31.312Z","1.0.0":"2025-08-03T10:57:05.767Z","1.0.1":"2025-08-03T14:54:03.003Z","1.0.2":"2025-08-03T15:34:52.129Z","1.1.0":"2025-08-03T15:38:05.481Z","1.2.1":"2025-08-04T10:00:31.092Z"},"license":"MIT","keywords":["error","logging","browser","debugging","javascript","typescript","frontend","monitoring"],"description":"A lightweight, platform-agnostic runtime error tracking package for browser-based applications","maintainers":[{"name":"cocporn","email":"cocporn@gmail.com"}],"readme":"# @6digit/browser-error-reporter\n\nA lightweight, platform-agnostic runtime error tracking package for browser-based applications, designed to emit structured error events and support LLM-assisted diagnostics.\n\n## Features\n\n- 🚀 **Lightweight**: Zero dependencies, minimal footprint\n- 🔧 **Framework-agnostic**: Works with any frontend framework\n- 📊 **Structured logging**: Emits typed error events\n- 🔄 **Session tracking**: Detects clean runs after application reloads\n- 🎯 **Configurable**: Filter, throttle, and customize error capture\n- 🧪 **TypeScript support**: Fully typed with TypeScript definitions\n\n## Installation\n\n```bash\nnpm install @6digit/browser-error-reporter\n```\n\n## Quick Start\n\n```typescript\nimport { installErrorReporter } from '@6digit/browser-error-reporter';\n\ninstallErrorReporter({\n  onReport: (log) => {\n    // Send error to your logging service\n    fetch('/api/log', {\n      method: 'POST',\n      body: JSON.stringify(log),\n    });\n  },\n  onCleanRun: (sessionId) => {\n    // Signal successful load\n    fetch('/api/log/clean-run', {\n      method: 'POST',\n      body: JSON.stringify({ sessionId })\n    });\n  },\n  ignorePatterns: [/ResizeObserver/, /deprecated/],\n});\n```\n\n## API Reference\n\n### `installErrorReporter(options)`\n\nInstalls the error reporter and returns an instance that can be destroyed.\n\n#### Options\n\n```typescript\ninterface ErrorReporterOptions {\n  onReport: (event: BrowserLogEvent) => void;\n  onCleanRun?: (sessionId: string) => void;\n  captureLevels?: Array<'log' | 'warn' | 'error'>;\n  ignorePatterns?: RegExp[];\n  cleanRunTimeoutMs?: number;\n  includeUnhandledRejections?: boolean;\n  contextProvider?: () => Record<string, any>;\n}\n```\n\n#### `BrowserLogEvent`\n\n```typescript\ninterface BrowserLogEvent {\n  level: 'log' | 'warn' | 'error' | 'exception';\n  message: string;\n  stack?: string;\n  source?: string;\n  lineno?: number;\n  colno?: number;\n  url: string;\n  timestamp: number;\n  context?: Record<string, any>;\n}\n```\n\n## Examples\n\n### Basic Usage\n\n```typescript\nimport { installErrorReporter } from '@6digit/browser-error-reporter';\n\ninstallErrorReporter({\n  onReport: (event) => {\n    console.log('Error captured:', event);\n  },\n});\n```\n\n### With Convex\n\n```typescript\nimport { api } from '../convex/_generated/api';\nimport { useMutation } from 'convex/react';\n\nconst logError = useMutation(api.errors.log);\nconst markClean = useMutation(api.errors.clean);\n\ninstallErrorReporter({\n  onReport: (e) => logError(e),\n  onCleanRun: (sessionId) => markClean({ sessionId }),\n});\n```\n\n### With Custom Context\n\n```typescript\nimport { installErrorReporter } from '@6digit/browser-error-reporter';\n\ninstallErrorReporter({\n  onReport: (event) => {\n    // Send to Sentry or similar service\n    Sentry.captureException({\n      message: event.message,\n      stack: event.stack,\n      extra: {\n        level: event.level,\n        context: event.context,\n      },\n    });\n  },\n  contextProvider: () => ({\n    userId: getCurrentUserId(),\n    route: window.location.pathname,\n    version: APP_VERSION,\n  }),\n  captureLevels: ['error', 'warn', 'log'],\n});\n```\n\n### Copy Errors to Clipboard (Development)\n\n```typescript\nimport { installErrorReporter, createClipboardErrorHandler } from '@6digit/browser-error-reporter';\n\ninstallErrorReporter({\n  onReport: createClipboardErrorHandler({\n    formatError: (event) => {\n      return `[${new Date(event.timestamp).toLocaleTimeString()}] ${event.level.toUpperCase()}: ${event.message}${\n        event.stack ? '\\n\\n' + event.stack : ''\n      }`;\n    },\n    notification: 'Error copied!',\n    notificationDuration: 3000,\n    onlyWhenTabActive: true, // Only copy when tab is active (default: true)\n  }),\n  captureLevels: ['error', 'warn'],\n});\n```\n\n\n### Custom Clipboard Notification\n\n```typescript\nimport { installErrorReporter, createClipboardErrorHandler } from '@6digit/browser-error-reporter';\n\n// Create a custom notification element\nfunction showNotification(message: string, duration: number) {\n  const notification = document.createElement('div');\n  notification.textContent = message;\n  notification.style.cssText = `\n    position: fixed;\n    bottom: 20px;\n    right: 20px;\n    background: #4CAF50;\n    color: white;\n    padding: 12px 20px;\n    border-radius: 4px;\n    box-shadow: 0 2px 10px rgba(0,0,0,0.2);\n    z-index: 9999;\n    font-family: monospace;\n    font-size: 14px;\n  `;\n  \n  document.body.appendChild(notification);\n  \n  setTimeout(() => {\n    notification.style.opacity = '0';\n    notification.style.transition = 'opacity 0.3s';\n    setTimeout(() => notification.remove(), 300);\n  }, duration);\n}\n\ninstallErrorReporter({\n  onReport: createClipboardErrorHandler({\n    customNotification: showNotification,\n    notificationDuration: 2000,\n    onlyWhenTabActive: true, // Only copy when tab is active (default: true)\n  }),\n  captureLevels: ['error'],\n});\n```\n\n## Advanced Configuration\n\n### Filtering Errors\n\n```typescript\ninstallErrorReporter({\n  onReport: (event) => {\n    // Handle error\n  },\n  ignorePatterns: [\n    /ResizeObserver loop limit exceeded/,\n    /Warning:.*deprecated/,\n    /Script error/,\n  ],\n});\n```\n\n### Custom Clean Run Timeout\n\n```typescript\ninstallErrorReporter({\n  onReport: (event) => {\n    // Handle error\n  },\n  onCleanRun: (sessionId) => {\n    // Handle clean run\n  },\n  cleanRunTimeoutMs: 15000, // 15 seconds\n});\n```\n\n### Disabling Unhandled Rejections\n\n```typescript\ninstallErrorReporter({\n  onReport: (event) => {\n    // Handle error\n  },\n  includeUnhandledRejections: false,\n});\n```\n\n### Promoting Logs Between Levels\n\nYou can define patterns to match in log messages and promote them to different log levels. This is useful for detecting important logs that should be treated with higher or lower priority.\n\n```typescript\ninstallErrorReporter({\n  onReport: (event) => {\n    // Handle promoted logs the same as regular logs\n    sendToMonitoringService(event);\n  },\n  promotionPatterns: [\n    {\n      // Match Convex error logs and promote to exceptions\n      pattern: /\\[CONVEX.*?\\]\\s*\\[ERROR\\]/,\n      promotionLevel: 'exception',\n      messageExtractor: (match) => {\n        return `Convex Exception Detected: ${match[0]}`;\n      },\n      contextExtractor: (match) => ({\n        service: 'convex',\n        originalLog: match[0]\n      })\n    },\n    {\n      // Match specific error patterns and promote to errors\n      pattern: /TypeError:.*?is not a function/,\n      promotionLevel: 'error',\n      contextExtractor: (match) => ({\n        errorType: 'TypeError',\n        functionName: match[1] || 'unknown'\n      })\n    },\n    {\n      // Match warnings and promote them to errors\n      pattern: /DEPRECATED:.*?/,\n      promotionLevel: 'error',\n      messageExtractor: (match) => {\n        return `DEPRECATION ERROR: ${match[0]}`;\n      }\n    },\n    {\n      // Match debug info and promote to warnings\n      pattern: /Slow query detected.*?/,\n      promotionLevel: 'warn',\n      contextExtractor: (match) => ({\n        performance: true,\n        queryTime: match[1]\n      })\n    }\n  ],\n});\n```\n\n#### Pattern Configuration Options\n\n- **pattern**: Regular expression to match against log messages\n- **promotionLevel**: Level to promote to ('log', 'warn', 'error', or 'exception'). Defaults to 'error'\n- **messageExtractor**: Function to extract a custom message from the regex match\n- **contextExtractor**: Function to extract additional context from the regex match\n\n#### Example Use Cases\n\n1. **Convex Exception Detection**:\n```typescript\n{\n  pattern: /\\[CONVEX.*?\\]\\s*\\[ERROR\\]/,\n  promotionLevel: 'exception',\n  contextExtractor: (match) => ({\n    service: 'convex',\n    severity: 'error'\n  })\n}\n```\n\n2. **API Error Detection**:\n```typescript\n{\n  pattern: /API Error \\d{3}:/,\n  promotionLevel: 'error',\n  contextExtractor: (match) => ({\n    apiError: true,\n    statusCode: match[1]\n  })\n}\n```\n\n3. **Performance Warning Detection**:\n```typescript\n{\n  pattern: /Slow query detected.*?(\\d+)ms/,\n  promotionLevel: 'warn',\n  contextExtractor: (match) => ({\n    performance: true,\n    queryTime: match[1],\n    category: 'slow-query'\n  })\n}\n```\n\n4. **Security Log Detection**:\n```typescript\n{\n  pattern: /Failed login attempt.*?from (\\d+\\.\\d+\\.\\d+\\.\\d+)/,\n  promotionLevel: 'error',\n  contextExtractor: (match) => ({\n    security: true,\n    ip: match[1],\n    category: 'authentication-failure'\n  })\n}\n```\n\n5. **Debug to Warning Promotion**:\n```typescript\n{\n  pattern: /Cache miss for key: (.*)/,\n  promotionLevel: 'warn',\n  contextExtractor: (match) => ({\n    cache: true,\n    missingKey: match[1],\n    category: 'cache-performance'\n  })\n}\n```\n\n## Browser Support\n\n- Chrome 60+\n- Firefox 55+\n- Safari 12+\n- Edge 79+\n\n## Development\n\n```bash\n# Install dependencies\nnpm install\n\n# Build the package\nnpm run build\n\n# Run tests\nnpm test\n\n# Run tests in watch mode\nnpm run test:watch\n\n# Lint code\nnpm run lint\n```\n\n## License\n\nMIT","readmeFilename":"README.md"}