@bugwatch/core 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +237 -9
- package/dist/index.d.ts +237 -9
- package/dist/index.js +444 -45
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +429 -46
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/transport.ts","../src/stacktrace.ts","../src/fingerprint.ts","../src/client.ts","../src/index.ts"],"names":["Bugwatch"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ErrorEvent, Transport, BugwatchOptions } from \"./types\";\n\nconst DEFAULT_ENDPOINT = \"https://api.bugwatch.dev\";\n\n/**\n * HTTP transport for sending events to the Bugwatch API\n */\nexport class HttpTransport implements Transport {\n private endpoint: string;\n private apiKey: string;\n private debug: boolean;\n\n constructor(options: BugwatchOptions) {\n this.endpoint = options.endpoint || DEFAULT_ENDPOINT;\n this.apiKey = options.apiKey;\n this.debug = options.debug || false;\n }\n\n async send(event: ErrorEvent): Promise<void> {\n const url = `${this.endpoint}/api/v1/events`;\n\n if (this.debug) {\n console.log(\"[Bugwatch] Sending event:\", event.event_id);\n }\n\n try {\n const response = await this.fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": this.apiKey,\n \"X-Bugwatch-SDK\": event.sdk?.name || \"bugwatch-core\",\n \"X-Bugwatch-SDK-Version\": event.sdk?.version || \"0.1.0\",\n },\n body: JSON.stringify(event),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n if (this.debug) {\n console.error(\"[Bugwatch] Failed to send event:\", response.status, errorText);\n }\n\n // Handle rate limiting\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"Retry-After\");\n if (this.debug) {\n console.warn(`[Bugwatch] Rate limited. Retry after ${retryAfter}s`);\n }\n }\n\n throw new Error(`Failed to send event: ${response.status}`);\n }\n\n if (this.debug) {\n console.log(\"[Bugwatch] Event sent successfully:\", event.event_id);\n }\n } catch (error) {\n if (this.debug) {\n console.error(\"[Bugwatch] Transport error:\", error);\n }\n // Don't throw - we don't want SDK errors to break the application\n }\n }\n\n /**\n * Abstract fetch to support different environments\n */\n private async fetch(\n url: string,\n options: RequestInit\n ): Promise<Response> {\n // Use global fetch (available in Node 18+, browsers, and edge runtimes)\n if (typeof globalThis.fetch === \"function\") {\n return globalThis.fetch(url, options);\n }\n\n throw new Error(\"No fetch implementation available\");\n }\n}\n\n/**\n * No-op transport for testing or disabled SDK\n */\nexport class NoopTransport implements Transport {\n async send(_event: ErrorEvent): Promise<void> {\n // Do nothing\n }\n}\n\n/**\n * Console transport for development/debugging\n */\nexport class ConsoleTransport implements Transport {\n async send(event: ErrorEvent): Promise<void> {\n console.log(\"[Bugwatch Event]\", JSON.stringify(event, null, 2));\n }\n}\n\n/**\n * Batching transport that queues events and sends them in batches\n */\nexport class BatchTransport implements Transport {\n private transport: Transport;\n private queue: ErrorEvent[] = [];\n private maxBatchSize: number;\n private flushInterval: number;\n private timer: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n transport: Transport,\n options: { maxBatchSize?: number; flushInterval?: number } = {}\n ) {\n this.transport = transport;\n this.maxBatchSize = options.maxBatchSize || 10;\n this.flushInterval = options.flushInterval || 5000;\n\n // Start flush timer\n this.startTimer();\n }\n\n async send(event: ErrorEvent): Promise<void> {\n this.queue.push(event);\n\n if (this.queue.length >= this.maxBatchSize) {\n await this.flush();\n }\n }\n\n async flush(): Promise<void> {\n if (this.queue.length === 0) {\n return;\n }\n\n const events = this.queue.splice(0, this.maxBatchSize);\n\n // Send events in parallel\n await Promise.all(events.map((event) => this.transport.send(event)));\n }\n\n private startTimer(): void {\n if (typeof setInterval !== \"undefined\") {\n this.timer = setInterval(() => {\n this.flush().catch(() => {\n // Ignore flush errors\n });\n }, this.flushInterval);\n\n // Unref timer in Node.js to not block process exit\n if (this.timer && typeof this.timer === \"object\" && \"unref\" in this.timer) {\n (this.timer as NodeJS.Timeout).unref();\n }\n }\n }\n\n destroy(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n}\n","import type { StackFrame } from \"./types\";\n\n/**\n * Parse an Error's stack trace into structured frames\n */\nexport function parseStackTrace(error: Error): StackFrame[] {\n const stack = error.stack;\n if (!stack) {\n return [];\n }\n\n const frames: StackFrame[] = [];\n const lines = stack.split(\"\\n\");\n\n for (const line of lines) {\n const frame = parseStackLine(line);\n if (frame) {\n frames.push(frame);\n }\n }\n\n return frames;\n}\n\n/**\n * Parse a single stack trace line\n * Handles various formats:\n * - Chrome/Node: \" at functionName (file:line:col)\"\n * - Firefox: \"functionName@file:line:col\"\n * - Safari: \"functionName@file:line:col\"\n */\nfunction parseStackLine(line: string): StackFrame | null {\n // Skip empty lines and error message lines\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"Error:\") || trimmed.startsWith(\"at \") === false && !trimmed.includes(\"@\")) {\n // Check if it's a Chrome/Node format without \"at\"\n if (!trimmed.includes(\"@\") && !trimmed.startsWith(\"at \")) {\n return null;\n }\n }\n\n // Chrome/Node format: \"at functionName (file:line:col)\" or \"at file:line:col\"\n const chromeMatch = trimmed.match(\n /^\\s*at\\s+(?:(.+?)\\s+\\()?(?:(.+?):(\\d+):(\\d+)|(.+?):(\\d+)|(.+))\\)?$/\n );\n\n if (chromeMatch) {\n const [, func, file1, line1, col1, file2, line2, file3] = chromeMatch;\n const filename = file1 || file2 || file3 || \"<anonymous>\";\n const lineno = parseInt(line1 || line2 || \"0\", 10);\n const colno = parseInt(col1 || \"0\", 10);\n\n return {\n filename: normalizeFilename(filename),\n function: func || \"<anonymous>\",\n lineno,\n colno,\n in_app: isInAppFrame(filename),\n };\n }\n\n // Firefox/Safari format: \"functionName@file:line:col\"\n const firefoxMatch = trimmed.match(/^(.+?)@(.+?):(\\d+):(\\d+)$/);\n\n if (firefoxMatch) {\n const [, func, file, lineStr, colStr] = firefoxMatch;\n const filename = file || \"<anonymous>\";\n const lineno = parseInt(lineStr || \"0\", 10);\n const colno = parseInt(colStr || \"0\", 10);\n\n return {\n filename: normalizeFilename(filename),\n function: func || \"<anonymous>\",\n lineno,\n colno,\n in_app: isInAppFrame(filename),\n };\n }\n\n return null;\n}\n\n/**\n * Normalize filename by removing common prefixes\n */\nfunction normalizeFilename(filename: string): string {\n // Remove webpack:// prefix\n let normalized = filename.replace(/^webpack:\\/\\/[^/]*\\//, \"\");\n\n // Remove file:// prefix\n normalized = normalized.replace(/^file:\\/\\//, \"\");\n\n // Remove leading ./\n normalized = normalized.replace(/^\\.\\//, \"\");\n\n // Remove query strings\n normalized = normalized.replace(/\\?.*$/, \"\");\n\n return normalized;\n}\n\n/**\n * Determine if a frame is from the application code (not a library)\n */\nfunction isInAppFrame(filename: string): boolean {\n // Node modules are not in-app\n if (filename.includes(\"node_modules\")) {\n return false;\n }\n\n // Internal Node.js modules\n if (\n filename.startsWith(\"node:\") ||\n filename.startsWith(\"internal/\") ||\n filename.includes(\"(native)\")\n ) {\n return false;\n }\n\n // Browser built-ins\n if (filename.startsWith(\"<\") || filename === \"native code\") {\n return false;\n }\n\n // Common bundler/framework internals\n const internalPatterns = [\n /webpack\\/runtime/,\n /webpack\\/bootstrap/,\n /turbopack/,\n /__next/,\n /next\\/dist/,\n /react-dom/,\n /react\\/cjs/,\n /scheduler/,\n ];\n\n for (const pattern of internalPatterns) {\n if (pattern.test(filename)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Extract error name and message from Error object\n */\nexport function extractErrorInfo(error: Error): { type: string; value: string } {\n const type = error.name || \"Error\";\n const value = error.message || String(error);\n\n return { type, value };\n}\n","import type { ExceptionInfo, StackFrame } from \"./types\";\n\n/**\n * Generate a fingerprint for an error to group similar errors together.\n * Uses a combination of error type, message patterns, and stack trace.\n */\nexport function generateFingerprint(\n errorType: string,\n message: string,\n stacktrace?: StackFrame[]\n): string {\n const components: string[] = [];\n\n // 1. Error type\n components.push(errorType);\n\n // 2. Normalized message (remove dynamic values)\n const normalizedMessage = normalizeErrorMessage(message);\n components.push(normalizedMessage);\n\n // 3. Top in-app stack frame location\n if (stacktrace && stacktrace.length > 0) {\n const topInAppFrame = stacktrace.find((frame) => frame.in_app);\n if (topInAppFrame) {\n components.push(`${topInAppFrame.filename}:${topInAppFrame.function}`);\n } else {\n // Fall back to first frame\n const firstFrame = stacktrace[0];\n if (firstFrame) {\n components.push(`${firstFrame.filename}:${firstFrame.function}`);\n }\n }\n }\n\n // Generate hash from components\n return hashString(components.join(\"|\"));\n}\n\n/**\n * Generate fingerprint from exception info\n */\nexport function fingerprintFromException(exception: ExceptionInfo): string {\n return generateFingerprint(\n exception.type,\n exception.value,\n exception.stacktrace\n );\n}\n\n/**\n * Normalize error message by removing dynamic values like:\n * - Numbers\n * - UUIDs\n * - URLs with dynamic segments\n * - Timestamps\n * - Memory addresses\n */\nfunction normalizeErrorMessage(message: string): string {\n return (\n message\n // Replace UUIDs\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 // Replace hex addresses (0x...)\n .replace(/0x[0-9a-f]+/gi, \"<ADDR>\")\n // Replace numbers\n .replace(/\\b\\d+\\b/g, \"<N>\")\n // Replace quoted strings\n .replace(/\"[^\"]*\"/g, '\"<STR>\"')\n .replace(/'[^']*'/g, \"'<STR>'\")\n // Replace URLs\n .replace(/https?:\\/\\/[^\\s]+/g, \"<URL>\")\n // Replace file paths\n .replace(/\\/[\\w\\-./]+\\.\\w+/g, \"<PATH>\")\n // Collapse whitespace\n .replace(/\\s+/g, \" \")\n .trim()\n );\n}\n\n/**\n * Simple string hash function (FNV-1a)\n */\nfunction hashString(str: string): string {\n let hash = 2166136261;\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n // Convert to hex string\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n","import type {\n BugwatchOptions,\n BugwatchClient,\n ErrorEvent,\n Breadcrumb,\n UserContext,\n Transport,\n Integration,\n ExceptionInfo,\n} from \"./types\";\nimport { HttpTransport, NoopTransport } from \"./transport\";\nimport { parseStackTrace, extractErrorInfo } from \"./stacktrace\";\nimport { fingerprintFromException } from \"./fingerprint\";\n\nconst SDK_NAME = \"@bugwatch/core\";\nconst SDK_VERSION = \"0.1.0\";\n\n/**\n * Generate a unique event ID\n */\nfunction generateEventId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 10);\n return `${timestamp}${random}`;\n}\n\n/**\n * Default options\n */\nconst DEFAULT_OPTIONS: Partial<BugwatchOptions> = {\n endpoint: \"https://api.bugwatch.dev\",\n debug: false,\n sampleRate: 1.0,\n maxBreadcrumbs: 100,\n environment: \"production\",\n};\n\n/**\n * Core Bugwatch client implementation\n */\nexport class Bugwatch implements BugwatchClient {\n private options: BugwatchOptions;\n private transport: Transport;\n private breadcrumbs: Breadcrumb[] = [];\n private tags: Record<string, string> = {};\n private extra: Record<string, unknown> = {};\n private user: UserContext | null = null;\n private integrations: Integration[] = [];\n private initialized = false;\n\n constructor(options: BugwatchOptions) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n this.transport = this.createTransport();\n\n // Apply initial tags\n if (options.tags) {\n this.tags = { ...options.tags };\n }\n\n // Apply initial user\n if (options.user) {\n this.user = options.user;\n }\n\n this.initialized = true;\n }\n\n private createTransport(): Transport {\n if (!this.options.apiKey) {\n if (this.options.debug) {\n console.warn(\"[Bugwatch] No API key provided, SDK is disabled\");\n }\n return new NoopTransport();\n }\n\n return new HttpTransport(this.options);\n }\n\n /**\n * Register an integration\n */\n use(integration: Integration): this {\n this.integrations.push(integration);\n integration.setup(this);\n return this;\n }\n\n /**\n * Get SDK options\n */\n getOptions(): BugwatchOptions {\n return this.options;\n }\n\n /**\n * Capture an exception\n */\n captureException(error: Error, context?: Partial<ErrorEvent>): string {\n if (!this.initialized) {\n return \"\";\n }\n\n // Sample rate check\n if (Math.random() > (this.options.sampleRate || 1.0)) {\n return \"\";\n }\n\n // Check ignore patterns\n if (this.shouldIgnoreError(error)) {\n return \"\";\n }\n\n const event = this.createEventFromError(error, context);\n\n // Run beforeSend hook\n const processedEvent = this.options.beforeSend\n ? this.options.beforeSend(event)\n : event;\n\n if (!processedEvent) {\n if (this.options.debug) {\n console.log(\"[Bugwatch] Event dropped by beforeSend\");\n }\n return \"\";\n }\n\n // Send event asynchronously\n this.transport.send(processedEvent).catch(() => {\n // Errors are logged by transport\n });\n\n return processedEvent.event_id;\n }\n\n /**\n * Capture a message\n */\n captureMessage(\n message: string,\n level: ErrorEvent[\"level\"] = \"info\"\n ): string {\n if (!this.initialized) {\n return \"\";\n }\n\n const event = this.createEvent({\n message,\n level,\n });\n\n // Run beforeSend hook\n const processedEvent = this.options.beforeSend\n ? this.options.beforeSend(event)\n : event;\n\n if (!processedEvent) {\n return \"\";\n }\n\n this.transport.send(processedEvent).catch(() => {\n // Errors are logged by transport\n });\n\n return processedEvent.event_id;\n }\n\n /**\n * Add a breadcrumb\n */\n addBreadcrumb(breadcrumb: Omit<Breadcrumb, \"timestamp\">): void {\n const crumb: Breadcrumb = {\n ...breadcrumb,\n timestamp: new Date().toISOString(),\n };\n\n this.breadcrumbs.push(crumb);\n\n // Limit breadcrumbs\n const max = this.options.maxBreadcrumbs || 100;\n if (this.breadcrumbs.length > max) {\n this.breadcrumbs = this.breadcrumbs.slice(-max);\n }\n }\n\n /**\n * Set user context\n */\n setUser(user: UserContext | null): void {\n this.user = user;\n }\n\n /**\n * Set a tag\n */\n setTag(key: string, value: string): void {\n this.tags[key] = value;\n }\n\n /**\n * Set extra context\n */\n setExtra(key: string, value: unknown): void {\n this.extra[key] = value;\n }\n\n /**\n * Clear breadcrumbs\n */\n clearBreadcrumbs(): void {\n this.breadcrumbs = [];\n }\n\n /**\n * Create an event from an Error object\n */\n private createEventFromError(\n error: Error,\n context?: Partial<ErrorEvent>\n ): ErrorEvent {\n const { type, value } = extractErrorInfo(error);\n const stacktrace = parseStackTrace(error);\n\n const exception: ExceptionInfo = {\n type,\n value,\n stacktrace,\n };\n\n return this.createEvent({\n level: \"error\",\n message: `${type}: ${value}`,\n exception,\n ...context,\n });\n }\n\n /**\n * Create a base event\n */\n private createEvent(partial: Partial<ErrorEvent>): ErrorEvent {\n const event: ErrorEvent = {\n event_id: generateEventId(),\n timestamp: new Date().toISOString(),\n platform: this.detectPlatform(),\n level: partial.level || \"error\",\n message: partial.message || \"\",\n environment: this.options.environment,\n release: this.options.release,\n tags: { ...this.tags, ...partial.tags },\n extra: { ...this.extra, ...partial.extra },\n breadcrumbs: [...this.breadcrumbs],\n sdk: {\n name: SDK_NAME,\n version: SDK_VERSION,\n },\n ...partial,\n };\n\n // Add user context\n if (this.user || partial.user) {\n event.user = { ...this.user, ...partial.user };\n }\n\n // Generate fingerprint if exception exists\n if (event.exception) {\n const fingerprint = fingerprintFromException(event.exception);\n event.tags = { ...event.tags, fingerprint };\n }\n\n return event;\n }\n\n /**\n * Check if error should be ignored\n */\n private shouldIgnoreError(error: Error): boolean {\n if (!this.options.ignoreErrors || this.options.ignoreErrors.length === 0) {\n return false;\n }\n\n const message = error.message || String(error);\n\n for (const pattern of this.options.ignoreErrors) {\n if (typeof pattern === \"string\") {\n if (message.includes(pattern)) {\n return true;\n }\n } else if (pattern instanceof RegExp) {\n if (pattern.test(message)) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Detect the current platform\n */\n private detectPlatform(): string {\n if (typeof window !== \"undefined\") {\n return \"javascript\";\n }\n if (typeof process !== \"undefined\" && process.versions?.node) {\n return \"node\";\n }\n if (typeof EdgeRuntime !== \"undefined\") {\n return \"edge\";\n }\n return \"javascript\";\n }\n}\n\n// Type declaration for edge runtime\ndeclare const EdgeRuntime: string | undefined;\n","// Core client\nexport { Bugwatch } from \"./client\";\n\n// Types\nexport type {\n BugwatchOptions,\n BugwatchClient,\n ErrorEvent,\n ExceptionInfo,\n StackFrame,\n Breadcrumb,\n UserContext,\n RequestContext,\n RuntimeInfo,\n SdkInfo,\n Transport,\n Integration,\n} from \"./types\";\n\n// Transport implementations\nexport {\n HttpTransport,\n NoopTransport,\n ConsoleTransport,\n BatchTransport,\n} from \"./transport\";\n\n// Utilities\nexport { parseStackTrace, extractErrorInfo } from \"./stacktrace\";\nexport { generateFingerprint, fingerprintFromException } from \"./fingerprint\";\n\n// Global instance management\nlet globalClient: import(\"./client\").Bugwatch | null = null;\n\n/**\n * Initialize the global Bugwatch client\n */\nexport function init(options: import(\"./types\").BugwatchOptions): import(\"./client\").Bugwatch {\n const { Bugwatch } = require(\"./client\");\n const client = new Bugwatch(options);\n globalClient = client;\n return client;\n}\n\n/**\n * Get the global Bugwatch client\n */\nexport function getClient(): import(\"./client\").Bugwatch | null {\n return globalClient;\n}\n\n/**\n * Capture an exception using the global client\n */\nexport function captureException(\n error: Error,\n context?: Partial<import(\"./types\").ErrorEvent>\n): string {\n if (!globalClient) {\n console.warn(\"[Bugwatch] SDK not initialized. Call init() first.\");\n return \"\";\n }\n return globalClient.captureException(error, context);\n}\n\n/**\n * Capture a message using the global client\n */\nexport function captureMessage(\n message: string,\n level?: import(\"./types\").ErrorEvent[\"level\"]\n): string {\n if (!globalClient) {\n console.warn(\"[Bugwatch] SDK not initialized. Call init() first.\");\n return \"\";\n }\n return globalClient.captureMessage(message, level);\n}\n\n/**\n * Add a breadcrumb using the global client\n */\nexport function addBreadcrumb(\n breadcrumb: Omit<import(\"./types\").Breadcrumb, \"timestamp\">\n): void {\n if (!globalClient) {\n return;\n }\n globalClient.addBreadcrumb(breadcrumb);\n}\n\n/**\n * Set user context on the global client\n */\nexport function setUser(user: import(\"./types\").UserContext | null): void {\n if (!globalClient) {\n return;\n }\n globalClient.setUser(user);\n}\n\n/**\n * Set a tag on the global client\n */\nexport function setTag(key: string, value: string): void {\n if (!globalClient) {\n return;\n }\n globalClient.setTag(key, value);\n}\n\n/**\n * Set extra context on the global client\n */\nexport function setExtra(key: string, value: unknown): void {\n if (!globalClient) {\n return;\n }\n globalClient.setExtra(key, value);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/transport.ts","../src/stacktrace.ts","../src/fingerprint.ts","../src/context.ts","../src/client.ts","../src/env.ts","../src/index.ts"],"names":["Bugwatch","getEnvConfig","validateApiKey","hasApiKey","addRequestBreadcrumb","setRequestUser","setRequestTag","setRequestExtra"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { ErrorEvent, Transport, BugwatchOptions } from \"./types\";\n\nconst DEFAULT_ENDPOINT = \"https://api.bugwatch.dev\";\nconst DEFAULT_TIMEOUT_MS = 10000;\n\n/**\n * Safely serialize a value to JSON, handling circular references.\n */\nfunction safeJsonStringify(value: unknown): string {\n const seen = new WeakSet();\n return JSON.stringify(value, (_key, val) => {\n if (typeof val === \"object\" && val !== null) {\n if (seen.has(val)) {\n return \"[Circular]\";\n }\n seen.add(val);\n }\n return val;\n });\n}\n\n/**\n * HTTP transport for sending events to the Bugwatch API\n */\nexport class HttpTransport implements Transport {\n private endpoint: string;\n private apiKey: string;\n private debug: boolean;\n private timeoutMs: number;\n\n constructor(options: BugwatchOptions) {\n this.endpoint = options.endpoint || DEFAULT_ENDPOINT;\n this.apiKey = options.apiKey;\n this.debug = options.debug || false;\n this.timeoutMs = DEFAULT_TIMEOUT_MS;\n }\n\n async send(event: ErrorEvent): Promise<void> {\n const url = `${this.endpoint}/api/v1/events`;\n\n if (this.debug) {\n console.log(\"[Bugwatch] Sending event:\", event.event_id);\n }\n\n try {\n const controller = typeof AbortController !== \"undefined\" ? new AbortController() : null;\n const timeoutId = controller\n ? setTimeout(() => controller.abort(), this.timeoutMs)\n : null;\n\n try {\n const response = await this.fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${this.apiKey}`,\n \"X-Bugwatch-SDK\": event.sdk?.name || \"bugwatch-core\",\n \"X-Bugwatch-SDK-Version\": event.sdk?.version || \"0.1.0\",\n },\n body: safeJsonStringify(event),\n ...(controller && { signal: controller.signal }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n if (this.debug) {\n console.error(\"[Bugwatch] Failed to send event:\", response.status, errorText);\n }\n\n // Handle rate limiting\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"Retry-After\");\n if (this.debug) {\n console.warn(`[Bugwatch] Rate limited. Retry after ${retryAfter}s`);\n }\n }\n\n throw new Error(`Failed to send event: ${response.status}`);\n }\n\n if (this.debug) {\n console.log(\"[Bugwatch] Event sent successfully:\", event.event_id);\n }\n } finally {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n }\n } catch (error) {\n if (this.debug) {\n const message = error instanceof Error && error.name === \"AbortError\"\n ? `[Bugwatch] Request timed out after ${this.timeoutMs}ms`\n : \"[Bugwatch] Transport error:\";\n console.error(message, error);\n }\n // Don't throw - we don't want SDK errors to break the application\n }\n }\n\n /**\n * Abstract fetch to support different environments\n */\n private async fetch(\n url: string,\n options: RequestInit\n ): Promise<Response> {\n // Use global fetch (available in Node 18+, browsers, and edge runtimes)\n if (typeof globalThis.fetch === \"function\") {\n return globalThis.fetch(url, options);\n }\n\n throw new Error(\"No fetch implementation available\");\n }\n}\n\n/**\n * No-op transport for testing or disabled SDK\n */\nexport class NoopTransport implements Transport {\n async send(_event: ErrorEvent): Promise<void> {\n // Do nothing\n }\n}\n\n/**\n * Console transport for development/debugging\n */\nexport class ConsoleTransport implements Transport {\n async send(event: ErrorEvent): Promise<void> {\n console.log(\"[Bugwatch Event]\", safeJsonStringify(event));\n }\n}\n\n/**\n * Batching transport that queues events and sends them in batches\n */\nexport class BatchTransport implements Transport {\n private transport: Transport;\n private queue: ErrorEvent[] = [];\n private maxBatchSize: number;\n private flushInterval: number;\n private timer: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n transport: Transport,\n options: { maxBatchSize?: number; flushInterval?: number } = {}\n ) {\n this.transport = transport;\n this.maxBatchSize = options.maxBatchSize || 10;\n this.flushInterval = options.flushInterval || 5000;\n\n // Start flush timer\n this.startTimer();\n }\n\n async send(event: ErrorEvent): Promise<void> {\n this.queue.push(event);\n\n if (this.queue.length >= this.maxBatchSize) {\n await this.flush();\n }\n }\n\n async flush(): Promise<void> {\n if (this.queue.length === 0) {\n return;\n }\n\n const events = this.queue.splice(0, this.maxBatchSize);\n\n // Send events in parallel, don't fail the batch if individual events fail\n const results = await Promise.allSettled(events.map((event) => this.transport.send(event)));\n\n // Log failures in debug mode (transport itself doesn't throw, but just in case)\n for (const result of results) {\n if (result.status === \"rejected\") {\n // Silently ignore - individual transport.send() already handles errors\n }\n }\n }\n\n private startTimer(): void {\n if (typeof setInterval !== \"undefined\") {\n this.timer = setInterval(() => {\n this.flush().catch(() => {\n // Ignore flush errors\n });\n }, this.flushInterval);\n\n // Unref timer in Node.js to not block process exit\n if (this.timer && typeof this.timer === \"object\" && \"unref\" in this.timer) {\n (this.timer as NodeJS.Timeout).unref();\n }\n }\n }\n\n destroy(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n\n /**\n * Close the transport, flushing any remaining events and stopping the timer.\n */\n async close(): Promise<void> {\n await this.flush();\n this.destroy();\n }\n}\n","import type { StackFrame } from \"./types\";\n\n/**\n * Parse an Error's stack trace into structured frames\n */\nexport function parseStackTrace(error: Error): StackFrame[] {\n const stack = error.stack;\n if (!stack) {\n return [];\n }\n\n const frames: StackFrame[] = [];\n const lines = stack.split(\"\\n\");\n\n for (const line of lines) {\n const frame = parseStackLine(line);\n if (frame) {\n frames.push(frame);\n }\n }\n\n return frames;\n}\n\n/**\n * Parse a single stack trace line\n * Handles various formats:\n * - Chrome/Node: \" at functionName (file:line:col)\"\n * - Firefox: \"functionName@file:line:col\"\n * - Safari: \"functionName@file:line:col\"\n */\nfunction parseStackLine(line: string): StackFrame | null {\n // Skip empty lines and error message lines\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"Error:\") || trimmed.startsWith(\"at \") === false && !trimmed.includes(\"@\")) {\n // Check if it's a Chrome/Node format without \"at\"\n if (!trimmed.includes(\"@\") && !trimmed.startsWith(\"at \")) {\n return null;\n }\n }\n\n // Chrome/Node format: \"at functionName (file:line:col)\" or \"at file:line:col\"\n const chromeMatch = trimmed.match(\n /^\\s*at\\s+(?:(.+?)\\s+\\()?(?:(.+?):(\\d+):(\\d+)|(.+?):(\\d+)|(.+))\\)?$/\n );\n\n if (chromeMatch) {\n const [, func, file1, line1, col1, file2, line2, file3] = chromeMatch;\n const filename = file1 || file2 || file3 || \"<anonymous>\";\n const lineno = parseInt(line1 || line2 || \"0\", 10);\n const colno = parseInt(col1 || \"0\", 10);\n\n return {\n filename: normalizeFilename(filename),\n function: func || \"<anonymous>\",\n lineno,\n colno,\n in_app: isInAppFrame(filename),\n };\n }\n\n // Firefox/Safari format: \"functionName@file:line:col\"\n const firefoxMatch = trimmed.match(/^(.+?)@(.+?):(\\d+):(\\d+)$/);\n\n if (firefoxMatch) {\n const [, func, file, lineStr, colStr] = firefoxMatch;\n const filename = file || \"<anonymous>\";\n const lineno = parseInt(lineStr || \"0\", 10);\n const colno = parseInt(colStr || \"0\", 10);\n\n return {\n filename: normalizeFilename(filename),\n function: func || \"<anonymous>\",\n lineno,\n colno,\n in_app: isInAppFrame(filename),\n };\n }\n\n return null;\n}\n\n/**\n * Normalize filename by removing common prefixes\n */\nfunction normalizeFilename(filename: string): string {\n // Remove webpack:// prefix\n let normalized = filename.replace(/^webpack:\\/\\/[^/]*\\//, \"\");\n\n // Remove file:// prefix\n normalized = normalized.replace(/^file:\\/\\//, \"\");\n\n // Remove leading ./\n normalized = normalized.replace(/^\\.\\//, \"\");\n\n // Remove query strings\n normalized = normalized.replace(/\\?.*$/, \"\");\n\n return normalized;\n}\n\n/**\n * Determine if a frame is from the application code (not a library)\n */\nfunction isInAppFrame(filename: string): boolean {\n // Node modules are not in-app\n if (filename.includes(\"node_modules\")) {\n return false;\n }\n\n // Internal Node.js modules\n if (\n filename.startsWith(\"node:\") ||\n filename.startsWith(\"internal/\") ||\n filename.includes(\"(native)\")\n ) {\n return false;\n }\n\n // Browser built-ins\n if (filename.startsWith(\"<\") || filename === \"native code\") {\n return false;\n }\n\n // Common bundler/framework internals\n const internalPatterns = [\n /webpack\\/runtime/,\n /webpack\\/bootstrap/,\n /turbopack/,\n /__next/,\n /next\\/dist/,\n /react-dom/,\n /react\\/cjs/,\n /scheduler/,\n ];\n\n for (const pattern of internalPatterns) {\n if (pattern.test(filename)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Extract error name and message from Error object\n */\nexport function extractErrorInfo(error: Error): { type: string; value: string } {\n const type = error.name || \"Error\";\n const value = error.message || String(error);\n\n return { type, value };\n}\n","import type { ExceptionInfo, StackFrame } from \"./types\";\n\n/**\n * Generate a fingerprint for an error to group similar errors together.\n * Uses a combination of error type, message patterns, and stack trace.\n */\nexport function generateFingerprint(\n errorType: string,\n message: string,\n stacktrace?: StackFrame[]\n): string {\n const components: string[] = [];\n\n // 1. Error type\n components.push(errorType);\n\n // 2. Normalized message (remove dynamic values)\n const normalizedMessage = normalizeErrorMessage(message);\n components.push(normalizedMessage);\n\n // 3. Top in-app stack frame location\n if (stacktrace && stacktrace.length > 0) {\n const topInAppFrame = stacktrace.find((frame) => frame.in_app);\n if (topInAppFrame) {\n components.push(`${topInAppFrame.filename}:${topInAppFrame.function}`);\n } else {\n // Fall back to first frame\n const firstFrame = stacktrace[0];\n if (firstFrame) {\n components.push(`${firstFrame.filename}:${firstFrame.function}`);\n }\n }\n }\n\n // Generate hash from components\n return hashString(components.join(\"|\"));\n}\n\n/**\n * Generate fingerprint from exception info\n */\nexport function fingerprintFromException(exception: ExceptionInfo): string {\n return generateFingerprint(\n exception.type,\n exception.value,\n exception.stacktrace\n );\n}\n\n/**\n * Normalize error message by removing dynamic values like:\n * - Numbers\n * - UUIDs\n * - URLs with dynamic segments\n * - Timestamps\n * - Memory addresses\n */\nfunction normalizeErrorMessage(message: string): string {\n return (\n message\n // Replace UUIDs\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 // Replace hex addresses (0x...)\n .replace(/0x[0-9a-f]+/gi, \"<ADDR>\")\n // Replace numbers\n .replace(/\\b\\d+\\b/g, \"<N>\")\n // Replace quoted strings\n .replace(/\"[^\"]*\"/g, '\"<STR>\"')\n .replace(/'[^']*'/g, \"'<STR>'\")\n // Replace URLs\n .replace(/https?:\\/\\/[^\\s]+/g, \"<URL>\")\n // Replace file paths\n .replace(/\\/[\\w\\-./]+\\.\\w+/g, \"<PATH>\")\n // Collapse whitespace\n .replace(/\\s+/g, \" \")\n .trim()\n );\n}\n\n/**\n * Simple string hash function (FNV-1a)\n */\nfunction hashString(str: string): string {\n let hash = 2166136261;\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n // Convert to hex string\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n","/**\n * Request-scoped context using AsyncLocalStorage.\n *\n * This module provides thread-safe, request-isolated context storage\n * for Node.js environments. Each concurrent request gets its own\n * isolated context that won't leak to other requests.\n */\n\nimport type { UserContext, Breadcrumb } from \"./types\";\n\n/**\n * Request-scoped context that is isolated per request\n */\nexport interface ScopedContext {\n user: UserContext | null;\n tags: Record<string, string>;\n extra: Record<string, unknown>;\n breadcrumbs: Breadcrumb[];\n}\n\n/**\n * Create a new empty scoped context\n */\nexport function createScopedContext(): ScopedContext {\n return {\n user: null,\n tags: {},\n extra: {},\n breadcrumbs: [],\n };\n}\n\n// AsyncLocalStorage is only available in Node.js environments\nlet asyncLocalStorage: import(\"async_hooks\").AsyncLocalStorage<ScopedContext> | null = null;\n\n/**\n * Check if we're in a Node.js environment with async_hooks support\n */\nfunction isNodeEnvironment(): boolean {\n return typeof process !== \"undefined\" &&\n process.versions?.node !== undefined &&\n typeof require !== \"undefined\";\n}\n\n/**\n * Initialize the AsyncLocalStorage if available\n */\nfunction getAsyncLocalStorage(): import(\"async_hooks\").AsyncLocalStorage<ScopedContext> | null {\n if (asyncLocalStorage) {\n return asyncLocalStorage;\n }\n\n if (!isNodeEnvironment()) {\n return null;\n }\n\n try {\n // Dynamic import for Node.js environments\n const asyncHooks = require(\"async_hooks\") as typeof import(\"async_hooks\");\n asyncLocalStorage = new asyncHooks.AsyncLocalStorage<ScopedContext>();\n return asyncLocalStorage;\n } catch {\n // async_hooks not available (browser, edge runtime, etc.)\n return null;\n }\n}\n\n/**\n * Run a function within an isolated context.\n *\n * All context operations (setUser, setTag, etc.) within this function\n * will be scoped to this context and won't affect other concurrent requests.\n *\n * @param context - The initial context for this scope\n * @param fn - The function to run within the context\n * @returns The result of the function\n */\nexport function runWithContext<T>(context: ScopedContext, fn: () => T): T {\n const storage = getAsyncLocalStorage();\n if (storage) {\n return storage.run(context, fn);\n }\n // Fallback: just run the function without isolation\n return fn();\n}\n\n/**\n * Run an async function within an isolated context.\n */\nexport async function runWithContextAsync<T>(\n context: ScopedContext,\n fn: () => Promise<T>\n): Promise<T> {\n const storage = getAsyncLocalStorage();\n if (storage) {\n return storage.run(context, fn);\n }\n return fn();\n}\n\n/**\n * Get the current request-scoped context.\n * Returns undefined if not running within a context scope.\n */\nexport function getRequestContext(): ScopedContext | undefined {\n const storage = getAsyncLocalStorage();\n return storage?.getStore();\n}\n\n/**\n * Check if we're currently running within a scoped context\n */\nexport function hasRequestContext(): boolean {\n return getRequestContext() !== undefined;\n}\n\n/**\n * Set user in the current request context (if available)\n * Returns true if the user was set in request context, false otherwise\n */\nexport function setRequestUser(user: UserContext | null): boolean {\n const ctx = getRequestContext();\n if (ctx) {\n ctx.user = user;\n return true;\n }\n return false;\n}\n\n/**\n * Set a tag in the current request context (if available)\n * Returns true if the tag was set in request context, false otherwise\n */\nexport function setRequestTag(key: string, value: string): boolean {\n const ctx = getRequestContext();\n if (ctx) {\n ctx.tags[key] = value;\n return true;\n }\n return false;\n}\n\n/**\n * Set extra data in the current request context (if available)\n * Returns true if the extra was set in request context, false otherwise\n */\nexport function setRequestExtra(key: string, value: unknown): boolean {\n const ctx = getRequestContext();\n if (ctx) {\n ctx.extra[key] = value;\n return true;\n }\n return false;\n}\n\n/**\n * Add a breadcrumb to the current request context (if available)\n * Returns true if the breadcrumb was added to request context, false otherwise\n */\nexport function addRequestBreadcrumb(breadcrumb: Breadcrumb, maxBreadcrumbs: number = 100): boolean {\n const ctx = getRequestContext();\n if (ctx) {\n ctx.breadcrumbs.push(breadcrumb);\n // Limit breadcrumbs\n if (ctx.breadcrumbs.length > maxBreadcrumbs) {\n ctx.breadcrumbs = ctx.breadcrumbs.slice(-maxBreadcrumbs);\n }\n return true;\n }\n return false;\n}\n\n/**\n * Get the merged context from request scope and global scope\n */\nexport function getMergedContext(\n globalUser: UserContext | null,\n globalTags: Record<string, string>,\n globalExtra: Record<string, unknown>,\n globalBreadcrumbs: Breadcrumb[]\n): {\n user: UserContext | null;\n tags: Record<string, string>;\n extra: Record<string, unknown>;\n breadcrumbs: Breadcrumb[];\n} {\n const reqCtx = getRequestContext();\n\n if (!reqCtx) {\n return {\n user: globalUser,\n tags: globalTags,\n extra: globalExtra,\n breadcrumbs: globalBreadcrumbs,\n };\n }\n\n // Request context takes precedence over global context\n return {\n user: reqCtx.user || globalUser,\n tags: { ...globalTags, ...reqCtx.tags },\n extra: { ...globalExtra, ...reqCtx.extra },\n breadcrumbs: [...globalBreadcrumbs, ...reqCtx.breadcrumbs],\n };\n}\n","import type {\n BugwatchOptions,\n BugwatchClient,\n ErrorEvent,\n Breadcrumb,\n UserContext,\n Transport,\n Integration,\n ExceptionInfo,\n} from \"./types\";\nimport { HttpTransport, NoopTransport } from \"./transport\";\nimport { parseStackTrace, extractErrorInfo } from \"./stacktrace\";\nimport { fingerprintFromException } from \"./fingerprint\";\nimport { getMergedContext } from \"./context\";\n\n/**\n * Ring buffer for efficient breadcrumb storage.\n * Avoids array shifting/slicing on every breadcrumb addition.\n */\nclass RingBuffer<T> {\n private buffer: (T | undefined)[];\n private head = 0;\n private count = 0;\n\n constructor(private maxSize: number) {\n this.buffer = new Array(maxSize);\n }\n\n push(item: T): void {\n this.buffer[this.head] = item;\n this.head = (this.head + 1) % this.maxSize;\n if (this.count < this.maxSize) {\n this.count++;\n }\n }\n\n toArray(): T[] {\n if (this.count === 0) {\n return [];\n }\n\n const result: T[] = [];\n // Start from the oldest item\n const start = this.count < this.maxSize ? 0 : this.head;\n\n for (let i = 0; i < this.count; i++) {\n const index = (start + i) % this.maxSize;\n const item = this.buffer[index];\n if (item !== undefined) {\n result.push(item);\n }\n }\n\n return result;\n }\n\n clear(): void {\n this.buffer = new Array(this.maxSize);\n this.head = 0;\n this.count = 0;\n }\n\n get length(): number {\n return this.count;\n }\n}\n\nconst SDK_NAME = \"@bugwatch/core\";\nconst SDK_VERSION = \"0.1.0\";\n\n/**\n * Generate a unique event ID\n */\nfunction generateEventId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 10);\n return `${timestamp}${random}`;\n}\n\n/**\n * Default options\n */\nconst DEFAULT_OPTIONS: Partial<BugwatchOptions> = {\n endpoint: \"https://api.bugwatch.dev\",\n debug: false,\n sampleRate: 1.0,\n maxBreadcrumbs: 100,\n environment: \"production\",\n};\n\n/**\n * Core Bugwatch client implementation\n */\nexport class Bugwatch implements BugwatchClient {\n private options: BugwatchOptions;\n private transport: Transport;\n private breadcrumbs: RingBuffer<Breadcrumb>;\n private tags: Record<string, string> = {};\n private extra: Record<string, unknown> = {};\n private user: UserContext | null = null;\n private integrations: Integration[] = [];\n private initialized = false;\n\n constructor(options: BugwatchOptions) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n this.transport = this.createTransport();\n this.breadcrumbs = new RingBuffer<Breadcrumb>(this.options.maxBreadcrumbs || 100);\n\n // Apply initial tags\n if (options.tags) {\n this.tags = { ...options.tags };\n }\n\n // Apply initial user\n if (options.user) {\n this.user = options.user;\n }\n\n this.initialized = true;\n }\n\n private createTransport(): Transport {\n if (!this.options.apiKey) {\n if (this.options.debug) {\n console.warn(\"[Bugwatch] No API key provided, SDK is disabled\");\n }\n return new NoopTransport();\n }\n\n return new HttpTransport(this.options);\n }\n\n /**\n * Register an integration\n */\n use(integration: Integration): this {\n this.integrations.push(integration);\n integration.setup(this);\n return this;\n }\n\n /**\n * Get SDK options\n */\n getOptions(): BugwatchOptions {\n return this.options;\n }\n\n /**\n * Capture an exception\n */\n captureException(error: Error, context?: Partial<ErrorEvent>): string {\n if (!this.initialized) {\n return \"\";\n }\n\n // Sample rate check\n if (Math.random() > (this.options.sampleRate || 1.0)) {\n return \"\";\n }\n\n // Check ignore patterns\n if (this.shouldIgnoreError(error)) {\n return \"\";\n }\n\n const event = this.createEventFromError(error, context);\n\n // Run beforeSend hook with error handling\n let processedEvent: import(\"./types\").ErrorEvent | null = event;\n if (this.options.beforeSend) {\n try {\n processedEvent = this.options.beforeSend(event);\n } catch (err) {\n if (this.options.debug) {\n console.error(\"[Bugwatch] beforeSend threw an error:\", err);\n }\n // Continue with original event if beforeSend throws\n processedEvent = event;\n }\n }\n\n if (!processedEvent) {\n if (this.options.debug) {\n console.log(\"[Bugwatch] Event dropped by beforeSend\");\n }\n return \"\";\n }\n\n // Send event asynchronously\n this.transport.send(processedEvent).catch(() => {\n // Errors are logged by transport\n });\n\n return processedEvent.event_id;\n }\n\n /**\n * Capture a message\n */\n captureMessage(\n message: string,\n level: ErrorEvent[\"level\"] = \"info\"\n ): string {\n if (!this.initialized) {\n return \"\";\n }\n\n const event = this.createEvent({\n message,\n level,\n });\n\n // Run beforeSend hook with error handling\n let processedEvent: import(\"./types\").ErrorEvent | null = event;\n if (this.options.beforeSend) {\n try {\n processedEvent = this.options.beforeSend(event);\n } catch (err) {\n if (this.options.debug) {\n console.error(\"[Bugwatch] beforeSend threw an error:\", err);\n }\n // Continue with original event if beforeSend throws\n processedEvent = event;\n }\n }\n\n if (!processedEvent) {\n return \"\";\n }\n\n this.transport.send(processedEvent).catch(() => {\n // Errors are logged by transport\n });\n\n return processedEvent.event_id;\n }\n\n /**\n * Add a breadcrumb\n */\n addBreadcrumb(breadcrumb: Omit<Breadcrumb, \"timestamp\">): void {\n const crumb: Breadcrumb = {\n ...breadcrumb,\n timestamp: new Date().toISOString(),\n };\n\n // Ring buffer automatically handles max size\n this.breadcrumbs.push(crumb);\n }\n\n /**\n * Set user context\n */\n setUser(user: UserContext | null): void {\n this.user = user;\n }\n\n /**\n * Set a tag\n */\n setTag(key: string, value: string): void {\n this.tags[key] = value;\n }\n\n /**\n * Set extra context\n */\n setExtra(key: string, value: unknown): void {\n this.extra[key] = value;\n }\n\n /**\n * Clear breadcrumbs\n */\n clearBreadcrumbs(): void {\n this.breadcrumbs.clear();\n }\n\n /**\n * Create an event from an Error object\n */\n private createEventFromError(\n error: Error,\n context?: Partial<ErrorEvent>\n ): ErrorEvent {\n const { type, value } = extractErrorInfo(error);\n const stacktrace = parseStackTrace(error);\n\n const exception: ExceptionInfo = {\n type,\n value,\n stacktrace,\n };\n\n return this.createEvent({\n level: \"error\",\n message: `${type}: ${value}`,\n exception,\n ...context,\n });\n }\n\n /**\n * Create a base event\n */\n private createEvent(partial: Partial<ErrorEvent>): ErrorEvent {\n // Get merged context from request scope (if available) and global scope\n // Request context takes precedence over global context\n const mergedContext = getMergedContext(\n this.user,\n this.tags,\n this.extra,\n this.breadcrumbs.toArray()\n );\n\n const event: ErrorEvent = {\n event_id: generateEventId(),\n timestamp: new Date().toISOString(),\n platform: this.detectPlatform(),\n level: partial.level || \"error\",\n message: partial.message || \"\",\n environment: this.options.environment,\n release: this.options.release,\n tags: { ...mergedContext.tags, ...partial.tags },\n extra: { ...mergedContext.extra, ...partial.extra },\n breadcrumbs: mergedContext.breadcrumbs,\n sdk: {\n name: SDK_NAME,\n version: SDK_VERSION,\n },\n ...partial,\n };\n\n // Add user context (merged context user + partial user)\n if (mergedContext.user || partial.user) {\n event.user = { ...mergedContext.user, ...partial.user };\n }\n\n // Generate fingerprint if exception exists\n if (event.exception) {\n const fingerprint = fingerprintFromException(event.exception);\n event.tags = { ...event.tags, fingerprint };\n }\n\n return event;\n }\n\n /**\n * Check if error should be ignored\n */\n private shouldIgnoreError(error: Error): boolean {\n if (!this.options.ignoreErrors || this.options.ignoreErrors.length === 0) {\n return false;\n }\n\n const message = error.message || String(error);\n\n for (const pattern of this.options.ignoreErrors) {\n if (typeof pattern === \"string\") {\n if (message.includes(pattern)) {\n return true;\n }\n } else if (pattern instanceof RegExp) {\n if (pattern.test(message)) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Detect the current platform\n */\n private detectPlatform(): string {\n if (typeof window !== \"undefined\") {\n return \"javascript\";\n }\n if (typeof process !== \"undefined\" && process.versions?.node) {\n return \"node\";\n }\n if (typeof EdgeRuntime !== \"undefined\") {\n return \"edge\";\n }\n return \"javascript\";\n }\n\n /**\n * Flush any pending events.\n * Call this before process exit to ensure no events are lost.\n */\n async flush(): Promise<void> {\n if (this.transport.flush) {\n await this.transport.flush();\n }\n }\n\n /**\n * Close the client and release any resources.\n * This flushes any pending events and closes the transport.\n * After calling this method, the client should not be used again.\n */\n async close(): Promise<void> {\n if (this.transport.close) {\n await this.transport.close();\n } else {\n await this.flush();\n }\n this.initialized = false;\n }\n}\n\n// Type declaration for edge runtime\ndeclare const EdgeRuntime: string | undefined;\n","/**\n * Environment variable utilities for Bugwatch SDK.\n *\n * This module provides functions for reading configuration from environment\n * variables and validating API keys.\n */\n\nimport type { BugwatchOptions } from \"./types\";\n\n/**\n * Supported environment variables for Bugwatch configuration.\n */\nexport const ENV_VARS = {\n API_KEY: \"BUGWATCH_API_KEY\",\n ENVIRONMENT: \"BUGWATCH_ENVIRONMENT\",\n RELEASE: \"BUGWATCH_RELEASE\",\n DEBUG: \"BUGWATCH_DEBUG\",\n ENDPOINT: \"BUGWATCH_ENDPOINT\",\n} as const;\n\n/**\n * Get environment variable value safely across different runtimes.\n */\nfunction getEnvVar(name: string): string | undefined {\n // Node.js\n if (typeof process !== \"undefined\" && process.env) {\n return process.env[name];\n }\n return undefined;\n}\n\n/**\n * Read Bugwatch configuration from environment variables.\n *\n * Supported environment variables:\n * - `BUGWATCH_API_KEY` - API key (required unless passed explicitly)\n * - `BUGWATCH_ENVIRONMENT` - Environment tag (e.g., 'production', 'staging')\n * - `BUGWATCH_RELEASE` - Release version\n * - `BUGWATCH_DEBUG` - Enable debug mode ('true' to enable)\n * - `BUGWATCH_ENDPOINT` - Custom API endpoint\n *\n * @returns Partial configuration from environment variables\n *\n * @example\n * ```typescript\n * // Set environment variables\n * // BUGWATCH_API_KEY=bw_live_xxxxx\n * // BUGWATCH_ENVIRONMENT=production\n *\n * const envConfig = getEnvConfig();\n * // { apiKey: 'bw_live_xxxxx', environment: 'production' }\n * ```\n */\nexport function getEnvConfig(): Partial<BugwatchOptions> {\n const config: Partial<BugwatchOptions> = {};\n\n const apiKey = getEnvVar(ENV_VARS.API_KEY);\n if (apiKey) {\n config.apiKey = apiKey;\n }\n\n const environment = getEnvVar(ENV_VARS.ENVIRONMENT);\n if (environment) {\n config.environment = environment;\n }\n\n const release = getEnvVar(ENV_VARS.RELEASE);\n if (release) {\n config.release = release;\n }\n\n const debug = getEnvVar(ENV_VARS.DEBUG);\n if (debug === \"true\") {\n config.debug = true;\n }\n\n const endpoint = getEnvVar(ENV_VARS.ENDPOINT);\n if (endpoint) {\n config.endpoint = endpoint;\n }\n\n return config;\n}\n\n/**\n * Validate an API key and throw a clear error if invalid.\n *\n * @param key - The API key to validate\n * @throws Error if the API key is missing or invalid\n *\n * @example\n * ```typescript\n * // Missing API key\n * validateApiKey(undefined);\n * // throws: \"Bugwatch: API key required. Set BUGWATCH_API_KEY environment variable or pass { apiKey: '...' }\"\n *\n * // Invalid format (logs warning but doesn't throw)\n * validateApiKey(\"invalid-key\");\n * // warns: \"Bugwatch: API key should start with 'bw_'. Got 'invali...'\"\n * ```\n */\nexport function validateApiKey(key: string | undefined): asserts key is string {\n if (!key) {\n throw new Error(\n \"Bugwatch: API key required. \" +\n \"Set BUGWATCH_API_KEY environment variable or pass { apiKey: '...' }\"\n );\n }\n\n if (!key.startsWith(\"bw_\")) {\n // Only show prefix if key is long enough to not expose the full key\n const preview = key.length > 10 ? `${key.slice(0, 6)}...` : \"[hidden]\";\n console.warn(\n `Bugwatch: API key should start with 'bw_'. Got '${preview}'`\n );\n }\n}\n\n/**\n * Check if API key is available (either in env or passed explicitly).\n *\n * @param explicitKey - Explicitly provided API key\n * @returns true if an API key is available\n */\nexport function hasApiKey(explicitKey?: string): boolean {\n return Boolean(explicitKey || getEnvVar(ENV_VARS.API_KEY));\n}\n","// Core client\nexport { Bugwatch } from \"./client\";\n\n// Types\nexport type {\n BugwatchOptions,\n BugwatchClient,\n ErrorEvent,\n ExceptionInfo,\n StackFrame,\n Breadcrumb,\n UserContext,\n RequestContext,\n RuntimeInfo,\n SdkInfo,\n Transport,\n Integration,\n} from \"./types\";\n\n// Transport implementations\nexport {\n HttpTransport,\n NoopTransport,\n ConsoleTransport,\n BatchTransport,\n} from \"./transport\";\n\n// Utilities\nexport { parseStackTrace, extractErrorInfo } from \"./stacktrace\";\nexport { generateFingerprint, fingerprintFromException } from \"./fingerprint\";\n\n// Environment utilities\nexport { getEnvConfig, validateApiKey, hasApiKey, ENV_VARS } from \"./env\";\n\n// Request context utilities (for request-scoped context isolation)\nexport {\n runWithContext,\n runWithContextAsync,\n getRequestContext,\n hasRequestContext,\n createScopedContext,\n setRequestUser,\n setRequestTag,\n setRequestExtra,\n addRequestBreadcrumb,\n getMergedContext,\n type ScopedContext,\n} from \"./context\";\n\n// Global instance management\nlet globalClient: import(\"./client\").Bugwatch | null = null;\nlet lazyInitWarned = false;\n\n/**\n * Initialize the global Bugwatch client.\n *\n * Reads configuration from environment variables if not explicitly provided:\n * - `BUGWATCH_API_KEY` - API key (required)\n * - `BUGWATCH_ENVIRONMENT` - Environment tag\n * - `BUGWATCH_RELEASE` - Release version\n * - `BUGWATCH_DEBUG` - Enable debug mode ('true')\n *\n * @param options - Configuration options (optional if BUGWATCH_API_KEY env var is set)\n * @throws Error if no API key is provided and BUGWATCH_API_KEY is not set\n *\n * @example\n * ```typescript\n * // With env var BUGWATCH_API_KEY set\n * init();\n *\n * // Or explicit configuration\n * init({ apiKey: \"bw_live_xxxxx\" });\n *\n * // Mix of env vars and explicit options\n * init({ environment: \"staging\" }); // Uses BUGWATCH_API_KEY from env\n * ```\n */\nexport function init(options?: Partial<import(\"./types\").BugwatchOptions>): import(\"./client\").Bugwatch {\n const { Bugwatch } = require(\"./client\");\n const { getEnvConfig, validateApiKey } = require(\"./env\");\n\n // Merge env config with explicit options (explicit takes precedence)\n const envConfig = getEnvConfig();\n const mergedOptions = { ...envConfig, ...options };\n\n // Validate API key\n validateApiKey(mergedOptions.apiKey);\n\n const client = new Bugwatch(mergedOptions as import(\"./types\").BugwatchOptions);\n globalClient = client;\n lazyInitWarned = false;\n return client;\n}\n\n/**\n * Get the global Bugwatch client\n */\nexport function getClient(): import(\"./client\").Bugwatch | null {\n return globalClient;\n}\n\n/**\n * Try to lazily initialize from environment variables.\n * Returns true if initialization succeeded, false otherwise.\n */\nfunction tryLazyInit(): boolean {\n if (globalClient) return true;\n\n const { getEnvConfig, hasApiKey } = require(\"./env\");\n\n if (!hasApiKey()) {\n return false;\n }\n\n try {\n const { Bugwatch } = require(\"./client\");\n const envConfig = getEnvConfig();\n\n // Double-check that apiKey is present (defensive programming)\n if (!envConfig.apiKey) {\n return false;\n }\n\n const client = new Bugwatch(envConfig as import(\"./types\").BugwatchOptions);\n globalClient = client;\n\n // Log warning in debug mode\n if (envConfig.debug && !lazyInitWarned) {\n console.warn(\"[Bugwatch] Auto-initialized from BUGWATCH_API_KEY environment variable\");\n lazyInitWarned = true;\n }\n\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Capture an exception using the global client.\n *\n * If the SDK is not initialized but BUGWATCH_API_KEY environment variable is set,\n * the SDK will auto-initialize before capturing.\n */\nexport function captureException(\n error: Error,\n context?: Partial<import(\"./types\").ErrorEvent>\n): string {\n // Try lazy initialization if not initialized\n if (!globalClient && !tryLazyInit()) {\n console.warn(\"[Bugwatch] SDK not initialized. Call init() first or set BUGWATCH_API_KEY environment variable.\");\n return \"\";\n }\n return globalClient!.captureException(error, context);\n}\n\n/**\n * Capture a message using the global client.\n *\n * If the SDK is not initialized but BUGWATCH_API_KEY environment variable is set,\n * the SDK will auto-initialize before capturing.\n */\nexport function captureMessage(\n message: string,\n level?: import(\"./types\").ErrorEvent[\"level\"]\n): string {\n // Try lazy initialization if not initialized\n if (!globalClient && !tryLazyInit()) {\n console.warn(\"[Bugwatch] SDK not initialized. Call init() first or set BUGWATCH_API_KEY environment variable.\");\n return \"\";\n }\n return globalClient!.captureMessage(message, level);\n}\n\n/**\n * Add a breadcrumb using the global client.\n * If called within a request context, adds to the request-scoped breadcrumbs.\n */\nexport function addBreadcrumb(\n breadcrumb: Omit<import(\"./types\").Breadcrumb, \"timestamp\">\n): void {\n if (!globalClient) {\n return;\n }\n\n // Try to add to request context first\n const { addRequestBreadcrumb } = require(\"./context\");\n const crumb = {\n ...breadcrumb,\n timestamp: new Date().toISOString(),\n };\n if (addRequestBreadcrumb(crumb, globalClient.getOptions().maxBreadcrumbs || 100)) {\n return; // Added to request context\n }\n\n // Fall back to global client\n globalClient.addBreadcrumb(breadcrumb);\n}\n\n/**\n * Set user context.\n * If called within a request context, sets the request-scoped user.\n * Otherwise sets the global user context.\n */\nexport function setUser(user: import(\"./types\").UserContext | null): void {\n if (!globalClient) {\n return;\n }\n\n // Try to set on request context first\n const { setRequestUser } = require(\"./context\");\n if (setRequestUser(user)) {\n return; // Set on request context\n }\n\n // Fall back to global client\n globalClient.setUser(user);\n}\n\n/**\n * Set a tag.\n * If called within a request context, sets the request-scoped tag.\n * Otherwise sets the global tag.\n */\nexport function setTag(key: string, value: string): void {\n if (!globalClient) {\n return;\n }\n\n // Try to set on request context first\n const { setRequestTag } = require(\"./context\");\n if (setRequestTag(key, value)) {\n return; // Set on request context\n }\n\n // Fall back to global client\n globalClient.setTag(key, value);\n}\n\n/**\n * Set extra context.\n * If called within a request context, sets the request-scoped extra.\n * Otherwise sets the global extra context.\n */\nexport function setExtra(key: string, value: unknown): void {\n if (!globalClient) {\n return;\n }\n\n // Try to set on request context first\n const { setRequestExtra } = require(\"./context\");\n if (setRequestExtra(key, value)) {\n return; // Set on request context\n }\n\n // Fall back to global client\n globalClient.setExtra(key, value);\n}\n\n/**\n * Flush any pending events using the global client.\n * Call this before process exit to ensure no events are lost.\n */\nexport async function flush(): Promise<void> {\n if (!globalClient) {\n console.warn(\"[Bugwatch] SDK not initialized. Call init() first.\");\n return;\n }\n await globalClient.flush();\n}\n\n/**\n * Close the global client and release any resources.\n * This flushes any pending events and closes the transport.\n * After calling this method, the client should not be used again.\n */\nexport async function close(): Promise<void> {\n if (!globalClient) {\n console.warn(\"[Bugwatch] SDK not initialized. Call init() first.\");\n return;\n }\n await globalClient.close();\n globalClient = null;\n}\n\n/**\n * Reset the SDK state completely.\n * Use this for testing or to allow re-initialization.\n * Note: This does NOT flush pending events - call close() first if needed.\n */\nexport function reset(): void {\n globalClient = null;\n lazyInitWarned = false;\n}\n"]}
|