scout-error 0.3.3 → 0.3.4
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/react.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var
|
|
2
|
-
`),
|
|
3
|
-
`))}catch(
|
|
4
|
-
`):[];for(let
|
|
1
|
+
var V=Object.create;var m=Object.defineProperty,q=Object.defineProperties,z=Object.getOwnPropertyDescriptor,J=Object.getOwnPropertyDescriptors,G=Object.getOwnPropertyNames,U=Object.getOwnPropertySymbols,K=Object.getPrototypeOf,P=Object.prototype.hasOwnProperty,Z=Object.prototype.propertyIsEnumerable;var D=(e,r,o)=>r in e?m(e,r,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[r]=o,u=(e,r)=>{for(var o in r||(r={}))P.call(r,o)&&D(e,o,r[o]);if(U)for(var o of U(r))Z.call(r,o)&&D(e,o,r[o]);return e},N=(e,r)=>q(e,J(r));var Q=(e,r)=>{for(var o in r)m(e,o,{get:r[o],enumerable:!0})},A=(e,r,o,c)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of G(r))!P.call(e,a)&&a!==o&&m(e,a,{get:()=>r[a],enumerable:!(c=z(r,a))||c.enumerable});return e};var Y=(e,r,o)=>(o=e!=null?V(K(e)):{},A(r||!e||!e.__esModule?m(o,"default",{value:e,enumerable:!0}):o,e)),j=e=>A(m({},"__esModule",{value:!0}),e);var w=(e,r,o)=>new Promise((c,a)=>{var t=i=>{try{l(o.next(i))}catch(d){a(d)}},n=i=>{try{l(o.throw(i))}catch(d){a(d)}},l=i=>i.done?c(i.value):Promise.resolve(i.value).then(t,n);l((o=o.apply(e,r)).next())});var pe={};Q(pe,{ScoutErrorBoundary:()=>x});module.exports=j(pe);var X=Y(require("react"),1);var ee={trackUserInteractions:!0,selfHealingErrors:!1,attachStacktrace:!0,handleSourceMaps:!0,browserDetails:!0,warnOnCapture:!1,loadUAParser:!0,ignoreErrors:null,sendErrors:!0,sampleRate:1,enabled:!0,debug:!1,endpoint:"",token:null,overrideOnError:!1,overrideOnUnhandledRejection:!1,addErrorEventListener:!0,addUnhandledRejectionEventListener:!0,overrideConsoleLog:!1,overrideConsoleWarn:!1,overrideConsoleInfo:!1,overrideConsoleError:!0},s=u({},ee),W,g={environment:typeof window!="undefined"&&((W=window.location)==null?void 0:W.hostname)==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.3.4",project:null,release:null,version:null,app:null},k={clicks:0,scrolls:0},M=null,O=!1,_=null,C={},v=[],ne=30;var S=console.warn;var F=console.log;function L(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function re(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",L("user")),localStorage.getItem("__scoutUserId")),r=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",L("session")),sessionStorage.getItem("__scoutSessionId"));return M=M||L("pageload"),{pageloadId:M,userId:e,sessionId:r}}function te(){var o,c,a;if((c=(o=window._uaParserResult)==null?void 0:o.browser)!=null&&c.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return((a=[{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(t=>e.match(t.p)))==null?void 0:a.n)||"Unknown"}function oe(){var o,c,a;if((c=(o=window._uaParserResult)==null?void 0:o.os)!=null&&c.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return((a=[{p:/Win/,n:"Windows"},{p:/Mac/,n:"Mac OS"},{p:/X11|Linux/,n:"Linux"},{p:/Android/,n:"Android"},{p:/iPhone|iPad/,n:"iOS"}].find(t=>e.match(t.p)))==null?void 0:a.n)||"Unknown"}function se(){var r,o,c,a,t,n,l,i,d,f;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:te(),browserVersion:((o=(r=window._uaParserResult)==null?void 0:r.browser)==null?void 0:o.version)||null,os:oe(),osVersion:((a=(c=window._uaParserResult)==null?void 0:c.os)==null?void 0:a.version)||null,deviceType:((n=(t=window._uaParserResult)==null?void 0:t.device)==null?void 0:n.type)||null,deviceModel:((i=(l=window._uaParserResult)==null?void 0:l.device)==null?void 0:i.model)||null,deviceVendor:((f=(d=window._uaParserResult)==null?void 0:d.device)==null?void 0:f.vendor)||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:k.clicks,userScrolls:k.scrolls}}function y(e){return!s.ignoreErrors||!Array.isArray(s.ignoreErrors)?!1:s.ignoreErrors.some(r=>typeof r=="string"?e.includes(r):r instanceof RegExp?r.test(e):!1)}function $(e,r){let o=new AbortController,c=setTimeout(()=>o.abort(),5e3),a={"Content-Type":"application/json"};return s.token&&(a["X-Ingest-Token"]=s.token),fetch(e,{method:"POST",headers:a,body:JSON.stringify(r),signal:o.signal}).then(t=>(clearTimeout(c),t)).catch(()=>{clearTimeout(c)})}function E(e){let r=(e[0]||"")+"",o=[...e];return r.replace(/%[sdj]/g,c=>{let a=o.shift();return c==="%s"?String(a):c==="%d"?Number(a):c==="%j"?JSON.stringify(a):c})}function H(e,r){let o=document.createElement("script");o.src=e,o.async=!0,r&&(o.onload=r),document.head.appendChild(o)}function ae(e,r,o){return w(this,null,function*(){var c;try{let a=yield fetch(e);if(!a.ok)return null;let t=yield a.text(),n=t.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),l=t.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),i;if(n)i=JSON.parse(atob(n[1]));else if(l){let B=new URL(l[1],e).href,I=yield fetch(B);if(!I.ok)return null;i=yield I.json()}else return null;if(!((c=window.sourceMap)!=null&&c.SourceMapConsumer))return null;let f=new window.sourceMap.SourceMapConsumer(i).originalPositionFor({line:r,column:o});if(!f.source)return null;let T=i.sources.indexOf(f.source),b=null;return i.sourcesContent&&i.sourcesContent[T]&&(b=i.sourcesContent[T]),{originalSource:f.source,originalLine:f.line,originalColumn:f.column,originalName:f.name,snippet:b}}catch(a){return null}})}function p(e){v.push(u({timestamp:Date.now()},e)),v.length>ne&&v.shift()}var ie=new Set(["type","message","args","stack","errorTrace","source","lineno","colno","reason","snippet","highlightLineNumber","originalSource","originalLine","originalColumn","originalName","context","user","breadcrumbs","timestamp","errorTimestamp"]);function h(e){return w(this,null,function*(){e=u({},e||{});let r={};for(let n of Object.keys(e))n!=="context"&&!ie.has(n)&&(r[n]=e[n],delete e[n]);if(s.sampleRate&&Math.random()<1-parseFloat(s.sampleRate)){s.debug&&F("[Scout] Suppressed by sampling");return}if(s.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let n=e.errorTrace.split(`
|
|
2
|
+
`),l=[n[0]];for(let i=1;i<n.length;i++)!n[i].includes("/scout")&&!n[i].includes("scout.js")&&!n[i].includes("scout-error")&&l.push(n[i]);l.length>1&&(e.errorTrace=l.join(`
|
|
3
|
+
`))}catch(n){}if((e.errorTrace||e.stack)&&!e.source)try{let n=e.errorTrace||e.stack,l=n?n.split(`
|
|
4
|
+
`):[];for(let i=1;i<l.length;i++){let d=l[i].trim().match(/(http.*?):(\d+):(\d+)/);if(d){e.source=d[1],e.lineno=parseInt(d[2],10),e.colno=parseInt(d[3],10);break}}}catch(n){}let o=e.context&&typeof e.context=="object"?e.context:{},c=u(u(u({},C),r),o),a=s.browserDetails?se():{},t=Object.assign({},e,a,g,re());if(_&&(t.user=_),Object.keys(c).length&&(t.context=c),t.breadcrumbs=v.slice(),s.debug&&F("[Scout] Sending:",t),s.endpoint&&$(s.endpoint,t),s.handleSourceMaps&&e.source&&e.lineno)try{let n=yield ae(e.source,e.lineno,e.colno||0);if(n){let l=N(u({},t),{originalSource:n.originalSource,originalLine:n.originalLine,originalColumn:n.originalColumn,originalName:n.originalName,highlightLineNumber:n.originalLine});n.snippet&&(l.snippet=n.snippet),s.endpoint&&$(s.endpoint,l)}}catch(n){}})}function R(e){s.enabled&&h(e)}function ce(e){_=e}function le(e){C=u(u({},C),e)}function ue(e,r){C[e]=r}function de(){if(s.trackUserInteractions){document.addEventListener("click",n=>{k.clicks++;let l=n.target,i=l.tagName?l.tagName.toLowerCase():"",d=(l.textContent||"").trim().slice(0,50);p({category:"click",message:i+(d?": "+d:"")})});let t=0;window.addEventListener("scroll",()=>{let n=Date.now();n-t>100&&(k.scrolls++,t=n)})}let e=history.pushState;history.pushState=function(){e.apply(this,arguments),p({category:"navigation",message:window.location.href})},window.addEventListener("popstate",()=>{p({category:"navigation",message:window.location.href})});let r=window.fetch;window.fetch=function(t,n){let l=typeof t=="string"?t:(t==null?void 0:t.url)||"",i=(n==null?void 0:n.method)||"GET",d=Date.now();return r.apply(this,arguments).then(f=>(p({category:"fetch",message:`${i} ${l}`,data:{status:f.status,duration:Date.now()-d}}),f)).catch(f=>{throw p({category:"fetch",message:`${i} ${l}`,data:{error:f.message,duration:Date.now()-d}}),f})};let o=XMLHttpRequest.prototype.open,c=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(t,n){return this._scoutMethod=t,this._scoutUrl=n,o.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){let t=this,n=Date.now();return t.addEventListener("loadend",()=>{p({category:"xhr",message:`${t._scoutMethod||"GET"} ${t._scoutUrl||""}`,data:{status:t.status,duration:Date.now()-n}})}),c.apply(this,arguments)},s.addErrorEventListener&&window.addEventListener("error",t=>w(this,null,function*(){if(s.enabled){try{let n=t.error?t.error.stack:"No stack trace available";if(y(t.message))return;s.sendErrors&&h({type:"window.onerror",message:t.message,source:t.filename,lineno:t.lineno,colno:t.colno,errorTrace:n})}catch(n){S("[Scout] Error handler failure:",n)}s.selfHealingErrors&&t.preventDefault()}})),s.addUnhandledRejectionEventListener&&window.addEventListener("unhandledrejection",t=>{if(s.enabled){try{let n=t.reason,l=(n==null?void 0:n.stack)||"No stack trace available";if(y((n==null?void 0:n.message)||""))return;s.sendErrors&&h({type:"Unhandled Promise Rejection",message:(n==null?void 0:n.message)||"Unhandled Promise Rejection",reason:t.reason,errorTrace:l})}catch(n){S("[Scout] Rejection handler failure:",n)}s.selfHealingErrors&&t.preventDefault()}}),s.overrideConsoleError&&(console.error=function(...t){if(s.enabled)try{let n=new Error().stack;if(y(E(t)))return;s.sendErrors&&h({type:"console.error",errorTrace:n,args:E(t)})}catch(n){S("[Scout] console.error override failure:",n)}}),s.overrideConsoleWarn&&(console.warn=function(...t){if(s.enabled)try{let n=new Error().stack;if(y(E(t)))return;s.sendErrors&&h({type:"console.warn",errorTrace:n,args:E(t)})}catch(n){S("[Scout] console.warn override failure:",n)}});let a=s.endpoint?new URL(s.endpoint).origin:"";s.loadUAParser&&s.browserDetails&&a&&H(`${a}/vendor/ua-parser.min.js`,()=>{typeof UAParser!="undefined"&&(window._uaParserResult=new UAParser().getResult())}),s.handleSourceMaps&&a&&H(`${a}/vendor/source-map.min.js`)}function fe(e={},r={}){if(e.user&&(_=e.user,delete e.user),O){g=u(u({},g),e),s=u(u({},s),r);return}g=u(u({},g),e),s=u(u({},s),r),O=!0,typeof window!="undefined"&&de()}typeof window!="undefined"&&(window.Scout={init:fe,setScope:e=>{g=u(u({},g),e)},setConfig:e=>{s=u(u({},s),e)},setUser:ce,setContext:le,setTag:ue,addBreadcrumb:p,error:R});var x=class extends X.default.Component{constructor(r){super(r),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(r,o){R({message:r.message,stack:r.stack,errorTrace:r.stack,component:(o==null?void 0:o.componentStack)||"",type:"react-error-boundary"})}render(){return this.state.hasError?this.props.fallback||null:this.props.children}};
|
|
5
5
|
//# sourceMappingURL=react.cjs.map
|
package/dist/react.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/react.js", "../src/index.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * Scout.js React Error Boundary\n *\n * Usage:\n * import { init } from 'scoutjs'\n * import { ScoutErrorBoundary } from 'scoutjs/react'\n *\n * init({ app: 'My App', project: 'my-project' }, { endpoint: '...' })\n *\n * <ScoutErrorBoundary>\n * <App />\n * </ScoutErrorBoundary>\n */\n\nimport React from 'react'\nimport { captureError } from './index.js'\n\nexport class ScoutErrorBoundary extends React.Component {\n constructor(props) {\n super(props)\n this.state = { hasError: false }\n }\n\n static getDerivedStateFromError() {\n return { hasError: true }\n }\n\n componentDidCatch(error, errorInfo) {\n captureError({\n message: error.message,\n stack: error.stack,\n errorTrace: error.stack,\n component: errorInfo?.componentStack || '',\n type: 'react-error-boundary',\n })\n }\n\n render() {\n if (this.state.hasError) {\n return this.props.fallback || null\n }\n return this.props.children\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\nasync function pushErrorEvent(obj) {\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(customContext).length) event.context = { ...customContext }\n event.breadcrumbs = breadcrumbs.slice()\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 // 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": ["react_exports", "__export", "ScoutErrorBoundary", "__toCommonJS", "import_react", "defaultConfig", "config", "__spreadValues", "_a", "scope", "userInteractions", "pageloadId", "initialized", "userContext", "customContext", "breadcrumbs", "MAX_BREADCRUMBS", "_consoleWarn", "_consoleLog", "generateId", "prefix", "getIds", "userId", "sessionId", "pageloadId", "getBrowser", "_a", "_b", "_c", "ua", "b", "getOS", "o", "captureBrowserDetails", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "conn", "userInteractions", "shouldIgnoreError", "msg", "config", "pattern", "postData", "url", "data", "controller", "timeout", "headers", "r", "argsToString", "args", "fmt", "rest", "m", "v", "_loadScript", "src", "onload", "s", "resolveSourceMap", "sourceUrl", "lineno", "colno", "__async", "jsResponse", "jsCode", "inlineMatch", "externalMatch", "sourceMapData", "mapURL", "mapResponse", "pos", "sourceIndex", "snippet", "e", "_addBreadcrumb", "crumb", "breadcrumbs", "__spreadValues", "MAX_BREADCRUMBS", "pushErrorEvent", "obj", "
|
|
4
|
+
"sourcesContent": ["/**\n * Scout.js React Error Boundary\n *\n * Usage:\n * import { init } from 'scoutjs'\n * import { ScoutErrorBoundary } from 'scoutjs/react'\n *\n * init({ app: 'My App', project: 'my-project' }, { endpoint: '...' })\n *\n * <ScoutErrorBoundary>\n * <App />\n * </ScoutErrorBoundary>\n */\n\nimport React from 'react'\nimport { captureError } from './index.js'\n\nexport class ScoutErrorBoundary extends React.Component {\n constructor(props) {\n super(props)\n this.state = { hasError: false }\n }\n\n static getDerivedStateFromError() {\n return { hasError: true }\n }\n\n componentDidCatch(error, errorInfo) {\n captureError({\n message: error.message,\n stack: error.stack,\n errorTrace: error.stack,\n component: errorInfo?.componentStack || '',\n type: 'react-error-boundary',\n })\n }\n\n render() {\n if (this.state.hasError) {\n return this.props.fallback || null\n }\n return this.props.children\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": "ilCAAA,IAAAA,GAAA,GAAAC,EAAAD,GAAA,wBAAAE,IAAA,eAAAC,EAAAH,IAcA,IAAAI,EAAkB,sBCAlB,IAAMC,GAAgB,CACpB,sBAAuB,GACvB,kBAAmB,GACnB,iBAAkB,GAClB,iBAAkB,GAClB,eAAgB,GAChB,cAAe,GACf,aAAc,GACd,aAAc,KACd,WAAY,GACZ,WAAY,EACZ,QAAS,GACT,MAAO,GACP,SAAU,GACV,MAAO,KAEP,gBAAiB,GACjB,6BAA8B,GAC9B,sBAAuB,GACvB,mCAAoC,GAEpC,mBAAoB,GACpB,oBAAqB,GACrB,oBAAqB,GACrB,qBAAsB,EACxB,EAEIC,EAASC,EAAA,GAAKF,IAzClBG,EA2CIC,EAAQ,CACV,YAAa,OAAO,QAAW,eAAeD,EAAA,OAAO,WAAP,YAAAA,EAAiB,YAAa,YAAc,cAAgB,aAC1G,IAAK,aACL,WAAY,QACZ,QAAS,KACT,QAAS,KACT,QAAS,KACT,IAAK,IACP,EAEME,EAAmB,CAAE,OAAQ,EAAG,QAAS,CAAE,EAC7CC,EAAa,KACbC,EAAc,GACdC,EAAc,KACdC,EAAgB,CAAC,EACfC,EAAc,CAAC,EACfC,GAAkB,GAIxB,IAAMC,EAAe,QAAQ,KAE7B,IAAMC,EAAc,QAAQ,IAI5B,SAASC,EAAWC,EAAQ,CAC1B,MAAO,GAAGA,CAAM,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,EAC7D,CAEA,SAASC,IAAS,CAChB,IAAMC,EAAS,aAAa,QAAQ,eAAe,IAAM,aAAa,QAAQ,gBAAiBH,EAAW,MAAM,CAAC,EAAG,aAAa,QAAQ,eAAe,GAClJI,EAAY,eAAe,QAAQ,kBAAkB,IAAM,eAAe,QAAQ,mBAAoBJ,EAAW,SAAS,CAAC,EAAG,eAAe,QAAQ,kBAAkB,GAC7K,OAAAK,EAAaA,GAAcL,EAAW,UAAU,EACzC,CAAE,WAAAK,EAAY,OAAAF,EAAQ,UAAAC,CAAU,CACzC,CAEA,SAASE,IAAa,CAhFtB,IAAAC,EAAAC,EAAAC,EAiFE,IAAID,GAAAD,EAAA,OAAO,kBAAP,YAAAA,EAAwB,UAAxB,MAAAC,EAAiC,KAAM,OAAO,OAAO,gBAAgB,QAAQ,KACjF,IAAME,EAAK,UAAU,UAWrB,QAAOD,EAVK,CACV,CAAE,EAAG,iBAAkB,EAAG,eAAgB,EAC1C,CAAE,EAAG,SAAU,EAAG,QAAS,EAC3B,CAAE,EAAG,kBAAmB,EAAG,gBAAiB,EAC5C,CAAE,EAAG,UAAW,EAAG,SAAU,EAC7B,CAAE,EAAG,iBAAkB,EAAG,eAAgB,EAC1C,CAAE,EAAG,SAAU,EAAG,QAAS,EAC3B,CAAE,EAAG,eAAgB,EAAG,mBAAoB,EAC5C,CAAE,EAAG,OAAQ,EAAG,MAAO,CACzB,EACW,KAAKE,GAAKD,EAAG,MAAMC,EAAE,CAAC,CAAC,IAA3B,YAAAF,EAA8B,IAAK,SAC5C,CAEA,SAASG,IAAQ,CAhGjB,IAAAL,EAAAC,EAAAC,EAiGE,IAAID,GAAAD,EAAA,OAAO,kBAAP,YAAAA,EAAwB,KAAxB,MAAAC,EAA4B,KAAM,OAAO,OAAO,gBAAgB,GAAG,KACvE,IAAME,EAAK,UAAU,UAQrB,QAAOD,EAPK,CACV,CAAE,EAAG,MAAO,EAAG,SAAU,EACzB,CAAE,EAAG,MAAO,EAAG,QAAS,EACxB,CAAE,EAAG,YAAa,EAAG,OAAQ,EAC7B,CAAE,EAAG,UAAW,EAAG,SAAU,EAC7B,CAAE,EAAG,cAAe,EAAG,KAAM,CAC/B,EACW,KAAKI,GAAKH,EAAG,MAAMG,EAAE,CAAC,CAAC,IAA3B,YAAAJ,EAA8B,IAAK,SAC5C,CAEA,SAASK,IAAwB,CA7GjC,IAAAP,EAAAC,EAAAC,EAAAM,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EA8GE,IAAMC,EAAO,UAAU,YAAc,UAAU,eAAiB,UAAU,iBAC1E,MAAO,CACL,eAAgBA,EAAOA,EAAK,cAAgB,UAC5C,UAAW,UAAU,UACrB,MAAO,OAAO,WACd,OAAQ,OAAO,YACf,YAAa,OAAO,MACpB,aAAc,OAAO,OACrB,eAAgB,KAAK,IAAI,EACzB,WAAY,KAAK,eAAe,EAAE,gBAAgB,EAAE,SACpD,cAAe,UAAU,UAAY,UAAU,aAC/C,YAAa,KAAK,MAAM,YAAY,IAAI,EAAI,GAAI,EAChD,aAAc,UAAU,cAAgB,UACxC,eAAgB,IAAI,KAAK,EAAE,kBAAkB,EAC7C,eAAgB,UAAU,cAC1B,IAAK,OAAO,SAAS,KACrB,KAAM,OAAO,SAAS,KACtB,SAAU,SAAS,SACnB,QAAShB,GAAW,EACpB,iBAAgBE,GAAAD,EAAA,OAAO,kBAAP,YAAAA,EAAwB,UAAxB,YAAAC,EAAiC,UAAW,KAC5D,GAAII,GAAM,EACV,YAAWG,GAAAN,EAAA,OAAO,kBAAP,YAAAA,EAAwB,KAAxB,YAAAM,EAA4B,UAAW,KAClD,aAAYE,GAAAD,EAAA,OAAO,kBAAP,YAAAA,EAAwB,SAAxB,YAAAC,EAAgC,OAAQ,KACpD,cAAaE,GAAAD,EAAA,OAAO,kBAAP,YAAAA,EAAwB,SAAxB,YAAAC,EAAgC,QAAS,KACtD,eAAcE,GAAAD,EAAA,OAAO,kBAAP,YAAAA,EAAwB,SAAxB,YAAAC,EAAgC,SAAU,KACxD,SAAU,KAAK,IAAI,EAAG,YAAY,OAAO,aAAe,YAAY,OAAO,eAAe,EAC1F,WAAYE,EAAiB,OAC7B,YAAaA,EAAiB,OAChC,CACF,CAEA,SAASC,EAAkBC,EAAK,CAC9B,MAAI,CAACC,EAAO,cAAgB,CAAC,MAAM,QAAQA,EAAO,YAAY,EAAU,GACjEA,EAAO,aAAa,KAAKC,GAC1B,OAAOA,GAAY,SAAiBF,EAAI,SAASE,CAAO,EACxDA,aAAmB,OAAeA,EAAQ,KAAKF,CAAG,EAC/C,EACR,CACH,CAEA,SAASG,EAASC,EAAKC,EAAM,CAC3B,IAAMC,EAAa,IAAI,gBACjBC,EAAU,WAAW,IAAMD,EAAW,MAAM,EAAG,GAAI,EAEnDE,EAAU,CAAE,eAAgB,kBAAmB,EACrD,OAAIP,EAAO,QAAOO,EAAQ,gBAAgB,EAAIP,EAAO,OAE9C,MAAMG,EAAK,CAChB,OAAQ,OACR,QAAAI,EACA,KAAM,KAAK,UAAUH,CAAI,EACzB,OAAQC,EAAW,MACrB,CAAC,EACE,KAAKG,IAAO,aAAaF,CAAO,EAAUE,EAAG,EAC7C,MAAM,IAAM,CAAE,aAAaF,CAAO,CAAE,CAAC,CAC1C,CAEA,SAASG,EAAaC,EAAM,CAC1B,IAAMC,GAAOD,EAAK,CAAC,GAAK,IAAM,GACxBE,EAAO,CAAC,GAAGF,CAAI,EACrB,OAAOC,EAAI,QAAQ,UAAYE,GAAM,CACnC,IAAMC,EAAIF,EAAK,MAAM,EACrB,OAAIC,IAAM,KAAa,OAAOC,CAAC,EAC3BD,IAAM,KAAa,OAAOC,CAAC,EAC3BD,IAAM,KAAa,KAAK,UAAUC,CAAC,EAChCD,CACT,CAAC,CACH,CAEA,SAASE,EAAYC,EAAKC,EAAQ,CAChC,IAAMC,EAAI,SAAS,cAAc,QAAQ,EACzCA,EAAE,IAAMF,EACRE,EAAE,MAAQ,GACND,IAAQC,EAAE,OAASD,GACvB,SAAS,KAAK,YAAYC,CAAC,CAC7B,CAIA,SAAeC,GAAiBC,EAAWC,EAAQC,EAAO,QAAAC,EAAA,sBA7L1D,IAAA1C,EA8LE,GAAI,CAEF,IAAM2C,EAAa,MAAM,MAAMJ,CAAS,EACxC,GAAI,CAACI,EAAW,GAAI,OAAO,KAC3B,IAAMC,EAAS,MAAMD,EAAW,KAAK,EAE/BE,EAAcD,EAAO,MAAM,+DAA+D,EAC1FE,EAAgBF,EAAO,MAAM,0CAA0C,EAEzEG,EACJ,GAAIF,EACFE,EAAgB,KAAK,MAAM,KAAKF,EAAY,CAAC,CAAC,CAAC,UACtCC,EAAe,CACxB,IAAME,EAAS,IAAI,IAAIF,EAAc,CAAC,EAAGP,CAAS,EAAE,KAC9CU,EAAc,MAAM,MAAMD,CAAM,EACtC,GAAI,CAACC,EAAY,GAAI,OAAO,KAC5BF,EAAgB,MAAME,EAAY,KAAK,CACzC,KACE,QAAO,KAGT,GAAI,GAACjD,EAAA,OAAO,YAAP,MAAAA,EAAkB,mBAAmB,OAAO,KAEjD,IAAMkD,EADW,IAAI,OAAO,UAAU,kBAAkBH,CAAa,EAChD,oBAAoB,CAAE,KAAMP,EAAQ,OAAQC,CAAM,CAAC,EAExE,GAAI,CAACS,EAAI,OAAQ,OAAO,KAGxB,IAAMC,EAAcJ,EAAc,QAAQ,QAAQG,EAAI,MAAM,EACxDE,EAAU,KACd,OAAIL,EAAc,gBAAkBA,EAAc,eAAeI,CAAW,IAC1EC,EAAUL,EAAc,eAAeI,CAAW,GAG7C,CACL,eAAgBD,EAAI,OACpB,aAAcA,EAAI,KAClB,eAAgBA,EAAI,OACpB,aAAcA,EAAI,KAClB,QAAAE,CACF,CACF,OAASC,EAAG,CACV,OAAO,IACT,CACF,GAIA,SAASC,EAAeC,EAAO,CAC7BC,EAAY,KAAKC,EAAA,CAAE,UAAW,KAAK,IAAI,GAAMF,EAAO,EAChDC,EAAY,OAASE,IAAiBF,EAAY,MAAM,CAC9D,CAOA,IAAMG,GAAqB,IAAI,IAAI,CACjC,OAAQ,UAAW,OAAQ,QAAS,aACpC,SAAU,SAAU,QAAS,SAC7B,UAAW,sBACX,iBAAkB,eAAgB,iBAAkB,eACpD,UAAW,OAAQ,cACnB,YAAa,gBACf,CAAC,EAED,SAAeC,EAAeC,EAAK,QAAAnB,EAAA,sBAEjCmB,EAAMJ,EAAA,GAAMI,GAAO,CAAC,GAIpB,IAAMC,EAAW,CAAC,EAClB,QAAWC,KAAK,OAAO,KAAKF,CAAG,EACzBE,IAAM,WAAa,CAACJ,GAAmB,IAAII,CAAC,IAC9CD,EAASC,CAAC,EAAIF,EAAIE,CAAC,EACnB,OAAOF,EAAIE,CAAC,GAIhB,GAAI5C,EAAO,YAAc,KAAK,OAAO,EAAK,EAAI,WAAWA,EAAO,UAAU,EAAI,CACxEA,EAAO,OAAO3B,EAAY,gCAAgC,EAC9D,MACF,CAKA,GAHK2B,EAAO,mBAAkB0C,EAAI,WAAa,MAG3CA,EAAI,WACN,GAAI,CACF,IAAMG,EAAQH,EAAI,WAAW,MAAM;AAAA,CAAI,EACjCI,EAAW,CAACD,EAAM,CAAC,CAAC,EAC1B,QAAS,EAAI,EAAG,EAAIA,EAAM,OAAQ,IAC5B,CAACA,EAAM,CAAC,EAAE,SAAS,QAAQ,GAAK,CAACA,EAAM,CAAC,EAAE,SAAS,UAAU,GAAK,CAACA,EAAM,CAAC,EAAE,SAAS,aAAa,GACpGC,EAAS,KAAKD,EAAM,CAAC,CAAC,EAGtBC,EAAS,OAAS,IAAGJ,EAAI,WAAaI,EAAS,KAAK;AAAA,CAAI,EAC9D,OAASZ,EAAG,CAAe,CAG7B,IAAKQ,EAAI,YAAcA,EAAI,QAAU,CAACA,EAAI,OACxC,GAAI,CACF,IAAMK,EAAQL,EAAI,YAAcA,EAAI,MAC9BG,EAAQE,EAAQA,EAAM,MAAM;AAAA,CAAI,EAAI,CAAC,EAE3C,QAAS,EAAI,EAAG,EAAIF,EAAM,OAAQ,IAAK,CACrC,IAAMG,EAAQH,EAAM,CAAC,EAAE,KAAK,EAAE,MAAM,uBAAuB,EAC3D,GAAIG,EAAO,CACTN,EAAI,OAASM,EAAM,CAAC,EACpBN,EAAI,OAAS,SAASM,EAAM,CAAC,EAAG,EAAE,EAClCN,EAAI,MAAQ,SAASM,EAAM,CAAC,EAAG,EAAE,EACjC,KACF,CACF,CACF,OAASd,EAAG,CAAe,CAK7B,IAAMe,EAAiBP,EAAI,SAAW,OAAOA,EAAI,SAAY,SAAYA,EAAI,QAAU,CAAC,EAClFQ,EAAgBZ,MAAA,GAAKa,GAAkBR,GAAaM,GAEpDG,EAAUpD,EAAO,eAAiBZ,GAAsB,EAAI,CAAC,EAC7DiE,EAAQ,OAAO,OAAO,CAAC,EAAGX,EAAKU,EAASE,EAAO9E,GAAO,CAAC,EAW7D,GATI+E,IAAaF,EAAM,KAAOE,GAC1B,OAAO,KAAKL,CAAa,EAAE,SAAQG,EAAM,QAAUH,GACvDG,EAAM,YAAchB,EAAY,MAAM,EAGlCrC,EAAO,OAAO3B,EAAY,mBAAoBgF,CAAK,EACnDrD,EAAO,UAAUE,EAASF,EAAO,SAAUqD,CAAK,EAGhDrD,EAAO,kBAAoB0C,EAAI,QAAUA,EAAI,OAC/C,GAAI,CACF,IAAMc,EAAW,MAAMrC,GAAiBuB,EAAI,OAAQA,EAAI,OAAQA,EAAI,OAAS,CAAC,EAC9E,GAAIc,EAAU,CACZ,IAAMC,EAAWC,EAAApB,EAAA,GACZe,GADY,CAEf,eAAgBG,EAAS,eACzB,aAAcA,EAAS,aACvB,eAAgBA,EAAS,eACzB,aAAcA,EAAS,aACvB,oBAAqBA,EAAS,YAChC,GACIA,EAAS,UAASC,EAAS,QAAUD,EAAS,SAC9CxD,EAAO,UAAUE,EAASF,EAAO,SAAUyD,CAAQ,CACzD,CACF,OAASvB,EAAG,CAAsB,CAEtC,GAKO,SAASyB,EAAaN,EAAO,CAC7BrD,EAAO,SACZyC,EAAeY,CAAK,CACtB,CAMO,SAASO,GAAQC,EAAM,CAC5BN,EAAcM,CAChB,CAMO,SAASC,GAAWC,EAAK,CAC9BZ,EAAgBb,IAAA,GAAKa,GAAkBY,EACzC,CAKO,SAASC,GAAOC,EAAKC,EAAO,CACjCf,EAAcc,CAAG,EAAIC,CACvB,CAYA,SAASC,IAAiB,CAExB,GAAIC,EAAO,sBAAuB,CAChC,SAAS,iBAAiB,QAAUC,GAAM,CACxCC,EAAiB,SACjB,IAAMC,EAAKF,EAAE,OACPG,EAAMD,EAAG,QAAUA,EAAG,QAAQ,YAAY,EAAI,GAC9CE,GAAQF,EAAG,aAAe,IAAI,KAAK,EAAE,MAAM,EAAG,EAAE,EACtDG,EAAe,CAAE,SAAU,QAAS,QAASF,GAAOC,EAAO,KAAOA,EAAO,GAAI,CAAC,CAChF,CAAC,EACD,IAAIE,EAAa,EACjB,OAAO,iBAAiB,SAAU,IAAM,CACtC,IAAMC,EAAM,KAAK,IAAI,EACjBA,EAAMD,EAAa,MAAOL,EAAiB,UAAWK,EAAaC,EACzE,CAAC,CACH,CAGA,IAAMC,EAAgB,QAAQ,UAC9B,QAAQ,UAAY,UAAW,CAC7BA,EAAc,MAAM,KAAM,SAAS,EACnCH,EAAe,CAAE,SAAU,aAAc,QAAS,OAAO,SAAS,IAAK,CAAC,CAC1E,EACA,OAAO,iBAAiB,WAAY,IAAM,CACxCA,EAAe,CAAE,SAAU,aAAc,QAAS,OAAO,SAAS,IAAK,CAAC,CAC1E,CAAC,EAGD,IAAMI,EAAY,OAAO,MACzB,OAAO,MAAQ,SAASC,EAAOC,EAAM,CACnC,IAAMC,EAAM,OAAOF,GAAU,SAAWA,GAASA,GAAA,YAAAA,EAAO,MAAO,GACzDG,GAASF,GAAA,YAAAA,EAAM,SAAU,MACzBG,EAAQ,KAAK,IAAI,EACvB,OAAOL,EAAU,MAAM,KAAM,SAAS,EAAE,KAAKM,IAC3CV,EAAe,CAAE,SAAU,QAAS,QAAS,GAAGQ,CAAM,IAAID,CAAG,GAAI,KAAM,CAAE,OAAQG,EAAS,OAAQ,SAAU,KAAK,IAAI,EAAID,CAAM,CAAE,CAAC,EAC3HC,EACR,EAAE,MAAMC,GAAO,CACd,MAAAX,EAAe,CAAE,SAAU,QAAS,QAAS,GAAGQ,CAAM,IAAID,CAAG,GAAI,KAAM,CAAE,MAAOI,EAAI,QAAS,SAAU,KAAK,IAAI,EAAIF,CAAM,CAAE,CAAC,EACvHE,CACR,CAAC,CACH,EAGA,IAAMC,EAAW,eAAe,UAAU,KACpCC,EAAW,eAAe,UAAU,KAC1C,eAAe,UAAU,KAAO,SAASL,EAAQD,EAAK,CACpD,YAAK,aAAeC,EACpB,KAAK,UAAYD,EACVK,EAAS,MAAM,KAAM,SAAS,CACvC,EACA,eAAe,UAAU,KAAO,UAAW,CACzC,IAAME,EAAO,KACPL,EAAQ,KAAK,IAAI,EACvB,OAAAK,EAAK,iBAAiB,UAAW,IAAM,CACrCd,EAAe,CAAE,SAAU,MAAO,QAAS,GAAGc,EAAK,cAAgB,KAAK,IAAIA,EAAK,WAAa,EAAE,GAAI,KAAM,CAAE,OAAQA,EAAK,OAAQ,SAAU,KAAK,IAAI,EAAIL,CAAM,CAAE,CAAC,CACnK,CAAC,EACMI,EAAS,MAAM,KAAM,SAAS,CACvC,EAGInB,EAAO,uBACT,OAAO,iBAAiB,QAAgBqB,GAAUC,EAAA,sBAChD,GAAKtB,EAAO,QACZ,IAAI,CACF,IAAMuB,EAAaF,EAAM,MAAQA,EAAM,MAAM,MAAQ,2BACrD,GAAIG,EAAkBH,EAAM,OAAO,EAAG,OAClCrB,EAAO,YACTyB,EAAe,CACb,KAAM,iBACN,QAASJ,EAAM,QACf,OAAQA,EAAM,SACd,OAAQA,EAAM,OACd,MAAOA,EAAM,MACb,WAAAE,CACF,CAAC,CAEL,OAAStB,EAAG,CACVyB,EAAa,iCAAkCzB,CAAC,CAClD,CACID,EAAO,mBAAmBqB,EAAM,eAAe,EACrD,EAAC,EAICrB,EAAO,oCACT,OAAO,iBAAiB,qBAAuBqB,GAAU,CACvD,GAAKrB,EAAO,QACZ,IAAI,CACF,IAAM2B,EAAQN,EAAM,OACdE,GAAaI,GAAA,YAAAA,EAAO,QAAS,2BACnC,GAAIH,GAAkBG,GAAA,YAAAA,EAAO,UAAW,EAAE,EAAG,OACzC3B,EAAO,YACTyB,EAAe,CACb,KAAM,8BACN,SAASE,GAAA,YAAAA,EAAO,UAAW,8BAC3B,OAAQN,EAAM,OACd,WAAAE,CACF,CAAC,CAEL,OAAStB,EAAG,CACVyB,EAAa,qCAAsCzB,CAAC,CACtD,CACID,EAAO,mBAAmBqB,EAAM,eAAe,EACrD,CAAC,EAICrB,EAAO,uBACT,QAAQ,MAAQ,YAAa4B,EAAM,CACjC,GAAK5B,EAAO,QACZ,GAAI,CACF,IAAMuB,EAAa,IAAI,MAAM,EAAE,MAC/B,GAAIC,EAAkBK,EAAaD,CAAI,CAAC,EAAG,OACvC5B,EAAO,YAAYyB,EAAe,CAAE,KAAM,gBAAiB,WAAAF,EAAY,KAAMM,EAAaD,CAAI,CAAE,CAAC,CACvG,OAAS3B,EAAG,CAAEyB,EAAa,0CAA2CzB,CAAC,CAAE,CAC3E,GAGED,EAAO,sBACT,QAAQ,KAAO,YAAa4B,EAAM,CAChC,GAAK5B,EAAO,QACZ,GAAI,CACF,IAAMuB,EAAa,IAAI,MAAM,EAAE,MAC/B,GAAIC,EAAkBK,EAAaD,CAAI,CAAC,EAAG,OACvC5B,EAAO,YAAYyB,EAAe,CAAE,KAAM,eAAgB,WAAAF,EAAY,KAAMM,EAAaD,CAAI,CAAE,CAAC,CACtG,OAAS3B,EAAG,CAAEyB,EAAa,yCAA0CzB,CAAC,CAAE,CAC1E,GAIF,IAAM6B,EAAU9B,EAAO,SAAW,IAAI,IAAIA,EAAO,QAAQ,EAAE,OAAS,GAChEA,EAAO,cAAgBA,EAAO,gBAAkB8B,GAClDC,EAAY,GAAGD,CAAO,2BAA4B,IAAM,CAClD,OAAO,UAAa,cACtB,OAAO,gBAAkB,IAAI,SAAS,EAAE,UAAU,EAEtD,CAAC,EAEC9B,EAAO,kBAAoB8B,GAC7BC,EAAY,GAAGD,CAAO,2BAA2B,CAErD,CAQO,SAASlB,GAAKoB,EAAe,CAAC,EAAGC,EAAgB,CAAC,EAAG,CAO1D,GALID,EAAa,OACfE,EAAcF,EAAa,KAC3B,OAAOA,EAAa,MAGlBG,EAAa,CACfC,EAAQC,IAAA,GAAKD,GAAUJ,GACvBhC,EAASqC,IAAA,GAAKrC,GAAWiC,GACzB,MACF,CAEAG,EAAQC,IAAA,GAAKD,GAAUJ,GACvBhC,EAASqC,IAAA,GAAKrC,GAAWiC,GACzBE,EAAc,GAEV,OAAO,QAAW,aACpBpC,GAAe,CAEnB,CAII,OAAO,QAAW,cACpB,OAAO,MAAQ,CACb,KAAAa,GACA,SAAW0B,GAAM,CAAEF,EAAQC,IAAA,GAAKD,GAAUE,EAAI,EAC9C,UAAYC,GAAM,CAAEvC,EAASqC,IAAA,GAAKrC,GAAWuC,EAAI,EACjD,QAAAC,GACA,WAAAC,GACA,OAAAC,GACA,cAAepC,EACf,MAAOqC,CACT,GDxiBK,IAAMC,EAAN,cAAiC,EAAAC,QAAM,SAAU,CACtD,YAAYC,EAAO,CACjB,MAAMA,CAAK,EACX,KAAK,MAAQ,CAAE,SAAU,EAAM,CACjC,CAEA,OAAO,0BAA2B,CAChC,MAAO,CAAE,SAAU,EAAK,CAC1B,CAEA,kBAAkBC,EAAOC,EAAW,CAClCC,EAAa,CACX,QAASF,EAAM,QACf,MAAOA,EAAM,MACb,WAAYA,EAAM,MAClB,WAAWC,GAAA,YAAAA,EAAW,iBAAkB,GACxC,KAAM,sBACR,CAAC,CACH,CAEA,QAAS,CACP,OAAI,KAAK,MAAM,SACN,KAAK,MAAM,UAAY,KAEzB,KAAK,MAAM,QACpB,CACF",
|
|
6
|
+
"names": ["react_exports", "__export", "ScoutErrorBoundary", "__toCommonJS", "import_react", "defaultConfig", "config", "__spreadValues", "_a", "scope", "userInteractions", "pageloadId", "initialized", "userContext", "customContext", "breadcrumbs", "MAX_BREADCRUMBS", "_consoleWarn", "_consoleLog", "generateId", "prefix", "getIds", "userId", "sessionId", "pageloadId", "getBrowser", "_a", "_b", "_c", "ua", "b", "getOS", "o", "captureBrowserDetails", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "conn", "userInteractions", "shouldIgnoreError", "msg", "config", "pattern", "postData", "url", "data", "controller", "timeout", "headers", "r", "argsToString", "args", "fmt", "rest", "m", "v", "_loadScript", "src", "onload", "s", "resolveSourceMap", "sourceUrl", "lineno", "colno", "__async", "jsResponse", "jsCode", "inlineMatch", "externalMatch", "sourceMapData", "mapURL", "mapResponse", "pos", "sourceIndex", "snippet", "e", "_addBreadcrumb", "crumb", "breadcrumbs", "__spreadValues", "MAX_BREADCRUMBS", "KNOWN_EVENT_FIELDS", "pushErrorEvent", "obj", "promoted", "k", "lines", "filtered", "stack", "match", "inlineContext", "mergedContext", "customContext", "details", "event", "scope", "userContext", "resolved", "enriched", "__spreadProps", "captureError", "setUser", "user", "setContext", "ctx", "setTag", "key", "value", "setupListeners", "config", "e", "userInteractions", "el", "tag", "text", "_addBreadcrumb", "lastScroll", "now", "origPushState", "origFetch", "input", "init", "url", "method", "start", "response", "err", "origOpen", "origSend", "self", "event", "__async", "errorTrace", "shouldIgnoreError", "pushErrorEvent", "_consoleWarn", "error", "args", "argsToString", "baseUrl", "_loadScript", "scopeOptions", "configOptions", "userContext", "initialized", "scope", "__spreadValues", "s", "c", "setUser", "setContext", "setTag", "captureError", "ScoutErrorBoundary", "React", "props", "error", "errorInfo", "captureError"]
|
|
7
7
|
}
|
package/dist/react.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var H=Object.defineProperty,W=Object.defineProperties;var X=Object.getOwnPropertyDescriptors;var
|
|
2
|
-
`),
|
|
3
|
-
`))}catch(
|
|
4
|
-
`):[];for(let
|
|
1
|
+
var H=Object.defineProperty,W=Object.defineProperties;var X=Object.getOwnPropertyDescriptors;var b=Object.getOwnPropertySymbols;var B=Object.prototype.hasOwnProperty,V=Object.prototype.propertyIsEnumerable;var I=(e,t,o)=>t in e?H(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,u=(e,t)=>{for(var o in t||(t={}))B.call(t,o)&&I(e,o,t[o]);if(b)for(var o of b(t))V.call(t,o)&&I(e,o,t[o]);return e},U=(e,t)=>W(e,X(t));var h=(e,t,o)=>new Promise((l,i)=>{var r=a=>{try{c(o.next(a))}catch(d){i(d)}},n=a=>{try{c(o.throw(a))}catch(d){i(d)}},c=a=>a.done?l(a.value):Promise.resolve(a.value).then(r,n);c((o=o.apply(e,t)).next())});import oe from"react";var q={trackUserInteractions:!0,selfHealingErrors:!1,attachStacktrace:!0,handleSourceMaps:!0,browserDetails:!0,warnOnCapture:!1,loadUAParser:!0,ignoreErrors:null,sendErrors:!0,sampleRate:1,enabled:!0,debug:!1,endpoint:"",token:null,overrideOnError:!1,overrideOnUnhandledRejection:!1,addErrorEventListener:!0,addUnhandledRejectionEventListener:!0,overrideConsoleLog:!1,overrideConsoleWarn:!1,overrideConsoleInfo:!1,overrideConsoleError:!0},s=u({},q),O,g={environment:typeof window!="undefined"&&((O=window.location)==null?void 0:O.hostname)==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.3.4",project:null,release:null,version:null,app:null},v={clicks:0,scrolls:0},C=null,D=!1,k=null,_={},E=[],z=30;var w=console.warn;var P=console.log;function M(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function J(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",M("user")),localStorage.getItem("__scoutUserId")),t=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",M("session")),sessionStorage.getItem("__scoutSessionId"));return C=C||M("pageload"),{pageloadId:C,userId:e,sessionId:t}}function G(){var o,l,i;if((l=(o=window._uaParserResult)==null?void 0:o.browser)!=null&&l.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return((i=[{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(r=>e.match(r.p)))==null?void 0:i.n)||"Unknown"}function K(){var o,l,i;if((l=(o=window._uaParserResult)==null?void 0:o.os)!=null&&l.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return((i=[{p:/Win/,n:"Windows"},{p:/Mac/,n:"Mac OS"},{p:/X11|Linux/,n:"Linux"},{p:/Android/,n:"Android"},{p:/iPhone|iPad/,n:"iOS"}].find(r=>e.match(r.p)))==null?void 0:i.n)||"Unknown"}function Z(){var t,o,l,i,r,n,c,a,d,f;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:G(),browserVersion:((o=(t=window._uaParserResult)==null?void 0:t.browser)==null?void 0:o.version)||null,os:K(),osVersion:((i=(l=window._uaParserResult)==null?void 0:l.os)==null?void 0:i.version)||null,deviceType:((n=(r=window._uaParserResult)==null?void 0:r.device)==null?void 0:n.type)||null,deviceModel:((a=(c=window._uaParserResult)==null?void 0:c.device)==null?void 0:a.model)||null,deviceVendor:((f=(d=window._uaParserResult)==null?void 0:d.device)==null?void 0:f.vendor)||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:v.clicks,userScrolls:v.scrolls}}function S(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 N(e,t){let o=new AbortController,l=setTimeout(()=>o.abort(),5e3),i={"Content-Type":"application/json"};return s.token&&(i["X-Ingest-Token"]=s.token),fetch(e,{method:"POST",headers:i,body:JSON.stringify(t),signal:o.signal}).then(r=>(clearTimeout(l),r)).catch(()=>{clearTimeout(l)})}function y(e){let t=(e[0]||"")+"",o=[...e];return t.replace(/%[sdj]/g,l=>{let i=o.shift();return l==="%s"?String(i):l==="%d"?Number(i):l==="%j"?JSON.stringify(i):l})}function A(e,t){let o=document.createElement("script");o.src=e,o.async=!0,t&&(o.onload=t),document.head.appendChild(o)}function Q(e,t,o){return h(this,null,function*(){var l;try{let i=yield fetch(e);if(!i.ok)return null;let r=yield i.text(),n=r.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),c=r.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),a;if(n)a=JSON.parse(atob(n[1]));else if(c){let $=new URL(c[1],e).href,T=yield fetch($);if(!T.ok)return null;a=yield T.json()}else return null;if(!((l=window.sourceMap)!=null&&l.SourceMapConsumer))return null;let f=new window.sourceMap.SourceMapConsumer(a).originalPositionFor({line:t,column:o});if(!f.source)return null;let R=a.sources.indexOf(f.source),x=null;return a.sourcesContent&&a.sourcesContent[R]&&(x=a.sourcesContent[R]),{originalSource:f.source,originalLine:f.line,originalColumn:f.column,originalName:f.name,snippet:x}}catch(i){return null}})}function p(e){E.push(u({timestamp:Date.now()},e)),E.length>z&&E.shift()}var Y=new Set(["type","message","args","stack","errorTrace","source","lineno","colno","reason","snippet","highlightLineNumber","originalSource","originalLine","originalColumn","originalName","context","user","breadcrumbs","timestamp","errorTimestamp"]);function m(e){return h(this,null,function*(){e=u({},e||{});let t={};for(let n of Object.keys(e))n!=="context"&&!Y.has(n)&&(t[n]=e[n],delete e[n]);if(s.sampleRate&&Math.random()<1-parseFloat(s.sampleRate)){s.debug&&P("[Scout] Suppressed by sampling");return}if(s.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let n=e.errorTrace.split(`
|
|
2
|
+
`),c=[n[0]];for(let a=1;a<n.length;a++)!n[a].includes("/scout")&&!n[a].includes("scout.js")&&!n[a].includes("scout-error")&&c.push(n[a]);c.length>1&&(e.errorTrace=c.join(`
|
|
3
|
+
`))}catch(n){}if((e.errorTrace||e.stack)&&!e.source)try{let n=e.errorTrace||e.stack,c=n?n.split(`
|
|
4
|
+
`):[];for(let a=1;a<c.length;a++){let d=c[a].trim().match(/(http.*?):(\d+):(\d+)/);if(d){e.source=d[1],e.lineno=parseInt(d[2],10),e.colno=parseInt(d[3],10);break}}}catch(n){}let o=e.context&&typeof e.context=="object"?e.context:{},l=u(u(u({},_),t),o),i=s.browserDetails?Z():{},r=Object.assign({},e,i,g,J());if(k&&(r.user=k),Object.keys(l).length&&(r.context=l),r.breadcrumbs=E.slice(),s.debug&&P("[Scout] Sending:",r),s.endpoint&&N(s.endpoint,r),s.handleSourceMaps&&e.source&&e.lineno)try{let n=yield Q(e.source,e.lineno,e.colno||0);if(n){let c=U(u({},r),{originalSource:n.originalSource,originalLine:n.originalLine,originalColumn:n.originalColumn,originalName:n.originalName,highlightLineNumber:n.originalLine});n.snippet&&(c.snippet=n.snippet),s.endpoint&&N(s.endpoint,c)}}catch(n){}})}function L(e){s.enabled&&m(e)}function j(e){k=e}function ee(e){_=u(u({},_),e)}function ne(e,t){_[e]=t}function re(){if(s.trackUserInteractions){document.addEventListener("click",n=>{v.clicks++;let c=n.target,a=c.tagName?c.tagName.toLowerCase():"",d=(c.textContent||"").trim().slice(0,50);p({category:"click",message:a+(d?": "+d:"")})});let r=0;window.addEventListener("scroll",()=>{let n=Date.now();n-r>100&&(v.scrolls++,r=n)})}let e=history.pushState;history.pushState=function(){e.apply(this,arguments),p({category:"navigation",message:window.location.href})},window.addEventListener("popstate",()=>{p({category:"navigation",message:window.location.href})});let t=window.fetch;window.fetch=function(r,n){let c=typeof r=="string"?r:(r==null?void 0:r.url)||"",a=(n==null?void 0:n.method)||"GET",d=Date.now();return t.apply(this,arguments).then(f=>(p({category:"fetch",message:`${a} ${c}`,data:{status:f.status,duration:Date.now()-d}}),f)).catch(f=>{throw p({category:"fetch",message:`${a} ${c}`,data:{error:f.message,duration:Date.now()-d}}),f})};let o=XMLHttpRequest.prototype.open,l=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(r,n){return this._scoutMethod=r,this._scoutUrl=n,o.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){let r=this,n=Date.now();return r.addEventListener("loadend",()=>{p({category:"xhr",message:`${r._scoutMethod||"GET"} ${r._scoutUrl||""}`,data:{status:r.status,duration:Date.now()-n}})}),l.apply(this,arguments)},s.addErrorEventListener&&window.addEventListener("error",r=>h(this,null,function*(){if(s.enabled){try{let n=r.error?r.error.stack:"No stack trace available";if(S(r.message))return;s.sendErrors&&m({type:"window.onerror",message:r.message,source:r.filename,lineno:r.lineno,colno:r.colno,errorTrace:n})}catch(n){w("[Scout] Error handler failure:",n)}s.selfHealingErrors&&r.preventDefault()}})),s.addUnhandledRejectionEventListener&&window.addEventListener("unhandledrejection",r=>{if(s.enabled){try{let n=r.reason,c=(n==null?void 0:n.stack)||"No stack trace available";if(S((n==null?void 0:n.message)||""))return;s.sendErrors&&m({type:"Unhandled Promise Rejection",message:(n==null?void 0:n.message)||"Unhandled Promise Rejection",reason:r.reason,errorTrace:c})}catch(n){w("[Scout] Rejection handler failure:",n)}s.selfHealingErrors&&r.preventDefault()}}),s.overrideConsoleError&&(console.error=function(...r){if(s.enabled)try{let n=new Error().stack;if(S(y(r)))return;s.sendErrors&&m({type:"console.error",errorTrace:n,args:y(r)})}catch(n){w("[Scout] console.error override failure:",n)}}),s.overrideConsoleWarn&&(console.warn=function(...r){if(s.enabled)try{let n=new Error().stack;if(S(y(r)))return;s.sendErrors&&m({type:"console.warn",errorTrace:n,args:y(r)})}catch(n){w("[Scout] console.warn override failure:",n)}});let i=s.endpoint?new URL(s.endpoint).origin:"";s.loadUAParser&&s.browserDetails&&i&&A(`${i}/vendor/ua-parser.min.js`,()=>{typeof UAParser!="undefined"&&(window._uaParserResult=new UAParser().getResult())}),s.handleSourceMaps&&i&&A(`${i}/vendor/source-map.min.js`)}function te(e={},t={}){if(e.user&&(k=e.user,delete e.user),D){g=u(u({},g),e),s=u(u({},s),t);return}g=u(u({},g),e),s=u(u({},s),t),D=!0,typeof window!="undefined"&&re()}typeof window!="undefined"&&(window.Scout={init:te,setScope:e=>{g=u(u({},g),e)},setConfig:e=>{s=u(u({},s),e)},setUser:j,setContext:ee,setTag:ne,addBreadcrumb:p,error:L});var F=class extends oe.Component{constructor(t){super(t),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(t,o){L({message:t.message,stack:t.stack,errorTrace:t.stack,component:(o==null?void 0:o.componentStack)||"",type:"react-error-boundary"})}render(){return this.state.hasError?this.props.fallback||null:this.props.children}};export{F as ScoutErrorBoundary};
|
|
5
5
|
//# sourceMappingURL=react.js.map
|
package/dist/react.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/react.js", "../src/index.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * Scout.js React Error Boundary\n *\n * Usage:\n * import { init } from 'scoutjs'\n * import { ScoutErrorBoundary } from 'scoutjs/react'\n *\n * init({ app: 'My App', project: 'my-project' }, { endpoint: '...' })\n *\n * <ScoutErrorBoundary>\n * <App />\n * </ScoutErrorBoundary>\n */\n\nimport React from 'react'\nimport { captureError } from './index.js'\n\nexport class ScoutErrorBoundary extends React.Component {\n constructor(props) {\n super(props)\n this.state = { hasError: false }\n }\n\n static getDerivedStateFromError() {\n return { hasError: true }\n }\n\n componentDidCatch(error, errorInfo) {\n captureError({\n message: error.message,\n stack: error.stack,\n errorTrace: error.stack,\n component: errorInfo?.componentStack || '',\n type: 'react-error-boundary',\n })\n }\n\n render() {\n if (this.state.hasError) {\n return this.props.fallback || null\n }\n return this.props.children\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\nasync function pushErrorEvent(obj) {\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(customContext).length) event.context = { ...customContext }\n event.breadcrumbs = breadcrumbs.slice()\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 // 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": "0nBAcA,OAAOA,OAAW,QCAlB,IAAMC,EAAgB,CACpB,sBAAuB,GACvB,kBAAmB,GACnB,iBAAkB,GAClB,iBAAkB,GAClB,eAAgB,GAChB,cAAe,GACf,aAAc,GACd,aAAc,KACd,WAAY,GACZ,WAAY,EACZ,QAAS,GACT,MAAO,GACP,SAAU,GACV,MAAO,KAEP,gBAAiB,GACjB,6BAA8B,GAC9B,sBAAuB,GACvB,mCAAoC,GAEpC,mBAAoB,GACpB,oBAAqB,GACrB,oBAAqB,GACrB,qBAAsB,EACxB,EAEIC,EAASC,EAAA,GAAKF,GAzClBG,EA2CIC,EAAQ,CACV,YAAa,OAAO,QAAW,eAAeD,EAAA,OAAO,WAAP,YAAAA,EAAiB,YAAa,YAAc,cAAgB,aAC1G,IAAK,aACL,WAAY,QACZ,QAAS,KACT,QAAS,KACT,QAAS,KACT,IAAK,IACP,EAEME,EAAmB,CAAE,OAAQ,EAAG,QAAS,CAAE,EAC7CC,EAAa,KACbC,EAAc,GACdC,EAAc,KACdC,EAAgB,CAAC,EACfC,EAAc,CAAC,EACfC,EAAkB,GAIxB,IAAMC,EAAe,QAAQ,KAE7B,IAAMC,EAAc,QAAQ,IAI5B,SAASC,EAAWC,EAAQ,CAC1B,MAAO,GAAGA,CAAM,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,EAAG,CAAC,CAAC,EAC7D,CAEA,SAASC,GAAS,CAChB,IAAMC,EAAS,aAAa,QAAQ,eAAe,IAAM,aAAa,QAAQ,gBAAiBH,EAAW,MAAM,CAAC,EAAG,aAAa,QAAQ,eAAe,GAClJI,EAAY,eAAe,QAAQ,kBAAkB,IAAM,eAAe,QAAQ,mBAAoBJ,EAAW,SAAS,CAAC,EAAG,eAAe,QAAQ,kBAAkB,GAC7K,OAAAK,EAAaA,GAAcL,EAAW,UAAU,EACzC,CAAE,WAAAK,EAAY,OAAAF,EAAQ,UAAAC,CAAU,CACzC,CAEA,SAASE,GAAa,CAhFtB,IAAAC,EAAAC,EAAAC,EAiFE,IAAID,GAAAD,EAAA,OAAO,kBAAP,YAAAA,EAAwB,UAAxB,MAAAC,EAAiC,KAAM,OAAO,OAAO,gBAAgB,QAAQ,KACjF,IAAME,EAAK,UAAU,UAWrB,QAAOD,EAVK,CACV,CAAE,EAAG,iBAAkB,EAAG,eAAgB,EAC1C,CAAE,EAAG,SAAU,EAAG,QAAS,EAC3B,CAAE,EAAG,kBAAmB,EAAG,gBAAiB,EAC5C,CAAE,EAAG,UAAW,EAAG,SAAU,EAC7B,CAAE,EAAG,iBAAkB,EAAG,eAAgB,EAC1C,CAAE,EAAG,SAAU,EAAG,QAAS,EAC3B,CAAE,EAAG,eAAgB,EAAG,mBAAoB,EAC5C,CAAE,EAAG,OAAQ,EAAG,MAAO,CACzB,EACW,KAAKE,GAAKD,EAAG,MAAMC,EAAE,CAAC,CAAC,IAA3B,YAAAF,EAA8B,IAAK,SAC5C,CAEA,SAASG,GAAQ,CAhGjB,IAAAL,EAAAC,EAAAC,EAiGE,IAAID,GAAAD,EAAA,OAAO,kBAAP,YAAAA,EAAwB,KAAxB,MAAAC,EAA4B,KAAM,OAAO,OAAO,gBAAgB,GAAG,KACvE,IAAME,EAAK,UAAU,UAQrB,QAAOD,EAPK,CACV,CAAE,EAAG,MAAO,EAAG,SAAU,EACzB,CAAE,EAAG,MAAO,EAAG,QAAS,EACxB,CAAE,EAAG,YAAa,EAAG,OAAQ,EAC7B,CAAE,EAAG,UAAW,EAAG,SAAU,EAC7B,CAAE,EAAG,cAAe,EAAG,KAAM,CAC/B,EACW,KAAKI,GAAKH,EAAG,MAAMG,EAAE,CAAC,CAAC,IAA3B,YAAAJ,EAA8B,IAAK,SAC5C,CAEA,SAASK,GAAwB,CA7GjC,IAAAP,EAAAC,EAAAC,EAAAM,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EA8GE,IAAMC,EAAO,UAAU,YAAc,UAAU,eAAiB,UAAU,iBAC1E,MAAO,CACL,eAAgBA,EAAOA,EAAK,cAAgB,UAC5C,UAAW,UAAU,UACrB,MAAO,OAAO,WACd,OAAQ,OAAO,YACf,YAAa,OAAO,MACpB,aAAc,OAAO,OACrB,eAAgB,KAAK,IAAI,EACzB,WAAY,KAAK,eAAe,EAAE,gBAAgB,EAAE,SACpD,cAAe,UAAU,UAAY,UAAU,aAC/C,YAAa,KAAK,MAAM,YAAY,IAAI,EAAI,GAAI,EAChD,aAAc,UAAU,cAAgB,UACxC,eAAgB,IAAI,KAAK,EAAE,kBAAkB,EAC7C,eAAgB,UAAU,cAC1B,IAAK,OAAO,SAAS,KACrB,KAAM,OAAO,SAAS,KACtB,SAAU,SAAS,SACnB,QAAShB,EAAW,EACpB,iBAAgBE,GAAAD,EAAA,OAAO,kBAAP,YAAAA,EAAwB,UAAxB,YAAAC,EAAiC,UAAW,KAC5D,GAAII,EAAM,EACV,YAAWG,GAAAN,EAAA,OAAO,kBAAP,YAAAA,EAAwB,KAAxB,YAAAM,EAA4B,UAAW,KAClD,aAAYE,GAAAD,EAAA,OAAO,kBAAP,YAAAA,EAAwB,SAAxB,YAAAC,EAAgC,OAAQ,KACpD,cAAaE,GAAAD,EAAA,OAAO,kBAAP,YAAAA,EAAwB,SAAxB,YAAAC,EAAgC,QAAS,KACtD,eAAcE,GAAAD,EAAA,OAAO,kBAAP,YAAAA,EAAwB,SAAxB,YAAAC,EAAgC,SAAU,KACxD,SAAU,KAAK,IAAI,EAAG,YAAY,OAAO,aAAe,YAAY,OAAO,eAAe,EAC1F,WAAYE,EAAiB,OAC7B,YAAaA,EAAiB,OAChC,CACF,CAEA,SAASC,EAAkBC,EAAK,CAC9B,MAAI,CAACC,EAAO,cAAgB,CAAC,MAAM,QAAQA,EAAO,YAAY,EAAU,GACjEA,EAAO,aAAa,KAAKC,GAC1B,OAAOA,GAAY,SAAiBF,EAAI,SAASE,CAAO,EACxDA,aAAmB,OAAeA,EAAQ,KAAKF,CAAG,EAC/C,EACR,CACH,CAEA,SAASG,EAASC,EAAKC,EAAM,CAC3B,IAAMC,EAAa,IAAI,gBACjBC,EAAU,WAAW,IAAMD,EAAW,MAAM,EAAG,GAAI,EAEnDE,EAAU,CAAE,eAAgB,kBAAmB,EACrD,OAAIP,EAAO,QAAOO,EAAQ,gBAAgB,EAAIP,EAAO,OAE9C,MAAMG,EAAK,CAChB,OAAQ,OACR,QAAAI,EACA,KAAM,KAAK,UAAUH,CAAI,EACzB,OAAQC,EAAW,MACrB,CAAC,EACE,KAAK,IAAO,aAAaC,CAAO,EAAU,EAAG,EAC7C,MAAM,IAAM,CAAE,aAAaA,CAAO,CAAE,CAAC,CAC1C,CAEA,SAASE,EAAaC,EAAM,CAC1B,IAAMC,GAAOD,EAAK,CAAC,GAAK,IAAM,GACxBE,EAAO,CAAC,GAAGF,CAAI,EACrB,OAAOC,EAAI,QAAQ,UAAYE,GAAM,CACnC,IAAMC,EAAIF,EAAK,MAAM,EACrB,OAAIC,IAAM,KAAa,OAAOC,CAAC,EAC3BD,IAAM,KAAa,OAAOC,CAAC,EAC3BD,IAAM,KAAa,KAAK,UAAUC,CAAC,EAChCD,CACT,CAAC,CACH,CAEA,SAASE,EAAYC,EAAKC,EAAQ,CAChC,IAAMC,EAAI,SAAS,cAAc,QAAQ,EACzCA,EAAE,IAAMF,EACRE,EAAE,MAAQ,GACND,IAAQC,EAAE,OAASD,GACvB,SAAS,KAAK,YAAYC,CAAC,CAC7B,CAIA,SAAeC,EAAiBC,EAAWC,EAAQC,EAAO,QAAAC,EAAA,sBA7L1D,IAAAzC,EA8LE,GAAI,CAEF,IAAM0C,EAAa,MAAM,MAAMJ,CAAS,EACxC,GAAI,CAACI,EAAW,GAAI,OAAO,KAC3B,IAAMC,EAAS,MAAMD,EAAW,KAAK,EAE/BE,EAAcD,EAAO,MAAM,+DAA+D,EAC1FE,EAAgBF,EAAO,MAAM,0CAA0C,EAEzEG,EACJ,GAAIF,EACFE,EAAgB,KAAK,MAAM,KAAKF,EAAY,CAAC,CAAC,CAAC,UACtCC,EAAe,CACxB,IAAME,EAAS,IAAI,IAAIF,EAAc,CAAC,EAAGP,CAAS,EAAE,KAC9CU,EAAc,MAAM,MAAMD,CAAM,EACtC,GAAI,CAACC,EAAY,GAAI,OAAO,KAC5BF,EAAgB,MAAME,EAAY,KAAK,CACzC,KACE,QAAO,KAGT,GAAI,GAAChD,EAAA,OAAO,YAAP,MAAAA,EAAkB,mBAAmB,OAAO,KAEjD,IAAMiD,EADW,IAAI,OAAO,UAAU,kBAAkBH,CAAa,EAChD,oBAAoB,CAAE,KAAMP,EAAQ,OAAQC,CAAM,CAAC,EAExE,GAAI,CAACS,EAAI,OAAQ,OAAO,KAGxB,IAAMC,EAAcJ,EAAc,QAAQ,QAAQG,EAAI,MAAM,EACxDE,EAAU,KACd,OAAIL,EAAc,gBAAkBA,EAAc,eAAeI,CAAW,IAC1EC,EAAUL,EAAc,eAAeI,CAAW,GAG7C,CACL,eAAgBD,EAAI,OACpB,aAAcA,EAAI,KAClB,eAAgBA,EAAI,OACpB,aAAcA,EAAI,KAClB,QAAAE,CACF,CACF,OAASC,EAAG,CACV,OAAO,IACT,CACF,GAIA,SAASC,EAAeC,EAAO,CAC7BC,EAAY,KAAKC,EAAA,CAAE,UAAW,KAAK,IAAI,GAAMF,EAAO,EAChDC,EAAY,OAASE,GAAiBF,EAAY,MAAM,CAC9D,CAIA,SAAeG,EAAeC,EAAK,QAAAlB,EAAA,sBACjC,IAAMmB,EAAUzC,EAAO,eAAiBZ,EAAsB,EAAI,CAAC,EAC7DsD,EAAQ,OAAO,OAAOF,EAAKC,EAASE,EAAOnE,EAAO,CAAC,EAMzD,GAJIoE,IAAaF,EAAM,KAAOE,GAC1B,OAAO,KAAKC,CAAa,EAAE,SAAQH,EAAM,QAAUL,EAAA,GAAKQ,IAC5DH,EAAM,YAAcN,EAAY,MAAM,EAElCpC,EAAO,YAAc,KAAK,OAAO,EAAK,EAAI,WAAWA,EAAO,UAAU,EAAI,CACxEA,EAAO,OAAO3B,EAAY,gCAAgC,EAC9D,MACF,CAKA,GAHK2B,EAAO,mBAAkBwC,EAAI,WAAa,MAG3CA,EAAI,WACN,GAAI,CACF,IAAMM,EAAQN,EAAI,WAAW,MAAM;AAAA,CAAI,EACjCO,EAAW,CAACD,EAAM,CAAC,CAAC,EAC1B,QAASE,EAAI,EAAGA,EAAIF,EAAM,OAAQE,IAC5B,CAACF,EAAME,CAAC,EAAE,SAAS,QAAQ,GAAK,CAACF,EAAME,CAAC,EAAE,SAAS,UAAU,GAAK,CAACF,EAAME,CAAC,EAAE,SAAS,aAAa,GACpGD,EAAS,KAAKD,EAAME,CAAC,CAAC,EAGtBD,EAAS,OAAS,IAAGP,EAAI,WAAaO,EAAS,KAAK;AAAA,CAAI,EAC9D,OAASd,EAAG,CAAe,CAG7B,IAAKO,EAAI,YAAcA,EAAI,QAAU,CAACA,EAAI,OACxC,GAAI,CACF,IAAMS,EAAQT,EAAI,YAAcA,EAAI,MAC9BM,EAAQG,EAAQA,EAAM,MAAM;AAAA,CAAI,EAAI,CAAC,EAE3C,QAASD,EAAI,EAAGA,EAAIF,EAAM,OAAQE,IAAK,CACrC,IAAME,EAAQJ,EAAME,CAAC,EAAE,KAAK,EAAE,MAAM,uBAAuB,EAC3D,GAAIE,EAAO,CACTV,EAAI,OAASU,EAAM,CAAC,EACpBV,EAAI,OAAS,SAASU,EAAM,CAAC,EAAG,EAAE,EAClCV,EAAI,MAAQ,SAASU,EAAM,CAAC,EAAG,EAAE,EACjC,KACF,CACF,CACF,OAASjB,EAAG,CAAe,CAQ7B,GAJIjC,EAAO,OAAO3B,EAAY,mBAAoBqE,CAAK,EACnD1C,EAAO,UAAUE,EAASF,EAAO,SAAU0C,CAAK,EAGhD1C,EAAO,kBAAoBwC,EAAI,QAAUA,EAAI,OAC/C,GAAI,CACF,IAAMW,EAAW,MAAMjC,EAAiBsB,EAAI,OAAQA,EAAI,OAAQA,EAAI,OAAS,CAAC,EAC9E,GAAIW,EAAU,CACZ,IAAMC,EAAWC,EAAAhB,EAAA,GACZK,GADY,CAEf,eAAgBS,EAAS,eACzB,aAAcA,EAAS,aACvB,eAAgBA,EAAS,eACzB,aAAcA,EAAS,aACvB,oBAAqBA,EAAS,YAChC,GACIA,EAAS,UAASC,EAAS,QAAUD,EAAS,SAC9CnD,EAAO,UAAUE,EAASF,EAAO,SAAUoD,CAAQ,CACzD,CACF,OAASnB,EAAG,CAAsB,CAEtC,GAKO,SAASqB,EAAaZ,EAAO,CAC7B1C,EAAO,SACZuC,EAAeG,CAAK,CACtB,CAMO,SAASa,EAAQC,EAAM,CAC5BZ,EAAcY,CAChB,CAMO,SAASC,EAAWC,EAAK,CAC9Bb,EAAgBR,IAAA,GAAKQ,GAAkBa,EACzC,CAKO,SAASC,GAAOC,EAAKC,EAAO,CACjChB,EAAce,CAAG,EAAIC,CACvB,CAYA,SAASC,IAAiB,CAExB,GAAIC,EAAO,sBAAuB,CAChC,SAAS,iBAAiB,QAAUC,GAAM,CACxCC,EAAiB,SACjB,IAAMC,EAAKF,EAAE,OACPG,EAAMD,EAAG,QAAUA,EAAG,QAAQ,YAAY,EAAI,GAC9CE,GAAQF,EAAG,aAAe,IAAI,KAAK,EAAE,MAAM,EAAG,EAAE,EACtDG,EAAe,CAAE,SAAU,QAAS,QAASF,GAAOC,EAAO,KAAOA,EAAO,GAAI,CAAC,CAChF,CAAC,EACD,IAAIE,EAAa,EACjB,OAAO,iBAAiB,SAAU,IAAM,CACtC,IAAMC,EAAM,KAAK,IAAI,EACjBA,EAAMD,EAAa,MAAOL,EAAiB,UAAWK,EAAaC,EACzE,CAAC,CACH,CAGA,IAAMC,EAAgB,QAAQ,UAC9B,QAAQ,UAAY,UAAW,CAC7BA,EAAc,MAAM,KAAM,SAAS,EACnCH,EAAe,CAAE,SAAU,aAAc,QAAS,OAAO,SAAS,IAAK,CAAC,CAC1E,EACA,OAAO,iBAAiB,WAAY,IAAM,CACxCA,EAAe,CAAE,SAAU,aAAc,QAAS,OAAO,SAAS,IAAK,CAAC,CAC1E,CAAC,EAGD,IAAMI,EAAY,OAAO,MACzB,OAAO,MAAQ,SAASC,EAAOC,EAAM,CACnC,IAAMC,EAAM,OAAOF,GAAU,SAAWA,GAASA,GAAA,YAAAA,EAAO,MAAO,GACzDG,GAASF,GAAA,YAAAA,EAAM,SAAU,MACzBG,EAAQ,KAAK,IAAI,EACvB,OAAOL,EAAU,MAAM,KAAM,SAAS,EAAE,KAAKM,IAC3CV,EAAe,CAAE,SAAU,QAAS,QAAS,GAAGQ,CAAM,IAAID,CAAG,GAAI,KAAM,CAAE,OAAQG,EAAS,OAAQ,SAAU,KAAK,IAAI,EAAID,CAAM,CAAE,CAAC,EAC3HC,EACR,EAAE,MAAMC,GAAO,CACd,MAAAX,EAAe,CAAE,SAAU,QAAS,QAAS,GAAGQ,CAAM,IAAID,CAAG,GAAI,KAAM,CAAE,MAAOI,EAAI,QAAS,SAAU,KAAK,IAAI,EAAIF,CAAM,CAAE,CAAC,EACvHE,CACR,CAAC,CACH,EAGA,IAAMC,EAAW,eAAe,UAAU,KACpCC,EAAW,eAAe,UAAU,KAC1C,eAAe,UAAU,KAAO,SAASL,EAAQD,EAAK,CACpD,YAAK,aAAeC,EACpB,KAAK,UAAYD,EACVK,EAAS,MAAM,KAAM,SAAS,CACvC,EACA,eAAe,UAAU,KAAO,UAAW,CACzC,IAAME,EAAO,KACPL,EAAQ,KAAK,IAAI,EACvB,OAAAK,EAAK,iBAAiB,UAAW,IAAM,CACrCd,EAAe,CAAE,SAAU,MAAO,QAAS,GAAGc,EAAK,cAAgB,KAAK,IAAIA,EAAK,WAAa,EAAE,GAAI,KAAM,CAAE,OAAQA,EAAK,OAAQ,SAAU,KAAK,IAAI,EAAIL,CAAM,CAAE,CAAC,CACnK,CAAC,EACMI,EAAS,MAAM,KAAM,SAAS,CACvC,EAGInB,EAAO,uBACT,OAAO,iBAAiB,QAAgBqB,GAAUC,EAAA,sBAChD,GAAKtB,EAAO,QACZ,IAAI,CACF,IAAMuB,EAAaF,EAAM,MAAQA,EAAM,MAAM,MAAQ,2BACrD,GAAIG,EAAkBH,EAAM,OAAO,EAAG,OAClCrB,EAAO,YACTyB,EAAe,CACb,KAAM,iBACN,QAASJ,EAAM,QACf,OAAQA,EAAM,SACd,OAAQA,EAAM,OACd,MAAOA,EAAM,MACb,WAAAE,CACF,CAAC,CAEL,OAAStB,EAAG,CACVyB,EAAa,iCAAkCzB,CAAC,CAClD,CACID,EAAO,mBAAmBqB,EAAM,eAAe,EACrD,EAAC,EAICrB,EAAO,oCACT,OAAO,iBAAiB,qBAAuBqB,GAAU,CACvD,GAAKrB,EAAO,QACZ,IAAI,CACF,IAAM2B,EAAQN,EAAM,OACdE,GAAaI,GAAA,YAAAA,EAAO,QAAS,2BACnC,GAAIH,GAAkBG,GAAA,YAAAA,EAAO,UAAW,EAAE,EAAG,OACzC3B,EAAO,YACTyB,EAAe,CACb,KAAM,8BACN,SAASE,GAAA,YAAAA,EAAO,UAAW,8BAC3B,OAAQN,EAAM,OACd,WAAAE,CACF,CAAC,CAEL,OAAStB,EAAG,CACVyB,EAAa,qCAAsCzB,CAAC,CACtD,CACID,EAAO,mBAAmBqB,EAAM,eAAe,EACrD,CAAC,EAICrB,EAAO,uBACT,QAAQ,MAAQ,YAAa4B,EAAM,CACjC,GAAK5B,EAAO,QACZ,GAAI,CACF,IAAMuB,EAAa,IAAI,MAAM,EAAE,MAC/B,GAAIC,EAAkBK,EAAaD,CAAI,CAAC,EAAG,OACvC5B,EAAO,YAAYyB,EAAe,CAAE,KAAM,gBAAiB,WAAAF,EAAY,KAAMM,EAAaD,CAAI,CAAE,CAAC,CACvG,OAAS3B,EAAG,CAAEyB,EAAa,0CAA2CzB,CAAC,CAAE,CAC3E,GAGED,EAAO,sBACT,QAAQ,KAAO,YAAa4B,EAAM,CAChC,GAAK5B,EAAO,QACZ,GAAI,CACF,IAAMuB,EAAa,IAAI,MAAM,EAAE,MAC/B,GAAIC,EAAkBK,EAAaD,CAAI,CAAC,EAAG,OACvC5B,EAAO,YAAYyB,EAAe,CAAE,KAAM,eAAgB,WAAAF,EAAY,KAAMM,EAAaD,CAAI,CAAE,CAAC,CACtG,OAAS3B,EAAG,CAAEyB,EAAa,yCAA0CzB,CAAC,CAAE,CAC1E,GAIF,IAAM6B,EAAU9B,EAAO,SAAW,IAAI,IAAIA,EAAO,QAAQ,EAAE,OAAS,GAChEA,EAAO,cAAgBA,EAAO,gBAAkB8B,GAClDC,EAAY,GAAGD,CAAO,2BAA4B,IAAM,CAClD,OAAO,UAAa,cACtB,OAAO,gBAAkB,IAAI,SAAS,EAAE,UAAU,EAEtD,CAAC,EAEC9B,EAAO,kBAAoB8B,GAC7BC,EAAY,GAAGD,CAAO,2BAA2B,CAErD,CAQO,SAASlB,GAAKoB,EAAe,CAAC,EAAGC,EAAgB,CAAC,EAAG,CAO1D,GALID,EAAa,OACfE,EAAcF,EAAa,KAC3B,OAAOA,EAAa,MAGlBG,EAAa,CACfC,EAAQC,IAAA,GAAKD,GAAUJ,GACvBhC,EAASqC,IAAA,GAAKrC,GAAWiC,GACzB,MACF,CAEAG,EAAQC,IAAA,GAAKD,GAAUJ,GACvBhC,EAASqC,IAAA,GAAKrC,GAAWiC,GACzBE,EAAc,GAEV,OAAO,QAAW,aACpBpC,GAAe,CAEnB,CAII,OAAO,QAAW,cACpB,OAAO,MAAQ,CACb,KAAAa,GACA,SAAW0B,GAAM,CAAEF,EAAQC,IAAA,GAAKD,GAAUE,EAAI,EAC9C,UAAYC,GAAM,CAAEvC,EAASqC,IAAA,GAAKrC,GAAWuC,EAAI,EACjD,QAAAC,EACA,WAAAC,EACA,OAAAC,GACA,cAAepC,EACf,MAAOqC,CACT,GD1gBK,IAAMC,EAAN,cAAiCC,GAAM,SAAU,CACtD,YAAYC,EAAO,CACjB,MAAMA,CAAK,EACX,KAAK,MAAQ,CAAE,SAAU,EAAM,CACjC,CAEA,OAAO,0BAA2B,CAChC,MAAO,CAAE,SAAU,EAAK,CAC1B,CAEA,kBAAkBC,EAAOC,EAAW,CAClCC,EAAa,CACX,QAASF,EAAM,QACf,MAAOA,EAAM,MACb,WAAYA,EAAM,MAClB,WAAWC,GAAA,YAAAA,EAAW,iBAAkB,GACxC,KAAM,sBACR,CAAC,CACH,CAEA,QAAS,CACP,OAAI,KAAK,MAAM,SACN,KAAK,MAAM,UAAY,KAEzB,KAAK,MAAM,QACpB,CACF",
|
|
6
|
-
"names": ["React", "defaultConfig", "config", "__spreadValues", "_a", "scope", "userInteractions", "pageloadId", "initialized", "userContext", "customContext", "breadcrumbs", "MAX_BREADCRUMBS", "_consoleWarn", "_consoleLog", "generateId", "prefix", "getIds", "userId", "sessionId", "pageloadId", "getBrowser", "_a", "_b", "_c", "ua", "b", "getOS", "o", "captureBrowserDetails", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "conn", "userInteractions", "shouldIgnoreError", "msg", "config", "pattern", "postData", "url", "data", "controller", "timeout", "headers", "argsToString", "args", "fmt", "rest", "m", "v", "_loadScript", "src", "onload", "s", "resolveSourceMap", "sourceUrl", "lineno", "colno", "__async", "jsResponse", "jsCode", "inlineMatch", "externalMatch", "sourceMapData", "mapURL", "mapResponse", "pos", "sourceIndex", "snippet", "e", "_addBreadcrumb", "crumb", "breadcrumbs", "__spreadValues", "MAX_BREADCRUMBS", "pushErrorEvent", "obj", "
|
|
4
|
+
"sourcesContent": ["/**\n * Scout.js React Error Boundary\n *\n * Usage:\n * import { init } from 'scoutjs'\n * import { ScoutErrorBoundary } from 'scoutjs/react'\n *\n * init({ app: 'My App', project: 'my-project' }, { endpoint: '...' })\n *\n * <ScoutErrorBoundary>\n * <App />\n * </ScoutErrorBoundary>\n */\n\nimport React from 'react'\nimport { captureError } from './index.js'\n\nexport class ScoutErrorBoundary extends React.Component {\n constructor(props) {\n super(props)\n this.state = { hasError: false }\n }\n\n static getDerivedStateFromError() {\n return { hasError: true }\n }\n\n componentDidCatch(error, errorInfo) {\n captureError({\n message: error.message,\n stack: error.stack,\n errorTrace: error.stack,\n component: errorInfo?.componentStack || '',\n type: 'react-error-boundary',\n })\n }\n\n render() {\n if (this.state.hasError) {\n return this.props.fallback || null\n }\n return this.props.children\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": ["React", "defaultConfig", "config", "__spreadValues", "_a", "scope", "userInteractions", "pageloadId", "initialized", "userContext", "customContext", "breadcrumbs", "MAX_BREADCRUMBS", "_consoleWarn", "_consoleLog", "generateId", "prefix", "getIds", "userId", "sessionId", "pageloadId", "getBrowser", "_a", "_b", "_c", "ua", "b", "getOS", "o", "captureBrowserDetails", "_d", "_e", "_f", "_g", "_h", "_i", "_j", "conn", "userInteractions", "shouldIgnoreError", "msg", "config", "pattern", "postData", "url", "data", "controller", "timeout", "headers", "argsToString", "args", "fmt", "rest", "m", "v", "_loadScript", "src", "onload", "s", "resolveSourceMap", "sourceUrl", "lineno", "colno", "__async", "jsResponse", "jsCode", "inlineMatch", "externalMatch", "sourceMapData", "mapURL", "mapResponse", "pos", "sourceIndex", "snippet", "e", "_addBreadcrumb", "crumb", "breadcrumbs", "__spreadValues", "MAX_BREADCRUMBS", "KNOWN_EVENT_FIELDS", "pushErrorEvent", "obj", "promoted", "k", "lines", "filtered", "i", "stack", "match", "inlineContext", "mergedContext", "customContext", "details", "event", "scope", "userContext", "resolved", "enriched", "__spreadProps", "captureError", "setUser", "user", "setContext", "ctx", "setTag", "key", "value", "setupListeners", "config", "e", "userInteractions", "el", "tag", "text", "_addBreadcrumb", "lastScroll", "now", "origPushState", "origFetch", "input", "init", "url", "method", "start", "response", "err", "origOpen", "origSend", "self", "event", "__async", "errorTrace", "shouldIgnoreError", "pushErrorEvent", "_consoleWarn", "error", "args", "argsToString", "baseUrl", "_loadScript", "scopeOptions", "configOptions", "userContext", "initialized", "scope", "__spreadValues", "s", "c", "setUser", "setContext", "setTag", "captureError", "ScoutErrorBoundary", "React", "props", "error", "errorInfo", "captureError"]
|
|
7
7
|
}
|