@uncaughtdev/core 0.1.1 → 0.2.0

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 (52) hide show
  1. package/README.md +44 -3
  2. package/dist/chunk-2YXXFGBV.js +2 -0
  3. package/dist/chunk-2YXXFGBV.js.map +1 -0
  4. package/dist/chunk-3FCDO7OR.mjs +23 -0
  5. package/dist/chunk-3FCDO7OR.mjs.map +1 -0
  6. package/dist/chunk-A6GKDPT3.mjs +2 -0
  7. package/dist/chunk-A6GKDPT3.mjs.map +1 -0
  8. package/dist/chunk-BXMN7NW4.mjs +2 -0
  9. package/dist/chunk-BXMN7NW4.mjs.map +1 -0
  10. package/dist/chunk-HANXURHX.mjs +59 -0
  11. package/dist/chunk-HANXURHX.mjs.map +1 -0
  12. package/dist/chunk-MSUAXLMV.js +2 -0
  13. package/dist/chunk-MSUAXLMV.js.map +1 -0
  14. package/dist/chunk-VQXSHR3C.js +59 -0
  15. package/dist/chunk-VQXSHR3C.js.map +1 -0
  16. package/dist/chunk-WZBG5VLB.js +23 -0
  17. package/dist/chunk-WZBG5VLB.js.map +1 -0
  18. package/dist/index.d.mts +64 -3
  19. package/dist/index.d.ts +64 -3
  20. package/dist/index.js +7 -26
  21. package/dist/index.js.map +1 -1
  22. package/dist/index.mjs +7 -26
  23. package/dist/index.mjs.map +1 -1
  24. package/dist/local-api-handler-pages.js +1 -1
  25. package/dist/local-api-handler-pages.js.map +1 -1
  26. package/dist/local-api-handler-pages.mjs +1 -1
  27. package/dist/local-api-handler-pages.mjs.map +1 -1
  28. package/dist/local-api-handler.d.mts +1 -1
  29. package/dist/local-api-handler.d.ts +1 -1
  30. package/dist/local-api-handler.js +1 -1
  31. package/dist/local-api-handler.mjs +1 -1
  32. package/dist/local-viewer.js +432 -46
  33. package/dist/local-viewer.js.map +1 -1
  34. package/dist/local-viewer.mjs +432 -46
  35. package/dist/local-viewer.mjs.map +1 -1
  36. package/dist/mcp-server.d.mts +1 -0
  37. package/dist/mcp-server.d.ts +1 -0
  38. package/dist/mcp-server.js +22 -0
  39. package/dist/mcp-server.js.map +1 -0
  40. package/dist/mcp-server.mjs +22 -0
  41. package/dist/mcp-server.mjs.map +1 -0
  42. package/dist/sqlite-store-4FTNST7O.js +2 -0
  43. package/dist/sqlite-store-4FTNST7O.js.map +1 -0
  44. package/dist/sqlite-store-TEXDAAOM.mjs +2 -0
  45. package/dist/sqlite-store-TEXDAAOM.mjs.map +1 -0
  46. package/dist/{types-CjgYXVc_.d.mts → types-D1Fw4k-D.d.mts} +12 -1
  47. package/dist/{types-CjgYXVc_.d.ts → types-D1Fw4k-D.d.ts} +12 -1
  48. package/package.json +9 -2
  49. package/dist/chunk-FFHQ452Q.js +0 -2
  50. package/dist/chunk-FFHQ452Q.js.map +0 -1
  51. package/dist/chunk-JALIO2BZ.mjs +0 -2
  52. package/dist/chunk-JALIO2BZ.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/breadcrumbs.ts","../src/sanitizer.ts","../src/fingerprint.ts","../src/rate-limiter.ts","../src/env-detector.ts","../src/prompt-builder.ts","../src/transport.ts","../src/client.ts"],"names":["createBreadcrumbStore","capacity","buffer","head","size","crumb","entry","isoTimestamp","result","start","idx","n","count","i","DEFAULT_SENSITIVE_KEYS","SENSITIVE_HEADERS","REDACTED","MAX_STRING_LENGTH","buildKeyPattern","additionalKeys","escaped","k","sanitize","obj","pattern","seen","walk","value","key","item","generateFingerprint","error","normalisedMessage","normaliseMessage","frames","extractTopFrames","input","djb2","msg","stack","lines","line","trimmed","v8Match","fn","file","normalisePath","smMatch","p","str","hash","createRateLimiter","globalMax","perFingerprintMax","buckets","globalTimestamps","prune","timestamps","now","cutoff","fingerprint","fpTimestamps","ts","cached","detectEnvironment","info","isBrowser","detectNodeOS","ua","browserInfo","parseBrowserUA","parseOS","detectDeviceType","detectFramework","platform","patterns","name","regex","match","width","buildFixPrompt","event","sections","location","extractLocation","l","formatOperation","formatRequest","formatBreadcrumbs","formatEnvironment","v8","sm","op","req","crumbs","recent","time","formatTime","iso","d","h","m","s","env","entries","label","createTransport","config","createConsoleTransport","createRemoteTransport","createLocalTransport","_config","title","createLocalFileTransport","createLocalClientTransport","fsPromises","pathModule","baseDir","initialised","init","fs","path","ensureGitignore","gitignorePath","content","fp","eventDir","eventFile","eventPath","tmpEventPath","safeStringify","latestPath","tmpLatestPath","promptFile","promptPath","tmpPromptPath","updateIssuesIndex","indexPath","issues","raw","existing","userId","tmpIndexPath","queue","consoleFallback","postEvents","events","res","ok","batch","endpoint","projectKey","maxRetries","batchSize","flushIntervalMs","flushTimer","stopped","backoffDelays","sendBatch","attempt","retryAfter","sleep","startFlushing","registerBeacon","payload","ms","resolve","SDK_NAME","SDK_VERSION","_client","initUncaught","UncaughtClient","getClient","generateUUID","context","errorInfo","normaliseError","environment","eventId","err","message","level","user","args"],"mappings":"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","file":"index.mjs","sourcesContent":["// ---------------------------------------------------------------------------\n// @uncaughtdev/core — breadcrumb ring-buffer store\n// ---------------------------------------------------------------------------\n\nimport type { Breadcrumb, BreadcrumbStore } from './types';\nimport { isoTimestamp } from './utils';\n\n/**\n * Create a fixed-capacity ring-buffer store for breadcrumbs.\n *\n * - O(1) `add`\n * - Oldest entries are silently overwritten when capacity is reached.\n * - Returned arrays are always copies — callers cannot mutate internal state.\n *\n * @param capacity Maximum breadcrumbs retained. Defaults to 20.\n */\nexport function createBreadcrumbStore(capacity: number = 20): BreadcrumbStore {\n const buffer: Array<Breadcrumb | undefined> = new Array(capacity);\n let head = 0; // next write index\n let size = 0; // current number of entries\n\n const store: BreadcrumbStore = {\n add(crumb: Omit<Breadcrumb, 'timestamp'>): void {\n const entry: Breadcrumb = {\n ...crumb,\n timestamp: isoTimestamp(),\n };\n\n buffer[head] = entry;\n head = (head + 1) % capacity;\n\n if (size < capacity) {\n size++;\n }\n },\n\n getAll(): Breadcrumb[] {\n if (size === 0) return [];\n\n const result: Breadcrumb[] = [];\n\n // The oldest entry sits at `(head - size + capacity) % capacity`\n const start = (head - size + capacity) % capacity;\n\n for (let i = 0; i < size; i++) {\n const idx = (start + i) % capacity;\n const entry = buffer[idx];\n if (entry) {\n // Return a shallow copy so callers cannot mutate internal data.\n result.push({ ...entry });\n }\n }\n\n return result;\n },\n\n getLast(n: number): Breadcrumb[] {\n if (n <= 0 || size === 0) return [];\n\n const count = Math.min(n, size);\n const result: Breadcrumb[] = [];\n\n // Walk backwards from the most recent entry.\n for (let i = 0; i < count; i++) {\n const idx = (head - 1 - i + capacity) % capacity;\n const entry = buffer[idx];\n if (entry) {\n result.unshift({ ...entry });\n }\n }\n\n return result;\n },\n\n clear(): void {\n buffer.fill(undefined);\n head = 0;\n size = 0;\n },\n };\n\n return store;\n}\n","// ---------------------------------------------------------------------------\n// @uncaughtdev/core — PII / secret sanitizer\n// ---------------------------------------------------------------------------\n\n/** Default key patterns that are always redacted. */\nconst DEFAULT_SENSITIVE_KEYS: string[] = [\n 'password',\n 'passwd',\n 'secret',\n 'token',\n 'apikey',\n 'api_key',\n 'authorization',\n 'credit_card',\n 'creditcard',\n 'card_number',\n 'cvv',\n 'ssn',\n 'social_security',\n 'private_key',\n 'access_token',\n 'refresh_token',\n 'session_id',\n 'cookie',\n];\n\n/** Headers that are always stripped regardless of key matching. */\nconst SENSITIVE_HEADERS = new Set(['authorization', 'cookie', 'set-cookie']);\n\nconst REDACTED = '[REDACTED]';\nconst MAX_STRING_LENGTH = 2048;\n\n/**\n * Build a single RegExp that matches any of the sensitive key patterns\n * (case-insensitive).\n */\nfunction buildKeyPattern(additionalKeys: string[] = []): RegExp {\n const all = [...DEFAULT_SENSITIVE_KEYS, ...additionalKeys];\n // Escape special regex characters in user-supplied keys\n const escaped = all.map((k) => k.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\n return new RegExp(escaped.join('|'), 'i');\n}\n\n/**\n * Deep-clone and sanitise `obj`, redacting values whose keys match\n * sensitive patterns.\n *\n * - Handles circular references (returns `\"[Circular]\"`).\n * - Truncates strings longer than 2 048 characters.\n * - Never mutates the original object.\n *\n * @param obj - The value to sanitise.\n * @param additionalKeys - Extra key patterns to redact on top of the defaults.\n */\nexport function sanitize<T>(obj: T, additionalKeys?: string[]): T {\n const pattern = buildKeyPattern(additionalKeys);\n const seen = new WeakSet();\n\n function walk(value: unknown, key?: string): unknown {\n // Redact if the current key is sensitive\n if (key && pattern.test(key)) {\n return REDACTED;\n }\n\n // Primitives\n if (value === null || value === undefined) return value;\n\n if (typeof value === 'string') {\n return value.length > MAX_STRING_LENGTH\n ? value.slice(0, MAX_STRING_LENGTH) + '...[truncated]'\n : value;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'bigint') {\n return value.toString();\n }\n\n if (typeof value === 'function' || typeof value === 'symbol') {\n return undefined;\n }\n\n // Dates — return ISO string\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n // Arrays\n if (Array.isArray(value)) {\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n const result = value.map((item) => walk(item));\n seen.delete(value);\n return result;\n }\n\n // Plain objects\n if (typeof value === 'object') {\n if (seen.has(value as object)) return '[Circular]';\n seen.add(value as object);\n\n const result: Record<string, unknown> = {};\n\n for (const k of Object.keys(value as Record<string, unknown>)) {\n // Always strip sensitive headers\n if (SENSITIVE_HEADERS.has(k.toLowerCase())) {\n result[k] = REDACTED;\n continue;\n }\n\n result[k] = walk((value as Record<string, unknown>)[k], k);\n }\n\n seen.delete(value as object);\n return result;\n }\n\n return value;\n }\n\n return walk(obj) as T;\n}\n","// ---------------------------------------------------------------------------\n// @uncaughtdev/core — error fingerprinting\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a stable fingerprint for an error so that duplicate occurrences\n * of the same bug are grouped together.\n *\n * The fingerprint is an 8-character hex string derived from:\n * 1. The normalised error message (volatile parts stripped).\n * 2. The top 3 stack frames (file + function name, no line/col numbers).\n *\n * @param error - An object with at least `message` and optionally `stack` and `type`.\n */\nexport function generateFingerprint(error: {\n message?: string;\n type?: string;\n stack?: string;\n}): string {\n const normalisedMessage = normaliseMessage(error.message ?? '');\n const frames = extractTopFrames(error.stack ?? '', 3);\n const input = [error.type ?? 'Error', normalisedMessage, ...frames].join(\n '\\n'\n );\n return djb2(input);\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Strip volatile substrings from an error message so that trivially-different\n * occurrences of the same bug hash identically.\n */\nfunction normaliseMessage(msg: string): string {\n return (\n msg\n // UUIDs (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)\n .replace(\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n '<UUID>'\n )\n // Hex strings (8+ hex chars in a row)\n .replace(/\\b[0-9a-f]{8,}\\b/gi, '<HEX>')\n // Numbers longer than 3 digits\n .replace(/\\b\\d{4,}\\b/g, '<NUM>')\n // ISO timestamps\n .replace(\n /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}[.\\d]*Z?/g,\n '<TIMESTAMP>'\n )\n // Hashed file paths — replace the hash portion (e.g. chunk-abc123.js → chunk-<HASH>.js)\n .replace(\n /([/\\\\])[a-zA-Z0-9_-]+[-.]([a-f0-9]{6,})\\.(js|ts|mjs|cjs|jsx|tsx)/g,\n '$1<FILE>.$3'\n )\n .trim()\n );\n}\n\n/**\n * Extract the top N stack frames as normalised \"file:function\" strings.\n * Line and column numbers are intentionally omitted so that minor code\n * changes do not alter the fingerprint.\n */\nfunction extractTopFrames(stack: string, count: number): string[] {\n if (!stack) return [];\n\n const lines = stack.split('\\n');\n const frames: string[] = [];\n\n for (const line of lines) {\n if (frames.length >= count) break;\n\n const trimmed = line.trim();\n\n // V8 format: \" at FunctionName (file:line:col)\"\n // or \" at file:line:col\"\n const v8Match = trimmed.match(\n /at\\s+(?:(.+?)\\s+\\()?(?:(.+?):\\d+:\\d+)\\)?/\n );\n if (v8Match) {\n const fn = v8Match[1] || '<anonymous>';\n const file = normalisePath(v8Match[2] || '<unknown>');\n frames.push(`${file}:${fn}`);\n continue;\n }\n\n // SpiderMonkey / JavaScriptCore: \"functionName@file:line:col\"\n const smMatch = trimmed.match(/^(.+?)@(.+?):\\d+:\\d+/);\n if (smMatch) {\n const fn = smMatch[1] || '<anonymous>';\n const file = normalisePath(smMatch[2] || '<unknown>');\n frames.push(`${file}:${fn}`);\n continue;\n }\n }\n\n return frames;\n}\n\n/**\n * Normalise a file path by stripping query strings / hashes and collapsing\n * absolute filesystem prefixes.\n */\nfunction normalisePath(p: string): string {\n return p\n .replace(/[?#].*$/, '') // strip query / hash\n .replace(/^.*\\/node_modules\\//, 'node_modules/') // collapse deep paths\n .replace(/^(https?:\\/\\/[^/]+)/, '') // strip origin in URLs\n .replace(/^.*[/\\\\]/, ''); // keep only filename\n}\n\n/**\n * DJB2 hash → 8-character lowercase hex string.\n */\nfunction djb2(str: string): string {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n // hash * 33 + char\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;\n }\n // Convert to unsigned 32-bit then to 8-char hex\n return (hash >>> 0).toString(16).padStart(8, '0');\n}\n","// ---------------------------------------------------------------------------\n// @uncaughtdev/core — sliding-window rate limiter\n// ---------------------------------------------------------------------------\n\n/** Window duration in milliseconds (60 seconds). */\nconst WINDOW_MS = 60_000;\n\nexport interface RateLimiter {\n /**\n * Returns `true` if the event identified by `fingerprint` is allowed\n * through, `false` if it should be dropped.\n */\n shouldAllow(fingerprint: string): boolean;\n}\n\n/**\n * Create a rate limiter that enforces:\n * - A global maximum of `globalMax` events per 60-second window.\n * - A per-fingerprint maximum of `perFingerprintMax` events per 60-second window.\n *\n * Stale timestamps are lazily cleaned on every call to `shouldAllow`.\n *\n * @param globalMax Max events across all fingerprints. Defaults to 30.\n * @param perFingerprintMax Max events for a single fingerprint. Defaults to 5.\n */\nexport function createRateLimiter(\n globalMax: number = 30,\n perFingerprintMax: number = 5\n): RateLimiter {\n /** Per-fingerprint timestamp arrays. */\n const buckets = new Map<string, number[]>();\n /** Global timestamp array. */\n let globalTimestamps: number[] = [];\n\n /**\n * Remove timestamps older than the sliding window from an array (in-place)\n * and return the pruned array.\n */\n function prune(timestamps: number[], now: number): number[] {\n const cutoff = now - WINDOW_MS;\n // Find the first index that is within the window\n let start = 0;\n while (start < timestamps.length && timestamps[start] <= cutoff) {\n start++;\n }\n if (start > 0) {\n timestamps.splice(0, start);\n }\n return timestamps;\n }\n\n return {\n shouldAllow(fingerprint: string): boolean {\n const now = Date.now();\n\n // --- Global limit ---\n globalTimestamps = prune(globalTimestamps, now);\n if (globalTimestamps.length >= globalMax) {\n return false;\n }\n\n // --- Per-fingerprint limit ---\n let fpTimestamps = buckets.get(fingerprint);\n if (!fpTimestamps) {\n fpTimestamps = [];\n buckets.set(fingerprint, fpTimestamps);\n }\n prune(fpTimestamps, now);\n\n if (fpTimestamps.length >= perFingerprintMax) {\n return false;\n }\n\n // Record this event\n globalTimestamps.push(now);\n fpTimestamps.push(now);\n\n // Periodic cleanup: remove empty buckets to prevent unbounded memory growth\n if (buckets.size > 1000) {\n for (const [key, ts] of buckets) {\n if (ts.length === 0) {\n buckets.delete(key);\n }\n }\n }\n\n return true;\n },\n };\n}\n","// ---------------------------------------------------------------------------\n// @uncaughtdev/core — runtime / platform environment detector\n// ---------------------------------------------------------------------------\n\nimport type { EnvironmentInfo } from './types';\n\n/** Cached result so detection only runs once per process / page-load. */\nlet cached: EnvironmentInfo | undefined;\n\n/**\n * Detect the current runtime environment.\n *\n * - SSR-safe: every global access is guarded.\n * - Result is cached after the first invocation.\n */\nexport function detectEnvironment(): EnvironmentInfo {\n if (cached) return cached;\n\n const info: EnvironmentInfo = {};\n\n try {\n const isBrowser =\n typeof window !== 'undefined' && typeof document !== 'undefined';\n const isNode =\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null;\n\n // ----- Runtime ---------------------------------------------------------\n if (isNode) {\n info.runtime = 'node';\n info.runtimeVersion = process.versions.node;\n info.platform = process.platform;\n info.os = detectNodeOS();\n } else if (isBrowser) {\n info.runtime = 'browser';\n info.platform = 'web';\n\n const ua = navigator?.userAgent ?? '';\n const browserInfo = parseBrowserUA(ua);\n info.browser = browserInfo.name;\n info.browserVersion = browserInfo.version;\n info.os = parseOS(ua);\n info.deviceType = detectDeviceType();\n info.url = location?.href;\n info.locale = navigator?.language;\n info.timezone = Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone;\n }\n\n // ----- Framework detection (works in both Node & browser) ---------------\n detectFramework(info);\n } catch {\n // Silent — environment detection must never throw.\n }\n\n cached = info;\n return info;\n}\n\n/**\n * Reset the cached environment (useful for testing).\n */\nexport function resetEnvironmentCache(): void {\n cached = undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction detectNodeOS(): string | undefined {\n try {\n const platform = process.platform;\n const map: Record<string, string> = {\n darwin: 'macOS',\n win32: 'Windows',\n linux: 'Linux',\n freebsd: 'FreeBSD',\n sunos: 'SunOS',\n };\n return map[platform] ?? platform;\n } catch {\n return undefined;\n }\n}\n\ninterface BrowserInfo {\n name?: string;\n version?: string;\n}\n\nfunction parseBrowserUA(ua: string): BrowserInfo {\n // Order matters — check more specific browsers first.\n const patterns: Array<{ name: string; regex: RegExp }> = [\n { name: 'Edge', regex: /Edg(?:e|A|iOS)?\\/(\\d+[\\d.]*)/ },\n { name: 'Opera', regex: /(?:OPR|Opera)\\/(\\d+[\\d.]*)/ },\n { name: 'Samsung Internet', regex: /SamsungBrowser\\/(\\d+[\\d.]*)/ },\n { name: 'UC Browser', regex: /UCBrowser\\/(\\d+[\\d.]*)/ },\n { name: 'Firefox', regex: /Firefox\\/(\\d+[\\d.]*)/ },\n { name: 'Chrome', regex: /Chrome\\/(\\d+[\\d.]*)/ },\n { name: 'Safari', regex: /Version\\/(\\d+[\\d.]*).*Safari/ },\n ];\n\n for (const { name, regex } of patterns) {\n const match = ua.match(regex);\n if (match) {\n return { name, version: match[1] };\n }\n }\n\n return {};\n}\n\nfunction parseOS(ua: string): string | undefined {\n if (/Windows/i.test(ua)) return 'Windows';\n if (/Mac OS X|macOS/i.test(ua)) return 'macOS';\n if (/Android/i.test(ua)) return 'Android';\n if (/iPhone|iPad|iPod/i.test(ua)) return 'iOS';\n if (/Linux/i.test(ua)) return 'Linux';\n if (/CrOS/i.test(ua)) return 'ChromeOS';\n return undefined;\n}\n\nfunction detectDeviceType(): string | undefined {\n try {\n if (typeof window === 'undefined') return undefined;\n\n const width = window.screen?.width ?? window.innerWidth;\n\n if (width <= 480) return 'mobile';\n if (width <= 1024) return 'tablet';\n return 'desktop';\n } catch {\n return undefined;\n }\n}\n\nfunction detectFramework(info: EnvironmentInfo): void {\n try {\n // ----- Browser-side markers -------------------------------------------\n if (typeof window !== 'undefined') {\n // Next.js injects __NEXT_DATA__\n if ((window as any).__NEXT_DATA__) {\n info.framework = 'next';\n info.frameworkVersion =\n (window as any).__NEXT_DATA__?.buildId ?? undefined;\n }\n // Remix injects __remixContext\n else if ((window as any).__remixContext) {\n info.framework = 'remix';\n }\n // Nuxt injects __NUXT__\n else if ((window as any).__NUXT__) {\n info.framework = 'nuxt';\n }\n }\n\n // ----- Node-side markers -----------------------------------------------\n if (\n typeof process !== 'undefined' &&\n process.env != null\n ) {\n // Framework env vars set during SSR / server build\n if (!info.framework) {\n if (process.env.__NEXT_PRIVATE_ORIGIN !== undefined || process.env.NEXT_RUNTIME) {\n info.framework = 'next';\n } else if (process.env.REMIX_DEV_ORIGIN !== undefined) {\n info.framework = 'remix';\n }\n }\n\n // Hosting platform markers\n if (process.env.VERCEL) {\n info.platform = info.platform ?? 'vercel';\n } else if (process.env.RAILWAY_PROJECT_ID) {\n info.platform = info.platform ?? 'railway';\n } else if (process.env.FLY_APP_NAME) {\n info.platform = info.platform ?? 'fly';\n } else if (process.env.AWS_LAMBDA_FUNCTION_NAME) {\n info.platform = info.platform ?? 'aws-lambda';\n } else if (process.env.GOOGLE_CLOUD_PROJECT) {\n info.platform = info.platform ?? 'gcp';\n }\n }\n\n // ----- Vite (import.meta.env) ------------------------------------------\n try {\n if (typeof (import.meta as any)?.env?.VITE_USER_NODE_ENV !== 'undefined') {\n if (!info.framework) {\n info.framework = 'vite';\n }\n }\n } catch {\n // import.meta may not exist in CJS contexts\n }\n } catch {\n // Silent — never throw during detection.\n }\n}\n","// ---------------------------------------------------------------------------\n// @uncaughtdev/core — fix-prompt builder\n// ---------------------------------------------------------------------------\n\nimport type { UncaughtEvent, Breadcrumb, EnvironmentInfo, OperationInfo, RequestInfo } from './types';\n\n/**\n * Build a structured Markdown prompt that can be pasted into an AI assistant\n * to diagnose and fix the production error described by `event`.\n *\n * Empty sections are omitted to keep the prompt concise.\n */\nexport function buildFixPrompt(event: Partial<UncaughtEvent>): string {\n const sections: string[] = [];\n\n // ----- Intro -------------------------------------------------------------\n sections.push(\n 'I have a production bug in my application that I need help diagnosing and fixing.\\n'\n );\n\n // ----- Error -------------------------------------------------------------\n if (event.error) {\n const location = extractLocation(event.error.stack);\n const lines: string[] = ['## Error', ''];\n lines.push(`- **Type:** ${event.error.type || 'Error'}`);\n lines.push(`- **Message:** ${event.error.message || '(no message)'}`);\n if (location) {\n lines.push(`- **Location:** ${location}`);\n }\n sections.push(lines.join('\\n'));\n }\n\n // ----- Stack Trace -------------------------------------------------------\n if (event.error?.stack) {\n const frames = event.error.stack\n .split('\\n')\n .slice(0, 15)\n .map((l) => l.trimEnd())\n .join('\\n');\n sections.push(`## Stack Trace\\n\\n\\`\\`\\`\\n${frames}\\n\\`\\`\\``);\n }\n\n // ----- Failed Operation --------------------------------------------------\n if (event.operation) {\n sections.push(formatOperation(event.operation));\n }\n\n // ----- HTTP Request Context ----------------------------------------------\n if (event.request) {\n sections.push(formatRequest(event.request));\n }\n\n // ----- User Session (last 5 breadcrumbs) ---------------------------------\n if (event.breadcrumbs && event.breadcrumbs.length > 0) {\n sections.push(formatBreadcrumbs(event.breadcrumbs));\n }\n\n // ----- Environment -------------------------------------------------------\n if (event.environment) {\n sections.push(formatEnvironment(event.environment));\n }\n\n // ----- React Component Stack ---------------------------------------------\n if (event.error?.componentStack) {\n sections.push(\n `## React Component Stack\\n\\n\\`\\`\\`\\n${event.error.componentStack.trim()}\\n\\`\\`\\``\n );\n }\n\n // ----- What I need -------------------------------------------------------\n sections.push(\n [\n '## What I need',\n '',\n '1. **Root cause analysis** — explain why this error is occurring.',\n '2. **A fix** — provide the corrected code with an explanation of the changes.',\n '3. **Prevention** — suggest any guards or tests to prevent this from happening again.',\n ].join('\\n')\n );\n\n return sections.join('\\n\\n') + '\\n';\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Extract the top-most location (file:line:col) from a stack trace string.\n */\nfunction extractLocation(stack?: string): string | undefined {\n if (!stack) return undefined;\n\n for (const line of stack.split('\\n')) {\n const trimmed = line.trim();\n\n // V8: \" at fn (file:line:col)\"\n const v8 = trimmed.match(/at\\s+(?:.+?\\s+\\()?(.+?:\\d+:\\d+)\\)?/);\n if (v8) return v8[1];\n\n // SpiderMonkey / JSC: \"fn@file:line:col\"\n const sm = trimmed.match(/@(.+?:\\d+:\\d+)/);\n if (sm) return sm[1];\n }\n\n return undefined;\n}\n\nfunction formatOperation(op: OperationInfo): string {\n const lines: string[] = ['## Failed Operation', ''];\n lines.push(`- **Provider:** ${op.provider}`);\n lines.push(`- **Type:** ${op.type}`);\n lines.push(`- **Method:** ${op.method}`);\n if (op.params) {\n lines.push(`- **Params:**`);\n lines.push('```json');\n lines.push(JSON.stringify(op.params, null, 2));\n lines.push('```');\n }\n if (op.errorCode) {\n lines.push(`- **Error Code:** ${op.errorCode}`);\n }\n if (op.errorDetails) {\n lines.push(`- **Error Details:** ${op.errorDetails}`);\n }\n return lines.join('\\n');\n}\n\nfunction formatRequest(req: RequestInfo): string {\n const lines: string[] = ['## HTTP Request Context', ''];\n if (req.method) lines.push(`- **Method:** ${req.method}`);\n if (req.url) lines.push(`- **URL:** ${req.url}`);\n if (req.body) {\n lines.push(`- **Body:**`);\n lines.push('```json');\n lines.push(\n typeof req.body === 'string'\n ? req.body\n : JSON.stringify(req.body, null, 2)\n );\n lines.push('```');\n }\n return lines.join('\\n');\n}\n\nfunction formatBreadcrumbs(crumbs: Breadcrumb[]): string {\n // Take the last 5 breadcrumbs\n const recent = crumbs.slice(-5);\n const lines: string[] = ['## User Session', ''];\n\n for (const crumb of recent) {\n const time = formatTime(crumb.timestamp);\n lines.push(`- \\`${time}\\` **[${crumb.type}]** ${crumb.message}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Extract HH:MM:SS from an ISO timestamp.\n */\nfunction formatTime(iso: string): string {\n try {\n const d = new Date(iso);\n const h = String(d.getHours()).padStart(2, '0');\n const m = String(d.getMinutes()).padStart(2, '0');\n const s = String(d.getSeconds()).padStart(2, '0');\n return `${h}:${m}:${s}`;\n } catch {\n return iso;\n }\n}\n\nfunction formatEnvironment(env: EnvironmentInfo): string {\n const lines: string[] = ['## Environment', ''];\n const entries: Array<[string, string | undefined]> = [\n ['Framework', env.framework],\n ['Framework Version', env.frameworkVersion],\n ['Runtime', env.runtime],\n ['Runtime Version', env.runtimeVersion],\n ['Platform', env.platform],\n ['Browser', env.browser ? `${env.browser} ${env.browserVersion ?? ''}`.trim() : undefined],\n ['OS', env.os],\n ['Device', env.deviceType],\n ['Locale', env.locale],\n ['Timezone', env.timezone],\n ['URL', env.url],\n ];\n\n for (const [label, value] of entries) {\n if (value) {\n lines.push(`- **${label}:** ${value}`);\n }\n }\n\n return lines.join('\\n');\n}\n","// ---------------------------------------------------------------------------\n// @uncaughtdev/core — transport layer (console / local-file / remote)\n// ---------------------------------------------------------------------------\n\nimport type {\n Transport,\n UncaughtConfig,\n UncaughtEvent,\n IssueEntry,\n} from './types';\nimport { safeStringify } from './utils';\n\n// ===================================================================\n// Factory\n// ===================================================================\n\n/**\n * Create the appropriate transport strategy based on config.\n */\nexport function createTransport(config: UncaughtConfig): Transport {\n const mode = config.transport ?? 'local';\n\n switch (mode) {\n case 'console':\n return createConsoleTransport(config);\n case 'remote':\n return createRemoteTransport(config);\n case 'local':\n default:\n return createLocalTransport(config);\n }\n}\n\n// ===================================================================\n// Console Transport\n// ===================================================================\n\nfunction createConsoleTransport(_config: UncaughtConfig): Transport {\n return {\n send(event: UncaughtEvent): void {\n try {\n const title = `[uncaught] ${event.error.type}: ${event.error.message}`;\n\n if (typeof console.group === 'function') {\n console.group(title);\n } else {\n console.log(`--- ${title} ---`);\n }\n\n console.error('Error:', event.error.message);\n if (event.error.stack) {\n console.log('Stack:', event.error.stack);\n }\n console.log('Event ID:', event.eventId);\n console.log('Fingerprint:', event.fingerprint);\n console.log('Breadcrumbs:', event.breadcrumbs);\n\n if (event.fixPrompt) {\n console.log('Fix Prompt:\\n', event.fixPrompt);\n }\n\n if (typeof console.groupEnd === 'function') {\n console.groupEnd();\n }\n } catch {\n // Never throw from transport.\n }\n },\n\n async flush(): Promise<void> {\n // Nothing to flush for console transport.\n },\n };\n}\n\n// ===================================================================\n// Local File Transport\n// ===================================================================\n\n/**\n * The local transport behaves differently depending on whether `fs` is\n * available (server / Node.js) or not (browser).\n *\n * **Server:** writes events directly to the `.uncaught/` directory.\n * **Browser:** POSTs to `/api/uncaught/local` and falls back to console.\n */\nfunction createLocalTransport(config: UncaughtConfig): Transport {\n // Detect server vs browser at transport creation time.\n const isServer = typeof process !== 'undefined' && process.versions?.node != null;\n\n if (isServer) {\n return createLocalFileTransport(config);\n }\n\n return createLocalClientTransport(config);\n}\n\n// ---------------------------------------------------------------------------\n// Local File Transport (Server / Node.js)\n// ---------------------------------------------------------------------------\n\ninterface FsModule {\n mkdir: (path: string, options: { recursive: boolean }) => Promise<void>;\n writeFile: (path: string, data: string, encoding: string) => Promise<void>;\n readFile: (path: string, encoding: string) => Promise<string>;\n rename: (from: string, to: string) => Promise<void>;\n access: (path: string) => Promise<void>;\n appendFile: (path: string, data: string) => Promise<void>;\n}\n\ninterface PathModule {\n join: (...parts: string[]) => string;\n resolve: (...parts: string[]) => string;\n}\n\nfunction createLocalFileTransport(config: UncaughtConfig): Transport {\n let fsPromises: FsModule | undefined;\n let pathModule: PathModule | undefined;\n let baseDir: string = '';\n let initialised = false;\n\n async function init(): Promise<void> {\n if (initialised) return;\n\n // Dynamic imports so this module can still be loaded in browsers without\n // causing a hard crash at parse time.\n const fs = await import('fs/promises');\n const path = await import('path');\n fsPromises = fs as unknown as FsModule;\n pathModule = path as unknown as PathModule;\n\n baseDir = config.localOutputDir ?? pathModule.resolve(process.cwd(), '.uncaught');\n\n // Ensure directory structure\n await fsPromises.mkdir(pathModule.join(baseDir, 'events'), { recursive: true });\n await fsPromises.mkdir(pathModule.join(baseDir, 'fix-prompts'), { recursive: true });\n\n // Auto-add .uncaught/ to .gitignore\n await ensureGitignore(fsPromises, pathModule);\n\n initialised = true;\n }\n\n async function ensureGitignore(fs: FsModule, path: PathModule): Promise<void> {\n try {\n const gitignorePath = path.resolve(process.cwd(), '.gitignore');\n let content = '';\n try {\n content = await fs.readFile(gitignorePath, 'utf-8');\n } catch {\n // File doesn't exist yet — that's fine.\n }\n\n if (!content.includes('.uncaught')) {\n const line = '\\n# Uncaught local error store\\n.uncaught/\\n';\n await fs.appendFile(gitignorePath, line);\n }\n } catch {\n // Non-critical — swallow.\n }\n }\n\n return {\n async send(event: UncaughtEvent): Promise<void> {\n try {\n await init();\n if (!fsPromises || !pathModule) return;\n\n const fp = event.fingerprint;\n const eventDir = pathModule.join(baseDir, 'events', fp);\n await fsPromises.mkdir(eventDir, { recursive: true });\n\n // --- Write timestamped event file (atomic: .tmp → rename) ----------\n const ts = event.timestamp.replace(/[:.]/g, '-');\n const eventFile = `event-${ts}.json`;\n const eventPath = pathModule.join(eventDir, eventFile);\n const tmpEventPath = eventPath + '.tmp';\n await fsPromises.writeFile(tmpEventPath, safeStringify(event), 'utf-8');\n await fsPromises.rename(tmpEventPath, eventPath);\n\n // --- Write / overwrite latest.json ---------------------------------\n const latestPath = pathModule.join(eventDir, 'latest.json');\n const tmpLatestPath = latestPath + '.tmp';\n await fsPromises.writeFile(tmpLatestPath, safeStringify(event), 'utf-8');\n await fsPromises.rename(tmpLatestPath, latestPath);\n\n // --- Write fix-prompt Markdown file --------------------------------\n const promptFile = `${fp}.md`;\n const promptPath = pathModule.join(baseDir, 'fix-prompts', promptFile);\n const tmpPromptPath = promptPath + '.tmp';\n await fsPromises.writeFile(tmpPromptPath, event.fixPrompt, 'utf-8');\n await fsPromises.rename(tmpPromptPath, promptPath);\n\n // --- Update issues.json index -------------------------------------\n await updateIssuesIndex(\n fsPromises,\n pathModule,\n baseDir,\n event,\n eventFile,\n promptFile\n );\n } catch {\n // Never crash the host app.\n }\n },\n\n async flush(): Promise<void> {\n // Local file transport writes synchronously per-event; nothing to flush.\n },\n };\n}\n\n/**\n * Read, update, and atomically write the `issues.json` index.\n */\nasync function updateIssuesIndex(\n fs: FsModule,\n path: PathModule,\n baseDir: string,\n event: UncaughtEvent,\n eventFile: string,\n promptFile: string\n): Promise<void> {\n const indexPath = path.join(baseDir, 'issues.json');\n\n let issues: IssueEntry[] = [];\n try {\n const raw = await fs.readFile(indexPath, 'utf-8');\n issues = JSON.parse(raw) as IssueEntry[];\n } catch {\n // File doesn't exist or is malformed — start fresh.\n }\n\n const existing = issues.find((i) => i.fingerprint === event.fingerprint);\n const userId = event.user?.id ?? event.user?.email ?? 'anonymous';\n\n if (existing) {\n existing.count += 1;\n existing.lastSeen = event.timestamp;\n existing.latestEventFile = eventFile;\n existing.fixPromptFile = promptFile;\n if (!existing.affectedUsers.includes(userId)) {\n existing.affectedUsers.push(userId);\n }\n // Re-open if previously resolved\n if (existing.status === 'resolved') {\n existing.status = 'open';\n }\n } else {\n issues.push({\n fingerprint: event.fingerprint,\n title: event.error.message,\n errorType: event.error.type,\n count: 1,\n affectedUsers: [userId],\n firstSeen: event.timestamp,\n lastSeen: event.timestamp,\n status: 'open',\n fixPromptFile: promptFile,\n latestEventFile: eventFile,\n });\n }\n\n const tmpIndexPath = indexPath + '.tmp';\n await fs.writeFile(tmpIndexPath, JSON.stringify(issues, null, 2), 'utf-8');\n await fs.rename(tmpIndexPath, indexPath);\n}\n\n// ---------------------------------------------------------------------------\n// Local Client Transport (Browser → POST /api/uncaught/local)\n// ---------------------------------------------------------------------------\n\nfunction createLocalClientTransport(_config: UncaughtConfig): Transport {\n const queue: UncaughtEvent[] = [];\n const consoleFallback = createConsoleTransport(_config);\n\n async function postEvents(events: UncaughtEvent[]): Promise<boolean> {\n try {\n const res = await fetch('/api/uncaught/local', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: safeStringify({ events }),\n });\n\n return res.ok || res.status === 202;\n } catch {\n return false;\n }\n }\n\n return {\n send(event: UncaughtEvent): void {\n queue.push(event);\n\n // Attempt to send immediately\n postEvents([event]).then((ok) => {\n if (!ok) {\n // Fallback to console\n consoleFallback.send(event);\n }\n }).catch(() => {\n consoleFallback.send(event);\n });\n },\n\n async flush(): Promise<void> {\n if (queue.length === 0) return;\n\n const batch = queue.splice(0, queue.length);\n const ok = await postEvents(batch);\n if (!ok) {\n // Fallback: log remaining to console\n for (const event of batch) {\n consoleFallback.send(event);\n }\n }\n },\n };\n}\n\n// ===================================================================\n// Remote Transport\n// ===================================================================\n\nfunction createRemoteTransport(config: UncaughtConfig): Transport {\n const endpoint = config.endpoint ?? '';\n const projectKey = config.projectKey ?? '';\n const maxRetries = 3;\n const batchSize = 10;\n const flushIntervalMs = 5_000;\n\n const queue: UncaughtEvent[] = [];\n let flushTimer: ReturnType<typeof setInterval> | undefined;\n let stopped = false;\n\n // Backoff delays in ms for retries (1s, 2s, 4s)\n const backoffDelays = [1000, 2000, 4000];\n\n async function sendBatch(events: UncaughtEvent[]): Promise<void> {\n if (events.length === 0 || stopped) return;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(projectKey ? { 'X-Project-Key': projectKey } : {}),\n },\n body: safeStringify({ events }),\n });\n\n if (res.ok || res.status === 202) {\n return; // Success\n }\n\n if (res.status === 401) {\n // Unauthorized — stop sending entirely.\n stopped = true;\n if (flushTimer) clearInterval(flushTimer);\n return;\n }\n\n if (res.status === 429) {\n // Rate limited — use longer backoff\n const retryAfter = parseInt(\n res.headers?.get?.('Retry-After') ?? '10',\n 10\n );\n await sleep(retryAfter * 1000);\n continue;\n }\n\n // Other server errors — retry with backoff\n if (attempt < maxRetries) {\n await sleep(backoffDelays[attempt] ?? 4000);\n }\n } catch {\n // Network error — retry\n if (attempt < maxRetries) {\n await sleep(backoffDelays[attempt] ?? 4000);\n }\n }\n }\n // All retries exhausted — events are dropped silently.\n }\n\n function startFlushing(): void {\n if (flushTimer) return;\n flushTimer = setInterval(() => {\n if (queue.length > 0) {\n const batch = queue.splice(0, batchSize);\n sendBatch(batch).catch(() => {\n // Swallow — never crash.\n });\n }\n }, flushIntervalMs);\n\n // Ensure the timer does not prevent Node.js from exiting.\n if (typeof flushTimer === 'object' && 'unref' in flushTimer) {\n (flushTimer as { unref: () => void }).unref();\n }\n }\n\n // Register sendBeacon on page unload (browser only)\n function registerBeacon(): void {\n try {\n if (\n typeof window !== 'undefined' &&\n typeof navigator?.sendBeacon === 'function'\n ) {\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden' && queue.length > 0) {\n const payload = safeStringify({ events: queue.splice(0, queue.length) });\n navigator.sendBeacon(endpoint, payload);\n }\n });\n\n window.addEventListener('pagehide', () => {\n if (queue.length > 0) {\n const payload = safeStringify({ events: queue.splice(0, queue.length) });\n navigator.sendBeacon(endpoint, payload);\n }\n });\n }\n } catch {\n // Not in a browser — that's fine.\n }\n }\n\n startFlushing();\n registerBeacon();\n\n return {\n send(event: UncaughtEvent): void {\n if (stopped) return;\n\n queue.push(event);\n\n // Flush immediately if batch size reached\n if (queue.length >= batchSize) {\n const batch = queue.splice(0, batchSize);\n sendBatch(batch).catch(() => {\n // Swallow.\n });\n }\n },\n\n async flush(): Promise<void> {\n if (flushTimer) {\n clearInterval(flushTimer);\n flushTimer = undefined;\n }\n\n while (queue.length > 0) {\n const batch = queue.splice(0, batchSize);\n await sendBatch(batch);\n }\n },\n };\n}\n\n// ===================================================================\n// Helpers\n// ===================================================================\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","// ---------------------------------------------------------------------------\n// @uncaughtdev/core — UncaughtClient (SDK entry-point)\n// ---------------------------------------------------------------------------\n\nimport type {\n UncaughtConfig,\n UncaughtEvent,\n Breadcrumb,\n BreadcrumbStore,\n Transport,\n SeverityLevel,\n UserInfo,\n RequestInfo,\n OperationInfo,\n} from './types';\n\nimport { generateUUID, isoTimestamp } from './utils';\nimport { createBreadcrumbStore } from './breadcrumbs';\nimport { sanitize } from './sanitizer';\nimport { generateFingerprint } from './fingerprint';\nimport { createRateLimiter, type RateLimiter } from './rate-limiter';\nimport { detectEnvironment } from './env-detector';\nimport { buildFixPrompt } from './prompt-builder';\nimport { createTransport } from './transport';\n\nconst SDK_NAME = '@uncaughtdev/core';\nconst SDK_VERSION = '0.1.0';\n\n// ---------------------------------------------------------------------------\n// Module-level singleton\n// ---------------------------------------------------------------------------\n\nlet _client: UncaughtClient | undefined;\n\n/**\n * Initialise the Uncaught SDK. Calling this more than once replaces the\n * previous client instance.\n */\nexport function initUncaught(config: UncaughtConfig): UncaughtClient {\n _client = new UncaughtClient(config);\n return _client;\n}\n\n/**\n * Return the current singleton client, or `undefined` if `initUncaught` has\n * not been called.\n */\nexport function getClient(): UncaughtClient | undefined {\n return _client;\n}\n\n// ---------------------------------------------------------------------------\n// Client class\n// ---------------------------------------------------------------------------\n\nexport class UncaughtClient {\n private readonly config: Required<\n Pick<UncaughtConfig, 'enabled' | 'debug' | 'maxBreadcrumbs' | 'maxEventsPerMinute'>\n > &\n UncaughtConfig;\n\n private readonly breadcrumbs: BreadcrumbStore;\n private readonly transport: Transport;\n private readonly rateLimiter: RateLimiter;\n private readonly sessionId: string;\n private user: UserInfo | undefined;\n\n constructor(config: UncaughtConfig) {\n this.config = {\n enabled: true,\n debug: false,\n maxBreadcrumbs: 20,\n maxEventsPerMinute: 30,\n ...config,\n };\n\n this.breadcrumbs = createBreadcrumbStore(this.config.maxBreadcrumbs);\n this.transport = createTransport(this.config);\n this.rateLimiter = createRateLimiter(this.config.maxEventsPerMinute);\n this.sessionId = generateUUID();\n }\n\n // -----------------------------------------------------------------------\n // Public API\n // -----------------------------------------------------------------------\n\n /**\n * Capture an error and send it through the transport pipeline.\n *\n * @returns The event ID, or `undefined` if the event was dropped.\n */\n captureError(\n error: unknown,\n context?: {\n request?: RequestInfo;\n operation?: OperationInfo;\n componentStack?: string;\n level?: SeverityLevel;\n }\n ): string | undefined {\n try {\n if (!this.config.enabled) return undefined;\n\n // --- Normalise error -------------------------------------------------\n const errorInfo = normaliseError(error);\n\n if (context?.componentStack) {\n errorInfo.componentStack = context.componentStack;\n }\n\n // --- Check ignoreErrors ----------------------------------------------\n if (this.shouldIgnore(errorInfo.message)) {\n this.debugLog('Event ignored by ignoreErrors filter');\n return undefined;\n }\n\n // --- Fingerprint -----------------------------------------------------\n const fingerprint = generateFingerprint(errorInfo);\n\n // --- Rate limit ------------------------------------------------------\n if (!this.rateLimiter.shouldAllow(fingerprint)) {\n this.debugLog(`Rate-limited: ${fingerprint}`);\n return undefined;\n }\n\n // --- Collect breadcrumbs ---------------------------------------------\n const crumbs = this.breadcrumbs.getAll();\n\n // --- Detect environment ----------------------------------------------\n const environment = detectEnvironment();\n\n // --- Build event -----------------------------------------------------\n const eventId = generateUUID();\n let event: UncaughtEvent = {\n eventId,\n timestamp: isoTimestamp(),\n projectKey: this.config.projectKey,\n level: context?.level ?? 'error',\n fingerprint,\n error: errorInfo,\n breadcrumbs: crumbs,\n request: context?.request,\n operation: context?.operation,\n environment,\n user: this.user\n ? { ...this.user, sessionId: this.sessionId }\n : { sessionId: this.sessionId },\n fixPrompt: '', // will be set below\n sdk: { name: SDK_NAME, version: SDK_VERSION },\n };\n\n // --- Sanitise --------------------------------------------------------\n event = sanitize(event, this.config.sanitizeKeys) as UncaughtEvent;\n\n // --- Build fix prompt ------------------------------------------------\n event.fixPrompt = buildFixPrompt(event);\n\n // --- beforeSend hook -------------------------------------------------\n if (this.config.beforeSend) {\n const result = this.config.beforeSend(event);\n if (result === null) {\n this.debugLog('Event dropped by beforeSend');\n return undefined;\n }\n event = result;\n }\n\n // --- Send ------------------------------------------------------------\n this.transport.send(event);\n this.debugLog(`Captured event: ${eventId} (${fingerprint})`);\n return eventId;\n } catch (err) {\n this.debugLog('captureError failed:', err);\n return undefined;\n }\n }\n\n /**\n * Capture a plain message (not backed by an Error instance).\n */\n captureMessage(\n message: string,\n level: SeverityLevel = 'info'\n ): string | undefined {\n try {\n return this.captureError(new Error(message), { level });\n } catch (err) {\n this.debugLog('captureMessage failed:', err);\n return undefined;\n }\n }\n\n /**\n * Add a breadcrumb to the ring buffer.\n */\n addBreadcrumb(crumb: Omit<Breadcrumb, 'timestamp'>): void {\n try {\n if (!this.config.enabled) return;\n this.breadcrumbs.add(crumb);\n } catch (err) {\n this.debugLog('addBreadcrumb failed:', err);\n }\n }\n\n /**\n * Set user context that will be attached to subsequent events.\n */\n setUser(user: UserInfo | undefined): void {\n try {\n this.user = user ? { ...user } : undefined;\n } catch (err) {\n this.debugLog('setUser failed:', err);\n }\n }\n\n /**\n * Flush all queued events to the transport.\n */\n async flush(): Promise<void> {\n try {\n await this.transport.flush();\n } catch (err) {\n this.debugLog('flush failed:', err);\n }\n }\n\n // -----------------------------------------------------------------------\n // Internal helpers\n // -----------------------------------------------------------------------\n\n private shouldIgnore(message: string): boolean {\n const patterns = this.config.ignoreErrors;\n if (!patterns || patterns.length === 0) return false;\n\n for (const pattern of patterns) {\n if (typeof pattern === 'string') {\n if (message.includes(pattern)) return true;\n } else if (pattern instanceof RegExp) {\n if (pattern.test(message)) return true;\n }\n }\n\n return false;\n }\n\n private debugLog(...args: unknown[]): void {\n if (this.config.debug) {\n try {\n console.debug('[uncaught]', ...args);\n } catch {\n // Even console.debug can theoretically throw in exotic environments.\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Error normalisation\n// ---------------------------------------------------------------------------\n\ninterface NormalisedError {\n message: string;\n type: string;\n stack?: string;\n componentStack?: string;\n raw?: unknown;\n}\n\nfunction normaliseError(error: unknown): NormalisedError {\n if (error instanceof Error) {\n return {\n message: error.message || String(error),\n type: error.constructor?.name || error.name || 'Error',\n stack: error.stack,\n raw: error,\n };\n }\n\n if (typeof error === 'string') {\n return {\n message: error,\n type: 'StringError',\n stack: new Error(error).stack,\n raw: error,\n };\n }\n\n if (error !== null && typeof error === 'object') {\n const obj = error as Record<string, unknown>;\n return {\n message: String(obj.message ?? obj.reason ?? JSON.stringify(error)),\n type: String(obj.name ?? obj.type ?? 'ObjectError'),\n stack: typeof obj.stack === 'string' ? obj.stack : undefined,\n raw: error,\n };\n }\n\n return {\n message: String(error),\n type: 'UnknownError',\n raw: error,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/breadcrumbs.ts","../src/sanitizer.ts","../src/fingerprint.ts","../src/rate-limiter.ts","../src/env-detector.ts","../src/transport.ts","../src/client.ts","../src/node-handlers.ts","../src/source-maps.ts"],"names":["createBreadcrumbStore","capacity","buffer","head","size","crumb","entry","isoTimestamp","result","start","idx","n","count","i","DEFAULT_SENSITIVE_KEYS","SENSITIVE_HEADERS","REDACTED","MAX_STRING_LENGTH","buildKeyPattern","additionalKeys","escaped","k","sanitize","obj","pattern","seen","walk","value","key","item","generateFingerprint","error","normalisedMessage","normaliseMessage","frames","extractTopFrames","input","djb2","msg","stack","lines","line","trimmed","v8Match","fn","file","normalisePath","smMatch","p","str","hash","createRateLimiter","globalMax","perFingerprintMax","buckets","globalTimestamps","prune","timestamps","now","cutoff","fingerprint","fpTimestamps","ts","cached","detectEnvironment","info","isBrowser","detectNodeOS","ua","browserInfo","parseBrowserUA","parseOS","detectDeviceType","detectFramework","platform","patterns","name","regex","match","width","createTransport","config","createConsoleTransport","createRemoteTransport","createLocalTransport","_config","event","title","createLocalFileTransport","createLocalClientTransport","fsPromises","pathModule","baseDir","initialised","init","fs","path","ensureGitignore","gitignorePath","content","fp","eventDir","eventFile","eventPath","tmpEventPath","safeStringify","latestPath","tmpLatestPath","promptFile","promptPath","tmpPromptPath","updateIssuesIndex","openStore","dbPath","store","indexPath","issues","raw","existing","userId","tmpIndexPath","queue","consoleFallback","postEvents","events","res","ok","batch","endpoint","projectKey","maxRetries","batchSize","flushIntervalMs","flushTimer","stopped","backoffDelays","sendBatch","attempt","retryAfter","sleep","startFlushing","registerBeacon","payload","ms","resolve","SDK_NAME","SDK_VERSION","_client","initUncaught","UncaughtClient","getClient","generateUUID","context","errorInfo","normaliseError","crumbs","environment","eventId","buildFixPrompt","err","message","level","user","feedback","body","url","args","setupNodeHandlers","client","handleUncaughtException","handleUnhandledRejection","reason","expressErrorHandler","req","_res","next","reqObj","fastifyErrorPlugin","fastify","_opts","done","request","reply","DEFAULT_SEARCH_DIRS","parseFrame","withFn","noFn","findSourceMap","sourceFile","searchDirs","mapName","dir","resolvedDir","found","findFileRecursive","directMap","filename","maxDepth","entries","fullPath","mapCache","resolveStackTrace","dirs","resolvedLines","frame","consumer","mapPath","rawMap","SourceMapConsumer","pos","fnName","clearSourceMapCache"],"mappings":"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","file":"index.mjs","sourcesContent":["// ---------------------------------------------------------------------------\n// @uncaughtdev/core — breadcrumb ring-buffer store\n// ---------------------------------------------------------------------------\n\nimport type { Breadcrumb, BreadcrumbStore } from './types';\nimport { isoTimestamp } from './utils';\n\n/**\n * Create a fixed-capacity ring-buffer store for breadcrumbs.\n *\n * - O(1) `add`\n * - Oldest entries are silently overwritten when capacity is reached.\n * - Returned arrays are always copies — callers cannot mutate internal state.\n *\n * @param capacity Maximum breadcrumbs retained. Defaults to 20.\n */\nexport function createBreadcrumbStore(capacity: number = 20): BreadcrumbStore {\n const buffer: Array<Breadcrumb | undefined> = new Array(capacity);\n let head = 0; // next write index\n let size = 0; // current number of entries\n\n const store: BreadcrumbStore = {\n add(crumb: Omit<Breadcrumb, 'timestamp'>): void {\n const entry: Breadcrumb = {\n ...crumb,\n timestamp: isoTimestamp(),\n };\n\n buffer[head] = entry;\n head = (head + 1) % capacity;\n\n if (size < capacity) {\n size++;\n }\n },\n\n getAll(): Breadcrumb[] {\n if (size === 0) return [];\n\n const result: Breadcrumb[] = [];\n\n // The oldest entry sits at `(head - size + capacity) % capacity`\n const start = (head - size + capacity) % capacity;\n\n for (let i = 0; i < size; i++) {\n const idx = (start + i) % capacity;\n const entry = buffer[idx];\n if (entry) {\n // Return a shallow copy so callers cannot mutate internal data.\n result.push({ ...entry });\n }\n }\n\n return result;\n },\n\n getLast(n: number): Breadcrumb[] {\n if (n <= 0 || size === 0) return [];\n\n const count = Math.min(n, size);\n const result: Breadcrumb[] = [];\n\n // Walk backwards from the most recent entry.\n for (let i = 0; i < count; i++) {\n const idx = (head - 1 - i + capacity) % capacity;\n const entry = buffer[idx];\n if (entry) {\n result.unshift({ ...entry });\n }\n }\n\n return result;\n },\n\n clear(): void {\n buffer.fill(undefined);\n head = 0;\n size = 0;\n },\n };\n\n return store;\n}\n","// ---------------------------------------------------------------------------\n// @uncaughtdev/core — PII / secret sanitizer\n// ---------------------------------------------------------------------------\n\n/** Default key patterns that are always redacted. */\nconst DEFAULT_SENSITIVE_KEYS: string[] = [\n 'password',\n 'passwd',\n 'secret',\n 'token',\n 'apikey',\n 'api_key',\n 'authorization',\n 'credit_card',\n 'creditcard',\n 'card_number',\n 'cvv',\n 'ssn',\n 'social_security',\n 'private_key',\n 'access_token',\n 'refresh_token',\n 'session_id',\n 'cookie',\n];\n\n/** Headers that are always stripped regardless of key matching. */\nconst SENSITIVE_HEADERS = new Set(['authorization', 'cookie', 'set-cookie']);\n\nconst REDACTED = '[REDACTED]';\nconst MAX_STRING_LENGTH = 2048;\n\n/**\n * Build a single RegExp that matches any of the sensitive key patterns\n * (case-insensitive).\n */\nfunction buildKeyPattern(additionalKeys: string[] = []): RegExp {\n const all = [...DEFAULT_SENSITIVE_KEYS, ...additionalKeys];\n // Escape special regex characters in user-supplied keys\n const escaped = all.map((k) => k.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'));\n return new RegExp(escaped.join('|'), 'i');\n}\n\n/**\n * Deep-clone and sanitise `obj`, redacting values whose keys match\n * sensitive patterns.\n *\n * - Handles circular references (returns `\"[Circular]\"`).\n * - Truncates strings longer than 2 048 characters.\n * - Never mutates the original object.\n *\n * @param obj - The value to sanitise.\n * @param additionalKeys - Extra key patterns to redact on top of the defaults.\n */\nexport function sanitize<T>(obj: T, additionalKeys?: string[]): T {\n const pattern = buildKeyPattern(additionalKeys);\n const seen = new WeakSet();\n\n function walk(value: unknown, key?: string): unknown {\n // Redact if the current key is sensitive\n if (key && pattern.test(key)) {\n return REDACTED;\n }\n\n // Primitives\n if (value === null || value === undefined) return value;\n\n if (typeof value === 'string') {\n return value.length > MAX_STRING_LENGTH\n ? value.slice(0, MAX_STRING_LENGTH) + '...[truncated]'\n : value;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'bigint') {\n return value.toString();\n }\n\n if (typeof value === 'function' || typeof value === 'symbol') {\n return undefined;\n }\n\n // Dates — return ISO string\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n // Arrays\n if (Array.isArray(value)) {\n if (seen.has(value)) return '[Circular]';\n seen.add(value);\n const result = value.map((item) => walk(item));\n seen.delete(value);\n return result;\n }\n\n // Plain objects\n if (typeof value === 'object') {\n if (seen.has(value as object)) return '[Circular]';\n seen.add(value as object);\n\n const result: Record<string, unknown> = {};\n\n for (const k of Object.keys(value as Record<string, unknown>)) {\n // Always strip sensitive headers\n if (SENSITIVE_HEADERS.has(k.toLowerCase())) {\n result[k] = REDACTED;\n continue;\n }\n\n result[k] = walk((value as Record<string, unknown>)[k], k);\n }\n\n seen.delete(value as object);\n return result;\n }\n\n return value;\n }\n\n return walk(obj) as T;\n}\n","// ---------------------------------------------------------------------------\n// @uncaughtdev/core — error fingerprinting\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a stable fingerprint for an error so that duplicate occurrences\n * of the same bug are grouped together.\n *\n * The fingerprint is an 8-character hex string derived from:\n * 1. The normalised error message (volatile parts stripped).\n * 2. The top 3 stack frames (file + function name, no line/col numbers).\n *\n * @param error - An object with at least `message` and optionally `stack` and `type`.\n */\nexport function generateFingerprint(error: {\n message?: string;\n type?: string;\n stack?: string;\n}): string {\n const normalisedMessage = normaliseMessage(error.message ?? '');\n const frames = extractTopFrames(error.stack ?? '', 3);\n const input = [error.type ?? 'Error', normalisedMessage, ...frames].join(\n '\\n'\n );\n return djb2(input);\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Strip volatile substrings from an error message so that trivially-different\n * occurrences of the same bug hash identically.\n */\nfunction normaliseMessage(msg: string): string {\n return (\n msg\n // UUIDs (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)\n .replace(\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi,\n '<UUID>'\n )\n // Hex strings (8+ hex chars in a row)\n .replace(/\\b[0-9a-f]{8,}\\b/gi, '<HEX>')\n // Numbers longer than 3 digits\n .replace(/\\b\\d{4,}\\b/g, '<NUM>')\n // ISO timestamps\n .replace(\n /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}[.\\d]*Z?/g,\n '<TIMESTAMP>'\n )\n // Hashed file paths — replace the hash portion (e.g. chunk-abc123.js → chunk-<HASH>.js)\n .replace(\n /([/\\\\])[a-zA-Z0-9_-]+[-.]([a-f0-9]{6,})\\.(js|ts|mjs|cjs|jsx|tsx)/g,\n '$1<FILE>.$3'\n )\n .trim()\n );\n}\n\n/**\n * Extract the top N stack frames as normalised \"file:function\" strings.\n * Line and column numbers are intentionally omitted so that minor code\n * changes do not alter the fingerprint.\n */\nfunction extractTopFrames(stack: string, count: number): string[] {\n if (!stack) return [];\n\n const lines = stack.split('\\n');\n const frames: string[] = [];\n\n for (const line of lines) {\n if (frames.length >= count) break;\n\n const trimmed = line.trim();\n\n // V8 format: \" at FunctionName (file:line:col)\"\n // or \" at file:line:col\"\n const v8Match = trimmed.match(\n /at\\s+(?:(.+?)\\s+\\()?(?:(.+?):\\d+:\\d+)\\)?/\n );\n if (v8Match) {\n const fn = v8Match[1] || '<anonymous>';\n const file = normalisePath(v8Match[2] || '<unknown>');\n frames.push(`${file}:${fn}`);\n continue;\n }\n\n // SpiderMonkey / JavaScriptCore: \"functionName@file:line:col\"\n const smMatch = trimmed.match(/^(.+?)@(.+?):\\d+:\\d+/);\n if (smMatch) {\n const fn = smMatch[1] || '<anonymous>';\n const file = normalisePath(smMatch[2] || '<unknown>');\n frames.push(`${file}:${fn}`);\n continue;\n }\n }\n\n return frames;\n}\n\n/**\n * Normalise a file path by stripping query strings / hashes and collapsing\n * absolute filesystem prefixes.\n */\nfunction normalisePath(p: string): string {\n return p\n .replace(/[?#].*$/, '') // strip query / hash\n .replace(/^.*\\/node_modules\\//, 'node_modules/') // collapse deep paths\n .replace(/^(https?:\\/\\/[^/]+)/, '') // strip origin in URLs\n .replace(/^.*[/\\\\]/, ''); // keep only filename\n}\n\n/**\n * DJB2 hash → 8-character lowercase hex string.\n */\nfunction djb2(str: string): string {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n // hash * 33 + char\n hash = ((hash << 5) + hash + str.charCodeAt(i)) | 0;\n }\n // Convert to unsigned 32-bit then to 8-char hex\n return (hash >>> 0).toString(16).padStart(8, '0');\n}\n","// ---------------------------------------------------------------------------\n// @uncaughtdev/core — sliding-window rate limiter\n// ---------------------------------------------------------------------------\n\n/** Window duration in milliseconds (60 seconds). */\nconst WINDOW_MS = 60_000;\n\nexport interface RateLimiter {\n /**\n * Returns `true` if the event identified by `fingerprint` is allowed\n * through, `false` if it should be dropped.\n */\n shouldAllow(fingerprint: string): boolean;\n}\n\n/**\n * Create a rate limiter that enforces:\n * - A global maximum of `globalMax` events per 60-second window.\n * - A per-fingerprint maximum of `perFingerprintMax` events per 60-second window.\n *\n * Stale timestamps are lazily cleaned on every call to `shouldAllow`.\n *\n * @param globalMax Max events across all fingerprints. Defaults to 30.\n * @param perFingerprintMax Max events for a single fingerprint. Defaults to 5.\n */\nexport function createRateLimiter(\n globalMax: number = 30,\n perFingerprintMax: number = 5\n): RateLimiter {\n /** Per-fingerprint timestamp arrays. */\n const buckets = new Map<string, number[]>();\n /** Global timestamp array. */\n let globalTimestamps: number[] = [];\n\n /**\n * Remove timestamps older than the sliding window from an array (in-place)\n * and return the pruned array.\n */\n function prune(timestamps: number[], now: number): number[] {\n const cutoff = now - WINDOW_MS;\n // Find the first index that is within the window\n let start = 0;\n while (start < timestamps.length && timestamps[start] <= cutoff) {\n start++;\n }\n if (start > 0) {\n timestamps.splice(0, start);\n }\n return timestamps;\n }\n\n return {\n shouldAllow(fingerprint: string): boolean {\n const now = Date.now();\n\n // --- Global limit ---\n globalTimestamps = prune(globalTimestamps, now);\n if (globalTimestamps.length >= globalMax) {\n return false;\n }\n\n // --- Per-fingerprint limit ---\n let fpTimestamps = buckets.get(fingerprint);\n if (!fpTimestamps) {\n fpTimestamps = [];\n buckets.set(fingerprint, fpTimestamps);\n }\n prune(fpTimestamps, now);\n\n if (fpTimestamps.length >= perFingerprintMax) {\n return false;\n }\n\n // Record this event\n globalTimestamps.push(now);\n fpTimestamps.push(now);\n\n // Periodic cleanup: remove empty buckets to prevent unbounded memory growth\n if (buckets.size > 1000) {\n for (const [key, ts] of buckets) {\n if (ts.length === 0) {\n buckets.delete(key);\n }\n }\n }\n\n return true;\n },\n };\n}\n","// ---------------------------------------------------------------------------\n// @uncaughtdev/core — runtime / platform environment detector\n// ---------------------------------------------------------------------------\n\nimport type { EnvironmentInfo } from './types';\n\n/** Cached result so detection only runs once per process / page-load. */\nlet cached: EnvironmentInfo | undefined;\n\n/**\n * Detect the current runtime environment.\n *\n * - SSR-safe: every global access is guarded.\n * - Result is cached after the first invocation.\n */\nexport function detectEnvironment(): EnvironmentInfo {\n if (cached) return cached;\n\n const info: EnvironmentInfo = {};\n\n try {\n const isBrowser =\n typeof window !== 'undefined' && typeof document !== 'undefined';\n const isNode =\n typeof process !== 'undefined' &&\n process.versions != null &&\n process.versions.node != null;\n\n // ----- Runtime ---------------------------------------------------------\n if (isNode) {\n info.runtime = 'node';\n info.runtimeVersion = process.versions.node;\n info.platform = process.platform;\n info.os = detectNodeOS();\n } else if (isBrowser) {\n info.runtime = 'browser';\n info.platform = 'web';\n\n const ua = navigator?.userAgent ?? '';\n const browserInfo = parseBrowserUA(ua);\n info.browser = browserInfo.name;\n info.browserVersion = browserInfo.version;\n info.os = parseOS(ua);\n info.deviceType = detectDeviceType();\n info.url = location?.href;\n info.locale = navigator?.language;\n info.timezone = Intl?.DateTimeFormat?.()?.resolvedOptions?.()?.timeZone;\n }\n\n // ----- Framework detection (works in both Node & browser) ---------------\n detectFramework(info);\n } catch {\n // Silent — environment detection must never throw.\n }\n\n cached = info;\n return info;\n}\n\n/**\n * Reset the cached environment (useful for testing).\n */\nexport function resetEnvironmentCache(): void {\n cached = undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction detectNodeOS(): string | undefined {\n try {\n const platform = process.platform;\n const map: Record<string, string> = {\n darwin: 'macOS',\n win32: 'Windows',\n linux: 'Linux',\n freebsd: 'FreeBSD',\n sunos: 'SunOS',\n };\n return map[platform] ?? platform;\n } catch {\n return undefined;\n }\n}\n\ninterface BrowserInfo {\n name?: string;\n version?: string;\n}\n\nfunction parseBrowserUA(ua: string): BrowserInfo {\n // Order matters — check more specific browsers first.\n const patterns: Array<{ name: string; regex: RegExp }> = [\n { name: 'Edge', regex: /Edg(?:e|A|iOS)?\\/(\\d+[\\d.]*)/ },\n { name: 'Opera', regex: /(?:OPR|Opera)\\/(\\d+[\\d.]*)/ },\n { name: 'Samsung Internet', regex: /SamsungBrowser\\/(\\d+[\\d.]*)/ },\n { name: 'UC Browser', regex: /UCBrowser\\/(\\d+[\\d.]*)/ },\n { name: 'Firefox', regex: /Firefox\\/(\\d+[\\d.]*)/ },\n { name: 'Chrome', regex: /Chrome\\/(\\d+[\\d.]*)/ },\n { name: 'Safari', regex: /Version\\/(\\d+[\\d.]*).*Safari/ },\n ];\n\n for (const { name, regex } of patterns) {\n const match = ua.match(regex);\n if (match) {\n return { name, version: match[1] };\n }\n }\n\n return {};\n}\n\nfunction parseOS(ua: string): string | undefined {\n if (/Windows/i.test(ua)) return 'Windows';\n if (/Mac OS X|macOS/i.test(ua)) return 'macOS';\n if (/Android/i.test(ua)) return 'Android';\n if (/iPhone|iPad|iPod/i.test(ua)) return 'iOS';\n if (/Linux/i.test(ua)) return 'Linux';\n if (/CrOS/i.test(ua)) return 'ChromeOS';\n return undefined;\n}\n\nfunction detectDeviceType(): string | undefined {\n try {\n if (typeof window === 'undefined') return undefined;\n\n const width = window.screen?.width ?? window.innerWidth;\n\n if (width <= 480) return 'mobile';\n if (width <= 1024) return 'tablet';\n return 'desktop';\n } catch {\n return undefined;\n }\n}\n\nfunction detectFramework(info: EnvironmentInfo): void {\n try {\n // ----- Browser-side markers -------------------------------------------\n if (typeof window !== 'undefined') {\n // Next.js injects __NEXT_DATA__\n if ((window as any).__NEXT_DATA__) {\n info.framework = 'next';\n info.frameworkVersion =\n (window as any).__NEXT_DATA__?.buildId ?? undefined;\n }\n // Remix injects __remixContext\n else if ((window as any).__remixContext) {\n info.framework = 'remix';\n }\n // Nuxt injects __NUXT__\n else if ((window as any).__NUXT__) {\n info.framework = 'nuxt';\n }\n }\n\n // ----- Node-side markers -----------------------------------------------\n if (\n typeof process !== 'undefined' &&\n process.env != null\n ) {\n // Framework env vars set during SSR / server build\n if (!info.framework) {\n if (process.env.__NEXT_PRIVATE_ORIGIN !== undefined || process.env.NEXT_RUNTIME) {\n info.framework = 'next';\n } else if (process.env.REMIX_DEV_ORIGIN !== undefined) {\n info.framework = 'remix';\n }\n }\n\n // Hosting platform markers\n if (process.env.VERCEL) {\n info.platform = info.platform ?? 'vercel';\n } else if (process.env.RAILWAY_PROJECT_ID) {\n info.platform = info.platform ?? 'railway';\n } else if (process.env.FLY_APP_NAME) {\n info.platform = info.platform ?? 'fly';\n } else if (process.env.AWS_LAMBDA_FUNCTION_NAME) {\n info.platform = info.platform ?? 'aws-lambda';\n } else if (process.env.GOOGLE_CLOUD_PROJECT) {\n info.platform = info.platform ?? 'gcp';\n }\n }\n\n // ----- Vite (import.meta.env) ------------------------------------------\n try {\n if (typeof (import.meta as any)?.env?.VITE_USER_NODE_ENV !== 'undefined') {\n if (!info.framework) {\n info.framework = 'vite';\n }\n }\n } catch {\n // import.meta may not exist in CJS contexts\n }\n } catch {\n // Silent — never throw during detection.\n }\n}\n","// ---------------------------------------------------------------------------\n// @uncaughtdev/core — transport layer (console / local-file / remote)\n// ---------------------------------------------------------------------------\n\nimport type {\n Transport,\n UncaughtConfig,\n UncaughtEvent,\n IssueEntry,\n} from './types';\nimport { safeStringify } from './utils';\n\n// ===================================================================\n// Factory\n// ===================================================================\n\n/**\n * Create the appropriate transport strategy based on config.\n */\nexport function createTransport(config: UncaughtConfig): Transport {\n const mode = config.transport ?? 'local';\n\n switch (mode) {\n case 'console':\n return createConsoleTransport(config);\n case 'remote':\n return createRemoteTransport(config);\n case 'local':\n default:\n return createLocalTransport(config);\n }\n}\n\n// ===================================================================\n// Console Transport\n// ===================================================================\n\nfunction createConsoleTransport(_config: UncaughtConfig): Transport {\n return {\n send(event: UncaughtEvent): void {\n try {\n const title = `[uncaught] ${event.error.type}: ${event.error.message}`;\n\n if (typeof console.group === 'function') {\n console.group(title);\n } else {\n console.log(`--- ${title} ---`);\n }\n\n console.error('Error:', event.error.message);\n if (event.error.stack) {\n console.log('Stack:', event.error.stack);\n }\n console.log('Event ID:', event.eventId);\n console.log('Fingerprint:', event.fingerprint);\n console.log('Breadcrumbs:', event.breadcrumbs);\n\n if (event.fixPrompt) {\n console.log('Fix Prompt:\\n', event.fixPrompt);\n }\n\n if (typeof console.groupEnd === 'function') {\n console.groupEnd();\n }\n } catch {\n // Never throw from transport.\n }\n },\n\n async flush(): Promise<void> {\n // Nothing to flush for console transport.\n },\n };\n}\n\n// ===================================================================\n// Local File Transport\n// ===================================================================\n\n/**\n * The local transport behaves differently depending on whether `fs` is\n * available (server / Node.js) or not (browser).\n *\n * **Server:** writes events directly to the `.uncaught/` directory.\n * **Browser:** POSTs to `/api/uncaught/local` and falls back to console.\n */\nfunction createLocalTransport(config: UncaughtConfig): Transport {\n // Detect server vs browser at transport creation time.\n const isServer = typeof process !== 'undefined' && process.versions?.node != null;\n\n if (isServer) {\n return createLocalFileTransport(config);\n }\n\n return createLocalClientTransport(config);\n}\n\n// ---------------------------------------------------------------------------\n// Local File Transport (Server / Node.js)\n// ---------------------------------------------------------------------------\n\ninterface FsModule {\n mkdir: (path: string, options: { recursive: boolean }) => Promise<void>;\n writeFile: (path: string, data: string, encoding: string) => Promise<void>;\n readFile: (path: string, encoding: string) => Promise<string>;\n rename: (from: string, to: string) => Promise<void>;\n access: (path: string) => Promise<void>;\n appendFile: (path: string, data: string) => Promise<void>;\n}\n\ninterface PathModule {\n join: (...parts: string[]) => string;\n resolve: (...parts: string[]) => string;\n}\n\nfunction createLocalFileTransport(config: UncaughtConfig): Transport {\n let fsPromises: FsModule | undefined;\n let pathModule: PathModule | undefined;\n let baseDir: string = '';\n let initialised = false;\n\n async function init(): Promise<void> {\n if (initialised) return;\n\n // Dynamic imports so this module can still be loaded in browsers without\n // causing a hard crash at parse time.\n const fs = await import('fs/promises');\n const path = await import('path');\n fsPromises = fs as unknown as FsModule;\n pathModule = path as unknown as PathModule;\n\n baseDir = config.localOutputDir ?? pathModule.resolve(process.cwd(), '.uncaught');\n\n // Ensure directory structure\n await fsPromises.mkdir(pathModule.join(baseDir, 'events'), { recursive: true });\n await fsPromises.mkdir(pathModule.join(baseDir, 'fix-prompts'), { recursive: true });\n\n // Auto-add .uncaught/ to .gitignore\n await ensureGitignore(fsPromises, pathModule);\n\n initialised = true;\n }\n\n async function ensureGitignore(fs: FsModule, path: PathModule): Promise<void> {\n try {\n const gitignorePath = path.resolve(process.cwd(), '.gitignore');\n let content = '';\n try {\n content = await fs.readFile(gitignorePath, 'utf-8');\n } catch {\n // File doesn't exist yet — that's fine.\n }\n\n if (!content.includes('.uncaught')) {\n const line = '\\n# Uncaught local error store\\n.uncaught/\\n';\n await fs.appendFile(gitignorePath, line);\n }\n } catch {\n // Non-critical — swallow.\n }\n }\n\n return {\n async send(event: UncaughtEvent): Promise<void> {\n try {\n await init();\n if (!fsPromises || !pathModule) return;\n\n const fp = event.fingerprint;\n const eventDir = pathModule.join(baseDir, 'events', fp);\n await fsPromises.mkdir(eventDir, { recursive: true });\n\n // --- Write timestamped event file (atomic: .tmp → rename) ----------\n const ts = event.timestamp.replace(/[:.]/g, '-');\n const eventFile = `event-${ts}.json`;\n const eventPath = pathModule.join(eventDir, eventFile);\n const tmpEventPath = eventPath + '.tmp';\n await fsPromises.writeFile(tmpEventPath, safeStringify(event), 'utf-8');\n await fsPromises.rename(tmpEventPath, eventPath);\n\n // --- Write / overwrite latest.json ---------------------------------\n const latestPath = pathModule.join(eventDir, 'latest.json');\n const tmpLatestPath = latestPath + '.tmp';\n await fsPromises.writeFile(tmpLatestPath, safeStringify(event), 'utf-8');\n await fsPromises.rename(tmpLatestPath, latestPath);\n\n // --- Write fix-prompt Markdown file --------------------------------\n const promptFile = `${fp}.md`;\n const promptPath = pathModule.join(baseDir, 'fix-prompts', promptFile);\n const tmpPromptPath = promptPath + '.tmp';\n await fsPromises.writeFile(tmpPromptPath, event.fixPrompt, 'utf-8');\n await fsPromises.rename(tmpPromptPath, promptPath);\n\n // --- Update issues.json index -------------------------------------\n await updateIssuesIndex(\n fsPromises,\n pathModule,\n baseDir,\n event,\n eventFile,\n promptFile\n );\n\n // --- Also write to SQLite -----------------------------------------\n try {\n const { openStore } = await import('./sqlite-store');\n const dbPath = pathModule.join(baseDir, 'uncaught.db');\n const store = openStore(dbPath);\n store.insertEvent(event);\n store.close();\n } catch {\n // SQLite is best-effort\n }\n } catch {\n // Never crash the host app.\n }\n },\n\n async flush(): Promise<void> {\n // Local file transport writes synchronously per-event; nothing to flush.\n },\n };\n}\n\n/**\n * Read, update, and atomically write the `issues.json` index.\n */\nasync function updateIssuesIndex(\n fs: FsModule,\n path: PathModule,\n baseDir: string,\n event: UncaughtEvent,\n eventFile: string,\n promptFile: string\n): Promise<void> {\n const indexPath = path.join(baseDir, 'issues.json');\n\n let issues: IssueEntry[] = [];\n try {\n const raw = await fs.readFile(indexPath, 'utf-8');\n issues = JSON.parse(raw) as IssueEntry[];\n } catch {\n // File doesn't exist or is malformed — start fresh.\n }\n\n const existing = issues.find((i) => i.fingerprint === event.fingerprint);\n const userId = event.user?.id ?? event.user?.email ?? 'anonymous';\n\n if (existing) {\n existing.count += 1;\n existing.lastSeen = event.timestamp;\n existing.latestEventFile = eventFile;\n existing.fixPromptFile = promptFile;\n if (!existing.affectedUsers.includes(userId)) {\n existing.affectedUsers.push(userId);\n }\n // Re-open if previously resolved\n if (existing.status === 'resolved') {\n existing.status = 'open';\n }\n } else {\n issues.push({\n fingerprint: event.fingerprint,\n title: event.error.message,\n errorType: event.error.type,\n count: 1,\n affectedUsers: [userId],\n firstSeen: event.timestamp,\n lastSeen: event.timestamp,\n status: 'open',\n fixPromptFile: promptFile,\n latestEventFile: eventFile,\n release: event.release,\n environment: event.environment?.deploy,\n });\n }\n\n const tmpIndexPath = indexPath + '.tmp';\n await fs.writeFile(tmpIndexPath, JSON.stringify(issues, null, 2), 'utf-8');\n await fs.rename(tmpIndexPath, indexPath);\n}\n\n// ---------------------------------------------------------------------------\n// Local Client Transport (Browser → POST /api/uncaught/local)\n// ---------------------------------------------------------------------------\n\nfunction createLocalClientTransport(_config: UncaughtConfig): Transport {\n const queue: UncaughtEvent[] = [];\n const consoleFallback = createConsoleTransport(_config);\n\n async function postEvents(events: UncaughtEvent[]): Promise<boolean> {\n try {\n const res = await fetch('/api/uncaught/local', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: safeStringify({ events }),\n });\n\n return res.ok || res.status === 202;\n } catch {\n return false;\n }\n }\n\n return {\n send(event: UncaughtEvent): void {\n queue.push(event);\n\n // Attempt to send immediately\n postEvents([event]).then((ok) => {\n if (!ok) {\n // Fallback to console\n consoleFallback.send(event);\n }\n }).catch(() => {\n consoleFallback.send(event);\n });\n },\n\n async flush(): Promise<void> {\n if (queue.length === 0) return;\n\n const batch = queue.splice(0, queue.length);\n const ok = await postEvents(batch);\n if (!ok) {\n // Fallback: log remaining to console\n for (const event of batch) {\n consoleFallback.send(event);\n }\n }\n },\n };\n}\n\n// ===================================================================\n// Remote Transport\n// ===================================================================\n\nfunction createRemoteTransport(config: UncaughtConfig): Transport {\n const endpoint = config.endpoint ?? '';\n const projectKey = config.projectKey ?? '';\n const maxRetries = 3;\n const batchSize = 10;\n const flushIntervalMs = 5_000;\n\n const queue: UncaughtEvent[] = [];\n let flushTimer: ReturnType<typeof setInterval> | undefined;\n let stopped = false;\n\n // Backoff delays in ms for retries (1s, 2s, 4s)\n const backoffDelays = [1000, 2000, 4000];\n\n async function sendBatch(events: UncaughtEvent[]): Promise<void> {\n if (events.length === 0 || stopped) return;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(projectKey ? { 'X-Project-Key': projectKey } : {}),\n },\n body: safeStringify({ events }),\n });\n\n if (res.ok || res.status === 202) {\n return; // Success\n }\n\n if (res.status === 401) {\n // Unauthorized — stop sending entirely.\n stopped = true;\n if (flushTimer) clearInterval(flushTimer);\n return;\n }\n\n if (res.status === 429) {\n // Rate limited — use longer backoff\n const retryAfter = parseInt(\n res.headers?.get?.('Retry-After') ?? '10',\n 10\n );\n await sleep(retryAfter * 1000);\n continue;\n }\n\n // Other server errors — retry with backoff\n if (attempt < maxRetries) {\n await sleep(backoffDelays[attempt] ?? 4000);\n }\n } catch {\n // Network error — retry\n if (attempt < maxRetries) {\n await sleep(backoffDelays[attempt] ?? 4000);\n }\n }\n }\n // All retries exhausted — events are dropped silently.\n }\n\n function startFlushing(): void {\n if (flushTimer) return;\n flushTimer = setInterval(() => {\n if (queue.length > 0) {\n const batch = queue.splice(0, batchSize);\n sendBatch(batch).catch(() => {\n // Swallow — never crash.\n });\n }\n }, flushIntervalMs);\n\n // Ensure the timer does not prevent Node.js from exiting.\n if (typeof flushTimer === 'object' && 'unref' in flushTimer) {\n (flushTimer as { unref: () => void }).unref();\n }\n }\n\n // Register sendBeacon on page unload (browser only)\n function registerBeacon(): void {\n try {\n if (\n typeof window !== 'undefined' &&\n typeof navigator?.sendBeacon === 'function'\n ) {\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden' && queue.length > 0) {\n const payload = safeStringify({ events: queue.splice(0, queue.length) });\n navigator.sendBeacon(endpoint, payload);\n }\n });\n\n window.addEventListener('pagehide', () => {\n if (queue.length > 0) {\n const payload = safeStringify({ events: queue.splice(0, queue.length) });\n navigator.sendBeacon(endpoint, payload);\n }\n });\n }\n } catch {\n // Not in a browser — that's fine.\n }\n }\n\n startFlushing();\n registerBeacon();\n\n return {\n send(event: UncaughtEvent): void {\n if (stopped) return;\n\n queue.push(event);\n\n // Flush immediately if batch size reached\n if (queue.length >= batchSize) {\n const batch = queue.splice(0, batchSize);\n sendBatch(batch).catch(() => {\n // Swallow.\n });\n }\n },\n\n async flush(): Promise<void> {\n if (flushTimer) {\n clearInterval(flushTimer);\n flushTimer = undefined;\n }\n\n while (queue.length > 0) {\n const batch = queue.splice(0, batchSize);\n await sendBatch(batch);\n }\n },\n };\n}\n\n// ===================================================================\n// Helpers\n// ===================================================================\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","// ---------------------------------------------------------------------------\n// @uncaughtdev/core — UncaughtClient (SDK entry-point)\n// ---------------------------------------------------------------------------\n\nimport type {\n UncaughtConfig,\n UncaughtEvent,\n Breadcrumb,\n BreadcrumbStore,\n Transport,\n SeverityLevel,\n UserInfo,\n RequestInfo,\n OperationInfo,\n} from './types';\n\nimport { generateUUID, isoTimestamp, safeStringify } from './utils';\nimport { createBreadcrumbStore } from './breadcrumbs';\nimport { sanitize } from './sanitizer';\nimport { generateFingerprint } from './fingerprint';\nimport { createRateLimiter, type RateLimiter } from './rate-limiter';\nimport { detectEnvironment } from './env-detector';\nimport { buildFixPrompt } from './prompt-builder';\nimport { createTransport } from './transport';\n\nconst SDK_NAME = '@uncaughtdev/core';\nconst SDK_VERSION = '0.1.0';\n\n// ---------------------------------------------------------------------------\n// Module-level singleton\n// ---------------------------------------------------------------------------\n\nlet _client: UncaughtClient | undefined;\n\n/**\n * Initialise the Uncaught SDK. Calling this more than once replaces the\n * previous client instance.\n */\nexport function initUncaught(config: UncaughtConfig): UncaughtClient {\n _client = new UncaughtClient(config);\n return _client;\n}\n\n/**\n * Return the current singleton client, or `undefined` if `initUncaught` has\n * not been called.\n */\nexport function getClient(): UncaughtClient | undefined {\n return _client;\n}\n\n// ---------------------------------------------------------------------------\n// Client class\n// ---------------------------------------------------------------------------\n\nexport class UncaughtClient {\n private readonly config: Required<\n Pick<UncaughtConfig, 'enabled' | 'debug' | 'maxBreadcrumbs' | 'maxEventsPerMinute'>\n > &\n UncaughtConfig;\n\n private readonly breadcrumbs: BreadcrumbStore;\n private readonly transport: Transport;\n private readonly rateLimiter: RateLimiter;\n private readonly sessionId: string;\n private readonly seenFingerprints = new Set<string>();\n private user: UserInfo | undefined;\n\n constructor(config: UncaughtConfig) {\n this.config = {\n enabled: true,\n debug: false,\n maxBreadcrumbs: 20,\n maxEventsPerMinute: 30,\n ...config,\n };\n\n this.breadcrumbs = createBreadcrumbStore(this.config.maxBreadcrumbs);\n this.transport = createTransport(this.config);\n this.rateLimiter = createRateLimiter(this.config.maxEventsPerMinute);\n this.sessionId = generateUUID();\n }\n\n // -----------------------------------------------------------------------\n // Public API\n // -----------------------------------------------------------------------\n\n /**\n * Return the current SDK configuration.\n */\n getConfig(): UncaughtConfig {\n return this.config;\n }\n\n /**\n * Capture an error and send it through the transport pipeline.\n *\n * @returns The event ID, or `undefined` if the event was dropped.\n */\n captureError(\n error: unknown,\n context?: {\n request?: RequestInfo;\n operation?: OperationInfo;\n componentStack?: string;\n level?: SeverityLevel;\n }\n ): string | undefined {\n try {\n if (!this.config.enabled) return undefined;\n\n // --- Normalise error -------------------------------------------------\n const errorInfo = normaliseError(error);\n\n if (context?.componentStack) {\n errorInfo.componentStack = context.componentStack;\n }\n\n // --- Check ignoreErrors ----------------------------------------------\n if (this.shouldIgnore(errorInfo.message)) {\n this.debugLog('Event ignored by ignoreErrors filter');\n return undefined;\n }\n\n // --- Fingerprint -----------------------------------------------------\n const fingerprint = generateFingerprint(errorInfo);\n\n // --- Rate limit ------------------------------------------------------\n if (!this.rateLimiter.shouldAllow(fingerprint)) {\n this.debugLog(`Rate-limited: ${fingerprint}`);\n return undefined;\n }\n\n // --- Collect breadcrumbs ---------------------------------------------\n const crumbs = this.breadcrumbs.getAll();\n\n // --- Detect environment ----------------------------------------------\n const environment = detectEnvironment();\n\n // Attach deployment environment from config\n if (this.config.environment) {\n environment.deploy = this.config.environment;\n }\n\n // --- Build event -----------------------------------------------------\n const eventId = generateUUID();\n let event: UncaughtEvent = {\n eventId,\n timestamp: isoTimestamp(),\n projectKey: this.config.projectKey,\n level: context?.level ?? 'error',\n fingerprint,\n release: this.config.release,\n error: errorInfo,\n breadcrumbs: crumbs,\n request: context?.request,\n operation: context?.operation,\n environment,\n user: this.user\n ? { ...this.user, sessionId: this.sessionId }\n : { sessionId: this.sessionId },\n fixPrompt: '', // will be set below\n sdk: { name: SDK_NAME, version: SDK_VERSION },\n };\n\n // --- Sanitise --------------------------------------------------------\n event = sanitize(event, this.config.sanitizeKeys) as UncaughtEvent;\n\n // --- Build fix prompt ------------------------------------------------\n event.fixPrompt = buildFixPrompt(event);\n\n // --- beforeSend hook -------------------------------------------------\n if (this.config.beforeSend) {\n const result = this.config.beforeSend(event);\n if (result === null) {\n this.debugLog('Event dropped by beforeSend');\n return undefined;\n }\n event = result;\n }\n\n // --- Send ------------------------------------------------------------\n this.transport.send(event);\n this.debugLog(`Captured event: ${eventId} (${fingerprint})`);\n\n // --- Webhook notification (new fingerprints only) --------------------\n if (this.config.webhookUrl && !this.seenFingerprints.has(fingerprint)) {\n this.seenFingerprints.add(fingerprint);\n this.sendWebhook(event);\n } else {\n this.seenFingerprints.add(fingerprint);\n }\n\n return eventId;\n } catch (err) {\n this.debugLog('captureError failed:', err);\n return undefined;\n }\n }\n\n /**\n * Capture a plain message (not backed by an Error instance).\n */\n captureMessage(\n message: string,\n level: SeverityLevel = 'info'\n ): string | undefined {\n try {\n return this.captureError(new Error(message), { level });\n } catch (err) {\n this.debugLog('captureMessage failed:', err);\n return undefined;\n }\n }\n\n /**\n * Add a breadcrumb to the ring buffer.\n */\n addBreadcrumb(crumb: Omit<Breadcrumb, 'timestamp'>): void {\n try {\n if (!this.config.enabled) return;\n this.breadcrumbs.add(crumb);\n } catch (err) {\n this.debugLog('addBreadcrumb failed:', err);\n }\n }\n\n /**\n * Set user context that will be attached to subsequent events.\n */\n setUser(user: UserInfo | undefined): void {\n try {\n this.user = user ? { ...user } : undefined;\n } catch (err) {\n this.debugLog('setUser failed:', err);\n }\n }\n\n /**\n * Attach user feedback to a previously captured event.\n * Re-sends the event with feedback attached so it persists.\n */\n submitFeedback(eventId: string, feedback: string): void {\n try {\n if (!this.config.enabled || !feedback.trim()) return;\n\n // Send a lightweight feedback event\n const event: UncaughtEvent = {\n eventId: generateUUID(),\n timestamp: isoTimestamp(),\n projectKey: this.config.projectKey,\n level: 'info',\n fingerprint: `feedback-${eventId}`,\n release: this.config.release,\n error: { message: `User feedback for ${eventId}`, type: 'UserFeedback' },\n breadcrumbs: [],\n userFeedback: feedback,\n fixPrompt: '',\n sdk: { name: SDK_NAME, version: SDK_VERSION },\n };\n\n this.transport.send(event);\n this.debugLog(`Submitted feedback for event: ${eventId}`);\n } catch (err) {\n this.debugLog('submitFeedback failed:', err);\n }\n }\n\n /**\n * Flush all queued events to the transport.\n */\n async flush(): Promise<void> {\n try {\n await this.transport.flush();\n } catch (err) {\n this.debugLog('flush failed:', err);\n }\n }\n\n // -----------------------------------------------------------------------\n // Internal helpers\n // -----------------------------------------------------------------------\n\n private shouldIgnore(message: string): boolean {\n const patterns = this.config.ignoreErrors;\n if (!patterns || patterns.length === 0) return false;\n\n for (const pattern of patterns) {\n if (typeof pattern === 'string') {\n if (message.includes(pattern)) return true;\n } else if (pattern instanceof RegExp) {\n if (pattern.test(message)) return true;\n }\n }\n\n return false;\n }\n\n /**\n * POST a notification to the configured webhook URL for new error fingerprints.\n * Fire-and-forget — never blocks the error pipeline.\n */\n private sendWebhook(event: UncaughtEvent): void {\n try {\n const payload = {\n title: event.error.message,\n errorType: event.error.type,\n fingerprint: event.fingerprint,\n level: event.level,\n timestamp: event.timestamp,\n release: event.release,\n environment: event.environment?.deploy,\n fixPrompt: event.fixPrompt,\n };\n\n const body = safeStringify(payload);\n const url = this.config.webhookUrl!;\n\n // Use fetch in browser, dynamic import in Node\n if (typeof fetch === 'function') {\n fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body,\n }).catch(() => {\n // Swallow — webhook is best-effort\n });\n }\n } catch {\n // Never crash from webhook\n }\n }\n\n private debugLog(...args: unknown[]): void {\n if (this.config.debug) {\n try {\n console.debug('[uncaught]', ...args);\n } catch {\n // Even console.debug can theoretically throw in exotic environments.\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Error normalisation\n// ---------------------------------------------------------------------------\n\ninterface NormalisedError {\n message: string;\n type: string;\n stack?: string;\n componentStack?: string;\n raw?: unknown;\n}\n\nfunction normaliseError(error: unknown): NormalisedError {\n if (error instanceof Error) {\n return {\n message: error.message || String(error),\n type: error.constructor?.name || error.name || 'Error',\n stack: error.stack,\n raw: error,\n };\n }\n\n if (typeof error === 'string') {\n return {\n message: error,\n type: 'StringError',\n stack: new Error(error).stack,\n raw: error,\n };\n }\n\n if (error !== null && typeof error === 'object') {\n const obj = error as Record<string, unknown>;\n return {\n message: String(obj.message ?? obj.reason ?? JSON.stringify(error)),\n type: String(obj.name ?? obj.type ?? 'ObjectError'),\n stack: typeof obj.stack === 'string' ? obj.stack : undefined,\n raw: error,\n };\n }\n\n return {\n message: String(error),\n type: 'UnknownError',\n raw: error,\n };\n}\n","// ---------------------------------------------------------------------------\n// @uncaughtdev/core — Node.js server-side error handlers\n// ---------------------------------------------------------------------------\n\nimport type { UncaughtClient } from './client';\n\n/**\n * Set up Node.js process-level error handlers.\n *\n * - `uncaughtException` — captures the error, flushes, then re-throws\n * - `unhandledRejection` — captures with 'fatal' level\n *\n * @returns Cleanup function to remove the handlers.\n */\nexport function setupNodeHandlers(client: UncaughtClient): () => void {\n if (typeof process === 'undefined' || !process.on) {\n return () => {};\n }\n\n const handleUncaughtException = (error: Error): void => {\n try {\n client.captureError(error, { level: 'fatal' });\n // Synchronous flush attempt before process exits\n client.flush().catch(() => {});\n } catch {\n // Never interfere with process crash\n }\n // Re-throw so the default handler still terminates the process\n throw error;\n };\n\n const handleUnhandledRejection = (reason: unknown): void => {\n try {\n client.captureError(reason, { level: 'fatal' });\n } catch {\n // Never crash from error reporting\n }\n };\n\n process.on('uncaughtException', handleUncaughtException);\n process.on('unhandledRejection', handleUnhandledRejection);\n\n return () => {\n process.removeListener('uncaughtException', handleUncaughtException);\n process.removeListener('unhandledRejection', handleUnhandledRejection);\n };\n}\n\n/**\n * Express error-handling middleware.\n *\n * Usage:\n * ```js\n * const { expressErrorHandler } = require('@uncaughtdev/core');\n * app.use(expressErrorHandler(client));\n * ```\n *\n * Must be registered AFTER all routes (Express processes error middleware last).\n */\nexport function expressErrorHandler(\n client: UncaughtClient\n): (err: Error, req: unknown, res: unknown, next: (err?: unknown) => void) => void {\n return (err, req, _res, next) => {\n try {\n const reqObj = req as Record<string, unknown>;\n client.captureError(err, {\n request: {\n method: reqObj.method as string | undefined,\n url: reqObj.originalUrl as string ?? reqObj.url as string | undefined,\n headers: reqObj.headers as Record<string, string> | undefined,\n },\n });\n } catch {\n // Never crash from error reporting\n }\n next(err);\n };\n}\n\n/**\n * Fastify error handler plugin.\n *\n * Usage:\n * ```js\n * const { fastifyErrorPlugin } = require('@uncaughtdev/core');\n * fastify.register(fastifyErrorPlugin(client));\n * ```\n */\nexport function fastifyErrorPlugin(\n client: UncaughtClient\n): (fastify: unknown, opts: unknown, done: () => void) => void {\n return (fastify, _opts, done) => {\n const f = fastify as {\n setErrorHandler: (handler: (error: Error, request: unknown, reply: unknown) => void) => void;\n };\n\n f.setErrorHandler((error, request, reply) => {\n try {\n const req = request as Record<string, unknown>;\n client.captureError(error, {\n request: {\n method: req.method as string | undefined,\n url: req.url as string | undefined,\n headers: req.headers as Record<string, string> | undefined,\n },\n });\n } catch {\n // Never crash from error reporting\n }\n\n // Send error response\n const rep = reply as { status: (code: number) => { send: (body: unknown) => void } };\n rep.status(500).send({ error: 'Internal Server Error' });\n });\n\n done();\n };\n}\n","// ---------------------------------------------------------------------------\n// @uncaughtdev/core — Source map resolution\n// ---------------------------------------------------------------------------\n\nimport { SourceMapConsumer } from 'source-map';\n\n/**\n * Parsed representation of a single stack frame.\n */\ninterface StackFrame {\n raw: string;\n file?: string;\n line?: number;\n column?: number;\n fn?: string;\n}\n\n// Common build output directories to search for .map files\nconst DEFAULT_SEARCH_DIRS = [\n '.next/static',\n '.next/server',\n 'dist',\n 'build',\n 'out',\n '.output',\n];\n\n/**\n * Parse a single line of a V8/Chrome stack trace into its components.\n * Handles formats like:\n * at functionName (file:line:col)\n * at file:line:col\n * at functionName (webpack-internal:///./src/file.ts:line:col)\n */\nfunction parseFrame(line: string): StackFrame {\n const trimmed = line.trim();\n\n // Match: at functionName (file:line:col)\n const withFn = trimmed.match(/^at\\s+(.+?)\\s+\\((.+?):(\\d+):(\\d+)\\)$/);\n if (withFn) {\n return { raw: trimmed, fn: withFn[1], file: withFn[2], line: parseInt(withFn[3], 10), column: parseInt(withFn[4], 10) };\n }\n\n // Match: at file:line:col\n const noFn = trimmed.match(/^at\\s+(.+?):(\\d+):(\\d+)$/);\n if (noFn) {\n return { raw: trimmed, file: noFn[1], line: parseInt(noFn[2], 10), column: parseInt(noFn[3], 10) };\n }\n\n return { raw: trimmed };\n}\n\n/**\n * Find a .map file for a given source file by searching common build directories.\n */\nasync function findSourceMap(\n sourceFile: string,\n searchDirs: string[]\n): Promise<string | null> {\n try {\n const fs = await import('fs');\n const path = await import('path');\n\n // Extract the filename from the full path/URL\n const basename = path.basename(sourceFile);\n const mapName = basename + '.map';\n\n for (const dir of searchDirs) {\n const resolvedDir = path.resolve(dir);\n if (!fs.existsSync(resolvedDir)) continue;\n\n // Recursive search for the .map file\n const found = findFileRecursive(fs, path, resolvedDir, mapName, 3);\n if (found) return found;\n }\n\n // Also check if .map file exists next to the source file\n const directMap = sourceFile + '.map';\n if (fs.existsSync(directMap)) return directMap;\n\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Recursively search for a file up to maxDepth levels deep.\n */\nfunction findFileRecursive(\n fs: typeof import('fs'),\n path: typeof import('path'),\n dir: string,\n filename: string,\n maxDepth: number\n): string | null {\n if (maxDepth <= 0) return null;\n\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isFile() && entry.name === filename) {\n return fullPath;\n }\n if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules') {\n const found = findFileRecursive(fs, path, fullPath, filename, maxDepth - 1);\n if (found) return found;\n }\n }\n } catch {\n // Permission errors, etc.\n }\n return null;\n}\n\n// Cache for loaded source maps\nconst mapCache = new Map<string, SourceMapConsumer>();\n\n/**\n * Resolve a minified/bundled stack trace to original source locations\n * using source maps found in common build output directories.\n *\n * @param stack - The raw stack trace string\n * @param searchDirs - Directories to search for .map files (defaults to common build dirs)\n * @returns The resolved stack trace with original file paths and line numbers\n */\nexport async function resolveStackTrace(\n stack: string,\n searchDirs?: string[]\n): Promise<string> {\n if (!stack) return stack;\n\n const dirs = searchDirs ?? DEFAULT_SEARCH_DIRS;\n const lines = stack.split('\\n');\n const resolvedLines: string[] = [];\n\n for (const line of lines) {\n const frame = parseFrame(line);\n\n if (!frame.file || !frame.line || !frame.column) {\n resolvedLines.push(line);\n continue;\n }\n\n try {\n // Check cache first\n let consumer = mapCache.get(frame.file);\n\n if (!consumer) {\n const mapPath = await findSourceMap(frame.file, dirs);\n if (!mapPath) {\n resolvedLines.push(line);\n continue;\n }\n\n const fs = await import('fs');\n const rawMap = fs.readFileSync(mapPath, 'utf-8');\n consumer = await new SourceMapConsumer(JSON.parse(rawMap));\n mapCache.set(frame.file, consumer);\n }\n\n const pos = consumer.originalPositionFor({\n line: frame.line,\n column: frame.column - 1, // source-map uses 0-based columns\n });\n\n if (pos.source && pos.line) {\n const fnName = pos.name || frame.fn || '<anonymous>';\n resolvedLines.push(` at ${fnName} (${pos.source}:${pos.line}:${(pos.column ?? 0) + 1})`);\n } else {\n resolvedLines.push(line);\n }\n } catch {\n resolvedLines.push(line);\n }\n }\n\n return resolvedLines.join('\\n');\n}\n\n/**\n * Clean up cached source map consumers to free memory.\n */\nexport function clearSourceMapCache(): void {\n for (const consumer of mapCache.values()) {\n try { consumer.destroy(); } catch { /* ignore */ }\n }\n mapCache.clear();\n}\n"]}
@@ -1,2 +1,2 @@
1
- 'use strict';var chunkFFHQ452Q_js=require('./chunk-FFHQ452Q.js');require('./chunk-E76GW6KF.js');async function r(s,t){try{if(s.method!=="POST"){t.status(405).json({error:"Method not allowed"});return}if(typeof process<"u"&&process.env.NODE_ENV==="production"&&process.env.UNCAUGHT_LOCAL_IN_PROD!=="true"){t.status(403).json({error:"Local handler is disabled in production"});return}let e=s.body;if(!e||typeof e!="object"||!Array.isArray(e.events)){t.status(400).json({error:'Payload must contain an "events" array'});return}let n=e.events;if(n.length===0){t.status(202).json({accepted:0});return}await chunkFFHQ452Q_js.b(n),t.status(202).json({accepted:n.length});}catch(e){let n=e instanceof Error?e.message:"Internal server error";t.status(500).json({error:n});}}module.exports=r;//# sourceMappingURL=local-api-handler-pages.js.map
1
+ 'use strict';var chunkMSUAXLMV_js=require('./chunk-MSUAXLMV.js');require('./chunk-E76GW6KF.js'),require('./chunk-2YXXFGBV.js');async function r(s,t){try{if(s.method!=="POST"){t.status(405).json({error:"Method not allowed"});return}if(typeof process<"u"&&process.env.NODE_ENV==="production"&&process.env.UNCAUGHT_LOCAL_IN_PROD!=="true"){t.status(403).json({error:"Local handler is disabled in production"});return}let e=s.body;if(!e||typeof e!="object"||!Array.isArray(e.events)){t.status(400).json({error:'Payload must contain an "events" array'});return}let n=e.events;if(n.length===0){t.status(202).json({accepted:0});return}await chunkMSUAXLMV_js.b(n),t.status(202).json({accepted:n.length});}catch(e){let n=e instanceof Error?e.message:"Internal server error";t.status(500).json({error:n});}}module.exports=r;//# sourceMappingURL=local-api-handler-pages.js.map
2
2
  //# sourceMappingURL=local-api-handler-pages.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/local-api-handler-pages.ts"],"names":["handler","req","res","body","events","writeEvents","err","message"],"mappings":"gGAyCA,eAAOA,CAAAA,CACLC,CAAAA,CACAC,CAAAA,CACe,CACf,GAAI,CAEF,GAAID,CAAAA,CAAI,MAAA,GAAW,MAAA,CAAQ,CACzBC,CAAAA,CAAI,OAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,KAAA,CAAO,oBAAqB,CAAC,CAAA,CACpD,MACF,CAGA,GACE,OAAO,OAAA,CAAY,GAAA,EACnB,OAAA,CAAQ,GAAA,CAAI,WAAa,YAAA,EACzB,OAAA,CAAQ,GAAA,CAAI,sBAAA,GAA2B,MAAA,CACvC,CACAA,CAAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,KAAA,CAAO,yCAA0C,CAAC,CAAA,CACzE,MACF,CAGA,IAAMC,CAAAA,CAAOF,CAAAA,CAAI,IAAA,CAEjB,GACE,CAACE,CAAAA,EACD,OAAOA,CAAAA,EAAS,QAAA,EAChB,CAAC,KAAA,CAAM,OAAA,CAASA,CAAAA,CAAiC,MAAM,EACvD,CACAD,CAAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,KAAA,CAAO,wCAAyC,CAAC,CAAA,CACxE,MACF,CAEA,IAAME,CAAAA,CAAUD,CAAAA,CAAqC,OAErD,GAAIC,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAG,CACvBF,CAAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,QAAA,CAAU,CAAE,CAAC,CAAA,CACpC,MACF,CAGA,MAAMG,kBAAAA,CAAYD,CAAM,CAAA,CAExBF,CAAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,QAAA,CAAUE,CAAAA,CAAO,MAAO,CAAC,EAClD,CAAA,MAASE,EAAK,CACZ,IAAMC,CAAAA,CACJD,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,uBAAA,CACvCJ,EAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,KAAA,CAAOK,CAAQ,CAAC,EACzC,CACF","file":"local-api-handler-pages.js","sourcesContent":["// ---------------------------------------------------------------------------\n// @uncaughtdev/core — Next.js Pages Router local API handler\n// ---------------------------------------------------------------------------\n//\n// Usage:\n// // pages/api/uncaught/local.ts\n// export { default } from '@uncaughtdev/core/local-api-handler/pages';\n//\n// ---------------------------------------------------------------------------\n\nimport type { UncaughtEvent } from './types';\nimport { writeEvents } from './local-api-handler';\n\n/**\n * Minimal type for the Next.js Pages API request.\n * We intentionally avoid importing `next` so that `@uncaughtdev/core` has\n * zero runtime dependencies.\n */\ninterface PagesApiRequest {\n method?: string;\n body?: unknown;\n}\n\n/**\n * Minimal type for the Next.js Pages API response.\n */\ninterface PagesApiResponse {\n status: (code: number) => PagesApiResponse;\n json: (body: unknown) => void;\n setHeader?: (name: string, value: string) => PagesApiResponse;\n end?: () => void;\n}\n\n/**\n * Next.js Pages Router API handler (`/pages/api/uncaught/local.ts`).\n *\n * Accepts POST requests with `{ events: UncaughtEvent[] }` and writes them\n * to `.uncaught/`.\n *\n * Blocked in production unless `UNCAUGHT_LOCAL_IN_PROD=true` is set.\n */\nexport default async function handler(\n req: PagesApiRequest,\n res: PagesApiResponse\n): Promise<void> {\n try {\n // --- Method check ------------------------------------------------------\n if (req.method !== 'POST') {\n res.status(405).json({ error: 'Method not allowed' });\n return;\n }\n\n // --- Production guard --------------------------------------------------\n if (\n typeof process !== 'undefined' &&\n process.env.NODE_ENV === 'production' &&\n process.env.UNCAUGHT_LOCAL_IN_PROD !== 'true'\n ) {\n res.status(403).json({ error: 'Local handler is disabled in production' });\n return;\n }\n\n // --- Validate body -----------------------------------------------------\n const body = req.body;\n\n if (\n !body ||\n typeof body !== 'object' ||\n !Array.isArray((body as Record<string, unknown>).events)\n ) {\n res.status(400).json({ error: 'Payload must contain an \"events\" array' });\n return;\n }\n\n const events = (body as { events: UncaughtEvent[] }).events;\n\n if (events.length === 0) {\n res.status(202).json({ accepted: 0 });\n return;\n }\n\n // --- Write events to disk ----------------------------------------------\n await writeEvents(events);\n\n res.status(202).json({ accepted: events.length });\n } catch (err) {\n const message =\n err instanceof Error ? err.message : 'Internal server error';\n res.status(500).json({ error: message });\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/local-api-handler-pages.ts"],"names":["handler","req","res","body","events","writeEvents","err","message"],"mappings":"+HAyCA,eAAOA,CAAAA,CACLC,CAAAA,CACAC,CAAAA,CACe,CACf,GAAI,CAEF,GAAID,CAAAA,CAAI,MAAA,GAAW,MAAA,CAAQ,CACzBC,CAAAA,CAAI,OAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,KAAA,CAAO,oBAAqB,CAAC,CAAA,CACpD,MACF,CAGA,GACE,OAAO,OAAA,CAAY,GAAA,EACnB,OAAA,CAAQ,GAAA,CAAI,WAAa,YAAA,EACzB,OAAA,CAAQ,GAAA,CAAI,sBAAA,GAA2B,MAAA,CACvC,CACAA,CAAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,KAAA,CAAO,yCAA0C,CAAC,CAAA,CACzE,MACF,CAGA,IAAMC,CAAAA,CAAOF,CAAAA,CAAI,IAAA,CAEjB,GACE,CAACE,CAAAA,EACD,OAAOA,CAAAA,EAAS,QAAA,EAChB,CAAC,KAAA,CAAM,OAAA,CAASA,CAAAA,CAAiC,MAAM,EACvD,CACAD,CAAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,KAAA,CAAO,wCAAyC,CAAC,CAAA,CACxE,MACF,CAEA,IAAME,CAAAA,CAAUD,CAAAA,CAAqC,OAErD,GAAIC,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAG,CACvBF,CAAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,QAAA,CAAU,CAAE,CAAC,CAAA,CACpC,MACF,CAGA,MAAMG,kBAAAA,CAAYD,CAAM,CAAA,CAExBF,CAAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,QAAA,CAAUE,CAAAA,CAAO,MAAO,CAAC,EAClD,CAAA,MAASE,EAAK,CACZ,IAAMC,CAAAA,CACJD,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,uBAAA,CACvCJ,EAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,KAAA,CAAOK,CAAQ,CAAC,EACzC,CACF","file":"local-api-handler-pages.js","sourcesContent":["// ---------------------------------------------------------------------------\n// @uncaughtdev/core — Next.js Pages Router local API handler\n// ---------------------------------------------------------------------------\n//\n// Usage:\n// // pages/api/uncaught/local.ts\n// export { default } from '@uncaughtdev/core/local-api-handler/pages';\n//\n// ---------------------------------------------------------------------------\n\nimport type { UncaughtEvent } from './types';\nimport { writeEvents } from './local-api-handler';\n\n/**\n * Minimal type for the Next.js Pages API request.\n * We intentionally avoid importing `next` so that `@uncaughtdev/core` has\n * zero runtime dependencies.\n */\ninterface PagesApiRequest {\n method?: string;\n body?: unknown;\n}\n\n/**\n * Minimal type for the Next.js Pages API response.\n */\ninterface PagesApiResponse {\n status: (code: number) => PagesApiResponse;\n json: (body: unknown) => void;\n setHeader?: (name: string, value: string) => PagesApiResponse;\n end?: () => void;\n}\n\n/**\n * Next.js Pages Router API handler (`/pages/api/uncaught/local.ts`).\n *\n * Accepts POST requests with `{ events: UncaughtEvent[] }` and writes them\n * to `.uncaught/`.\n *\n * Blocked in production unless `UNCAUGHT_LOCAL_IN_PROD=true` is set.\n */\nexport default async function handler(\n req: PagesApiRequest,\n res: PagesApiResponse\n): Promise<void> {\n try {\n // --- Method check ------------------------------------------------------\n if (req.method !== 'POST') {\n res.status(405).json({ error: 'Method not allowed' });\n return;\n }\n\n // --- Production guard --------------------------------------------------\n if (\n typeof process !== 'undefined' &&\n process.env.NODE_ENV === 'production' &&\n process.env.UNCAUGHT_LOCAL_IN_PROD !== 'true'\n ) {\n res.status(403).json({ error: 'Local handler is disabled in production' });\n return;\n }\n\n // --- Validate body -----------------------------------------------------\n const body = req.body;\n\n if (\n !body ||\n typeof body !== 'object' ||\n !Array.isArray((body as Record<string, unknown>).events)\n ) {\n res.status(400).json({ error: 'Payload must contain an \"events\" array' });\n return;\n }\n\n const events = (body as { events: UncaughtEvent[] }).events;\n\n if (events.length === 0) {\n res.status(202).json({ accepted: 0 });\n return;\n }\n\n // --- Write events to disk ----------------------------------------------\n await writeEvents(events);\n\n res.status(202).json({ accepted: events.length });\n } catch (err) {\n const message =\n err instanceof Error ? err.message : 'Internal server error';\n res.status(500).json({ error: message });\n }\n}\n"]}
@@ -1,2 +1,2 @@
1
- import {b}from'./chunk-JALIO2BZ.mjs';import'./chunk-P6JRN5CN.mjs';async function r(s,t){try{if(s.method!=="POST"){t.status(405).json({error:"Method not allowed"});return}if(typeof process<"u"&&process.env.NODE_ENV==="production"&&process.env.UNCAUGHT_LOCAL_IN_PROD!=="true"){t.status(403).json({error:"Local handler is disabled in production"});return}let e=s.body;if(!e||typeof e!="object"||!Array.isArray(e.events)){t.status(400).json({error:'Payload must contain an "events" array'});return}let n=e.events;if(n.length===0){t.status(202).json({accepted:0});return}await b(n),t.status(202).json({accepted:n.length});}catch(e){let n=e instanceof Error?e.message:"Internal server error";t.status(500).json({error:n});}}export{r as default};//# sourceMappingURL=local-api-handler-pages.mjs.map
1
+ import {b}from'./chunk-BXMN7NW4.mjs';import'./chunk-P6JRN5CN.mjs';import'./chunk-A6GKDPT3.mjs';async function r(s,t){try{if(s.method!=="POST"){t.status(405).json({error:"Method not allowed"});return}if(typeof process<"u"&&process.env.NODE_ENV==="production"&&process.env.UNCAUGHT_LOCAL_IN_PROD!=="true"){t.status(403).json({error:"Local handler is disabled in production"});return}let e=s.body;if(!e||typeof e!="object"||!Array.isArray(e.events)){t.status(400).json({error:'Payload must contain an "events" array'});return}let n=e.events;if(n.length===0){t.status(202).json({accepted:0});return}await b(n),t.status(202).json({accepted:n.length});}catch(e){let n=e instanceof Error?e.message:"Internal server error";t.status(500).json({error:n});}}export{r as default};//# sourceMappingURL=local-api-handler-pages.mjs.map
2
2
  //# sourceMappingURL=local-api-handler-pages.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/local-api-handler-pages.ts"],"names":["handler","req","res","body","events","writeEvents","err","message"],"mappings":"kEAyCA,eAAOA,CAAAA,CACLC,CAAAA,CACAC,CAAAA,CACe,CACf,GAAI,CAEF,GAAID,CAAAA,CAAI,MAAA,GAAW,MAAA,CAAQ,CACzBC,CAAAA,CAAI,OAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,KAAA,CAAO,oBAAqB,CAAC,CAAA,CACpD,MACF,CAGA,GACE,OAAO,OAAA,CAAY,GAAA,EACnB,OAAA,CAAQ,GAAA,CAAI,WAAa,YAAA,EACzB,OAAA,CAAQ,GAAA,CAAI,sBAAA,GAA2B,MAAA,CACvC,CACAA,CAAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,KAAA,CAAO,yCAA0C,CAAC,CAAA,CACzE,MACF,CAGA,IAAMC,CAAAA,CAAOF,CAAAA,CAAI,IAAA,CAEjB,GACE,CAACE,CAAAA,EACD,OAAOA,CAAAA,EAAS,QAAA,EAChB,CAAC,KAAA,CAAM,OAAA,CAASA,CAAAA,CAAiC,MAAM,EACvD,CACAD,CAAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,KAAA,CAAO,wCAAyC,CAAC,CAAA,CACxE,MACF,CAEA,IAAME,CAAAA,CAAUD,CAAAA,CAAqC,OAErD,GAAIC,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAG,CACvBF,CAAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,QAAA,CAAU,CAAE,CAAC,CAAA,CACpC,MACF,CAGA,MAAMG,CAAAA,CAAYD,CAAM,CAAA,CAExBF,CAAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,QAAA,CAAUE,CAAAA,CAAO,MAAO,CAAC,EAClD,CAAA,MAASE,EAAK,CACZ,IAAMC,CAAAA,CACJD,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,uBAAA,CACvCJ,EAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,KAAA,CAAOK,CAAQ,CAAC,EACzC,CACF","file":"local-api-handler-pages.mjs","sourcesContent":["// ---------------------------------------------------------------------------\n// @uncaughtdev/core — Next.js Pages Router local API handler\n// ---------------------------------------------------------------------------\n//\n// Usage:\n// // pages/api/uncaught/local.ts\n// export { default } from '@uncaughtdev/core/local-api-handler/pages';\n//\n// ---------------------------------------------------------------------------\n\nimport type { UncaughtEvent } from './types';\nimport { writeEvents } from './local-api-handler';\n\n/**\n * Minimal type for the Next.js Pages API request.\n * We intentionally avoid importing `next` so that `@uncaughtdev/core` has\n * zero runtime dependencies.\n */\ninterface PagesApiRequest {\n method?: string;\n body?: unknown;\n}\n\n/**\n * Minimal type for the Next.js Pages API response.\n */\ninterface PagesApiResponse {\n status: (code: number) => PagesApiResponse;\n json: (body: unknown) => void;\n setHeader?: (name: string, value: string) => PagesApiResponse;\n end?: () => void;\n}\n\n/**\n * Next.js Pages Router API handler (`/pages/api/uncaught/local.ts`).\n *\n * Accepts POST requests with `{ events: UncaughtEvent[] }` and writes them\n * to `.uncaught/`.\n *\n * Blocked in production unless `UNCAUGHT_LOCAL_IN_PROD=true` is set.\n */\nexport default async function handler(\n req: PagesApiRequest,\n res: PagesApiResponse\n): Promise<void> {\n try {\n // --- Method check ------------------------------------------------------\n if (req.method !== 'POST') {\n res.status(405).json({ error: 'Method not allowed' });\n return;\n }\n\n // --- Production guard --------------------------------------------------\n if (\n typeof process !== 'undefined' &&\n process.env.NODE_ENV === 'production' &&\n process.env.UNCAUGHT_LOCAL_IN_PROD !== 'true'\n ) {\n res.status(403).json({ error: 'Local handler is disabled in production' });\n return;\n }\n\n // --- Validate body -----------------------------------------------------\n const body = req.body;\n\n if (\n !body ||\n typeof body !== 'object' ||\n !Array.isArray((body as Record<string, unknown>).events)\n ) {\n res.status(400).json({ error: 'Payload must contain an \"events\" array' });\n return;\n }\n\n const events = (body as { events: UncaughtEvent[] }).events;\n\n if (events.length === 0) {\n res.status(202).json({ accepted: 0 });\n return;\n }\n\n // --- Write events to disk ----------------------------------------------\n await writeEvents(events);\n\n res.status(202).json({ accepted: events.length });\n } catch (err) {\n const message =\n err instanceof Error ? err.message : 'Internal server error';\n res.status(500).json({ error: message });\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/local-api-handler-pages.ts"],"names":["handler","req","res","body","events","writeEvents","err","message"],"mappings":"+FAyCA,eAAOA,CAAAA,CACLC,CAAAA,CACAC,CAAAA,CACe,CACf,GAAI,CAEF,GAAID,CAAAA,CAAI,MAAA,GAAW,MAAA,CAAQ,CACzBC,CAAAA,CAAI,OAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,KAAA,CAAO,oBAAqB,CAAC,CAAA,CACpD,MACF,CAGA,GACE,OAAO,OAAA,CAAY,GAAA,EACnB,OAAA,CAAQ,GAAA,CAAI,WAAa,YAAA,EACzB,OAAA,CAAQ,GAAA,CAAI,sBAAA,GAA2B,MAAA,CACvC,CACAA,CAAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,KAAA,CAAO,yCAA0C,CAAC,CAAA,CACzE,MACF,CAGA,IAAMC,CAAAA,CAAOF,CAAAA,CAAI,IAAA,CAEjB,GACE,CAACE,CAAAA,EACD,OAAOA,CAAAA,EAAS,QAAA,EAChB,CAAC,KAAA,CAAM,OAAA,CAASA,CAAAA,CAAiC,MAAM,EACvD,CACAD,CAAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,KAAA,CAAO,wCAAyC,CAAC,CAAA,CACxE,MACF,CAEA,IAAME,CAAAA,CAAUD,CAAAA,CAAqC,OAErD,GAAIC,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAG,CACvBF,CAAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,QAAA,CAAU,CAAE,CAAC,CAAA,CACpC,MACF,CAGA,MAAMG,CAAAA,CAAYD,CAAM,CAAA,CAExBF,CAAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,QAAA,CAAUE,CAAAA,CAAO,MAAO,CAAC,EAClD,CAAA,MAASE,EAAK,CACZ,IAAMC,CAAAA,CACJD,CAAAA,YAAe,KAAA,CAAQA,CAAAA,CAAI,OAAA,CAAU,uBAAA,CACvCJ,EAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAE,KAAA,CAAOK,CAAQ,CAAC,EACzC,CACF","file":"local-api-handler-pages.mjs","sourcesContent":["// ---------------------------------------------------------------------------\n// @uncaughtdev/core — Next.js Pages Router local API handler\n// ---------------------------------------------------------------------------\n//\n// Usage:\n// // pages/api/uncaught/local.ts\n// export { default } from '@uncaughtdev/core/local-api-handler/pages';\n//\n// ---------------------------------------------------------------------------\n\nimport type { UncaughtEvent } from './types';\nimport { writeEvents } from './local-api-handler';\n\n/**\n * Minimal type for the Next.js Pages API request.\n * We intentionally avoid importing `next` so that `@uncaughtdev/core` has\n * zero runtime dependencies.\n */\ninterface PagesApiRequest {\n method?: string;\n body?: unknown;\n}\n\n/**\n * Minimal type for the Next.js Pages API response.\n */\ninterface PagesApiResponse {\n status: (code: number) => PagesApiResponse;\n json: (body: unknown) => void;\n setHeader?: (name: string, value: string) => PagesApiResponse;\n end?: () => void;\n}\n\n/**\n * Next.js Pages Router API handler (`/pages/api/uncaught/local.ts`).\n *\n * Accepts POST requests with `{ events: UncaughtEvent[] }` and writes them\n * to `.uncaught/`.\n *\n * Blocked in production unless `UNCAUGHT_LOCAL_IN_PROD=true` is set.\n */\nexport default async function handler(\n req: PagesApiRequest,\n res: PagesApiResponse\n): Promise<void> {\n try {\n // --- Method check ------------------------------------------------------\n if (req.method !== 'POST') {\n res.status(405).json({ error: 'Method not allowed' });\n return;\n }\n\n // --- Production guard --------------------------------------------------\n if (\n typeof process !== 'undefined' &&\n process.env.NODE_ENV === 'production' &&\n process.env.UNCAUGHT_LOCAL_IN_PROD !== 'true'\n ) {\n res.status(403).json({ error: 'Local handler is disabled in production' });\n return;\n }\n\n // --- Validate body -----------------------------------------------------\n const body = req.body;\n\n if (\n !body ||\n typeof body !== 'object' ||\n !Array.isArray((body as Record<string, unknown>).events)\n ) {\n res.status(400).json({ error: 'Payload must contain an \"events\" array' });\n return;\n }\n\n const events = (body as { events: UncaughtEvent[] }).events;\n\n if (events.length === 0) {\n res.status(202).json({ accepted: 0 });\n return;\n }\n\n // --- Write events to disk ----------------------------------------------\n await writeEvents(events);\n\n res.status(202).json({ accepted: events.length });\n } catch (err) {\n const message =\n err instanceof Error ? err.message : 'Internal server error';\n res.status(500).json({ error: message });\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { U as UncaughtEvent } from './types-CjgYXVc_.mjs';
1
+ import { U as UncaughtEvent } from './types-D1Fw4k-D.mjs';
2
2
 
3
3
  /**
4
4
  * Next.js App Router POST handler.
@@ -1,4 +1,4 @@
1
- import { U as UncaughtEvent } from './types-CjgYXVc_.js';
1
+ import { U as UncaughtEvent } from './types-D1Fw4k-D.js';
2
2
 
3
3
  /**
4
4
  * Next.js App Router POST handler.
@@ -1,2 +1,2 @@
1
- 'use strict';var chunkFFHQ452Q_js=require('./chunk-FFHQ452Q.js');require('./chunk-E76GW6KF.js');Object.defineProperty(exports,"POST",{enumerable:true,get:function(){return chunkFFHQ452Q_js.a}});Object.defineProperty(exports,"writeEvents",{enumerable:true,get:function(){return chunkFFHQ452Q_js.b}});//# sourceMappingURL=local-api-handler.js.map
1
+ 'use strict';var chunkMSUAXLMV_js=require('./chunk-MSUAXLMV.js');require('./chunk-E76GW6KF.js'),require('./chunk-2YXXFGBV.js');Object.defineProperty(exports,"POST",{enumerable:true,get:function(){return chunkMSUAXLMV_js.a}});Object.defineProperty(exports,"writeEvents",{enumerable:true,get:function(){return chunkMSUAXLMV_js.b}});//# sourceMappingURL=local-api-handler.js.map
2
2
  //# sourceMappingURL=local-api-handler.js.map
@@ -1,2 +1,2 @@
1
- export{a as POST,b as writeEvents}from'./chunk-JALIO2BZ.mjs';import'./chunk-P6JRN5CN.mjs';//# sourceMappingURL=local-api-handler.mjs.map
1
+ export{a as POST,b as writeEvents}from'./chunk-BXMN7NW4.mjs';import'./chunk-P6JRN5CN.mjs';import'./chunk-A6GKDPT3.mjs';//# sourceMappingURL=local-api-handler.mjs.map
2
2
  //# sourceMappingURL=local-api-handler.mjs.map