scout-error 0.3.4 → 0.3.5
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.cjs +4 -4
- package/dist/index.cjs.map +3 -3
- package/dist/index.js +4 -4
- package/dist/index.js.map +3 -3
- package/dist/node.cjs +1 -1
- package/dist/node.js +1 -1
- package/dist/react.cjs +4 -4
- package/dist/react.cjs.map +3 -3
- package/dist/react.js +4 -4
- package/dist/react.js.map +3 -3
- package/dist/scout.iife.js +4 -4
- package/dist/vue.cjs +4 -4
- package/dist/vue.cjs.map +3 -3
- package/dist/vue.js +4 -4
- package/dist/vue.js.map +3 -3
- package/package.json +1 -1
package/dist/vue.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/vue.js", "../src/index.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * Scout.js Vue Plugin\n *\n * Usage:\n * import { init } from 'scoutjs'\n * import { ScoutVue } from 'scoutjs/vue'\n *\n * init({ app: 'My App', project: 'my-project' }, { endpoint: '...' })\n * app.use(ScoutVue)\n */\n\nimport { captureError } from './index.js'\n\n/**\n * Vue plugin that installs error and warning handlers.\n *\n * app.use(ScoutVue)\n */\nexport const ScoutVue = {\n install(app) {\n app.config.errorHandler = (err, vm, info) => {\n captureError({\n message: err.message,\n stack: err.stack,\n errorTrace: err.stack,\n component: vm?.$options?.name || vm?.$options?.__name || 'Anonymous',\n type: 'vue-error-handler',\n info,\n })\n }\n\n app.config.warnHandler = (msg, vm, trace) => {\n captureError({\n message: msg,\n component: vm?.$options?.name || vm?.$options?.__name || 'Anonymous',\n type: 'vue-warn-handler',\n errorTrace: trace,\n })\n }\n },\n}\n", "/**\n * Scout.js Browser SDK\n *\n * Captures errors, unhandled rejections, and console output.\n * Collects browser telemetry, session tracking, and source maps.\n *\n * Usage:\n * import { init, captureError } from 'scout-error'\n * init({ app: 'My App', project: 'my-project' }, { endpoint: 'https://...' })\n */\n\n// UA Parser and Source Map are loaded at runtime from the same host as the endpoint\n// to avoid CDN/CSP issues. For npm/bundler users (Vue/React/Node), import them directly.\n\nconst defaultConfig = {\n trackUserInteractions: true,\n selfHealingErrors: false,\n attachStacktrace: true,\n handleSourceMaps: true,\n browserDetails: true,\n warnOnCapture: false,\n loadUAParser: true,\n ignoreErrors: null,\n sendErrors: true,\n sampleRate: 1.0,\n enabled: true,\n debug: false,\n endpoint: '',\n token: null,\n\n overrideOnError: false,\n overrideOnUnhandledRejection: false,\n addErrorEventListener: true,\n addUnhandledRejectionEventListener: true,\n\n overrideConsoleLog: false,\n overrideConsoleWarn: false,\n overrideConsoleInfo: false,\n overrideConsoleError: true,\n}\n\nlet config = { ...defaultConfig }\n\nlet scope = {\n environment: typeof window !== 'undefined' && window.location?.hostname === 'localhost' ? 'development' : 'production',\n sdk: 'javascript',\n sdkVersion: __SDK_VERSION__,\n project: null,\n release: null,\n version: null,\n app: null,\n}\n\nconst userInteractions = { clicks: 0, scrolls: 0 }\nlet pageloadId = null\nlet initialized = false\nlet userContext = null\nlet customContext = {}\nconst breadcrumbs = []\nconst MAX_BREADCRUMBS = 30\n\n// Save originals before any overrides\nconst _consoleError = console.error\nconst _consoleWarn = console.warn\nconst _consoleInfo = console.info\nconst _consoleLog = console.log\n\n// --- Utilities ---\n\nfunction generateId(prefix) {\n return `${prefix}_${Math.random().toString(36).substr(2, 9)}`\n}\n\nfunction getIds() {\n const userId = localStorage.getItem('__scoutUserId') || (localStorage.setItem('__scoutUserId', generateId('user')), localStorage.getItem('__scoutUserId'))\n const sessionId = sessionStorage.getItem('__scoutSessionId') || (sessionStorage.setItem('__scoutSessionId', generateId('session')), sessionStorage.getItem('__scoutSessionId'))\n pageloadId = pageloadId || generateId('pageload')\n return { pageloadId, userId, sessionId }\n}\n\nfunction getBrowser() {\n if (window._uaParserResult?.browser?.name) return window._uaParserResult.browser.name\n const ua = navigator.userAgent\n const map = [\n { p: /Chrome.*Mobile/, n: 'Chrome Mobile' },\n { p: /Chrome/, n: 'Chrome' },\n { p: /Firefox.*Mobile/, n: 'Firefox Mobile' },\n { p: /Firefox/, n: 'Firefox' },\n { p: /Safari.*Mobile/, n: 'Safari Mobile' },\n { p: /Safari/, n: 'Safari' },\n { p: /MSIE|Trident/, n: 'Internet Explorer' },\n { p: /Edge/, n: 'Edge' },\n ]\n return map.find(b => ua.match(b.p))?.n || 'Unknown'\n}\n\nfunction getOS() {\n if (window._uaParserResult?.os?.name) return window._uaParserResult.os.name\n const ua = navigator.userAgent\n const map = [\n { p: /Win/, n: 'Windows' },\n { p: /Mac/, n: 'Mac OS' },\n { p: /X11|Linux/, n: 'Linux' },\n { p: /Android/, n: 'Android' },\n { p: /iPhone|iPad/, n: 'iOS' },\n ]\n return map.find(o => ua.match(o.p))?.n || 'Unknown'\n}\n\nfunction captureBrowserDetails() {\n const conn = navigator.connection || navigator.mozConnection || navigator.webkitConnection\n return {\n connectionType: conn ? conn.effectiveType : 'unknown',\n userAgent: navigator.userAgent,\n width: window.innerWidth,\n height: window.innerHeight,\n screenWidth: screen.width,\n screenHeight: screen.height,\n errorTimestamp: Date.now(),\n timeLocale: Intl.DateTimeFormat().resolvedOptions().timeZone,\n browserLocale: navigator.language || navigator.userLanguage,\n sessionTime: Math.round(performance.now() / 1000),\n deviceMemory: navigator.deviceMemory || 'unknown',\n timezoneOffset: new Date().getTimezoneOffset(),\n cookiesEnabled: navigator.cookieEnabled,\n url: window.location.href,\n host: window.location.host,\n referrer: document.referrer,\n browser: getBrowser(),\n browserVersion: window._uaParserResult?.browser?.version || null,\n os: getOS(),\n osVersion: window._uaParserResult?.os?.version || null,\n deviceType: window._uaParserResult?.device?.type || null,\n deviceModel: window._uaParserResult?.device?.model || null,\n deviceVendor: window._uaParserResult?.device?.vendor || null,\n loadTime: Math.max(0, performance.timing.loadEventEnd - performance.timing.navigationStart),\n userClicks: userInteractions.clicks,\n userScrolls: userInteractions.scrolls,\n }\n}\n\nfunction shouldIgnoreError(msg) {\n if (!config.ignoreErrors || !Array.isArray(config.ignoreErrors)) return false\n return config.ignoreErrors.some(pattern => {\n if (typeof pattern === 'string') return msg.includes(pattern)\n if (pattern instanceof RegExp) return pattern.test(msg)\n return false\n })\n}\n\nfunction postData(url, data) {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), 5000)\n\n const headers = { 'Content-Type': 'application/json' }\n if (config.token) headers['X-Ingest-Token'] = config.token\n\n return fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(data),\n signal: controller.signal,\n })\n .then(r => { clearTimeout(timeout); return r })\n .catch(() => { clearTimeout(timeout) })\n}\n\nfunction argsToString(args) {\n const fmt = (args[0] || '') + ''\n const rest = [...args]\n return fmt.replace(/%[sdj]/g, (m) => {\n const v = rest.shift()\n if (m === '%s') return String(v)\n if (m === '%d') return Number(v)\n if (m === '%j') return JSON.stringify(v)\n return m\n })\n}\n\nfunction _loadScript(src, onload) {\n const s = document.createElement('script')\n s.src = src\n s.async = true\n if (onload) s.onload = onload\n document.head.appendChild(s)\n}\n\n// --- Source Maps ---\n\nasync function resolveSourceMap(sourceUrl, lineno, colno) {\n try {\n // Fetch the JS file to find sourceMappingURL\n const jsResponse = await fetch(sourceUrl)\n if (!jsResponse.ok) return null\n const jsCode = await jsResponse.text()\n\n const inlineMatch = jsCode.match(/\\/\\/# sourceMappingURL=data:application\\/json;base64,([^\\s]+)/)\n const externalMatch = jsCode.match(/\\/\\/# sourceMappingURL=(?!data:)([^\\s]+)/)\n\n let sourceMapData\n if (inlineMatch) {\n sourceMapData = JSON.parse(atob(inlineMatch[1]))\n } else if (externalMatch) {\n const mapURL = new URL(externalMatch[1], sourceUrl).href\n const mapResponse = await fetch(mapURL)\n if (!mapResponse.ok) return null\n sourceMapData = await mapResponse.json()\n } else {\n return null\n }\n\n if (!window.sourceMap?.SourceMapConsumer) return null\n const consumer = new window.sourceMap.SourceMapConsumer(sourceMapData)\n const pos = consumer.originalPositionFor({ line: lineno, column: colno })\n\n if (!pos.source) return null\n\n // Extract the original source snippet\n const sourceIndex = sourceMapData.sources.indexOf(pos.source)\n let snippet = null\n if (sourceMapData.sourcesContent && sourceMapData.sourcesContent[sourceIndex]) {\n snippet = sourceMapData.sourcesContent[sourceIndex]\n }\n\n return {\n originalSource: pos.source,\n originalLine: pos.line,\n originalColumn: pos.column,\n originalName: pos.name,\n snippet,\n }\n } catch (e) {\n return null\n }\n}\n\n// --- Breadcrumbs ---\n\nfunction _addBreadcrumb(crumb) {\n breadcrumbs.push({ timestamp: Date.now(), ...crumb })\n if (breadcrumbs.length > MAX_BREADCRUMBS) breadcrumbs.shift()\n}\n\n// --- Core ---\n\n// Known top-level event fields the SDK and server understand.\n// Anything else passed to captureError gets auto-promoted into context\n// so the admin UI's Context section can render it.\nconst KNOWN_EVENT_FIELDS = new Set([\n 'type', 'message', 'args', 'stack', 'errorTrace',\n 'source', 'lineno', 'colno', 'reason',\n 'snippet', 'highlightLineNumber',\n 'originalSource', 'originalLine', 'originalColumn', 'originalName',\n 'context', 'user', 'breadcrumbs',\n 'timestamp', 'errorTimestamp',\n])\n\nasync function pushErrorEvent(obj) {\n // Don't mutate the caller's object\n obj = { ...(obj || {}) }\n\n // Auto-promote unknown top-level keys into context (e.g. status, textStatus,\n // errorThrown, etc. that callers commonly pass alongside an error)\n const promoted = {}\n for (const k of Object.keys(obj)) {\n if (k !== 'context' && !KNOWN_EVENT_FIELDS.has(k)) {\n promoted[k] = obj[k]\n delete obj[k]\n }\n }\n\n if (config.sampleRate && Math.random() < (1 - parseFloat(config.sampleRate))) {\n if (config.debug) _consoleLog('[Scout] Suppressed by sampling')\n return\n }\n\n if (!config.attachStacktrace) obj.errorTrace = null\n\n // Strip scout's own frames from stack traces (for console.error/warn captures)\n if (obj.errorTrace) {\n try {\n const lines = obj.errorTrace.split('\\n')\n const filtered = [lines[0]]\n for (let i = 1; i < lines.length; i++) {\n if (!lines[i].includes('/scout') && !lines[i].includes('scout.js') && !lines[i].includes('scout-error')) {\n filtered.push(lines[i])\n }\n }\n if (filtered.length > 1) obj.errorTrace = filtered.join('\\n')\n } catch (e) { /* ignore */ }\n }\n\n if ((obj.errorTrace || obj.stack) && !obj.source) {\n try {\n const stack = obj.errorTrace || obj.stack\n const lines = stack ? stack.split('\\n') : []\n // Find the first frame with a source location (skip the error message line)\n for (let i = 1; i < lines.length; i++) {\n const match = lines[i].trim().match(/(http.*?):(\\d+):(\\d+)/)\n if (match) {\n obj.source = match[1]\n obj.lineno = parseInt(match[2], 10)\n obj.colno = parseInt(match[3], 10)\n break\n }\n }\n } catch (e) { /* ignore */ }\n }\n\n // Merge precedence: global customContext < auto-promoted < user's inline context\n // (so an explicit `context: { foo: 1 }` always wins over an accidental top-level foo)\n const inlineContext = (obj.context && typeof obj.context === 'object') ? obj.context : {}\n const mergedContext = { ...customContext, ...promoted, ...inlineContext }\n\n const details = config.browserDetails ? captureBrowserDetails() : {}\n const event = Object.assign({}, obj, details, scope, getIds())\n\n if (userContext) event.user = userContext\n if (Object.keys(mergedContext).length) event.context = mergedContext\n event.breadcrumbs = breadcrumbs.slice()\n\n // Send the event immediately \u2014 don't let source map resolution block it\n if (config.debug) _consoleLog('[Scout] Sending:', event)\n if (config.endpoint) postData(config.endpoint, event)\n\n // Resolve source maps after sending (best-effort, non-blocking)\n if (config.handleSourceMaps && obj.source && obj.lineno) {\n try {\n const resolved = await resolveSourceMap(obj.source, obj.lineno, obj.colno || 0)\n if (resolved) {\n const enriched = {\n ...event,\n originalSource: resolved.originalSource,\n originalLine: resolved.originalLine,\n originalColumn: resolved.originalColumn,\n originalName: resolved.originalName,\n highlightLineNumber: resolved.originalLine,\n }\n if (resolved.snippet) enriched.snippet = resolved.snippet\n if (config.endpoint) postData(config.endpoint, enriched)\n }\n } catch (e) { /* fail silently */ }\n }\n}\n\n/**\n * Manually capture an error object.\n */\nexport function captureError(event) {\n if (!config.enabled) return\n pushErrorEvent(event)\n}\n\n/**\n * Set identified user info. Call after login.\n * @param {{ id?: string, email?: string, name?: string }} user\n */\nexport function setUser(user) {\n userContext = user\n}\n\n/**\n * Merge custom key-value context attached to all future errors.\n * @param {Object} ctx\n */\nexport function setContext(ctx) {\n customContext = { ...customContext, ...ctx }\n}\n\n/**\n * Set a single context tag.\n */\nexport function setTag(key, value) {\n customContext[key] = value\n}\n\n/**\n * Manually add a breadcrumb.\n * @param {{ category?: string, message?: string, data?: Object }} crumb\n */\nexport function addBreadcrumb(crumb) {\n _addBreadcrumb(crumb)\n}\n\n// --- Setup ---\n\nfunction setupListeners() {\n // Click tracking + breadcrumbs\n if (config.trackUserInteractions) {\n document.addEventListener('click', (e) => {\n userInteractions.clicks++\n const el = e.target\n const tag = el.tagName ? el.tagName.toLowerCase() : ''\n const text = (el.textContent || '').trim().slice(0, 50)\n _addBreadcrumb({ category: 'click', message: tag + (text ? ': ' + text : '') })\n })\n let lastScroll = 0\n window.addEventListener('scroll', () => {\n const now = Date.now()\n if (now - lastScroll > 100) { userInteractions.scrolls++; lastScroll = now }\n })\n }\n\n // Navigation breadcrumbs\n const origPushState = history.pushState\n history.pushState = function() {\n origPushState.apply(this, arguments)\n _addBreadcrumb({ category: 'navigation', message: window.location.href })\n }\n window.addEventListener('popstate', () => {\n _addBreadcrumb({ category: 'navigation', message: window.location.href })\n })\n\n // Fetch breadcrumbs\n const origFetch = window.fetch\n window.fetch = function(input, init) {\n const url = typeof input === 'string' ? input : (input?.url || '')\n const method = init?.method || 'GET'\n const start = Date.now()\n return origFetch.apply(this, arguments).then(response => {\n _addBreadcrumb({ category: 'fetch', message: `${method} ${url}`, data: { status: response.status, duration: Date.now() - start } })\n return response\n }).catch(err => {\n _addBreadcrumb({ category: 'fetch', message: `${method} ${url}`, data: { error: err.message, duration: Date.now() - start } })\n throw err\n })\n }\n\n // XHR breadcrumbs\n const origOpen = XMLHttpRequest.prototype.open\n const origSend = XMLHttpRequest.prototype.send\n XMLHttpRequest.prototype.open = function(method, url) {\n this._scoutMethod = method\n this._scoutUrl = url\n return origOpen.apply(this, arguments)\n }\n XMLHttpRequest.prototype.send = function() {\n const self = this\n const start = Date.now()\n self.addEventListener('loadend', () => {\n _addBreadcrumb({ category: 'xhr', message: `${self._scoutMethod || 'GET'} ${self._scoutUrl || ''}`, data: { status: self.status, duration: Date.now() - start } })\n })\n return origSend.apply(this, arguments)\n }\n\n // Error event listener\n if (config.addErrorEventListener) {\n window.addEventListener('error', async (event) => {\n if (!config.enabled) return\n try {\n const errorTrace = event.error ? event.error.stack : 'No stack trace available'\n if (shouldIgnoreError(event.message)) return\n if (config.sendErrors) {\n pushErrorEvent({\n type: 'window.onerror',\n message: event.message,\n source: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n errorTrace,\n })\n }\n } catch (e) {\n _consoleWarn('[Scout] Error handler failure:', e)\n }\n if (config.selfHealingErrors) event.preventDefault()\n })\n }\n\n // Unhandled rejection listener\n if (config.addUnhandledRejectionEventListener) {\n window.addEventListener('unhandledrejection', (event) => {\n if (!config.enabled) return\n try {\n const error = event.reason\n const errorTrace = error?.stack || 'No stack trace available'\n if (shouldIgnoreError(error?.message || '')) return\n if (config.sendErrors) {\n pushErrorEvent({\n type: 'Unhandled Promise Rejection',\n message: error?.message || 'Unhandled Promise Rejection',\n reason: event.reason,\n errorTrace,\n })\n }\n } catch (e) {\n _consoleWarn('[Scout] Rejection handler failure:', e)\n }\n if (config.selfHealingErrors) event.preventDefault()\n })\n }\n\n // Console overrides\n if (config.overrideConsoleError) {\n console.error = function (...args) {\n if (!config.enabled) return\n try {\n const errorTrace = new Error().stack\n if (shouldIgnoreError(argsToString(args))) return\n if (config.sendErrors) pushErrorEvent({ type: 'console.error', errorTrace, args: argsToString(args) })\n } catch (e) { _consoleWarn('[Scout] console.error override failure:', e) }\n }\n }\n\n if (config.overrideConsoleWarn) {\n console.warn = function (...args) {\n if (!config.enabled) return\n try {\n const errorTrace = new Error().stack\n if (shouldIgnoreError(argsToString(args))) return\n if (config.sendErrors) pushErrorEvent({ type: 'console.warn', errorTrace, args: argsToString(args) })\n } catch (e) { _consoleWarn('[Scout] console.warn override failure:', e) }\n }\n }\n\n // Load UA Parser and Source Map from endpoint host (self-hosted, no CDN)\n const baseUrl = config.endpoint ? new URL(config.endpoint).origin : ''\n if (config.loadUAParser && config.browserDetails && baseUrl) {\n _loadScript(`${baseUrl}/vendor/ua-parser.min.js`, () => {\n if (typeof UAParser !== 'undefined') {\n window._uaParserResult = new UAParser().getResult()\n }\n })\n }\n if (config.handleSourceMaps && baseUrl) {\n _loadScript(`${baseUrl}/vendor/source-map.min.js`)\n }\n}\n\n/**\n * Initialize Scout error tracking.\n *\n * @param {Object} scopeOptions - { app, project, version, environment, user }\n * @param {Object} configOptions - { endpoint, token, sampleRate, debug, ... }\n */\nexport function init(scopeOptions = {}, configOptions = {}) {\n // Extract user from scope if provided\n if (scopeOptions.user) {\n userContext = scopeOptions.user\n delete scopeOptions.user\n }\n\n if (initialized) {\n scope = { ...scope, ...scopeOptions }\n config = { ...config, ...configOptions }\n return\n }\n\n scope = { ...scope, ...scopeOptions }\n config = { ...config, ...configOptions }\n initialized = true\n\n if (typeof window !== 'undefined') {\n setupListeners()\n }\n}\n\n// Expose window.Scout immediately on load (before init is called)\n// This overwrites the ES5 no-op stub with real methods\nif (typeof window !== 'undefined') {\n window.Scout = {\n init,\n setScope: (s) => { scope = { ...scope, ...s } },\n setConfig: (c) => { config = { ...config, ...c } },\n setUser,\n setContext,\n setTag,\n addBreadcrumb: _addBreadcrumb,\n error: captureError,\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["vue_exports", "__export", "ScoutVue", "__toCommonJS", "defaultConfig", "config", "__spreadValues", "_a", "scope", "userInteractions", "pageloadId", "initialized", "userContext", "customContext", "breadcrumbs", "MAX_BREADCRUMBS", "_consoleWarn", "_consoleLog", "generateId", "prefix", "getIds", "userId", "sessionId", "
|
|
4
|
+
"sourcesContent": ["/**\n * Scout.js Vue Plugin\n *\n * Usage:\n * import { init } from 'scoutjs'\n * import { ScoutVue } from 'scoutjs/vue'\n *\n * init({ app: 'My App', project: 'my-project' }, { endpoint: '...' })\n * app.use(ScoutVue)\n */\n\nimport { captureError } from './index.js'\n\n/**\n * Vue plugin that installs error and warning handlers.\n *\n * app.use(ScoutVue)\n */\nexport const ScoutVue = {\n install(app) {\n try {\n app.config.errorHandler = (err, vm, info) => {\n // Guarded so a fault in Scout never throws back into Vue's error path.\n try {\n captureError({\n message: err && err.message,\n stack: err && err.stack,\n errorTrace: err && err.stack,\n component: (vm && vm.$options && (vm.$options.name || vm.$options.__name)) || 'Anonymous',\n type: 'vue-error-handler',\n info,\n })\n } catch (_) { /* ignore */ }\n }\n\n app.config.warnHandler = (msg, vm, trace) => {\n try {\n captureError({\n message: msg,\n component: (vm && vm.$options && (vm.$options.name || vm.$options.__name)) || 'Anonymous',\n type: 'vue-warn-handler',\n errorTrace: trace,\n })\n } catch (_) { /* ignore */ }\n }\n } catch (_) { /* ignore */ }\n },\n}\n", "/**\n * Scout.js Browser SDK\n *\n * Captures errors, unhandled rejections, and console output.\n * Collects browser telemetry, session tracking, and source maps.\n *\n * Usage:\n * import { init, captureError } from 'scout-error'\n * init({ app: 'My App', project: 'my-project' }, { endpoint: 'https://...' })\n */\n\n// UA Parser and Source Map are loaded at runtime from the same host as the endpoint\n// to avoid CDN/CSP issues. For npm/bundler users (Vue/React/Node), import them directly.\n\nconst defaultConfig = {\n trackUserInteractions: true,\n selfHealingErrors: false,\n attachStacktrace: true,\n handleSourceMaps: true,\n browserDetails: true,\n warnOnCapture: false,\n loadUAParser: true,\n ignoreErrors: null,\n sendErrors: true,\n sampleRate: 1.0,\n maxEventsPerMinute: 60,\n enabled: true,\n debug: false,\n endpoint: '',\n token: null,\n\n overrideOnError: false,\n overrideOnUnhandledRejection: false,\n addErrorEventListener: true,\n addUnhandledRejectionEventListener: true,\n\n overrideConsoleLog: false,\n overrideConsoleWarn: false,\n overrideConsoleInfo: false,\n overrideConsoleError: true,\n}\n\nlet config = { ...defaultConfig }\n\nlet scope = {\n environment: typeof window !== 'undefined' && window.location?.hostname === 'localhost' ? 'development' : 'production',\n sdk: 'javascript',\n sdkVersion: __SDK_VERSION__,\n project: null,\n release: null,\n version: null,\n app: null,\n}\n\nconst userInteractions = { clicks: 0, scrolls: 0 }\nlet pageloadId = null\nlet initialized = false\nlet userContext = null\nlet customContext = {}\nconst breadcrumbs = []\nconst MAX_BREADCRUMBS = 30\n\n// Hardening state \u2014 the SDK must never loop, throw into the app, or brick a kiosk.\nlet _capturing = false // reentrancy guard (capture-within-capture / rejection loops)\nlet _origFetch = null // pristine fetch for ingest, captured before we patch window.fetch\nlet _memUserId = null // in-memory id fallback when Web Storage throws (locked-down webviews)\nlet _memSessionId = null\nconst _sendTimes = [] // sliding-window send timestamps for rate limiting\nconst _mapCache = new Map() // per-bundle source-map consumer (as an in-flight/resolved promise) or 'FAILED'\n\n// Save originals before any overrides\nconst _consoleError = console.error\nconst _consoleWarn = console.warn\nconst _consoleInfo = console.info\nconst _consoleLog = console.log\n\n// --- Utilities ---\n\nfunction generateId(prefix) {\n return `${prefix}_${Math.random().toString(36).substr(2, 9)}`\n}\n\nfunction getIds() {\n pageloadId = pageloadId || generateId('pageload')\n // Web Storage can throw (privacy modes, disabled storage, sandboxed webviews).\n // Fall back to in-memory ids so a capture never fails on storage access.\n let userId, sessionId\n try {\n userId = localStorage.getItem('__scoutUserId')\n if (!userId) { userId = generateId('user'); localStorage.setItem('__scoutUserId', userId) }\n } catch (e) {\n userId = _memUserId = _memUserId || generateId('user')\n }\n try {\n sessionId = sessionStorage.getItem('__scoutSessionId')\n if (!sessionId) { sessionId = generateId('session'); sessionStorage.setItem('__scoutSessionId', sessionId) }\n } catch (e) {\n sessionId = _memSessionId = _memSessionId || generateId('session')\n }\n return { pageloadId, userId, sessionId }\n}\n\nfunction getBrowser() {\n if (window._uaParserResult?.browser?.name) return window._uaParserResult.browser.name\n const ua = navigator.userAgent\n const map = [\n { p: /Chrome.*Mobile/, n: 'Chrome Mobile' },\n { p: /Chrome/, n: 'Chrome' },\n { p: /Firefox.*Mobile/, n: 'Firefox Mobile' },\n { p: /Firefox/, n: 'Firefox' },\n { p: /Safari.*Mobile/, n: 'Safari Mobile' },\n { p: /Safari/, n: 'Safari' },\n { p: /MSIE|Trident/, n: 'Internet Explorer' },\n { p: /Edge/, n: 'Edge' },\n ]\n return map.find(b => ua.match(b.p))?.n || 'Unknown'\n}\n\nfunction getOS() {\n if (window._uaParserResult?.os?.name) return window._uaParserResult.os.name\n const ua = navigator.userAgent\n const map = [\n { p: /Win/, n: 'Windows' },\n { p: /Mac/, n: 'Mac OS' },\n { p: /X11|Linux/, n: 'Linux' },\n { p: /Android/, n: 'Android' },\n { p: /iPhone|iPad/, n: 'iOS' },\n ]\n return map.find(o => ua.match(o.p))?.n || 'Unknown'\n}\n\nfunction captureBrowserDetails() {\n const conn = navigator.connection || navigator.mozConnection || navigator.webkitConnection\n return {\n connectionType: conn ? conn.effectiveType : 'unknown',\n userAgent: navigator.userAgent,\n width: window.innerWidth,\n height: window.innerHeight,\n screenWidth: screen.width,\n screenHeight: screen.height,\n errorTimestamp: Date.now(),\n timeLocale: Intl.DateTimeFormat().resolvedOptions().timeZone,\n browserLocale: navigator.language || navigator.userLanguage,\n sessionTime: Math.round(performance.now() / 1000),\n deviceMemory: navigator.deviceMemory || 'unknown',\n timezoneOffset: new Date().getTimezoneOffset(),\n cookiesEnabled: navigator.cookieEnabled,\n url: window.location.href,\n host: window.location.host,\n referrer: document.referrer,\n browser: getBrowser(),\n browserVersion: window._uaParserResult?.browser?.version || null,\n os: getOS(),\n osVersion: window._uaParserResult?.os?.version || null,\n deviceType: window._uaParserResult?.device?.type || null,\n deviceModel: window._uaParserResult?.device?.model || null,\n deviceVendor: window._uaParserResult?.device?.vendor || null,\n loadTime: (() => { try { return Math.max(0, performance.timing.loadEventEnd - performance.timing.navigationStart) } catch (e) { return 0 } })(),\n userClicks: userInteractions.clicks,\n userScrolls: userInteractions.scrolls,\n }\n}\n\nfunction shouldIgnoreError(msg) {\n if (!config.ignoreErrors || !Array.isArray(config.ignoreErrors)) return false\n return config.ignoreErrors.some(pattern => {\n if (typeof pattern === 'string') return msg.includes(pattern)\n if (pattern instanceof RegExp) return pattern.test(msg)\n return false\n })\n}\n\n// Circular-/non-serializable-safe JSON. A rejection reason or promoted context\n// value can be circular or hold DOM nodes/functions; a raw JSON.stringify would\n// throw and lose the event (or bubble out of the SDK).\nfunction safeStringify(data) {\n try {\n return JSON.stringify(data)\n } catch (e) {\n try {\n const seen = new WeakSet()\n return JSON.stringify(data, (k, v) => {\n if (typeof v === 'bigint') return v.toString()\n if (typeof v === 'function') return '[Function]'\n if (v && typeof v === 'object') {\n if (seen.has(v)) return '[Circular]'\n seen.add(v)\n }\n return v\n })\n } catch (_) {\n return null\n }\n }\n}\n\n// Sliding-window rate limit so a runaway error loop can't flood the network or\n// peg the device. Silently drops once the per-minute budget is exceeded.\nfunction rateLimited() {\n try {\n const limit = config.maxEventsPerMinute\n if (!limit) return false\n const now = Date.now()\n while (_sendTimes.length && now - _sendTimes[0] > 60000) _sendTimes.shift()\n if (_sendTimes.length >= limit) return true\n _sendTimes.push(now)\n return false\n } catch (e) {\n return false\n }\n}\n\nfunction postData(url, data) {\n try {\n const body = safeStringify(data)\n if (body == null) return\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), 5000)\n\n const headers = { 'Content-Type': 'application/json' }\n if (config.token) headers['X-Ingest-Token'] = config.token\n\n // Post via the pristine fetch so ingest never adds its own breadcrumbs,\n // never recurses, and keeps working even if the app breaks window.fetch.\n const f = _origFetch || fetch\n return f(url, {\n method: 'POST',\n headers,\n body,\n signal: controller.signal,\n })\n .then(r => { clearTimeout(timeout); return r })\n .catch(() => { clearTimeout(timeout) })\n } catch (e) {\n // Never let ingest failure escape into the app.\n }\n}\n\nfunction argsToString(args) {\n const fmt = (args[0] || '') + ''\n const rest = [...args]\n return fmt.replace(/%[sdj]/g, (m) => {\n const v = rest.shift()\n if (m === '%s') return String(v)\n if (m === '%d') return Number(v)\n if (m === '%j') return JSON.stringify(v)\n return m\n })\n}\n\nfunction _loadScript(src, onload) {\n const s = document.createElement('script')\n s.src = src\n s.async = true\n if (onload) s.onload = onload\n document.head.appendChild(s)\n}\n\n// --- Source Maps ---\n\n// Fetch + parse a bundle's source map and build its consumer exactly once.\n// Returns { consumer, data } or null (no map / incompatible consumer).\nasync function buildMapEntry(sourceUrl) {\n const f = _origFetch || fetch\n const jsResponse = await f(sourceUrl)\n if (!jsResponse.ok) return null\n const jsCode = await jsResponse.text()\n\n const inlineMatch = jsCode.match(/\\/\\/# sourceMappingURL=data:application\\/json;base64,([^\\s]+)/)\n const externalMatch = jsCode.match(/\\/\\/# sourceMappingURL=(?!data:)([^\\s]+)/)\n\n let data\n if (inlineMatch) {\n data = JSON.parse(atob(inlineMatch[1]))\n } else if (externalMatch) {\n const mapURL = new URL(externalMatch[1], sourceUrl).href\n const mapResponse = await f(mapURL)\n if (!mapResponse.ok) return null\n data = await mapResponse.json()\n } else {\n return null\n }\n\n // Build the consumer ONCE per bundle. Constructing one per error re-parses all\n // mappings (CPU) and, with the WASM build of source-map, leaks memory unless\n // destroyed \u2014 fatal on a kiosk that runs for weeks.\n const consumer = new window.sourceMap.SourceMapConsumer(data)\n // Guard an incompatible (async / Promise-returning 0.7) consumer build so we\n // degrade gracefully instead of throwing on every error.\n if (!consumer || typeof consumer.originalPositionFor !== 'function') return null\n return { consumer, data }\n}\n\n// Cache the in-flight PROMISE (not just the result) so a synchronous burst of\n// errors from the same bundle dedupes onto a single fetch + single consumer,\n// instead of every concurrent capture missing the not-yet-populated cache.\nfunction getMapEntry(sourceUrl) {\n const cached = _mapCache.get(sourceUrl)\n if (cached === 'FAILED') return Promise.resolve(null)\n if (cached) return cached\n\n const p = buildMapEntry(sourceUrl)\n _mapCache.set(sourceUrl, p)\n p.then(\n // Deterministic \"no map here\" \u2192 remember it so we never refetch the bundle.\n (entry) => { _mapCache.set(sourceUrl, entry ? Promise.resolve(entry) : 'FAILED') },\n // Transient failure (offline, network blip) \u2192 drop so a later error retries.\n () => { if (_mapCache.get(sourceUrl) === p) _mapCache.delete(sourceUrl) }\n )\n return p\n}\n\nasync function resolveSourceMap(sourceUrl, lineno, colno) {\n try {\n // If the consumer lib isn't loaded there's no point fetching the bundle.\n if (!window.sourceMap?.SourceMapConsumer) return null\n\n const entry = await getMapEntry(sourceUrl)\n if (!entry) return null\n\n const pos = entry.consumer.originalPositionFor({ line: lineno, column: colno })\n if (!pos.source) return null\n\n // Extract the original source snippet\n const sourceIndex = entry.data.sources.indexOf(pos.source)\n let snippet = null\n if (entry.data.sourcesContent && entry.data.sourcesContent[sourceIndex]) {\n snippet = entry.data.sourcesContent[sourceIndex]\n }\n\n return {\n originalSource: pos.source,\n originalLine: pos.line,\n originalColumn: pos.column,\n originalName: pos.name,\n snippet,\n }\n } catch (e) {\n return null\n }\n}\n\n// --- Breadcrumbs ---\n\nfunction _addBreadcrumb(crumb) {\n breadcrumbs.push({ timestamp: Date.now(), ...crumb })\n if (breadcrumbs.length > MAX_BREADCRUMBS) breadcrumbs.shift()\n}\n\n// --- Core ---\n\n// Known top-level event fields the SDK and server understand.\n// Anything else passed to captureError gets auto-promoted into context\n// so the admin UI's Context section can render it.\nconst KNOWN_EVENT_FIELDS = new Set([\n 'type', 'message', 'args', 'stack', 'errorTrace',\n 'source', 'lineno', 'colno', 'reason',\n 'snippet', 'highlightLineNumber',\n 'originalSource', 'originalLine', 'originalColumn', 'originalName',\n 'context', 'user', 'breadcrumbs',\n 'timestamp', 'errorTimestamp',\n])\n\nasync function pushErrorEvent(obj) {\n // Reentrancy guard: capturing must never trigger another capture (e.g. a throw\n // here becoming an unhandledrejection that we then capture, looping forever).\n if (_capturing) return\n _capturing = true\n\n let event = null\n let smSource = null, smLine = null, smCol = 0\n\n try {\n // Don't mutate the caller's object\n obj = { ...(obj || {}) }\n\n // Auto-promote unknown top-level keys into context (e.g. status, textStatus,\n // errorThrown, etc. that callers commonly pass alongside an error)\n const promoted = {}\n for (const k of Object.keys(obj)) {\n if (k !== 'context' && !KNOWN_EVENT_FIELDS.has(k)) {\n promoted[k] = obj[k]\n delete obj[k]\n }\n }\n\n if (config.sampleRate && Math.random() < (1 - parseFloat(config.sampleRate))) {\n if (config.debug) _consoleLog('[Scout] Suppressed by sampling')\n return\n }\n\n // Circuit breaker for error storms \u2014 protects the device before anything else.\n if (rateLimited()) {\n if (config.debug) _consoleLog('[Scout] Suppressed by rate limit')\n return\n }\n\n if (!config.attachStacktrace) obj.errorTrace = null\n\n // Strip scout's own frames from stack traces (for console.error/warn captures)\n if (obj.errorTrace) {\n try {\n const lines = obj.errorTrace.split('\\n')\n const filtered = [lines[0]]\n for (let i = 1; i < lines.length; i++) {\n if (!lines[i].includes('/scout') && !lines[i].includes('scout.js') && !lines[i].includes('scout-error')) {\n filtered.push(lines[i])\n }\n }\n if (filtered.length > 1) obj.errorTrace = filtered.join('\\n')\n } catch (e) { /* ignore */ }\n }\n\n if ((obj.errorTrace || obj.stack) && !obj.source) {\n try {\n const stack = obj.errorTrace || obj.stack\n const lines = stack ? stack.split('\\n') : []\n // Find the first frame with a source location (skip the error message line).\n // Match any URL scheme so webview origins (Capacitor's capacitor://, ionic://,\n // file://) resolve, not just http(s) \u2014 otherwise iOS stack frames never yield\n // a source and source maps can't be resolved for Vue/rejection/console errors.\n for (let i = 1; i < lines.length; i++) {\n const match = lines[i].trim().match(/((?:https?|capacitor|ionic|file):\\/\\/.*?):(\\d+):(\\d+)/)\n if (match) {\n obj.source = match[1]\n obj.lineno = parseInt(match[2], 10)\n obj.colno = parseInt(match[3], 10)\n break\n }\n }\n } catch (e) { /* ignore */ }\n }\n\n // Merge precedence: global customContext < auto-promoted < user's inline context\n // (so an explicit `context: { foo: 1 }` always wins over an accidental top-level foo)\n const inlineContext = (obj.context && typeof obj.context === 'object') ? obj.context : {}\n const mergedContext = { ...customContext, ...promoted, ...inlineContext }\n\n // Telemetry is best-effort \u2014 never let it block or drop the actual error.\n let details = {}\n if (config.browserDetails) { try { details = captureBrowserDetails() } catch (e) { /* ignore */ } }\n\n event = Object.assign({}, obj, details, scope, getIds())\n\n if (userContext) event.user = userContext\n if (Object.keys(mergedContext).length) event.context = mergedContext\n try { event.breadcrumbs = breadcrumbs.slice() } catch (e) { event.breadcrumbs = [] }\n\n // Send the event immediately \u2014 don't let source map resolution block it\n if (config.debug) _consoleLog('[Scout] Sending:', event)\n if (config.endpoint) postData(config.endpoint, event)\n\n // Remember where to resolve source maps (done below, outside the guard)\n smSource = obj.source; smLine = obj.lineno; smCol = obj.colno || 0\n } catch (e) {\n try { if (config.debug) _consoleWarn('[Scout] capture failed:', e) } catch (_) {}\n } finally {\n _capturing = false\n }\n\n // Best-effort source-map enrichment: outside the reentrancy guard and fully\n // guarded so it can never throw or reject back into the app.\n try {\n if (event && config.handleSourceMaps && smSource && smLine) {\n const resolved = await resolveSourceMap(smSource, smLine, smCol)\n if (resolved) {\n const enriched = {\n ...event,\n originalSource: resolved.originalSource,\n originalLine: resolved.originalLine,\n originalColumn: resolved.originalColumn,\n originalName: resolved.originalName,\n highlightLineNumber: resolved.originalLine,\n }\n if (resolved.snippet) enriched.snippet = resolved.snippet\n if (config.endpoint) postData(config.endpoint, enriched)\n }\n }\n } catch (e) { /* fail silently */ }\n}\n\n/**\n * Manually capture an error object.\n */\nexport function captureError(event) {\n try {\n if (!config.enabled) return\n const p = pushErrorEvent(event)\n if (p && typeof p.catch === 'function') p.catch(() => {})\n } catch (e) { /* never throw from capture */ }\n}\n\n/**\n * Set identified user info. Call after login.\n * @param {{ id?: string, email?: string, name?: string }} user\n */\nexport function setUser(user) {\n userContext = user\n}\n\n/**\n * Merge custom key-value context attached to all future errors.\n * @param {Object} ctx\n */\nexport function setContext(ctx) {\n customContext = { ...customContext, ...ctx }\n}\n\n/**\n * Set a single context tag.\n */\nexport function setTag(key, value) {\n customContext[key] = value\n}\n\n/**\n * Manually add a breadcrumb.\n * @param {{ category?: string, message?: string, data?: Object }} crumb\n */\nexport function addBreadcrumb(crumb) {\n _addBreadcrumb(crumb)\n}\n\n// --- Setup ---\n\nfunction setupListeners() {\n // Each instrumentation is isolated in its own try/catch: one failing patch\n // must never abort the rest, and no wrapper may ever change the behavior the\n // app observes from the original API (even if Scout's own code throws).\n\n // Click + scroll breadcrumbs\n if (config.trackUserInteractions) {\n try {\n document.addEventListener('click', (e) => {\n try {\n userInteractions.clicks++\n const el = e.target\n const tag = el && el.tagName ? el.tagName.toLowerCase() : ''\n const text = ((el && el.textContent) || '').trim().slice(0, 50)\n _addBreadcrumb({ category: 'click', message: tag + (text ? ': ' + text : '') })\n } catch (_) { /* breadcrumb must never break the app */ }\n }, { passive: true })\n let lastScroll = 0\n window.addEventListener('scroll', () => {\n try {\n const now = Date.now()\n if (now - lastScroll > 100) { userInteractions.scrolls++; lastScroll = now }\n } catch (_) { /* ignore */ }\n }, { passive: true })\n } catch (e) { /* ignore */ }\n }\n\n // Navigation breadcrumbs \u2014 run the original first; the breadcrumb is best-effort\n try {\n const origPushState = history.pushState\n history.pushState = function () {\n const r = origPushState.apply(this, arguments)\n try { _addBreadcrumb({ category: 'navigation', message: window.location.href }) } catch (_) { /* ignore */ }\n return r\n }\n window.addEventListener('popstate', () => {\n try { _addBreadcrumb({ category: 'navigation', message: window.location.href }) } catch (_) { /* ignore */ }\n })\n } catch (e) { /* ignore */ }\n\n // Fetch breadcrumbs \u2014 keep the original promise contract intact. The breadcrumb\n // is added on a passthrough of the original chain, wrapped so it can never\n // reject the app's fetch or swallow its rejection.\n try {\n _origFetch = window.fetch\n const origFetch = _origFetch\n window.fetch = function () {\n const args = arguments\n const start = Date.now()\n return origFetch.apply(this, args).then(\n (response) => {\n try {\n const url = typeof args[0] === 'string' ? args[0] : ((args[0] && args[0].url) || '')\n const method = (args[1] && args[1].method) || 'GET'\n _addBreadcrumb({ category: 'fetch', message: `${method} ${url}`, data: { status: response.status, duration: Date.now() - start } })\n } catch (_) { /* ignore */ }\n return response\n },\n (err) => {\n try {\n const url = typeof args[0] === 'string' ? args[0] : ((args[0] && args[0].url) || '')\n const method = (args[1] && args[1].method) || 'GET'\n _addBreadcrumb({ category: 'fetch', message: `${method} ${url}`, data: { error: err && err.message, duration: Date.now() - start } })\n } catch (_) { /* ignore */ }\n throw err\n }\n )\n }\n } catch (e) { /* ignore */ }\n\n // XHR breadcrumbs\n try {\n const origOpen = XMLHttpRequest.prototype.open\n const origSend = XMLHttpRequest.prototype.send\n XMLHttpRequest.prototype.open = function (method, url) {\n try { this._scoutMethod = method; this._scoutUrl = url } catch (_) { /* ignore */ }\n return origOpen.apply(this, arguments)\n }\n XMLHttpRequest.prototype.send = function () {\n try {\n const self = this\n const start = Date.now()\n self.addEventListener('loadend', () => {\n try { _addBreadcrumb({ category: 'xhr', message: `${self._scoutMethod || 'GET'} ${self._scoutUrl || ''}`, data: { status: self.status, duration: Date.now() - start } }) } catch (_) { /* ignore */ }\n })\n } catch (_) { /* ignore */ }\n return origSend.apply(this, arguments)\n }\n } catch (e) { /* ignore */ }\n\n // Error event listener (not async \u2014 must never return a rejecting promise)\n if (config.addErrorEventListener) {\n try {\n window.addEventListener('error', (event) => {\n try {\n if (!config.enabled || !config.sendErrors) return\n if (shouldIgnoreError(event.message)) return\n const errorTrace = event.error ? event.error.stack : 'No stack trace available'\n pushErrorEvent({\n type: 'window.onerror',\n message: event.message,\n source: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n errorTrace,\n })\n } catch (e) {\n try { _consoleWarn('[Scout] error handler failure:', e) } catch (_) { /* ignore */ }\n }\n if (config.selfHealingErrors) { try { event.preventDefault() } catch (_) { /* ignore */ } }\n })\n } catch (e) { /* ignore */ }\n }\n\n // Unhandled rejection listener\n if (config.addUnhandledRejectionEventListener) {\n try {\n window.addEventListener('unhandledrejection', (event) => {\n try {\n if (!config.enabled || !config.sendErrors) return\n const error = event.reason\n if (shouldIgnoreError((error && error.message) || '')) return\n const errorTrace = (error && error.stack) || 'No stack trace available'\n pushErrorEvent({\n type: 'Unhandled Promise Rejection',\n message: (error && error.message) || 'Unhandled Promise Rejection',\n reason: event.reason,\n errorTrace,\n })\n } catch (e) {\n try { _consoleWarn('[Scout] rejection handler failure:', e) } catch (_) { /* ignore */ }\n }\n if (config.selfHealingErrors) { try { event.preventDefault() } catch (_) { /* ignore */ } }\n })\n } catch (e) { /* ignore */ }\n }\n\n // Console overrides \u2014 ALWAYS delegate to the native console so the app's own\n // logging is never suppressed, even when Scout is disabled or capture throws.\n if (config.overrideConsoleError) {\n console.error = function (...args) {\n try {\n if (config.enabled && config.sendErrors && !shouldIgnoreError(argsToString(args))) {\n pushErrorEvent({ type: 'console.error', errorTrace: new Error().stack, args: argsToString(args) })\n }\n } catch (e) { /* ignore */ }\n try { _consoleError.apply(console, args) } catch (_) { /* ignore */ }\n }\n }\n\n if (config.overrideConsoleWarn) {\n console.warn = function (...args) {\n try {\n if (config.enabled && config.sendErrors && !shouldIgnoreError(argsToString(args))) {\n pushErrorEvent({ type: 'console.warn', errorTrace: new Error().stack, args: argsToString(args) })\n }\n } catch (e) { /* ignore */ }\n try { _consoleWarn.apply(console, args) } catch (_) { /* ignore */ }\n }\n }\n\n // Load UA Parser and Source Map from endpoint host (self-hosted, no CDN)\n try {\n const baseUrl = config.endpoint ? new URL(config.endpoint).origin : ''\n if (config.loadUAParser && config.browserDetails && baseUrl) {\n _loadScript(`${baseUrl}/vendor/ua-parser.min.js`, () => {\n try { if (typeof UAParser !== 'undefined') window._uaParserResult = new UAParser().getResult() } catch (_) { /* ignore */ }\n })\n }\n if (config.handleSourceMaps && baseUrl) {\n _loadScript(`${baseUrl}/vendor/source-map.min.js`)\n }\n } catch (e) { /* ignore */ }\n}\n\n/**\n * Initialize Scout error tracking.\n *\n * @param {Object} scopeOptions - { app, project, version, environment, user }\n * @param {Object} configOptions - { endpoint, token, sampleRate, debug, ... }\n */\nexport function init(scopeOptions = {}, configOptions = {}) {\n // Extract user from scope if provided\n if (scopeOptions.user) {\n userContext = scopeOptions.user\n delete scopeOptions.user\n }\n\n if (initialized) {\n scope = { ...scope, ...scopeOptions }\n config = { ...config, ...configOptions }\n return\n }\n\n scope = { ...scope, ...scopeOptions }\n config = { ...config, ...configOptions }\n initialized = true\n\n // setupListeners patches global APIs \u2014 if it ever throws it must not propagate,\n // since init() typically runs before the host app mounts.\n if (typeof window !== 'undefined') {\n try {\n setupListeners()\n } catch (e) {\n try { _consoleWarn('[Scout] setup failed:', e) } catch (_) { /* ignore */ }\n }\n }\n}\n\n// Expose window.Scout immediately on load (before init is called)\n// This overwrites the ES5 no-op stub with real methods\nif (typeof window !== 'undefined') {\n window.Scout = {\n init,\n setScope: (s) => { scope = { ...scope, ...s } },\n setConfig: (c) => { config = { ...config, ...c } },\n setUser,\n setContext,\n setTag,\n addBreadcrumb: _addBreadcrumb,\n error: captureError,\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["vue_exports", "__export", "ScoutVue", "__toCommonJS", "defaultConfig", "config", "__spreadValues", "_a", "scope", "userInteractions", "pageloadId", "initialized", "userContext", "customContext", "breadcrumbs", "MAX_BREADCRUMBS", "_capturing", "_origFetch", "_memUserId", "_memSessionId", "_sendTimes", "_mapCache", "_consoleError", "_consoleWarn", "_consoleLog", "generateId", "prefix", "getIds", "pageloadId", "userId", "sessionId", "e", "_memUserId", "_memSessionId", "getBrowser", "_a", "_b", "_c", "ua", "b", "getOS", "o", "captureBrowserDetails", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "conn", "userInteractions", "shouldIgnoreError", "msg", "config", "pattern", "safeStringify", "data", "seen", "k", "v", "_", "rateLimited", "limit", "now", "_sendTimes", "postData", "url", "body", "controller", "timeout", "headers", "_origFetch", "r", "argsToString", "args", "fmt", "rest", "m", "_loadScript", "src", "onload", "s", "buildMapEntry", "sourceUrl", "__async", "f", "jsResponse", "jsCode", "inlineMatch", "externalMatch", "mapURL", "mapResponse", "consumer", "getMapEntry", "cached", "_mapCache", "p", "entry", "resolveSourceMap", "lineno", "colno", "pos", "sourceIndex", "snippet", "_addBreadcrumb", "crumb", "breadcrumbs", "__spreadValues", "MAX_BREADCRUMBS", "KNOWN_EVENT_FIELDS", "pushErrorEvent", "obj", "_capturing", "event", "smSource", "smLine", "smCol", "promoted", "lines", "filtered", "i", "stack", "match", "inlineContext", "mergedContext", "customContext", "details", "scope", "userContext", "_consoleWarn", "resolved", "enriched", "__spreadProps", "captureError", "setUser", "user", "setContext", "ctx", "setTag", "key", "value", "setupListeners", "config", "e", "userInteractions", "el", "tag", "text", "_addBreadcrumb", "_", "lastScroll", "now", "origPushState", "r", "_origFetch", "origFetch", "args", "start", "response", "url", "method", "err", "origOpen", "origSend", "self", "event", "shouldIgnoreError", "errorTrace", "pushErrorEvent", "_consoleWarn", "error", "argsToString", "_consoleError", "baseUrl", "_loadScript", "init", "scopeOptions", "configOptions", "userContext", "initialized", "scope", "__spreadValues", "s", "c", "setUser", "setContext", "setTag", "captureError", "ScoutVue", "app", "err", "vm", "info", "captureError", "_", "msg", "trace"]
|
|
7
7
|
}
|
package/dist/vue.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var
|
|
2
|
-
`),
|
|
3
|
-
`))}catch(
|
|
4
|
-
`):[];for(let
|
|
1
|
+
var V=Object.defineProperty,X=Object.defineProperties;var q=Object.getOwnPropertyDescriptors;var U=Object.getOwnPropertySymbols;var z=Object.prototype.hasOwnProperty,J=Object.prototype.propertyIsEnumerable;var A=(e,t,n)=>t in e?V(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,c=(e,t)=>{for(var n in t||(t={}))z.call(t,n)&&A(e,n,t[n]);if(U)for(var n of U(t))J.call(t,n)&&A(e,n,t[n]);return e},N=(e,t)=>X(e,q(t));var v=(e,t,n)=>new Promise((o,r)=>{var a=d=>{try{u(n.next(d))}catch(i){r(i)}},l=d=>{try{u(n.throw(d))}catch(i){r(i)}},u=d=>d.done?o(d.value):Promise.resolve(d.value).then(a,l);u((n=n.apply(e,t)).next())});var G={trackUserInteractions:!0,selfHealingErrors:!1,attachStacktrace:!0,handleSourceMaps:!0,browserDetails:!0,warnOnCapture:!1,loadUAParser:!0,ignoreErrors:null,sendErrors:!0,sampleRate:1,maxEventsPerMinute:60,enabled:!0,debug:!1,endpoint:"",token:null,overrideOnError:!1,overrideOnUnhandledRejection:!1,addErrorEventListener:!0,addUnhandledRejectionEventListener:!0,overrideConsoleLog:!1,overrideConsoleWarn:!1,overrideConsoleInfo:!1,overrideConsoleError:!0},s=c({},G),B,g={environment:typeof window!="undefined"&&((B=window.location)==null?void 0:B.hostname)==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.3.5",project:null,release:null,version:null,app:null},L={clicks:0,scrolls:0},I=null,O=!1,b=null,x={},C=[],j=30,P=!1,T=null,$=null,F=null,m=[],w=new Map,K=console.error,S=console.warn;var D=console.log;function y(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function Z(){I=I||y("pageload");let e,t;try{e=localStorage.getItem("__scoutUserId"),e||(e=y("user"),localStorage.setItem("__scoutUserId",e))}catch(n){e=$=$||y("user")}try{t=sessionStorage.getItem("__scoutSessionId"),t||(t=y("session"),sessionStorage.setItem("__scoutSessionId",t))}catch(n){t=F=F||y("session")}return{pageloadId:I,userId:e,sessionId:t}}function Q(){var n,o,r;if((o=(n=window._uaParserResult)==null?void 0:n.browser)!=null&&o.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return((r=[{p:/Chrome.*Mobile/,n:"Chrome Mobile"},{p:/Chrome/,n:"Chrome"},{p:/Firefox.*Mobile/,n:"Firefox Mobile"},{p:/Firefox/,n:"Firefox"},{p:/Safari.*Mobile/,n:"Safari Mobile"},{p:/Safari/,n:"Safari"},{p:/MSIE|Trident/,n:"Internet Explorer"},{p:/Edge/,n:"Edge"}].find(a=>e.match(a.p)))==null?void 0:r.n)||"Unknown"}function Y(){var n,o,r;if((o=(n=window._uaParserResult)==null?void 0:n.os)!=null&&o.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return((r=[{p:/Win/,n:"Windows"},{p:/Mac/,n:"Mac OS"},{p:/X11|Linux/,n:"Linux"},{p:/Android/,n:"Android"},{p:/iPhone|iPad/,n:"iOS"}].find(a=>e.match(a.p)))==null?void 0:r.n)||"Unknown"}function ee(){var t,n,o,r,a,l,u,d,i,p;let e=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return{connectionType:e?e.effectiveType:"unknown",userAgent:navigator.userAgent,width:window.innerWidth,height:window.innerHeight,screenWidth:screen.width,screenHeight:screen.height,errorTimestamp:Date.now(),timeLocale:Intl.DateTimeFormat().resolvedOptions().timeZone,browserLocale:navigator.language||navigator.userLanguage,sessionTime:Math.round(performance.now()/1e3),deviceMemory:navigator.deviceMemory||"unknown",timezoneOffset:new Date().getTimezoneOffset(),cookiesEnabled:navigator.cookieEnabled,url:window.location.href,host:window.location.host,referrer:document.referrer,browser:Q(),browserVersion:((n=(t=window._uaParserResult)==null?void 0:t.browser)==null?void 0:n.version)||null,os:Y(),osVersion:((r=(o=window._uaParserResult)==null?void 0:o.os)==null?void 0:r.version)||null,deviceType:((l=(a=window._uaParserResult)==null?void 0:a.device)==null?void 0:l.type)||null,deviceModel:((d=(u=window._uaParserResult)==null?void 0:u.device)==null?void 0:d.model)||null,deviceVendor:((p=(i=window._uaParserResult)==null?void 0:i.device)==null?void 0:p.vendor)||null,loadTime:(()=>{try{return Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart)}catch(f){return 0}})(),userClicks:L.clicks,userScrolls:L.scrolls}}function k(e){return!s.ignoreErrors||!Array.isArray(s.ignoreErrors)?!1:s.ignoreErrors.some(t=>typeof t=="string"?e.includes(t):t instanceof RegExp?t.test(e):!1)}function te(e){try{return JSON.stringify(e)}catch(t){try{let n=new WeakSet;return JSON.stringify(e,(o,r)=>{if(typeof r=="bigint")return r.toString();if(typeof r=="function")return"[Function]";if(r&&typeof r=="object"){if(n.has(r))return"[Circular]";n.add(r)}return r})}catch(n){return null}}}function ne(){try{let e=s.maxEventsPerMinute;if(!e)return!1;let t=Date.now();for(;m.length&&t-m[0]>6e4;)m.shift();return m.length>=e?!0:(m.push(t),!1)}catch(e){return!1}}function H(e,t){try{let n=te(t);if(n==null)return;let o=new AbortController,r=setTimeout(()=>o.abort(),5e3),a={"Content-Type":"application/json"};return s.token&&(a["X-Ingest-Token"]=s.token),(T||fetch)(e,{method:"POST",headers:a,body:n,signal:o.signal}).then(u=>(clearTimeout(r),u)).catch(()=>{clearTimeout(r)})}catch(n){}}function M(e){let t=(e[0]||"")+"",n=[...e];return t.replace(/%[sdj]/g,o=>{let r=n.shift();return o==="%s"?String(r):o==="%d"?Number(r):o==="%j"?JSON.stringify(r):o})}function W(e,t){let n=document.createElement("script");n.src=e,n.async=!0,t&&(n.onload=t),document.head.appendChild(n)}function re(e){return v(this,null,function*(){let t=T||fetch,n=yield t(e);if(!n.ok)return null;let o=yield n.text(),r=o.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),a=o.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),l;if(r)l=JSON.parse(atob(r[1]));else if(a){let d=new URL(a[1],e).href,i=yield t(d);if(!i.ok)return null;l=yield i.json()}else return null;let u=new window.sourceMap.SourceMapConsumer(l);return!u||typeof u.originalPositionFor!="function"?null:{consumer:u,data:l}})}function oe(e){let t=w.get(e);if(t==="FAILED")return Promise.resolve(null);if(t)return t;let n=re(e);return w.set(e,n),n.then(o=>{w.set(e,o?Promise.resolve(o):"FAILED")},()=>{w.get(e)===n&&w.delete(e)}),n}function se(e,t,n){return v(this,null,function*(){var o;try{if(!((o=window.sourceMap)!=null&&o.SourceMapConsumer))return null;let r=yield oe(e);if(!r)return null;let a=r.consumer.originalPositionFor({line:t,column:n});if(!a.source)return null;let l=r.data.sources.indexOf(a.source),u=null;return r.data.sourcesContent&&r.data.sourcesContent[l]&&(u=r.data.sourcesContent[l]),{originalSource:a.source,originalLine:a.line,originalColumn:a.column,originalName:a.name,snippet:u}}catch(r){return null}})}function h(e){C.push(c({timestamp:Date.now()},e)),C.length>j&&C.shift()}var ae=new Set(["type","message","args","stack","errorTrace","source","lineno","colno","reason","snippet","highlightLineNumber","originalSource","originalLine","originalColumn","originalName","context","user","breadcrumbs","timestamp","errorTimestamp"]);function _(e){return v(this,null,function*(){if(P)return;P=!0;let t=null,n=null,o=null,r=0;try{e=c({},e||{});let a={};for(let i of Object.keys(e))i!=="context"&&!ae.has(i)&&(a[i]=e[i],delete e[i]);if(s.sampleRate&&Math.random()<1-parseFloat(s.sampleRate)){s.debug&&D("[Scout] Suppressed by sampling");return}if(ne()){s.debug&&D("[Scout] Suppressed by rate limit");return}if(s.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let i=e.errorTrace.split(`
|
|
2
|
+
`),p=[i[0]];for(let f=1;f<i.length;f++)!i[f].includes("/scout")&&!i[f].includes("scout.js")&&!i[f].includes("scout-error")&&p.push(i[f]);p.length>1&&(e.errorTrace=p.join(`
|
|
3
|
+
`))}catch(i){}if((e.errorTrace||e.stack)&&!e.source)try{let i=e.errorTrace||e.stack,p=i?i.split(`
|
|
4
|
+
`):[];for(let f=1;f<p.length;f++){let E=p[f].trim().match(/((?:https?|capacitor|ionic|file):\/\/.*?):(\d+):(\d+)/);if(E){e.source=E[1],e.lineno=parseInt(E[2],10),e.colno=parseInt(E[3],10);break}}}catch(i){}let l=e.context&&typeof e.context=="object"?e.context:{},u=c(c(c({},x),a),l),d={};if(s.browserDetails)try{d=ee()}catch(i){}t=Object.assign({},e,d,g,Z()),b&&(t.user=b),Object.keys(u).length&&(t.context=u);try{t.breadcrumbs=C.slice()}catch(i){t.breadcrumbs=[]}s.debug&&D("[Scout] Sending:",t),s.endpoint&&H(s.endpoint,t),n=e.source,o=e.lineno,r=e.colno||0}catch(a){try{s.debug&&S("[Scout] capture failed:",a)}catch(l){}}finally{P=!1}try{if(t&&s.handleSourceMaps&&n&&o){let a=yield se(n,o,r);if(a){let l=N(c({},t),{originalSource:a.originalSource,originalLine:a.originalLine,originalColumn:a.originalColumn,originalName:a.originalName,highlightLineNumber:a.originalLine});a.snippet&&(l.snippet=a.snippet),s.endpoint&&H(s.endpoint,l)}}}catch(a){}})}function R(e){try{if(!s.enabled)return;let t=_(e);t&&typeof t.catch=="function"&&t.catch(()=>{})}catch(t){}}function ie(e){b=e}function ce(e){x=c(c({},x),e)}function le(e,t){x[e]=t}function ue(){if(s.trackUserInteractions)try{document.addEventListener("click",t=>{try{L.clicks++;let n=t.target,o=n&&n.tagName?n.tagName.toLowerCase():"",r=(n&&n.textContent||"").trim().slice(0,50);h({category:"click",message:o+(r?": "+r:"")})}catch(n){}},{passive:!0});let e=0;window.addEventListener("scroll",()=>{try{let t=Date.now();t-e>100&&(L.scrolls++,e=t)}catch(t){}},{passive:!0})}catch(e){}try{let e=history.pushState;history.pushState=function(){let t=e.apply(this,arguments);try{h({category:"navigation",message:window.location.href})}catch(n){}return t},window.addEventListener("popstate",()=>{try{h({category:"navigation",message:window.location.href})}catch(t){}})}catch(e){}try{T=window.fetch;let e=T;window.fetch=function(){let t=arguments,n=Date.now();return e.apply(this,t).then(o=>{try{let r=typeof t[0]=="string"?t[0]:t[0]&&t[0].url||"",a=t[1]&&t[1].method||"GET";h({category:"fetch",message:`${a} ${r}`,data:{status:o.status,duration:Date.now()-n}})}catch(r){}return o},o=>{try{let r=typeof t[0]=="string"?t[0]:t[0]&&t[0].url||"",a=t[1]&&t[1].method||"GET";h({category:"fetch",message:`${a} ${r}`,data:{error:o&&o.message,duration:Date.now()-n}})}catch(r){}throw o})}}catch(e){}try{let e=XMLHttpRequest.prototype.open,t=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(n,o){try{this._scoutMethod=n,this._scoutUrl=o}catch(r){}return e.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){try{let n=this,o=Date.now();n.addEventListener("loadend",()=>{try{h({category:"xhr",message:`${n._scoutMethod||"GET"} ${n._scoutUrl||""}`,data:{status:n.status,duration:Date.now()-o}})}catch(r){}})}catch(n){}return t.apply(this,arguments)}}catch(e){}if(s.addErrorEventListener)try{window.addEventListener("error",e=>{try{if(!s.enabled||!s.sendErrors||k(e.message))return;let t=e.error?e.error.stack:"No stack trace available";_({type:"window.onerror",message:e.message,source:e.filename,lineno:e.lineno,colno:e.colno,errorTrace:t})}catch(t){try{S("[Scout] error handler failure:",t)}catch(n){}}if(s.selfHealingErrors)try{e.preventDefault()}catch(t){}})}catch(e){}if(s.addUnhandledRejectionEventListener)try{window.addEventListener("unhandledrejection",e=>{try{if(!s.enabled||!s.sendErrors)return;let t=e.reason;if(k(t&&t.message||""))return;let n=t&&t.stack||"No stack trace available";_({type:"Unhandled Promise Rejection",message:t&&t.message||"Unhandled Promise Rejection",reason:e.reason,errorTrace:n})}catch(t){try{S("[Scout] rejection handler failure:",t)}catch(n){}}if(s.selfHealingErrors)try{e.preventDefault()}catch(t){}})}catch(e){}s.overrideConsoleError&&(console.error=function(...e){try{s.enabled&&s.sendErrors&&!k(M(e))&&_({type:"console.error",errorTrace:new Error().stack,args:M(e)})}catch(t){}try{K.apply(console,e)}catch(t){}}),s.overrideConsoleWarn&&(console.warn=function(...e){try{s.enabled&&s.sendErrors&&!k(M(e))&&_({type:"console.warn",errorTrace:new Error().stack,args:M(e)})}catch(t){}try{S.apply(console,e)}catch(t){}});try{let e=s.endpoint?new URL(s.endpoint).origin:"";s.loadUAParser&&s.browserDetails&&e&&W(`${e}/vendor/ua-parser.min.js`,()=>{try{typeof UAParser!="undefined"&&(window._uaParserResult=new UAParser().getResult())}catch(t){}}),s.handleSourceMaps&&e&&W(`${e}/vendor/source-map.min.js`)}catch(e){}}function de(e={},t={}){if(e.user&&(b=e.user,delete e.user),O){g=c(c({},g),e),s=c(c({},s),t);return}if(g=c(c({},g),e),s=c(c({},s),t),O=!0,typeof window!="undefined")try{ue()}catch(n){try{S("[Scout] setup failed:",n)}catch(o){}}}typeof window!="undefined"&&(window.Scout={init:de,setScope:e=>{g=c(c({},g),e)},setConfig:e=>{s=c(c({},s),e)},setUser:ie,setContext:ce,setTag:le,addBreadcrumb:h,error:R});var me={install(e){try{e.config.errorHandler=(t,n,o)=>{try{R({message:t&&t.message,stack:t&&t.stack,errorTrace:t&&t.stack,component:n&&n.$options&&(n.$options.name||n.$options.__name)||"Anonymous",type:"vue-error-handler",info:o})}catch(r){}},e.config.warnHandler=(t,n,o)=>{try{R({message:t,component:n&&n.$options&&(n.$options.name||n.$options.__name)||"Anonymous",type:"vue-warn-handler",errorTrace:o})}catch(r){}}}catch(t){}}};export{me as ScoutVue};
|
|
5
5
|
//# sourceMappingURL=vue.js.map
|
package/dist/vue.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.js", "../src/vue.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * Scout.js Browser SDK\n *\n * Captures errors, unhandled rejections, and console output.\n * Collects browser telemetry, session tracking, and source maps.\n *\n * Usage:\n * import { init, captureError } from 'scout-error'\n * init({ app: 'My App', project: 'my-project' }, { endpoint: 'https://...' })\n */\n\n// UA Parser and Source Map are loaded at runtime from the same host as the endpoint\n// to avoid CDN/CSP issues. For npm/bundler users (Vue/React/Node), import them directly.\n\nconst defaultConfig = {\n trackUserInteractions: true,\n selfHealingErrors: false,\n attachStacktrace: true,\n handleSourceMaps: true,\n browserDetails: true,\n warnOnCapture: false,\n loadUAParser: true,\n ignoreErrors: null,\n sendErrors: true,\n sampleRate: 1.0,\n enabled: true,\n debug: false,\n endpoint: '',\n token: null,\n\n overrideOnError: false,\n overrideOnUnhandledRejection: false,\n addErrorEventListener: true,\n addUnhandledRejectionEventListener: true,\n\n overrideConsoleLog: false,\n overrideConsoleWarn: false,\n overrideConsoleInfo: false,\n overrideConsoleError: true,\n}\n\nlet config = { ...defaultConfig }\n\nlet scope = {\n environment: typeof window !== 'undefined' && window.location?.hostname === 'localhost' ? 'development' : 'production',\n sdk: 'javascript',\n sdkVersion: __SDK_VERSION__,\n project: null,\n release: null,\n version: null,\n app: null,\n}\n\nconst userInteractions = { clicks: 0, scrolls: 0 }\nlet pageloadId = null\nlet initialized = false\nlet userContext = null\nlet customContext = {}\nconst breadcrumbs = []\nconst MAX_BREADCRUMBS = 30\n\n// Save originals before any overrides\nconst _consoleError = console.error\nconst _consoleWarn = console.warn\nconst _consoleInfo = console.info\nconst _consoleLog = console.log\n\n// --- Utilities ---\n\nfunction generateId(prefix) {\n return `${prefix}_${Math.random().toString(36).substr(2, 9)}`\n}\n\nfunction getIds() {\n const userId = localStorage.getItem('__scoutUserId') || (localStorage.setItem('__scoutUserId', generateId('user')), localStorage.getItem('__scoutUserId'))\n const sessionId = sessionStorage.getItem('__scoutSessionId') || (sessionStorage.setItem('__scoutSessionId', generateId('session')), sessionStorage.getItem('__scoutSessionId'))\n pageloadId = pageloadId || generateId('pageload')\n return { pageloadId, userId, sessionId }\n}\n\nfunction getBrowser() {\n if (window._uaParserResult?.browser?.name) return window._uaParserResult.browser.name\n const ua = navigator.userAgent\n const map = [\n { p: /Chrome.*Mobile/, n: 'Chrome Mobile' },\n { p: /Chrome/, n: 'Chrome' },\n { p: /Firefox.*Mobile/, n: 'Firefox Mobile' },\n { p: /Firefox/, n: 'Firefox' },\n { p: /Safari.*Mobile/, n: 'Safari Mobile' },\n { p: /Safari/, n: 'Safari' },\n { p: /MSIE|Trident/, n: 'Internet Explorer' },\n { p: /Edge/, n: 'Edge' },\n ]\n return map.find(b => ua.match(b.p))?.n || 'Unknown'\n}\n\nfunction getOS() {\n if (window._uaParserResult?.os?.name) return window._uaParserResult.os.name\n const ua = navigator.userAgent\n const map = [\n { p: /Win/, n: 'Windows' },\n { p: /Mac/, n: 'Mac OS' },\n { p: /X11|Linux/, n: 'Linux' },\n { p: /Android/, n: 'Android' },\n { p: /iPhone|iPad/, n: 'iOS' },\n ]\n return map.find(o => ua.match(o.p))?.n || 'Unknown'\n}\n\nfunction captureBrowserDetails() {\n const conn = navigator.connection || navigator.mozConnection || navigator.webkitConnection\n return {\n connectionType: conn ? conn.effectiveType : 'unknown',\n userAgent: navigator.userAgent,\n width: window.innerWidth,\n height: window.innerHeight,\n screenWidth: screen.width,\n screenHeight: screen.height,\n errorTimestamp: Date.now(),\n timeLocale: Intl.DateTimeFormat().resolvedOptions().timeZone,\n browserLocale: navigator.language || navigator.userLanguage,\n sessionTime: Math.round(performance.now() / 1000),\n deviceMemory: navigator.deviceMemory || 'unknown',\n timezoneOffset: new Date().getTimezoneOffset(),\n cookiesEnabled: navigator.cookieEnabled,\n url: window.location.href,\n host: window.location.host,\n referrer: document.referrer,\n browser: getBrowser(),\n browserVersion: window._uaParserResult?.browser?.version || null,\n os: getOS(),\n osVersion: window._uaParserResult?.os?.version || null,\n deviceType: window._uaParserResult?.device?.type || null,\n deviceModel: window._uaParserResult?.device?.model || null,\n deviceVendor: window._uaParserResult?.device?.vendor || null,\n loadTime: Math.max(0, performance.timing.loadEventEnd - performance.timing.navigationStart),\n userClicks: userInteractions.clicks,\n userScrolls: userInteractions.scrolls,\n }\n}\n\nfunction shouldIgnoreError(msg) {\n if (!config.ignoreErrors || !Array.isArray(config.ignoreErrors)) return false\n return config.ignoreErrors.some(pattern => {\n if (typeof pattern === 'string') return msg.includes(pattern)\n if (pattern instanceof RegExp) return pattern.test(msg)\n return false\n })\n}\n\nfunction postData(url, data) {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), 5000)\n\n const headers = { 'Content-Type': 'application/json' }\n if (config.token) headers['X-Ingest-Token'] = config.token\n\n return fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(data),\n signal: controller.signal,\n })\n .then(r => { clearTimeout(timeout); return r })\n .catch(() => { clearTimeout(timeout) })\n}\n\nfunction argsToString(args) {\n const fmt = (args[0] || '') + ''\n const rest = [...args]\n return fmt.replace(/%[sdj]/g, (m) => {\n const v = rest.shift()\n if (m === '%s') return String(v)\n if (m === '%d') return Number(v)\n if (m === '%j') return JSON.stringify(v)\n return m\n })\n}\n\nfunction _loadScript(src, onload) {\n const s = document.createElement('script')\n s.src = src\n s.async = true\n if (onload) s.onload = onload\n document.head.appendChild(s)\n}\n\n// --- Source Maps ---\n\nasync function resolveSourceMap(sourceUrl, lineno, colno) {\n try {\n // Fetch the JS file to find sourceMappingURL\n const jsResponse = await fetch(sourceUrl)\n if (!jsResponse.ok) return null\n const jsCode = await jsResponse.text()\n\n const inlineMatch = jsCode.match(/\\/\\/# sourceMappingURL=data:application\\/json;base64,([^\\s]+)/)\n const externalMatch = jsCode.match(/\\/\\/# sourceMappingURL=(?!data:)([^\\s]+)/)\n\n let sourceMapData\n if (inlineMatch) {\n sourceMapData = JSON.parse(atob(inlineMatch[1]))\n } else if (externalMatch) {\n const mapURL = new URL(externalMatch[1], sourceUrl).href\n const mapResponse = await fetch(mapURL)\n if (!mapResponse.ok) return null\n sourceMapData = await mapResponse.json()\n } else {\n return null\n }\n\n if (!window.sourceMap?.SourceMapConsumer) return null\n const consumer = new window.sourceMap.SourceMapConsumer(sourceMapData)\n const pos = consumer.originalPositionFor({ line: lineno, column: colno })\n\n if (!pos.source) return null\n\n // Extract the original source snippet\n const sourceIndex = sourceMapData.sources.indexOf(pos.source)\n let snippet = null\n if (sourceMapData.sourcesContent && sourceMapData.sourcesContent[sourceIndex]) {\n snippet = sourceMapData.sourcesContent[sourceIndex]\n }\n\n return {\n originalSource: pos.source,\n originalLine: pos.line,\n originalColumn: pos.column,\n originalName: pos.name,\n snippet,\n }\n } catch (e) {\n return null\n }\n}\n\n// --- Breadcrumbs ---\n\nfunction _addBreadcrumb(crumb) {\n breadcrumbs.push({ timestamp: Date.now(), ...crumb })\n if (breadcrumbs.length > MAX_BREADCRUMBS) breadcrumbs.shift()\n}\n\n// --- Core ---\n\n// Known top-level event fields the SDK and server understand.\n// Anything else passed to captureError gets auto-promoted into context\n// so the admin UI's Context section can render it.\nconst KNOWN_EVENT_FIELDS = new Set([\n 'type', 'message', 'args', 'stack', 'errorTrace',\n 'source', 'lineno', 'colno', 'reason',\n 'snippet', 'highlightLineNumber',\n 'originalSource', 'originalLine', 'originalColumn', 'originalName',\n 'context', 'user', 'breadcrumbs',\n 'timestamp', 'errorTimestamp',\n])\n\nasync function pushErrorEvent(obj) {\n // Don't mutate the caller's object\n obj = { ...(obj || {}) }\n\n // Auto-promote unknown top-level keys into context (e.g. status, textStatus,\n // errorThrown, etc. that callers commonly pass alongside an error)\n const promoted = {}\n for (const k of Object.keys(obj)) {\n if (k !== 'context' && !KNOWN_EVENT_FIELDS.has(k)) {\n promoted[k] = obj[k]\n delete obj[k]\n }\n }\n\n if (config.sampleRate && Math.random() < (1 - parseFloat(config.sampleRate))) {\n if (config.debug) _consoleLog('[Scout] Suppressed by sampling')\n return\n }\n\n if (!config.attachStacktrace) obj.errorTrace = null\n\n // Strip scout's own frames from stack traces (for console.error/warn captures)\n if (obj.errorTrace) {\n try {\n const lines = obj.errorTrace.split('\\n')\n const filtered = [lines[0]]\n for (let i = 1; i < lines.length; i++) {\n if (!lines[i].includes('/scout') && !lines[i].includes('scout.js') && !lines[i].includes('scout-error')) {\n filtered.push(lines[i])\n }\n }\n if (filtered.length > 1) obj.errorTrace = filtered.join('\\n')\n } catch (e) { /* ignore */ }\n }\n\n if ((obj.errorTrace || obj.stack) && !obj.source) {\n try {\n const stack = obj.errorTrace || obj.stack\n const lines = stack ? stack.split('\\n') : []\n // Find the first frame with a source location (skip the error message line)\n for (let i = 1; i < lines.length; i++) {\n const match = lines[i].trim().match(/(http.*?):(\\d+):(\\d+)/)\n if (match) {\n obj.source = match[1]\n obj.lineno = parseInt(match[2], 10)\n obj.colno = parseInt(match[3], 10)\n break\n }\n }\n } catch (e) { /* ignore */ }\n }\n\n // Merge precedence: global customContext < auto-promoted < user's inline context\n // (so an explicit `context: { foo: 1 }` always wins over an accidental top-level foo)\n const inlineContext = (obj.context && typeof obj.context === 'object') ? obj.context : {}\n const mergedContext = { ...customContext, ...promoted, ...inlineContext }\n\n const details = config.browserDetails ? captureBrowserDetails() : {}\n const event = Object.assign({}, obj, details, scope, getIds())\n\n if (userContext) event.user = userContext\n if (Object.keys(mergedContext).length) event.context = mergedContext\n event.breadcrumbs = breadcrumbs.slice()\n\n // Send the event immediately \u2014 don't let source map resolution block it\n if (config.debug) _consoleLog('[Scout] Sending:', event)\n if (config.endpoint) postData(config.endpoint, event)\n\n // Resolve source maps after sending (best-effort, non-blocking)\n if (config.handleSourceMaps && obj.source && obj.lineno) {\n try {\n const resolved = await resolveSourceMap(obj.source, obj.lineno, obj.colno || 0)\n if (resolved) {\n const enriched = {\n ...event,\n originalSource: resolved.originalSource,\n originalLine: resolved.originalLine,\n originalColumn: resolved.originalColumn,\n originalName: resolved.originalName,\n highlightLineNumber: resolved.originalLine,\n }\n if (resolved.snippet) enriched.snippet = resolved.snippet\n if (config.endpoint) postData(config.endpoint, enriched)\n }\n } catch (e) { /* fail silently */ }\n }\n}\n\n/**\n * Manually capture an error object.\n */\nexport function captureError(event) {\n if (!config.enabled) return\n pushErrorEvent(event)\n}\n\n/**\n * Set identified user info. Call after login.\n * @param {{ id?: string, email?: string, name?: string }} user\n */\nexport function setUser(user) {\n userContext = user\n}\n\n/**\n * Merge custom key-value context attached to all future errors.\n * @param {Object} ctx\n */\nexport function setContext(ctx) {\n customContext = { ...customContext, ...ctx }\n}\n\n/**\n * Set a single context tag.\n */\nexport function setTag(key, value) {\n customContext[key] = value\n}\n\n/**\n * Manually add a breadcrumb.\n * @param {{ category?: string, message?: string, data?: Object }} crumb\n */\nexport function addBreadcrumb(crumb) {\n _addBreadcrumb(crumb)\n}\n\n// --- Setup ---\n\nfunction setupListeners() {\n // Click tracking + breadcrumbs\n if (config.trackUserInteractions) {\n document.addEventListener('click', (e) => {\n userInteractions.clicks++\n const el = e.target\n const tag = el.tagName ? el.tagName.toLowerCase() : ''\n const text = (el.textContent || '').trim().slice(0, 50)\n _addBreadcrumb({ category: 'click', message: tag + (text ? ': ' + text : '') })\n })\n let lastScroll = 0\n window.addEventListener('scroll', () => {\n const now = Date.now()\n if (now - lastScroll > 100) { userInteractions.scrolls++; lastScroll = now }\n })\n }\n\n // Navigation breadcrumbs\n const origPushState = history.pushState\n history.pushState = function() {\n origPushState.apply(this, arguments)\n _addBreadcrumb({ category: 'navigation', message: window.location.href })\n }\n window.addEventListener('popstate', () => {\n _addBreadcrumb({ category: 'navigation', message: window.location.href })\n })\n\n // Fetch breadcrumbs\n const origFetch = window.fetch\n window.fetch = function(input, init) {\n const url = typeof input === 'string' ? input : (input?.url || '')\n const method = init?.method || 'GET'\n const start = Date.now()\n return origFetch.apply(this, arguments).then(response => {\n _addBreadcrumb({ category: 'fetch', message: `${method} ${url}`, data: { status: response.status, duration: Date.now() - start } })\n return response\n }).catch(err => {\n _addBreadcrumb({ category: 'fetch', message: `${method} ${url}`, data: { error: err.message, duration: Date.now() - start } })\n throw err\n })\n }\n\n // XHR breadcrumbs\n const origOpen = XMLHttpRequest.prototype.open\n const origSend = XMLHttpRequest.prototype.send\n XMLHttpRequest.prototype.open = function(method, url) {\n this._scoutMethod = method\n this._scoutUrl = url\n return origOpen.apply(this, arguments)\n }\n XMLHttpRequest.prototype.send = function() {\n const self = this\n const start = Date.now()\n self.addEventListener('loadend', () => {\n _addBreadcrumb({ category: 'xhr', message: `${self._scoutMethod || 'GET'} ${self._scoutUrl || ''}`, data: { status: self.status, duration: Date.now() - start } })\n })\n return origSend.apply(this, arguments)\n }\n\n // Error event listener\n if (config.addErrorEventListener) {\n window.addEventListener('error', async (event) => {\n if (!config.enabled) return\n try {\n const errorTrace = event.error ? event.error.stack : 'No stack trace available'\n if (shouldIgnoreError(event.message)) return\n if (config.sendErrors) {\n pushErrorEvent({\n type: 'window.onerror',\n message: event.message,\n source: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n errorTrace,\n })\n }\n } catch (e) {\n _consoleWarn('[Scout] Error handler failure:', e)\n }\n if (config.selfHealingErrors) event.preventDefault()\n })\n }\n\n // Unhandled rejection listener\n if (config.addUnhandledRejectionEventListener) {\n window.addEventListener('unhandledrejection', (event) => {\n if (!config.enabled) return\n try {\n const error = event.reason\n const errorTrace = error?.stack || 'No stack trace available'\n if (shouldIgnoreError(error?.message || '')) return\n if (config.sendErrors) {\n pushErrorEvent({\n type: 'Unhandled Promise Rejection',\n message: error?.message || 'Unhandled Promise Rejection',\n reason: event.reason,\n errorTrace,\n })\n }\n } catch (e) {\n _consoleWarn('[Scout] Rejection handler failure:', e)\n }\n if (config.selfHealingErrors) event.preventDefault()\n })\n }\n\n // Console overrides\n if (config.overrideConsoleError) {\n console.error = function (...args) {\n if (!config.enabled) return\n try {\n const errorTrace = new Error().stack\n if (shouldIgnoreError(argsToString(args))) return\n if (config.sendErrors) pushErrorEvent({ type: 'console.error', errorTrace, args: argsToString(args) })\n } catch (e) { _consoleWarn('[Scout] console.error override failure:', e) }\n }\n }\n\n if (config.overrideConsoleWarn) {\n console.warn = function (...args) {\n if (!config.enabled) return\n try {\n const errorTrace = new Error().stack\n if (shouldIgnoreError(argsToString(args))) return\n if (config.sendErrors) pushErrorEvent({ type: 'console.warn', errorTrace, args: argsToString(args) })\n } catch (e) { _consoleWarn('[Scout] console.warn override failure:', e) }\n }\n }\n\n // Load UA Parser and Source Map from endpoint host (self-hosted, no CDN)\n const baseUrl = config.endpoint ? new URL(config.endpoint).origin : ''\n if (config.loadUAParser && config.browserDetails && baseUrl) {\n _loadScript(`${baseUrl}/vendor/ua-parser.min.js`, () => {\n if (typeof UAParser !== 'undefined') {\n window._uaParserResult = new UAParser().getResult()\n }\n })\n }\n if (config.handleSourceMaps && baseUrl) {\n _loadScript(`${baseUrl}/vendor/source-map.min.js`)\n }\n}\n\n/**\n * Initialize Scout error tracking.\n *\n * @param {Object} scopeOptions - { app, project, version, environment, user }\n * @param {Object} configOptions - { endpoint, token, sampleRate, debug, ... }\n */\nexport function init(scopeOptions = {}, configOptions = {}) {\n // Extract user from scope if provided\n if (scopeOptions.user) {\n userContext = scopeOptions.user\n delete scopeOptions.user\n }\n\n if (initialized) {\n scope = { ...scope, ...scopeOptions }\n config = { ...config, ...configOptions }\n return\n }\n\n scope = { ...scope, ...scopeOptions }\n config = { ...config, ...configOptions }\n initialized = true\n\n if (typeof window !== 'undefined') {\n setupListeners()\n }\n}\n\n// Expose window.Scout immediately on load (before init is called)\n// This overwrites the ES5 no-op stub with real methods\nif (typeof window !== 'undefined') {\n window.Scout = {\n init,\n setScope: (s) => { scope = { ...scope, ...s } },\n setConfig: (c) => { config = { ...config, ...c } },\n setUser,\n setContext,\n setTag,\n addBreadcrumb: _addBreadcrumb,\n error: captureError,\n }\n}\n", "/**\n * Scout.js Vue Plugin\n *\n * Usage:\n * import { init } from 'scoutjs'\n * import { ScoutVue } from 'scoutjs/vue'\n *\n * init({ app: 'My App', project: 'my-project' }, { endpoint: '...' })\n * app.use(ScoutVue)\n */\n\nimport { captureError } from './index.js'\n\n/**\n * Vue plugin that installs error and warning handlers.\n *\n * app.use(ScoutVue)\n */\nexport const ScoutVue = {\n install(app) {\n app.config.errorHandler = (err, vm, info) => {\n captureError({\n message: err.message,\n stack: err.stack,\n errorTrace: err.stack,\n component: vm?.$options?.name || vm?.$options?.__name || 'Anonymous',\n type: 'vue-error-handler',\n info,\n })\n }\n\n app.config.warnHandler = (msg, vm, trace) => {\n captureError({\n message: msg,\n component: vm?.$options?.name || vm?.$options?.__name || 'Anonymous',\n type: 'vue-warn-handler',\n errorTrace: trace,\n })\n }\n },\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["defaultConfig", "config", "__spreadValues", "_a", "scope", "userInteractions", "pageloadId", "initialized", "userContext", "customContext", "breadcrumbs", "MAX_BREADCRUMBS", "_consoleWarn", "_consoleLog", "generateId", "prefix", "getIds", "userId", "sessionId", "
|
|
4
|
+
"sourcesContent": ["/**\n * Scout.js Browser SDK\n *\n * Captures errors, unhandled rejections, and console output.\n * Collects browser telemetry, session tracking, and source maps.\n *\n * Usage:\n * import { init, captureError } from 'scout-error'\n * init({ app: 'My App', project: 'my-project' }, { endpoint: 'https://...' })\n */\n\n// UA Parser and Source Map are loaded at runtime from the same host as the endpoint\n// to avoid CDN/CSP issues. For npm/bundler users (Vue/React/Node), import them directly.\n\nconst defaultConfig = {\n trackUserInteractions: true,\n selfHealingErrors: false,\n attachStacktrace: true,\n handleSourceMaps: true,\n browserDetails: true,\n warnOnCapture: false,\n loadUAParser: true,\n ignoreErrors: null,\n sendErrors: true,\n sampleRate: 1.0,\n maxEventsPerMinute: 60,\n enabled: true,\n debug: false,\n endpoint: '',\n token: null,\n\n overrideOnError: false,\n overrideOnUnhandledRejection: false,\n addErrorEventListener: true,\n addUnhandledRejectionEventListener: true,\n\n overrideConsoleLog: false,\n overrideConsoleWarn: false,\n overrideConsoleInfo: false,\n overrideConsoleError: true,\n}\n\nlet config = { ...defaultConfig }\n\nlet scope = {\n environment: typeof window !== 'undefined' && window.location?.hostname === 'localhost' ? 'development' : 'production',\n sdk: 'javascript',\n sdkVersion: __SDK_VERSION__,\n project: null,\n release: null,\n version: null,\n app: null,\n}\n\nconst userInteractions = { clicks: 0, scrolls: 0 }\nlet pageloadId = null\nlet initialized = false\nlet userContext = null\nlet customContext = {}\nconst breadcrumbs = []\nconst MAX_BREADCRUMBS = 30\n\n// Hardening state \u2014 the SDK must never loop, throw into the app, or brick a kiosk.\nlet _capturing = false // reentrancy guard (capture-within-capture / rejection loops)\nlet _origFetch = null // pristine fetch for ingest, captured before we patch window.fetch\nlet _memUserId = null // in-memory id fallback when Web Storage throws (locked-down webviews)\nlet _memSessionId = null\nconst _sendTimes = [] // sliding-window send timestamps for rate limiting\nconst _mapCache = new Map() // per-bundle source-map consumer (as an in-flight/resolved promise) or 'FAILED'\n\n// Save originals before any overrides\nconst _consoleError = console.error\nconst _consoleWarn = console.warn\nconst _consoleInfo = console.info\nconst _consoleLog = console.log\n\n// --- Utilities ---\n\nfunction generateId(prefix) {\n return `${prefix}_${Math.random().toString(36).substr(2, 9)}`\n}\n\nfunction getIds() {\n pageloadId = pageloadId || generateId('pageload')\n // Web Storage can throw (privacy modes, disabled storage, sandboxed webviews).\n // Fall back to in-memory ids so a capture never fails on storage access.\n let userId, sessionId\n try {\n userId = localStorage.getItem('__scoutUserId')\n if (!userId) { userId = generateId('user'); localStorage.setItem('__scoutUserId', userId) }\n } catch (e) {\n userId = _memUserId = _memUserId || generateId('user')\n }\n try {\n sessionId = sessionStorage.getItem('__scoutSessionId')\n if (!sessionId) { sessionId = generateId('session'); sessionStorage.setItem('__scoutSessionId', sessionId) }\n } catch (e) {\n sessionId = _memSessionId = _memSessionId || generateId('session')\n }\n return { pageloadId, userId, sessionId }\n}\n\nfunction getBrowser() {\n if (window._uaParserResult?.browser?.name) return window._uaParserResult.browser.name\n const ua = navigator.userAgent\n const map = [\n { p: /Chrome.*Mobile/, n: 'Chrome Mobile' },\n { p: /Chrome/, n: 'Chrome' },\n { p: /Firefox.*Mobile/, n: 'Firefox Mobile' },\n { p: /Firefox/, n: 'Firefox' },\n { p: /Safari.*Mobile/, n: 'Safari Mobile' },\n { p: /Safari/, n: 'Safari' },\n { p: /MSIE|Trident/, n: 'Internet Explorer' },\n { p: /Edge/, n: 'Edge' },\n ]\n return map.find(b => ua.match(b.p))?.n || 'Unknown'\n}\n\nfunction getOS() {\n if (window._uaParserResult?.os?.name) return window._uaParserResult.os.name\n const ua = navigator.userAgent\n const map = [\n { p: /Win/, n: 'Windows' },\n { p: /Mac/, n: 'Mac OS' },\n { p: /X11|Linux/, n: 'Linux' },\n { p: /Android/, n: 'Android' },\n { p: /iPhone|iPad/, n: 'iOS' },\n ]\n return map.find(o => ua.match(o.p))?.n || 'Unknown'\n}\n\nfunction captureBrowserDetails() {\n const conn = navigator.connection || navigator.mozConnection || navigator.webkitConnection\n return {\n connectionType: conn ? conn.effectiveType : 'unknown',\n userAgent: navigator.userAgent,\n width: window.innerWidth,\n height: window.innerHeight,\n screenWidth: screen.width,\n screenHeight: screen.height,\n errorTimestamp: Date.now(),\n timeLocale: Intl.DateTimeFormat().resolvedOptions().timeZone,\n browserLocale: navigator.language || navigator.userLanguage,\n sessionTime: Math.round(performance.now() / 1000),\n deviceMemory: navigator.deviceMemory || 'unknown',\n timezoneOffset: new Date().getTimezoneOffset(),\n cookiesEnabled: navigator.cookieEnabled,\n url: window.location.href,\n host: window.location.host,\n referrer: document.referrer,\n browser: getBrowser(),\n browserVersion: window._uaParserResult?.browser?.version || null,\n os: getOS(),\n osVersion: window._uaParserResult?.os?.version || null,\n deviceType: window._uaParserResult?.device?.type || null,\n deviceModel: window._uaParserResult?.device?.model || null,\n deviceVendor: window._uaParserResult?.device?.vendor || null,\n loadTime: (() => { try { return Math.max(0, performance.timing.loadEventEnd - performance.timing.navigationStart) } catch (e) { return 0 } })(),\n userClicks: userInteractions.clicks,\n userScrolls: userInteractions.scrolls,\n }\n}\n\nfunction shouldIgnoreError(msg) {\n if (!config.ignoreErrors || !Array.isArray(config.ignoreErrors)) return false\n return config.ignoreErrors.some(pattern => {\n if (typeof pattern === 'string') return msg.includes(pattern)\n if (pattern instanceof RegExp) return pattern.test(msg)\n return false\n })\n}\n\n// Circular-/non-serializable-safe JSON. A rejection reason or promoted context\n// value can be circular or hold DOM nodes/functions; a raw JSON.stringify would\n// throw and lose the event (or bubble out of the SDK).\nfunction safeStringify(data) {\n try {\n return JSON.stringify(data)\n } catch (e) {\n try {\n const seen = new WeakSet()\n return JSON.stringify(data, (k, v) => {\n if (typeof v === 'bigint') return v.toString()\n if (typeof v === 'function') return '[Function]'\n if (v && typeof v === 'object') {\n if (seen.has(v)) return '[Circular]'\n seen.add(v)\n }\n return v\n })\n } catch (_) {\n return null\n }\n }\n}\n\n// Sliding-window rate limit so a runaway error loop can't flood the network or\n// peg the device. Silently drops once the per-minute budget is exceeded.\nfunction rateLimited() {\n try {\n const limit = config.maxEventsPerMinute\n if (!limit) return false\n const now = Date.now()\n while (_sendTimes.length && now - _sendTimes[0] > 60000) _sendTimes.shift()\n if (_sendTimes.length >= limit) return true\n _sendTimes.push(now)\n return false\n } catch (e) {\n return false\n }\n}\n\nfunction postData(url, data) {\n try {\n const body = safeStringify(data)\n if (body == null) return\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), 5000)\n\n const headers = { 'Content-Type': 'application/json' }\n if (config.token) headers['X-Ingest-Token'] = config.token\n\n // Post via the pristine fetch so ingest never adds its own breadcrumbs,\n // never recurses, and keeps working even if the app breaks window.fetch.\n const f = _origFetch || fetch\n return f(url, {\n method: 'POST',\n headers,\n body,\n signal: controller.signal,\n })\n .then(r => { clearTimeout(timeout); return r })\n .catch(() => { clearTimeout(timeout) })\n } catch (e) {\n // Never let ingest failure escape into the app.\n }\n}\n\nfunction argsToString(args) {\n const fmt = (args[0] || '') + ''\n const rest = [...args]\n return fmt.replace(/%[sdj]/g, (m) => {\n const v = rest.shift()\n if (m === '%s') return String(v)\n if (m === '%d') return Number(v)\n if (m === '%j') return JSON.stringify(v)\n return m\n })\n}\n\nfunction _loadScript(src, onload) {\n const s = document.createElement('script')\n s.src = src\n s.async = true\n if (onload) s.onload = onload\n document.head.appendChild(s)\n}\n\n// --- Source Maps ---\n\n// Fetch + parse a bundle's source map and build its consumer exactly once.\n// Returns { consumer, data } or null (no map / incompatible consumer).\nasync function buildMapEntry(sourceUrl) {\n const f = _origFetch || fetch\n const jsResponse = await f(sourceUrl)\n if (!jsResponse.ok) return null\n const jsCode = await jsResponse.text()\n\n const inlineMatch = jsCode.match(/\\/\\/# sourceMappingURL=data:application\\/json;base64,([^\\s]+)/)\n const externalMatch = jsCode.match(/\\/\\/# sourceMappingURL=(?!data:)([^\\s]+)/)\n\n let data\n if (inlineMatch) {\n data = JSON.parse(atob(inlineMatch[1]))\n } else if (externalMatch) {\n const mapURL = new URL(externalMatch[1], sourceUrl).href\n const mapResponse = await f(mapURL)\n if (!mapResponse.ok) return null\n data = await mapResponse.json()\n } else {\n return null\n }\n\n // Build the consumer ONCE per bundle. Constructing one per error re-parses all\n // mappings (CPU) and, with the WASM build of source-map, leaks memory unless\n // destroyed \u2014 fatal on a kiosk that runs for weeks.\n const consumer = new window.sourceMap.SourceMapConsumer(data)\n // Guard an incompatible (async / Promise-returning 0.7) consumer build so we\n // degrade gracefully instead of throwing on every error.\n if (!consumer || typeof consumer.originalPositionFor !== 'function') return null\n return { consumer, data }\n}\n\n// Cache the in-flight PROMISE (not just the result) so a synchronous burst of\n// errors from the same bundle dedupes onto a single fetch + single consumer,\n// instead of every concurrent capture missing the not-yet-populated cache.\nfunction getMapEntry(sourceUrl) {\n const cached = _mapCache.get(sourceUrl)\n if (cached === 'FAILED') return Promise.resolve(null)\n if (cached) return cached\n\n const p = buildMapEntry(sourceUrl)\n _mapCache.set(sourceUrl, p)\n p.then(\n // Deterministic \"no map here\" \u2192 remember it so we never refetch the bundle.\n (entry) => { _mapCache.set(sourceUrl, entry ? Promise.resolve(entry) : 'FAILED') },\n // Transient failure (offline, network blip) \u2192 drop so a later error retries.\n () => { if (_mapCache.get(sourceUrl) === p) _mapCache.delete(sourceUrl) }\n )\n return p\n}\n\nasync function resolveSourceMap(sourceUrl, lineno, colno) {\n try {\n // If the consumer lib isn't loaded there's no point fetching the bundle.\n if (!window.sourceMap?.SourceMapConsumer) return null\n\n const entry = await getMapEntry(sourceUrl)\n if (!entry) return null\n\n const pos = entry.consumer.originalPositionFor({ line: lineno, column: colno })\n if (!pos.source) return null\n\n // Extract the original source snippet\n const sourceIndex = entry.data.sources.indexOf(pos.source)\n let snippet = null\n if (entry.data.sourcesContent && entry.data.sourcesContent[sourceIndex]) {\n snippet = entry.data.sourcesContent[sourceIndex]\n }\n\n return {\n originalSource: pos.source,\n originalLine: pos.line,\n originalColumn: pos.column,\n originalName: pos.name,\n snippet,\n }\n } catch (e) {\n return null\n }\n}\n\n// --- Breadcrumbs ---\n\nfunction _addBreadcrumb(crumb) {\n breadcrumbs.push({ timestamp: Date.now(), ...crumb })\n if (breadcrumbs.length > MAX_BREADCRUMBS) breadcrumbs.shift()\n}\n\n// --- Core ---\n\n// Known top-level event fields the SDK and server understand.\n// Anything else passed to captureError gets auto-promoted into context\n// so the admin UI's Context section can render it.\nconst KNOWN_EVENT_FIELDS = new Set([\n 'type', 'message', 'args', 'stack', 'errorTrace',\n 'source', 'lineno', 'colno', 'reason',\n 'snippet', 'highlightLineNumber',\n 'originalSource', 'originalLine', 'originalColumn', 'originalName',\n 'context', 'user', 'breadcrumbs',\n 'timestamp', 'errorTimestamp',\n])\n\nasync function pushErrorEvent(obj) {\n // Reentrancy guard: capturing must never trigger another capture (e.g. a throw\n // here becoming an unhandledrejection that we then capture, looping forever).\n if (_capturing) return\n _capturing = true\n\n let event = null\n let smSource = null, smLine = null, smCol = 0\n\n try {\n // Don't mutate the caller's object\n obj = { ...(obj || {}) }\n\n // Auto-promote unknown top-level keys into context (e.g. status, textStatus,\n // errorThrown, etc. that callers commonly pass alongside an error)\n const promoted = {}\n for (const k of Object.keys(obj)) {\n if (k !== 'context' && !KNOWN_EVENT_FIELDS.has(k)) {\n promoted[k] = obj[k]\n delete obj[k]\n }\n }\n\n if (config.sampleRate && Math.random() < (1 - parseFloat(config.sampleRate))) {\n if (config.debug) _consoleLog('[Scout] Suppressed by sampling')\n return\n }\n\n // Circuit breaker for error storms \u2014 protects the device before anything else.\n if (rateLimited()) {\n if (config.debug) _consoleLog('[Scout] Suppressed by rate limit')\n return\n }\n\n if (!config.attachStacktrace) obj.errorTrace = null\n\n // Strip scout's own frames from stack traces (for console.error/warn captures)\n if (obj.errorTrace) {\n try {\n const lines = obj.errorTrace.split('\\n')\n const filtered = [lines[0]]\n for (let i = 1; i < lines.length; i++) {\n if (!lines[i].includes('/scout') && !lines[i].includes('scout.js') && !lines[i].includes('scout-error')) {\n filtered.push(lines[i])\n }\n }\n if (filtered.length > 1) obj.errorTrace = filtered.join('\\n')\n } catch (e) { /* ignore */ }\n }\n\n if ((obj.errorTrace || obj.stack) && !obj.source) {\n try {\n const stack = obj.errorTrace || obj.stack\n const lines = stack ? stack.split('\\n') : []\n // Find the first frame with a source location (skip the error message line).\n // Match any URL scheme so webview origins (Capacitor's capacitor://, ionic://,\n // file://) resolve, not just http(s) \u2014 otherwise iOS stack frames never yield\n // a source and source maps can't be resolved for Vue/rejection/console errors.\n for (let i = 1; i < lines.length; i++) {\n const match = lines[i].trim().match(/((?:https?|capacitor|ionic|file):\\/\\/.*?):(\\d+):(\\d+)/)\n if (match) {\n obj.source = match[1]\n obj.lineno = parseInt(match[2], 10)\n obj.colno = parseInt(match[3], 10)\n break\n }\n }\n } catch (e) { /* ignore */ }\n }\n\n // Merge precedence: global customContext < auto-promoted < user's inline context\n // (so an explicit `context: { foo: 1 }` always wins over an accidental top-level foo)\n const inlineContext = (obj.context && typeof obj.context === 'object') ? obj.context : {}\n const mergedContext = { ...customContext, ...promoted, ...inlineContext }\n\n // Telemetry is best-effort \u2014 never let it block or drop the actual error.\n let details = {}\n if (config.browserDetails) { try { details = captureBrowserDetails() } catch (e) { /* ignore */ } }\n\n event = Object.assign({}, obj, details, scope, getIds())\n\n if (userContext) event.user = userContext\n if (Object.keys(mergedContext).length) event.context = mergedContext\n try { event.breadcrumbs = breadcrumbs.slice() } catch (e) { event.breadcrumbs = [] }\n\n // Send the event immediately \u2014 don't let source map resolution block it\n if (config.debug) _consoleLog('[Scout] Sending:', event)\n if (config.endpoint) postData(config.endpoint, event)\n\n // Remember where to resolve source maps (done below, outside the guard)\n smSource = obj.source; smLine = obj.lineno; smCol = obj.colno || 0\n } catch (e) {\n try { if (config.debug) _consoleWarn('[Scout] capture failed:', e) } catch (_) {}\n } finally {\n _capturing = false\n }\n\n // Best-effort source-map enrichment: outside the reentrancy guard and fully\n // guarded so it can never throw or reject back into the app.\n try {\n if (event && config.handleSourceMaps && smSource && smLine) {\n const resolved = await resolveSourceMap(smSource, smLine, smCol)\n if (resolved) {\n const enriched = {\n ...event,\n originalSource: resolved.originalSource,\n originalLine: resolved.originalLine,\n originalColumn: resolved.originalColumn,\n originalName: resolved.originalName,\n highlightLineNumber: resolved.originalLine,\n }\n if (resolved.snippet) enriched.snippet = resolved.snippet\n if (config.endpoint) postData(config.endpoint, enriched)\n }\n }\n } catch (e) { /* fail silently */ }\n}\n\n/**\n * Manually capture an error object.\n */\nexport function captureError(event) {\n try {\n if (!config.enabled) return\n const p = pushErrorEvent(event)\n if (p && typeof p.catch === 'function') p.catch(() => {})\n } catch (e) { /* never throw from capture */ }\n}\n\n/**\n * Set identified user info. Call after login.\n * @param {{ id?: string, email?: string, name?: string }} user\n */\nexport function setUser(user) {\n userContext = user\n}\n\n/**\n * Merge custom key-value context attached to all future errors.\n * @param {Object} ctx\n */\nexport function setContext(ctx) {\n customContext = { ...customContext, ...ctx }\n}\n\n/**\n * Set a single context tag.\n */\nexport function setTag(key, value) {\n customContext[key] = value\n}\n\n/**\n * Manually add a breadcrumb.\n * @param {{ category?: string, message?: string, data?: Object }} crumb\n */\nexport function addBreadcrumb(crumb) {\n _addBreadcrumb(crumb)\n}\n\n// --- Setup ---\n\nfunction setupListeners() {\n // Each instrumentation is isolated in its own try/catch: one failing patch\n // must never abort the rest, and no wrapper may ever change the behavior the\n // app observes from the original API (even if Scout's own code throws).\n\n // Click + scroll breadcrumbs\n if (config.trackUserInteractions) {\n try {\n document.addEventListener('click', (e) => {\n try {\n userInteractions.clicks++\n const el = e.target\n const tag = el && el.tagName ? el.tagName.toLowerCase() : ''\n const text = ((el && el.textContent) || '').trim().slice(0, 50)\n _addBreadcrumb({ category: 'click', message: tag + (text ? ': ' + text : '') })\n } catch (_) { /* breadcrumb must never break the app */ }\n }, { passive: true })\n let lastScroll = 0\n window.addEventListener('scroll', () => {\n try {\n const now = Date.now()\n if (now - lastScroll > 100) { userInteractions.scrolls++; lastScroll = now }\n } catch (_) { /* ignore */ }\n }, { passive: true })\n } catch (e) { /* ignore */ }\n }\n\n // Navigation breadcrumbs \u2014 run the original first; the breadcrumb is best-effort\n try {\n const origPushState = history.pushState\n history.pushState = function () {\n const r = origPushState.apply(this, arguments)\n try { _addBreadcrumb({ category: 'navigation', message: window.location.href }) } catch (_) { /* ignore */ }\n return r\n }\n window.addEventListener('popstate', () => {\n try { _addBreadcrumb({ category: 'navigation', message: window.location.href }) } catch (_) { /* ignore */ }\n })\n } catch (e) { /* ignore */ }\n\n // Fetch breadcrumbs \u2014 keep the original promise contract intact. The breadcrumb\n // is added on a passthrough of the original chain, wrapped so it can never\n // reject the app's fetch or swallow its rejection.\n try {\n _origFetch = window.fetch\n const origFetch = _origFetch\n window.fetch = function () {\n const args = arguments\n const start = Date.now()\n return origFetch.apply(this, args).then(\n (response) => {\n try {\n const url = typeof args[0] === 'string' ? args[0] : ((args[0] && args[0].url) || '')\n const method = (args[1] && args[1].method) || 'GET'\n _addBreadcrumb({ category: 'fetch', message: `${method} ${url}`, data: { status: response.status, duration: Date.now() - start } })\n } catch (_) { /* ignore */ }\n return response\n },\n (err) => {\n try {\n const url = typeof args[0] === 'string' ? args[0] : ((args[0] && args[0].url) || '')\n const method = (args[1] && args[1].method) || 'GET'\n _addBreadcrumb({ category: 'fetch', message: `${method} ${url}`, data: { error: err && err.message, duration: Date.now() - start } })\n } catch (_) { /* ignore */ }\n throw err\n }\n )\n }\n } catch (e) { /* ignore */ }\n\n // XHR breadcrumbs\n try {\n const origOpen = XMLHttpRequest.prototype.open\n const origSend = XMLHttpRequest.prototype.send\n XMLHttpRequest.prototype.open = function (method, url) {\n try { this._scoutMethod = method; this._scoutUrl = url } catch (_) { /* ignore */ }\n return origOpen.apply(this, arguments)\n }\n XMLHttpRequest.prototype.send = function () {\n try {\n const self = this\n const start = Date.now()\n self.addEventListener('loadend', () => {\n try { _addBreadcrumb({ category: 'xhr', message: `${self._scoutMethod || 'GET'} ${self._scoutUrl || ''}`, data: { status: self.status, duration: Date.now() - start } }) } catch (_) { /* ignore */ }\n })\n } catch (_) { /* ignore */ }\n return origSend.apply(this, arguments)\n }\n } catch (e) { /* ignore */ }\n\n // Error event listener (not async \u2014 must never return a rejecting promise)\n if (config.addErrorEventListener) {\n try {\n window.addEventListener('error', (event) => {\n try {\n if (!config.enabled || !config.sendErrors) return\n if (shouldIgnoreError(event.message)) return\n const errorTrace = event.error ? event.error.stack : 'No stack trace available'\n pushErrorEvent({\n type: 'window.onerror',\n message: event.message,\n source: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n errorTrace,\n })\n } catch (e) {\n try { _consoleWarn('[Scout] error handler failure:', e) } catch (_) { /* ignore */ }\n }\n if (config.selfHealingErrors) { try { event.preventDefault() } catch (_) { /* ignore */ } }\n })\n } catch (e) { /* ignore */ }\n }\n\n // Unhandled rejection listener\n if (config.addUnhandledRejectionEventListener) {\n try {\n window.addEventListener('unhandledrejection', (event) => {\n try {\n if (!config.enabled || !config.sendErrors) return\n const error = event.reason\n if (shouldIgnoreError((error && error.message) || '')) return\n const errorTrace = (error && error.stack) || 'No stack trace available'\n pushErrorEvent({\n type: 'Unhandled Promise Rejection',\n message: (error && error.message) || 'Unhandled Promise Rejection',\n reason: event.reason,\n errorTrace,\n })\n } catch (e) {\n try { _consoleWarn('[Scout] rejection handler failure:', e) } catch (_) { /* ignore */ }\n }\n if (config.selfHealingErrors) { try { event.preventDefault() } catch (_) { /* ignore */ } }\n })\n } catch (e) { /* ignore */ }\n }\n\n // Console overrides \u2014 ALWAYS delegate to the native console so the app's own\n // logging is never suppressed, even when Scout is disabled or capture throws.\n if (config.overrideConsoleError) {\n console.error = function (...args) {\n try {\n if (config.enabled && config.sendErrors && !shouldIgnoreError(argsToString(args))) {\n pushErrorEvent({ type: 'console.error', errorTrace: new Error().stack, args: argsToString(args) })\n }\n } catch (e) { /* ignore */ }\n try { _consoleError.apply(console, args) } catch (_) { /* ignore */ }\n }\n }\n\n if (config.overrideConsoleWarn) {\n console.warn = function (...args) {\n try {\n if (config.enabled && config.sendErrors && !shouldIgnoreError(argsToString(args))) {\n pushErrorEvent({ type: 'console.warn', errorTrace: new Error().stack, args: argsToString(args) })\n }\n } catch (e) { /* ignore */ }\n try { _consoleWarn.apply(console, args) } catch (_) { /* ignore */ }\n }\n }\n\n // Load UA Parser and Source Map from endpoint host (self-hosted, no CDN)\n try {\n const baseUrl = config.endpoint ? new URL(config.endpoint).origin : ''\n if (config.loadUAParser && config.browserDetails && baseUrl) {\n _loadScript(`${baseUrl}/vendor/ua-parser.min.js`, () => {\n try { if (typeof UAParser !== 'undefined') window._uaParserResult = new UAParser().getResult() } catch (_) { /* ignore */ }\n })\n }\n if (config.handleSourceMaps && baseUrl) {\n _loadScript(`${baseUrl}/vendor/source-map.min.js`)\n }\n } catch (e) { /* ignore */ }\n}\n\n/**\n * Initialize Scout error tracking.\n *\n * @param {Object} scopeOptions - { app, project, version, environment, user }\n * @param {Object} configOptions - { endpoint, token, sampleRate, debug, ... }\n */\nexport function init(scopeOptions = {}, configOptions = {}) {\n // Extract user from scope if provided\n if (scopeOptions.user) {\n userContext = scopeOptions.user\n delete scopeOptions.user\n }\n\n if (initialized) {\n scope = { ...scope, ...scopeOptions }\n config = { ...config, ...configOptions }\n return\n }\n\n scope = { ...scope, ...scopeOptions }\n config = { ...config, ...configOptions }\n initialized = true\n\n // setupListeners patches global APIs \u2014 if it ever throws it must not propagate,\n // since init() typically runs before the host app mounts.\n if (typeof window !== 'undefined') {\n try {\n setupListeners()\n } catch (e) {\n try { _consoleWarn('[Scout] setup failed:', e) } catch (_) { /* ignore */ }\n }\n }\n}\n\n// Expose window.Scout immediately on load (before init is called)\n// This overwrites the ES5 no-op stub with real methods\nif (typeof window !== 'undefined') {\n window.Scout = {\n init,\n setScope: (s) => { scope = { ...scope, ...s } },\n setConfig: (c) => { config = { ...config, ...c } },\n setUser,\n setContext,\n setTag,\n addBreadcrumb: _addBreadcrumb,\n error: captureError,\n }\n}\n", "/**\n * Scout.js Vue Plugin\n *\n * Usage:\n * import { init } from 'scoutjs'\n * import { ScoutVue } from 'scoutjs/vue'\n *\n * init({ app: 'My App', project: 'my-project' }, { endpoint: '...' })\n * app.use(ScoutVue)\n */\n\nimport { captureError } from './index.js'\n\n/**\n * Vue plugin that installs error and warning handlers.\n *\n * app.use(ScoutVue)\n */\nexport const ScoutVue = {\n install(app) {\n try {\n app.config.errorHandler = (err, vm, info) => {\n // Guarded so a fault in Scout never throws back into Vue's error path.\n try {\n captureError({\n message: err && err.message,\n stack: err && err.stack,\n errorTrace: err && err.stack,\n component: (vm && vm.$options && (vm.$options.name || vm.$options.__name)) || 'Anonymous',\n type: 'vue-error-handler',\n info,\n })\n } catch (_) { /* ignore */ }\n }\n\n app.config.warnHandler = (msg, vm, trace) => {\n try {\n captureError({\n message: msg,\n component: (vm && vm.$options && (vm.$options.name || vm.$options.__name)) || 'Anonymous',\n type: 'vue-warn-handler',\n errorTrace: trace,\n })\n } catch (_) { /* ignore */ }\n }\n } catch (_) { /* ignore */ }\n },\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["defaultConfig", "config", "__spreadValues", "_a", "scope", "userInteractions", "pageloadId", "initialized", "userContext", "customContext", "breadcrumbs", "MAX_BREADCRUMBS", "_capturing", "_origFetch", "_memUserId", "_memSessionId", "_sendTimes", "_mapCache", "_consoleError", "_consoleWarn", "_consoleLog", "generateId", "prefix", "getIds", "pageloadId", "userId", "sessionId", "e", "_memUserId", "_memSessionId", "getBrowser", "_a", "_b", "_c", "ua", "b", "getOS", "o", "captureBrowserDetails", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "conn", "userInteractions", "shouldIgnoreError", "msg", "config", "pattern", "safeStringify", "data", "seen", "k", "v", "_", "rateLimited", "limit", "now", "_sendTimes", "postData", "url", "body", "controller", "timeout", "headers", "_origFetch", "r", "argsToString", "args", "fmt", "rest", "m", "_loadScript", "src", "onload", "s", "buildMapEntry", "sourceUrl", "__async", "f", "jsResponse", "jsCode", "inlineMatch", "externalMatch", "mapURL", "mapResponse", "consumer", "getMapEntry", "cached", "_mapCache", "p", "entry", "resolveSourceMap", "lineno", "colno", "pos", "sourceIndex", "snippet", "_addBreadcrumb", "crumb", "breadcrumbs", "__spreadValues", "MAX_BREADCRUMBS", "KNOWN_EVENT_FIELDS", "pushErrorEvent", "obj", "_capturing", "event", "smSource", "smLine", "smCol", "promoted", "lines", "filtered", "i", "stack", "match", "inlineContext", "mergedContext", "customContext", "details", "scope", "userContext", "_consoleWarn", "resolved", "enriched", "__spreadProps", "captureError", "setUser", "user", "setContext", "ctx", "setTag", "key", "value", "setupListeners", "config", "e", "userInteractions", "el", "tag", "text", "_addBreadcrumb", "_", "lastScroll", "now", "origPushState", "r", "_origFetch", "origFetch", "args", "start", "response", "url", "method", "err", "origOpen", "origSend", "self", "event", "shouldIgnoreError", "errorTrace", "pushErrorEvent", "_consoleWarn", "error", "argsToString", "_consoleError", "baseUrl", "_loadScript", "init", "scopeOptions", "configOptions", "userContext", "initialized", "scope", "__spreadValues", "s", "c", "setUser", "setContext", "setTag", "captureError", "ScoutVue", "app", "err", "vm", "info", "captureError", "_", "msg", "trace"]
|
|
7
7
|
}
|