scout-error 0.2.3 → 0.2.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 CHANGED
@@ -1,5 +1,5 @@
1
- var S=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var P=Object.prototype.hasOwnProperty;var U=(e,o)=>{for(var s in o)S(e,s,{get:o[s],enumerable:!0})},D=(e,o,s,a)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of x(o))!P.call(e,r)&&r!==s&&S(e,r,{get:()=>o[r],enumerable:!(a=L(o,r))||a.enumerable});return e};var A=e=>D(S({},"__esModule",{value:!0}),e);var q={};U(q,{addBreadcrumb:()=>W,captureError:()=>T,init:()=>V,setContext:()=>C,setTag:()=>M,setUser:()=>R});module.exports=A(q);var O={trackUserInteractions:!0,selfHealingErrors:!1,attachStacktrace:!0,handleSourceMaps:!1,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},n={...O},c={environment:typeof window<"u"&&window.location?.hostname==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.2.3",project:null,release:null,version:null,app:null},y={clicks:0,scrolls:0},_=null,b=!1,g=null,p={},E=[],H=30;var w=console.warn;var I=console.log;function k(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function N(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",k("user")),localStorage.getItem("__scoutUserId")),o=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",k("session")),sessionStorage.getItem("__scoutSessionId"));return _=_||k("pageload"),{pageloadId:_,userId:e,sessionId:o}}function $(){if(window._uaParserResult?.browser?.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return[{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(s=>e.match(s.p))?.n||"Unknown"}function j(){if(window._uaParserResult?.os?.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return[{p:/Win/,n:"Windows"},{p:/Mac/,n:"Mac OS"},{p:/X11|Linux/,n:"Linux"},{p:/Android/,n:"Android"},{p:/iPhone|iPad/,n:"iOS"}].find(s=>e.match(s.p))?.n||"Unknown"}function B(){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:$(),browserVersion:window._uaParserResult?.browser?.version||null,os:j(),osVersion:window._uaParserResult?.os?.version||null,deviceType:window._uaParserResult?.device?.type||null,deviceModel:window._uaParserResult?.device?.model||null,deviceVendor:window._uaParserResult?.device?.vendor||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:y.clicks,userScrolls:y.scrolls}}function h(e){return!n.ignoreErrors||!Array.isArray(n.ignoreErrors)?!1:n.ignoreErrors.some(o=>typeof o=="string"?e.includes(o):o instanceof RegExp?o.test(e):!1)}function F(e,o){let s=new AbortController,a=setTimeout(()=>s.abort(),5e3),r={"Content-Type":"application/json"};return n.token&&(r["X-Ingest-Token"]=n.token),fetch(e,{method:"POST",headers:r,body:JSON.stringify(o),signal:s.signal}).then(t=>(clearTimeout(a),t)).catch(()=>{clearTimeout(a)})}function v(e){let o=(e[0]||"")+"",s=[...e];return o.replace(/%[sdj]/g,a=>{let r=s.shift();return a==="%s"?String(r):a==="%d"?Number(r):a==="%j"?JSON.stringify(r):a})}function l(e){E.push({timestamp:Date.now(),...e}),E.length>H&&E.shift()}async function f(e){let o=n.browserDetails?B():{},s=Object.assign(e,o,c,N());if(g&&(s.user=g),Object.keys(p).length&&(s.context={...p}),s.breadcrumbs=E.slice(),n.sampleRate&&Math.random()<1-parseFloat(n.sampleRate)){n.debug&&I("[Scout] Suppressed by sampling");return}if(n.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let a=e.errorTrace.split(`
2
- `),r=[a[0]];for(let t=1;t<a.length;t++)!a[t].includes("/scout")&&!a[t].includes("scout.js")&&!a[t].includes("scout-error")&&r.push(a[t]);r.length>1&&(e.errorTrace=r.join(`
3
- `))}catch{}if((e.errorTrace||e.stack)&&!e.source)try{let a=e.errorTrace||e.stack,r=a?a.split(`
4
- `):[];for(let t=1;t<r.length;t++){let i=r[t].trim().match(/(http.*?):(\d+):(\d+)/);if(i){e.source=i[1],e.lineno=parseInt(i[2],10),e.colno=parseInt(i[3],10);break}}}catch{}n.debug&&I("[Scout] Sending:",s),n.endpoint&&F(n.endpoint,s)}function T(e){n.enabled&&f(e)}function R(e){g=e}function C(e){p={...p,...e}}function M(e,o){p[e]=o}function W(e){l(e)}function X(){if(n.trackUserInteractions){document.addEventListener("click",t=>{y.clicks++;let i=t.target,m=i.tagName?i.tagName.toLowerCase():"",u=(i.textContent||"").trim().slice(0,50);l({category:"click",message:m+(u?": "+u:"")})});let r=0;window.addEventListener("scroll",()=>{let t=Date.now();t-r>100&&(y.scrolls++,r=t)})}let e=history.pushState;history.pushState=function(){e.apply(this,arguments),l({category:"navigation",message:window.location.href})},window.addEventListener("popstate",()=>{l({category:"navigation",message:window.location.href})});let o=window.fetch;window.fetch=function(r,t){let i=typeof r=="string"?r:r?.url||"",m=t?.method||"GET",u=Date.now();return o.apply(this,arguments).then(d=>(l({category:"fetch",message:`${m} ${i}`,data:{status:d.status,duration:Date.now()-u}}),d)).catch(d=>{throw l({category:"fetch",message:`${m} ${i}`,data:{error:d.message,duration:Date.now()-u}}),d})};let s=XMLHttpRequest.prototype.open,a=XMLHttpRequest.prototype.send;if(XMLHttpRequest.prototype.open=function(r,t){return this._scoutMethod=r,this._scoutUrl=t,s.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){let r=this,t=Date.now();return r.addEventListener("loadend",()=>{l({category:"xhr",message:`${r._scoutMethod||"GET"} ${r._scoutUrl||""}`,data:{status:r.status,duration:Date.now()-t}})}),a.apply(this,arguments)},n.addErrorEventListener&&window.addEventListener("error",async r=>{if(n.enabled){try{let t=r.error?r.error.stack:"No stack trace available";if(h(r.message))return;n.sendErrors&&f({type:"window.onerror",message:r.message,source:r.filename,lineno:r.lineno,colno:r.colno,errorTrace:t})}catch(t){w("[Scout] Error handler failure:",t)}n.selfHealingErrors&&r.preventDefault()}}),n.addUnhandledRejectionEventListener&&window.addEventListener("unhandledrejection",r=>{if(n.enabled){try{let t=r.reason,i=t?.stack||"No stack trace available";if(h(t?.message||""))return;n.sendErrors&&f({type:"Unhandled Promise Rejection",message:t?.message||"Unhandled Promise Rejection",reason:r.reason,errorTrace:i})}catch(t){w("[Scout] Rejection handler failure:",t)}n.selfHealingErrors&&r.preventDefault()}}),n.overrideConsoleError&&(console.error=function(...r){if(n.enabled)try{let t=new Error().stack;if(h(v(r)))return;n.sendErrors&&f({type:"console.error",errorTrace:t,args:v(r)})}catch(t){w("[Scout] console.error override failure:",t)}}),n.overrideConsoleWarn&&(console.warn=function(...r){if(n.enabled)try{let t=new Error().stack;if(h(v(r)))return;n.sendErrors&&f({type:"console.warn",errorTrace:t,args:v(r)})}catch(t){w("[Scout] console.warn override failure:",t)}}),n.loadUAParser&&n.browserDetails){let r=document.createElement("script");r.src="https://cdn.jsdelivr.net/npm/ua-parser-js/dist/ua-parser.min.js",r.async=!0,r.onload=()=>{typeof UAParser<"u"&&(window._uaParserResult=new UAParser().getResult())},document.head.appendChild(r)}}function V(e={},o={}){if(e.user&&(g=e.user,delete e.user),b){c={...c,...e},n={...n,...o};return}c={...c,...e},n={...n,...o},b=!0,typeof window<"u"&&(X(),window.Scout={init:(s,a)=>{s?.user&&(g=s.user,delete s.user),c={...c,...s},a&&(n={...n,...a})},setScope:s=>{c={...c,...s}},setConfig:s=>{n={...n,...s}},setUser:R,setContext:C,setTag:M,addBreadcrumb:l,error:T})}
1
+ var _=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var $=(e,s)=>{for(var n in s)_(e,n,{get:s[n],enumerable:!0})},H=(e,s,n,o)=>{if(s&&typeof s=="object"||typeof s=="function")for(let a of N(s))!O.call(e,a)&&a!==n&&_(e,a,{get:()=>s[a],enumerable:!(o=A(s,a))||o.enumerable});return e};var F=e=>H(_({},"__esModule",{value:!0}),e);var Q={};$(Q,{addBreadcrumb:()=>G,captureError:()=>T,init:()=>Z,setContext:()=>U,setTag:()=>P,setUser:()=>x});module.exports=F(Q);var B={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},t={...B},u={environment:typeof window<"u"&&window.location?.hostname==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.2.4",project:null,release:null,version:null,app:null},E={clicks:0,scrolls:0},M=null,L=!1,m=null,w={},y=[],W=30;var h=console.warn;var b=console.log;function k(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function X(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",k("user")),localStorage.getItem("__scoutUserId")),s=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",k("session")),sessionStorage.getItem("__scoutSessionId"));return M=M||k("pageload"),{pageloadId:M,userId:e,sessionId:s}}function j(){if(window._uaParserResult?.browser?.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return[{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(n=>e.match(n.p))?.n||"Unknown"}function V(){if(window._uaParserResult?.os?.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return[{p:/Win/,n:"Windows"},{p:/Mac/,n:"Mac OS"},{p:/X11|Linux/,n:"Linux"},{p:/Android/,n:"Android"},{p:/iPhone|iPad/,n:"iOS"}].find(n=>e.match(n.p))?.n||"Unknown"}function q(){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:j(),browserVersion:window._uaParserResult?.browser?.version||null,os:V(),osVersion:window._uaParserResult?.os?.version||null,deviceType:window._uaParserResult?.device?.type||null,deviceModel:window._uaParserResult?.device?.model||null,deviceVendor:window._uaParserResult?.device?.vendor||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:E.clicks,userScrolls:E.scrolls}}function S(e){return!t.ignoreErrors||!Array.isArray(t.ignoreErrors)?!1:t.ignoreErrors.some(s=>typeof s=="string"?e.includes(s):s instanceof RegExp?s.test(e):!1)}function z(e,s){let n=new AbortController,o=setTimeout(()=>n.abort(),5e3),a={"Content-Type":"application/json"};return t.token&&(a["X-Ingest-Token"]=t.token),fetch(e,{method:"POST",headers:a,body:JSON.stringify(s),signal:n.signal}).then(r=>(clearTimeout(o),r)).catch(()=>{clearTimeout(o)})}function v(e){let s=(e[0]||"")+"",n=[...e];return s.replace(/%[sdj]/g,o=>{let a=n.shift();return o==="%s"?String(a):o==="%d"?Number(a):o==="%j"?JSON.stringify(a):o})}function I(e,s){let n=document.createElement("script");n.src=e,n.async=!0,s&&(n.onload=s),document.head.appendChild(n)}async function J(e,s,n){try{let o=await fetch(e);if(!o.ok)return null;let a=await o.text(),r=a.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),i=a.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),c;if(r)c=JSON.parse(atob(r[1]));else if(i){let D=new URL(i[1],e).href,C=await fetch(D);if(!C.ok)return null;c=await C.json()}else return null;if(!window.sourceMap?.SourceMapConsumer)return null;let l=new window.sourceMap.SourceMapConsumer(c).originalPositionFor({line:s,column:n});if(!l.source)return null;let d=c.sources.indexOf(l.source),R=null;return c.sourcesContent&&c.sourcesContent[d]&&(R=c.sourcesContent[d]),{originalSource:l.source,originalLine:l.line,originalColumn:l.column,originalName:l.name,snippet:R}}catch{return null}}function f(e){y.push({timestamp:Date.now(),...e}),y.length>W&&y.shift()}async function g(e){let s=t.browserDetails?q():{},n=Object.assign(e,s,u,X());if(m&&(n.user=m),Object.keys(w).length&&(n.context={...w}),n.breadcrumbs=y.slice(),t.sampleRate&&Math.random()<1-parseFloat(t.sampleRate)){t.debug&&b("[Scout] Suppressed by sampling");return}if(t.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let o=e.errorTrace.split(`
2
+ `),a=[o[0]];for(let r=1;r<o.length;r++)!o[r].includes("/scout")&&!o[r].includes("scout.js")&&!o[r].includes("scout-error")&&a.push(o[r]);a.length>1&&(e.errorTrace=a.join(`
3
+ `))}catch{}if((e.errorTrace||e.stack)&&!e.source)try{let o=e.errorTrace||e.stack,a=o?o.split(`
4
+ `):[];for(let r=1;r<a.length;r++){let i=a[r].trim().match(/(http.*?):(\d+):(\d+)/);if(i){e.source=i[1],e.lineno=parseInt(i[2],10),e.colno=parseInt(i[3],10);break}}}catch{}if(t.handleSourceMaps&&e.source&&e.lineno)try{let o=await J(e.source,e.lineno,e.colno||0);o&&(n.originalSource=o.originalSource,n.originalLine=o.originalLine,n.originalColumn=o.originalColumn,n.originalName=o.originalName,n.highlightLineNumber=o.originalLine,o.snippet&&(n.snippet=o.snippet))}catch{}t.debug&&b("[Scout] Sending:",n),t.endpoint&&z(t.endpoint,n)}function T(e){t.enabled&&g(e)}function x(e){m=e}function U(e){w={...w,...e}}function P(e,s){w[e]=s}function G(e){f(e)}function K(){if(t.trackUserInteractions){document.addEventListener("click",i=>{E.clicks++;let c=i.target,p=c.tagName?c.tagName.toLowerCase():"",l=(c.textContent||"").trim().slice(0,50);f({category:"click",message:p+(l?": "+l:"")})});let r=0;window.addEventListener("scroll",()=>{let i=Date.now();i-r>100&&(E.scrolls++,r=i)})}let e=history.pushState;history.pushState=function(){e.apply(this,arguments),f({category:"navigation",message:window.location.href})},window.addEventListener("popstate",()=>{f({category:"navigation",message:window.location.href})});let s=window.fetch;window.fetch=function(r,i){let c=typeof r=="string"?r:r?.url||"",p=i?.method||"GET",l=Date.now();return s.apply(this,arguments).then(d=>(f({category:"fetch",message:`${p} ${c}`,data:{status:d.status,duration:Date.now()-l}}),d)).catch(d=>{throw f({category:"fetch",message:`${p} ${c}`,data:{error:d.message,duration:Date.now()-l}}),d})};let n=XMLHttpRequest.prototype.open,o=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(r,i){return this._scoutMethod=r,this._scoutUrl=i,n.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){let r=this,i=Date.now();return r.addEventListener("loadend",()=>{f({category:"xhr",message:`${r._scoutMethod||"GET"} ${r._scoutUrl||""}`,data:{status:r.status,duration:Date.now()-i}})}),o.apply(this,arguments)},t.addErrorEventListener&&window.addEventListener("error",async r=>{if(t.enabled){try{let i=r.error?r.error.stack:"No stack trace available";if(S(r.message))return;t.sendErrors&&g({type:"window.onerror",message:r.message,source:r.filename,lineno:r.lineno,colno:r.colno,errorTrace:i})}catch(i){h("[Scout] Error handler failure:",i)}t.selfHealingErrors&&r.preventDefault()}}),t.addUnhandledRejectionEventListener&&window.addEventListener("unhandledrejection",r=>{if(t.enabled){try{let i=r.reason,c=i?.stack||"No stack trace available";if(S(i?.message||""))return;t.sendErrors&&g({type:"Unhandled Promise Rejection",message:i?.message||"Unhandled Promise Rejection",reason:r.reason,errorTrace:c})}catch(i){h("[Scout] Rejection handler failure:",i)}t.selfHealingErrors&&r.preventDefault()}}),t.overrideConsoleError&&(console.error=function(...r){if(t.enabled)try{let i=new Error().stack;if(S(v(r)))return;t.sendErrors&&g({type:"console.error",errorTrace:i,args:v(r)})}catch(i){h("[Scout] console.error override failure:",i)}}),t.overrideConsoleWarn&&(console.warn=function(...r){if(t.enabled)try{let i=new Error().stack;if(S(v(r)))return;t.sendErrors&&g({type:"console.warn",errorTrace:i,args:v(r)})}catch(i){h("[Scout] console.warn override failure:",i)}});let a=t.endpoint?new URL(t.endpoint).origin:"";t.loadUAParser&&t.browserDetails&&a&&I(`${a}/vendor/ua-parser.min.js`,()=>{typeof UAParser<"u"&&(window._uaParserResult=new UAParser().getResult())}),t.handleSourceMaps&&a&&I(`${a}/vendor/source-map.min.js`)}function Z(e={},s={}){if(e.user&&(m=e.user,delete e.user),L){u={...u,...e},t={...t,...s};return}u={...u,...e},t={...t,...s},L=!0,typeof window<"u"&&(K(),window.Scout={init:(n,o)=>{n?.user&&(m=n.user,delete n.user),u={...u,...n},o&&(t={...t,...o})},setScope:n=>{u={...u,...n}},setConfig:n=>{t={...t,...n}},setUser:x,setContext:U,setTag:P,addBreadcrumb:f,error:T})}
5
5
  //# sourceMappingURL=index.cjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.js"],
4
- "sourcesContent": ["/**\n * Scout.js Browser SDK\n *\n * Captures errors, unhandled rejections, and console output.\n * Collects browser telemetry, session tracking, and source maps.\n *\n * Usage:\n * import { init, captureError } from 'scout-error'\n * init({ app: 'My App', project: 'my-project' }, { endpoint: 'https://...' })\n */\n\nconst defaultConfig = {\n trackUserInteractions: true,\n selfHealingErrors: false,\n attachStacktrace: true,\n handleSourceMaps: false,\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\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 if (config.debug) _consoleLog('[Scout] Sending:', event)\n if (config.endpoint) postData(config.endpoint, event)\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\n if (config.loadUAParser && config.browserDetails) {\n const s = document.createElement('script')\n s.src = 'https://cdn.jsdelivr.net/npm/ua-parser-js/dist/ua-parser.min.js'\n s.async = true\n s.onload = () => {\n if (typeof UAParser !== 'undefined') {\n window._uaParserResult = new UAParser().getResult()\n }\n }\n document.head.appendChild(s)\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 window.Scout = {\n init: (s, c) => { if (s?.user) { userContext = s.user; delete s.user }; scope = { ...scope, ...s }; if (c) config = { ...config, ...c } },\n setScope: (s) => { scope = { ...scope, ...s } },\n setConfig: (c) => { config = { ...config, ...c } },\n setUser,\n setContext,\n setTag,\n addBreadcrumb: _addBreadcrumb,\n error: captureError,\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["index_exports", "__export", "addBreadcrumb", "captureError", "init", "setContext", "setTag", "setUser", "__toCommonJS", "defaultConfig", "config", "scope", "userInteractions", "pageloadId", "initialized", "userContext", "customContext", "breadcrumbs", "MAX_BREADCRUMBS", "_consoleWarn", "_consoleLog", "generateId", "prefix", "getIds", "userId", "sessionId", "pageloadId", "getBrowser", "ua", "b", "getOS", "o", "captureBrowserDetails", "conn", "userInteractions", "shouldIgnoreError", "msg", "config", "pattern", "postData", "url", "data", "controller", "timeout", "headers", "r", "argsToString", "args", "fmt", "rest", "m", "v", "_addBreadcrumb", "crumb", "breadcrumbs", "MAX_BREADCRUMBS", "pushErrorEvent", "obj", "details", "event", "scope", "userContext", "customContext", "lines", "filtered", "i", "stack", "match", "captureError", "setUser", "user", "setContext", "ctx", "setTag", "key", "value", "addBreadcrumb", "setupListeners", "e", "el", "tag", "text", "lastScroll", "now", "origPushState", "origFetch", "input", "init", "method", "start", "response", "err", "origOpen", "origSend", "self", "errorTrace", "_consoleWarn", "error", "s", "scopeOptions", "configOptions", "initialized", "c"]
4
+ "sourcesContent": ["/**\n * Scout.js Browser SDK\n *\n * Captures errors, unhandled rejections, and console output.\n * Collects browser telemetry, session tracking, and source maps.\n *\n * Usage:\n * import { init, captureError } from 'scout-error'\n * init({ app: 'My App', project: 'my-project' }, { endpoint: 'https://...' })\n */\n\n// UA Parser and Source Map are loaded at runtime from the same host as the endpoint\n// to avoid CDN/CSP issues. For npm/bundler users (Vue/React/Node), import them directly.\n\nconst defaultConfig = {\n trackUserInteractions: true,\n selfHealingErrors: false,\n attachStacktrace: true,\n handleSourceMaps: true,\n browserDetails: true,\n warnOnCapture: false,\n loadUAParser: true,\n ignoreErrors: null,\n sendErrors: true,\n sampleRate: 1.0,\n enabled: true,\n debug: false,\n endpoint: '',\n token: null,\n\n overrideOnError: false,\n overrideOnUnhandledRejection: false,\n addErrorEventListener: true,\n addUnhandledRejectionEventListener: true,\n\n overrideConsoleLog: false,\n overrideConsoleWarn: false,\n overrideConsoleInfo: false,\n overrideConsoleError: true,\n}\n\nlet config = { ...defaultConfig }\n\nlet scope = {\n environment: typeof window !== 'undefined' && window.location?.hostname === 'localhost' ? 'development' : 'production',\n sdk: 'javascript',\n sdkVersion: __SDK_VERSION__,\n project: null,\n release: null,\n version: null,\n app: null,\n}\n\nconst userInteractions = { clicks: 0, scrolls: 0 }\nlet pageloadId = null\nlet initialized = false\nlet userContext = null\nlet customContext = {}\nconst breadcrumbs = []\nconst MAX_BREADCRUMBS = 30\n\n// Save originals before any overrides\nconst _consoleError = console.error\nconst _consoleWarn = console.warn\nconst _consoleInfo = console.info\nconst _consoleLog = console.log\n\n// --- Utilities ---\n\nfunction generateId(prefix) {\n return `${prefix}_${Math.random().toString(36).substr(2, 9)}`\n}\n\nfunction getIds() {\n const userId = localStorage.getItem('__scoutUserId') || (localStorage.setItem('__scoutUserId', generateId('user')), localStorage.getItem('__scoutUserId'))\n const sessionId = sessionStorage.getItem('__scoutSessionId') || (sessionStorage.setItem('__scoutSessionId', generateId('session')), sessionStorage.getItem('__scoutSessionId'))\n pageloadId = pageloadId || generateId('pageload')\n return { pageloadId, userId, sessionId }\n}\n\nfunction getBrowser() {\n if (window._uaParserResult?.browser?.name) return window._uaParserResult.browser.name\n const ua = navigator.userAgent\n const map = [\n { p: /Chrome.*Mobile/, n: 'Chrome Mobile' },\n { p: /Chrome/, n: 'Chrome' },\n { p: /Firefox.*Mobile/, n: 'Firefox Mobile' },\n { p: /Firefox/, n: 'Firefox' },\n { p: /Safari.*Mobile/, n: 'Safari Mobile' },\n { p: /Safari/, n: 'Safari' },\n { p: /MSIE|Trident/, n: 'Internet Explorer' },\n { p: /Edge/, n: 'Edge' },\n ]\n return map.find(b => ua.match(b.p))?.n || 'Unknown'\n}\n\nfunction getOS() {\n if (window._uaParserResult?.os?.name) return window._uaParserResult.os.name\n const ua = navigator.userAgent\n const map = [\n { p: /Win/, n: 'Windows' },\n { p: /Mac/, n: 'Mac OS' },\n { p: /X11|Linux/, n: 'Linux' },\n { p: /Android/, n: 'Android' },\n { p: /iPhone|iPad/, n: 'iOS' },\n ]\n return map.find(o => ua.match(o.p))?.n || 'Unknown'\n}\n\nfunction captureBrowserDetails() {\n const conn = navigator.connection || navigator.mozConnection || navigator.webkitConnection\n return {\n connectionType: conn ? conn.effectiveType : 'unknown',\n userAgent: navigator.userAgent,\n width: window.innerWidth,\n height: window.innerHeight,\n screenWidth: screen.width,\n screenHeight: screen.height,\n errorTimestamp: Date.now(),\n timeLocale: Intl.DateTimeFormat().resolvedOptions().timeZone,\n browserLocale: navigator.language || navigator.userLanguage,\n sessionTime: Math.round(performance.now() / 1000),\n deviceMemory: navigator.deviceMemory || 'unknown',\n timezoneOffset: new Date().getTimezoneOffset(),\n cookiesEnabled: navigator.cookieEnabled,\n url: window.location.href,\n host: window.location.host,\n referrer: document.referrer,\n browser: getBrowser(),\n browserVersion: window._uaParserResult?.browser?.version || null,\n os: getOS(),\n osVersion: window._uaParserResult?.os?.version || null,\n deviceType: window._uaParserResult?.device?.type || null,\n deviceModel: window._uaParserResult?.device?.model || null,\n deviceVendor: window._uaParserResult?.device?.vendor || null,\n loadTime: Math.max(0, performance.timing.loadEventEnd - performance.timing.navigationStart),\n userClicks: userInteractions.clicks,\n userScrolls: userInteractions.scrolls,\n }\n}\n\nfunction shouldIgnoreError(msg) {\n if (!config.ignoreErrors || !Array.isArray(config.ignoreErrors)) return false\n return config.ignoreErrors.some(pattern => {\n if (typeof pattern === 'string') return msg.includes(pattern)\n if (pattern instanceof RegExp) return pattern.test(msg)\n return false\n })\n}\n\nfunction postData(url, data) {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), 5000)\n\n const headers = { 'Content-Type': 'application/json' }\n if (config.token) headers['X-Ingest-Token'] = config.token\n\n return fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(data),\n signal: controller.signal,\n })\n .then(r => { clearTimeout(timeout); return r })\n .catch(() => { clearTimeout(timeout) })\n}\n\nfunction argsToString(args) {\n const fmt = (args[0] || '') + ''\n const rest = [...args]\n return fmt.replace(/%[sdj]/g, (m) => {\n const v = rest.shift()\n if (m === '%s') return String(v)\n if (m === '%d') return Number(v)\n if (m === '%j') return JSON.stringify(v)\n return m\n })\n}\n\nfunction _loadScript(src, onload) {\n const s = document.createElement('script')\n s.src = src\n s.async = true\n if (onload) s.onload = onload\n document.head.appendChild(s)\n}\n\n// --- Source Maps ---\n\nasync function resolveSourceMap(sourceUrl, lineno, colno) {\n try {\n // Fetch the JS file to find sourceMappingURL\n const jsResponse = await fetch(sourceUrl)\n if (!jsResponse.ok) return null\n const jsCode = await jsResponse.text()\n\n const inlineMatch = jsCode.match(/\\/\\/# sourceMappingURL=data:application\\/json;base64,([^\\s]+)/)\n const externalMatch = jsCode.match(/\\/\\/# sourceMappingURL=(?!data:)([^\\s]+)/)\n\n let sourceMapData\n if (inlineMatch) {\n sourceMapData = JSON.parse(atob(inlineMatch[1]))\n } else if (externalMatch) {\n const mapURL = new URL(externalMatch[1], sourceUrl).href\n const mapResponse = await fetch(mapURL)\n if (!mapResponse.ok) return null\n sourceMapData = await mapResponse.json()\n } else {\n return null\n }\n\n if (!window.sourceMap?.SourceMapConsumer) return null\n const consumer = new window.sourceMap.SourceMapConsumer(sourceMapData)\n const pos = consumer.originalPositionFor({ line: lineno, column: colno })\n\n if (!pos.source) return null\n\n // Extract the original source snippet\n const sourceIndex = sourceMapData.sources.indexOf(pos.source)\n let snippet = null\n if (sourceMapData.sourcesContent && sourceMapData.sourcesContent[sourceIndex]) {\n snippet = sourceMapData.sourcesContent[sourceIndex]\n }\n\n return {\n originalSource: pos.source,\n originalLine: pos.line,\n originalColumn: pos.column,\n originalName: pos.name,\n snippet,\n }\n } catch (e) {\n return null\n }\n}\n\n// --- Breadcrumbs ---\n\nfunction _addBreadcrumb(crumb) {\n breadcrumbs.push({ timestamp: Date.now(), ...crumb })\n if (breadcrumbs.length > MAX_BREADCRUMBS) breadcrumbs.shift()\n}\n\n// --- Core ---\n\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 // Resolve source maps if enabled and we have a source location\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 event.originalSource = resolved.originalSource\n event.originalLine = resolved.originalLine\n event.originalColumn = resolved.originalColumn\n event.originalName = resolved.originalName\n event.highlightLineNumber = resolved.originalLine\n if (resolved.snippet) event.snippet = resolved.snippet\n }\n } catch (e) { /* fail silently */ }\n }\n\n if (config.debug) _consoleLog('[Scout] Sending:', event)\n if (config.endpoint) postData(config.endpoint, event)\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 window.Scout = {\n init: (s, c) => { if (s?.user) { userContext = s.user; delete s.user }; scope = { ...scope, ...s }; if (c) config = { ...config, ...c } },\n setScope: (s) => { scope = { ...scope, ...s } },\n setConfig: (c) => { config = { ...config, ...c } },\n setUser,\n setContext,\n setTag,\n addBreadcrumb: _addBreadcrumb,\n error: captureError,\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["index_exports", "__export", "addBreadcrumb", "captureError", "init", "setContext", "setTag", "setUser", "__toCommonJS", "defaultConfig", "config", "scope", "userInteractions", "pageloadId", "initialized", "userContext", "customContext", "breadcrumbs", "MAX_BREADCRUMBS", "_consoleWarn", "_consoleLog", "generateId", "prefix", "getIds", "userId", "sessionId", "pageloadId", "getBrowser", "ua", "b", "getOS", "o", "captureBrowserDetails", "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", "jsResponse", "jsCode", "inlineMatch", "externalMatch", "sourceMapData", "mapURL", "mapResponse", "pos", "sourceIndex", "snippet", "_addBreadcrumb", "crumb", "breadcrumbs", "MAX_BREADCRUMBS", "pushErrorEvent", "obj", "details", "event", "scope", "userContext", "customContext", "lines", "filtered", "i", "stack", "match", "resolved", "captureError", "setUser", "user", "setContext", "ctx", "setTag", "key", "value", "addBreadcrumb", "setupListeners", "e", "el", "tag", "text", "lastScroll", "now", "origPushState", "origFetch", "input", "init", "method", "start", "response", "err", "origOpen", "origSend", "self", "errorTrace", "_consoleWarn", "error", "baseUrl", "scopeOptions", "configOptions", "initialized", "c"]
7
7
  }
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- var I={trackUserInteractions:!0,selfHealingErrors:!1,attachStacktrace:!0,handleSourceMaps:!1,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},n={...I},c={environment:typeof window<"u"&&window.location?.hostname==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.2.3",project:null,release:null,version:null,app:null},y={clicks:0,scrolls:0},S=null,k=!1,g=null,p={},E=[],T=30;var w=console.warn;var b=console.log;function _(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function R(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",_("user")),localStorage.getItem("__scoutUserId")),a=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",_("session")),sessionStorage.getItem("__scoutSessionId"));return S=S||_("pageload"),{pageloadId:S,userId:e,sessionId:a}}function C(){if(window._uaParserResult?.browser?.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return[{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(o=>e.match(o.p))?.n||"Unknown"}function M(){if(window._uaParserResult?.os?.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return[{p:/Win/,n:"Windows"},{p:/Mac/,n:"Mac OS"},{p:/X11|Linux/,n:"Linux"},{p:/Android/,n:"Android"},{p:/iPhone|iPad/,n:"iOS"}].find(o=>e.match(o.p))?.n||"Unknown"}function L(){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:C(),browserVersion:window._uaParserResult?.browser?.version||null,os:M(),osVersion:window._uaParserResult?.os?.version||null,deviceType:window._uaParserResult?.device?.type||null,deviceModel:window._uaParserResult?.device?.model||null,deviceVendor:window._uaParserResult?.device?.vendor||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:y.clicks,userScrolls:y.scrolls}}function h(e){return!n.ignoreErrors||!Array.isArray(n.ignoreErrors)?!1:n.ignoreErrors.some(a=>typeof a=="string"?e.includes(a):a instanceof RegExp?a.test(e):!1)}function x(e,a){let o=new AbortController,s=setTimeout(()=>o.abort(),5e3),r={"Content-Type":"application/json"};return n.token&&(r["X-Ingest-Token"]=n.token),fetch(e,{method:"POST",headers:r,body:JSON.stringify(a),signal:o.signal}).then(t=>(clearTimeout(s),t)).catch(()=>{clearTimeout(s)})}function v(e){let a=(e[0]||"")+"",o=[...e];return a.replace(/%[sdj]/g,s=>{let r=o.shift();return s==="%s"?String(r):s==="%d"?Number(r):s==="%j"?JSON.stringify(r):s})}function l(e){E.push({timestamp:Date.now(),...e}),E.length>T&&E.shift()}async function f(e){let a=n.browserDetails?L():{},o=Object.assign(e,a,c,R());if(g&&(o.user=g),Object.keys(p).length&&(o.context={...p}),o.breadcrumbs=E.slice(),n.sampleRate&&Math.random()<1-parseFloat(n.sampleRate)){n.debug&&b("[Scout] Suppressed by sampling");return}if(n.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let s=e.errorTrace.split(`
2
- `),r=[s[0]];for(let t=1;t<s.length;t++)!s[t].includes("/scout")&&!s[t].includes("scout.js")&&!s[t].includes("scout-error")&&r.push(s[t]);r.length>1&&(e.errorTrace=r.join(`
3
- `))}catch{}if((e.errorTrace||e.stack)&&!e.source)try{let s=e.errorTrace||e.stack,r=s?s.split(`
4
- `):[];for(let t=1;t<r.length;t++){let i=r[t].trim().match(/(http.*?):(\d+):(\d+)/);if(i){e.source=i[1],e.lineno=parseInt(i[2],10),e.colno=parseInt(i[3],10);break}}}catch{}n.debug&&b("[Scout] Sending:",o),n.endpoint&&x(n.endpoint,o)}function P(e){n.enabled&&f(e)}function U(e){g=e}function D(e){p={...p,...e}}function A(e,a){p[e]=a}function H(e){l(e)}function O(){if(n.trackUserInteractions){document.addEventListener("click",t=>{y.clicks++;let i=t.target,m=i.tagName?i.tagName.toLowerCase():"",u=(i.textContent||"").trim().slice(0,50);l({category:"click",message:m+(u?": "+u:"")})});let r=0;window.addEventListener("scroll",()=>{let t=Date.now();t-r>100&&(y.scrolls++,r=t)})}let e=history.pushState;history.pushState=function(){e.apply(this,arguments),l({category:"navigation",message:window.location.href})},window.addEventListener("popstate",()=>{l({category:"navigation",message:window.location.href})});let a=window.fetch;window.fetch=function(r,t){let i=typeof r=="string"?r:r?.url||"",m=t?.method||"GET",u=Date.now();return a.apply(this,arguments).then(d=>(l({category:"fetch",message:`${m} ${i}`,data:{status:d.status,duration:Date.now()-u}}),d)).catch(d=>{throw l({category:"fetch",message:`${m} ${i}`,data:{error:d.message,duration:Date.now()-u}}),d})};let o=XMLHttpRequest.prototype.open,s=XMLHttpRequest.prototype.send;if(XMLHttpRequest.prototype.open=function(r,t){return this._scoutMethod=r,this._scoutUrl=t,o.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){let r=this,t=Date.now();return r.addEventListener("loadend",()=>{l({category:"xhr",message:`${r._scoutMethod||"GET"} ${r._scoutUrl||""}`,data:{status:r.status,duration:Date.now()-t}})}),s.apply(this,arguments)},n.addErrorEventListener&&window.addEventListener("error",async r=>{if(n.enabled){try{let t=r.error?r.error.stack:"No stack trace available";if(h(r.message))return;n.sendErrors&&f({type:"window.onerror",message:r.message,source:r.filename,lineno:r.lineno,colno:r.colno,errorTrace:t})}catch(t){w("[Scout] Error handler failure:",t)}n.selfHealingErrors&&r.preventDefault()}}),n.addUnhandledRejectionEventListener&&window.addEventListener("unhandledrejection",r=>{if(n.enabled){try{let t=r.reason,i=t?.stack||"No stack trace available";if(h(t?.message||""))return;n.sendErrors&&f({type:"Unhandled Promise Rejection",message:t?.message||"Unhandled Promise Rejection",reason:r.reason,errorTrace:i})}catch(t){w("[Scout] Rejection handler failure:",t)}n.selfHealingErrors&&r.preventDefault()}}),n.overrideConsoleError&&(console.error=function(...r){if(n.enabled)try{let t=new Error().stack;if(h(v(r)))return;n.sendErrors&&f({type:"console.error",errorTrace:t,args:v(r)})}catch(t){w("[Scout] console.error override failure:",t)}}),n.overrideConsoleWarn&&(console.warn=function(...r){if(n.enabled)try{let t=new Error().stack;if(h(v(r)))return;n.sendErrors&&f({type:"console.warn",errorTrace:t,args:v(r)})}catch(t){w("[Scout] console.warn override failure:",t)}}),n.loadUAParser&&n.browserDetails){let r=document.createElement("script");r.src="https://cdn.jsdelivr.net/npm/ua-parser-js/dist/ua-parser.min.js",r.async=!0,r.onload=()=>{typeof UAParser<"u"&&(window._uaParserResult=new UAParser().getResult())},document.head.appendChild(r)}}function N(e={},a={}){if(e.user&&(g=e.user,delete e.user),k){c={...c,...e},n={...n,...a};return}c={...c,...e},n={...n,...a},k=!0,typeof window<"u"&&(O(),window.Scout={init:(o,s)=>{o?.user&&(g=o.user,delete o.user),c={...c,...o},s&&(n={...n,...s})},setScope:o=>{c={...c,...o}},setConfig:o=>{n={...n,...o}},setUser:U,setContext:D,setTag:A,addBreadcrumb:l,error:P})}export{H as addBreadcrumb,P as captureError,N as init,D as setContext,A as setTag,U as setUser};
1
+ var T={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},n={...T},u={environment:typeof window<"u"&&window.location?.hostname==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.2.4",project:null,release:null,version:null,app:null},E={clicks:0,scrolls:0},_=null,C=!1,m=null,w={},y=[],x=30;var h=console.warn;var L=console.log;function M(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function U(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",M("user")),localStorage.getItem("__scoutUserId")),i=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",M("session")),sessionStorage.getItem("__scoutSessionId"));return _=_||M("pageload"),{pageloadId:_,userId:e,sessionId:i}}function P(){if(window._uaParserResult?.browser?.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return[{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))?.n||"Unknown"}function D(){if(window._uaParserResult?.os?.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return[{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))?.n||"Unknown"}function A(){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:P(),browserVersion:window._uaParserResult?.browser?.version||null,os:D(),osVersion:window._uaParserResult?.os?.version||null,deviceType:window._uaParserResult?.device?.type||null,deviceModel:window._uaParserResult?.device?.model||null,deviceVendor:window._uaParserResult?.device?.vendor||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:E.clicks,userScrolls:E.scrolls}}function S(e){return!n.ignoreErrors||!Array.isArray(n.ignoreErrors)?!1:n.ignoreErrors.some(i=>typeof i=="string"?e.includes(i):i instanceof RegExp?i.test(e):!1)}function N(e,i){let t=new AbortController,o=setTimeout(()=>t.abort(),5e3),a={"Content-Type":"application/json"};return n.token&&(a["X-Ingest-Token"]=n.token),fetch(e,{method:"POST",headers:a,body:JSON.stringify(i),signal:t.signal}).then(r=>(clearTimeout(o),r)).catch(()=>{clearTimeout(o)})}function v(e){let i=(e[0]||"")+"",t=[...e];return i.replace(/%[sdj]/g,o=>{let a=t.shift();return o==="%s"?String(a):o==="%d"?Number(a):o==="%j"?JSON.stringify(a):o})}function b(e,i){let t=document.createElement("script");t.src=e,t.async=!0,i&&(t.onload=i),document.head.appendChild(t)}async function O(e,i,t){try{let o=await fetch(e);if(!o.ok)return null;let a=await o.text(),r=a.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),s=a.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),c;if(r)c=JSON.parse(atob(r[1]));else if(s){let I=new URL(s[1],e).href,R=await fetch(I);if(!R.ok)return null;c=await R.json()}else return null;if(!window.sourceMap?.SourceMapConsumer)return null;let l=new window.sourceMap.SourceMapConsumer(c).originalPositionFor({line:i,column:t});if(!l.source)return null;let d=c.sources.indexOf(l.source),k=null;return c.sourcesContent&&c.sourcesContent[d]&&(k=c.sourcesContent[d]),{originalSource:l.source,originalLine:l.line,originalColumn:l.column,originalName:l.name,snippet:k}}catch{return null}}function f(e){y.push({timestamp:Date.now(),...e}),y.length>x&&y.shift()}async function g(e){let i=n.browserDetails?A():{},t=Object.assign(e,i,u,U());if(m&&(t.user=m),Object.keys(w).length&&(t.context={...w}),t.breadcrumbs=y.slice(),n.sampleRate&&Math.random()<1-parseFloat(n.sampleRate)){n.debug&&L("[Scout] Suppressed by sampling");return}if(n.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let o=e.errorTrace.split(`
2
+ `),a=[o[0]];for(let r=1;r<o.length;r++)!o[r].includes("/scout")&&!o[r].includes("scout.js")&&!o[r].includes("scout-error")&&a.push(o[r]);a.length>1&&(e.errorTrace=a.join(`
3
+ `))}catch{}if((e.errorTrace||e.stack)&&!e.source)try{let o=e.errorTrace||e.stack,a=o?o.split(`
4
+ `):[];for(let r=1;r<a.length;r++){let s=a[r].trim().match(/(http.*?):(\d+):(\d+)/);if(s){e.source=s[1],e.lineno=parseInt(s[2],10),e.colno=parseInt(s[3],10);break}}}catch{}if(n.handleSourceMaps&&e.source&&e.lineno)try{let o=await O(e.source,e.lineno,e.colno||0);o&&(t.originalSource=o.originalSource,t.originalLine=o.originalLine,t.originalColumn=o.originalColumn,t.originalName=o.originalName,t.highlightLineNumber=o.originalLine,o.snippet&&(t.snippet=o.snippet))}catch{}n.debug&&L("[Scout] Sending:",t),n.endpoint&&N(n.endpoint,t)}function $(e){n.enabled&&g(e)}function H(e){m=e}function F(e){w={...w,...e}}function B(e,i){w[e]=i}function X(e){f(e)}function W(){if(n.trackUserInteractions){document.addEventListener("click",s=>{E.clicks++;let c=s.target,p=c.tagName?c.tagName.toLowerCase():"",l=(c.textContent||"").trim().slice(0,50);f({category:"click",message:p+(l?": "+l:"")})});let r=0;window.addEventListener("scroll",()=>{let s=Date.now();s-r>100&&(E.scrolls++,r=s)})}let e=history.pushState;history.pushState=function(){e.apply(this,arguments),f({category:"navigation",message:window.location.href})},window.addEventListener("popstate",()=>{f({category:"navigation",message:window.location.href})});let i=window.fetch;window.fetch=function(r,s){let c=typeof r=="string"?r:r?.url||"",p=s?.method||"GET",l=Date.now();return i.apply(this,arguments).then(d=>(f({category:"fetch",message:`${p} ${c}`,data:{status:d.status,duration:Date.now()-l}}),d)).catch(d=>{throw f({category:"fetch",message:`${p} ${c}`,data:{error:d.message,duration:Date.now()-l}}),d})};let t=XMLHttpRequest.prototype.open,o=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(r,s){return this._scoutMethod=r,this._scoutUrl=s,t.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){let r=this,s=Date.now();return r.addEventListener("loadend",()=>{f({category:"xhr",message:`${r._scoutMethod||"GET"} ${r._scoutUrl||""}`,data:{status:r.status,duration:Date.now()-s}})}),o.apply(this,arguments)},n.addErrorEventListener&&window.addEventListener("error",async r=>{if(n.enabled){try{let s=r.error?r.error.stack:"No stack trace available";if(S(r.message))return;n.sendErrors&&g({type:"window.onerror",message:r.message,source:r.filename,lineno:r.lineno,colno:r.colno,errorTrace:s})}catch(s){h("[Scout] Error handler failure:",s)}n.selfHealingErrors&&r.preventDefault()}}),n.addUnhandledRejectionEventListener&&window.addEventListener("unhandledrejection",r=>{if(n.enabled){try{let s=r.reason,c=s?.stack||"No stack trace available";if(S(s?.message||""))return;n.sendErrors&&g({type:"Unhandled Promise Rejection",message:s?.message||"Unhandled Promise Rejection",reason:r.reason,errorTrace:c})}catch(s){h("[Scout] Rejection handler failure:",s)}n.selfHealingErrors&&r.preventDefault()}}),n.overrideConsoleError&&(console.error=function(...r){if(n.enabled)try{let s=new Error().stack;if(S(v(r)))return;n.sendErrors&&g({type:"console.error",errorTrace:s,args:v(r)})}catch(s){h("[Scout] console.error override failure:",s)}}),n.overrideConsoleWarn&&(console.warn=function(...r){if(n.enabled)try{let s=new Error().stack;if(S(v(r)))return;n.sendErrors&&g({type:"console.warn",errorTrace:s,args:v(r)})}catch(s){h("[Scout] console.warn override failure:",s)}});let a=n.endpoint?new URL(n.endpoint).origin:"";n.loadUAParser&&n.browserDetails&&a&&b(`${a}/vendor/ua-parser.min.js`,()=>{typeof UAParser<"u"&&(window._uaParserResult=new UAParser().getResult())}),n.handleSourceMaps&&a&&b(`${a}/vendor/source-map.min.js`)}function j(e={},i={}){if(e.user&&(m=e.user,delete e.user),C){u={...u,...e},n={...n,...i};return}u={...u,...e},n={...n,...i},C=!0,typeof window<"u"&&(W(),window.Scout={init:(t,o)=>{t?.user&&(m=t.user,delete t.user),u={...u,...t},o&&(n={...n,...o})},setScope:t=>{u={...u,...t}},setConfig:t=>{n={...n,...t}},setUser:H,setContext:F,setTag:B,addBreadcrumb:f,error:$})}export{X as addBreadcrumb,$ as captureError,j as init,F as setContext,B as setTag,H as setUser};
5
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.js"],
4
- "sourcesContent": ["/**\n * Scout.js Browser SDK\n *\n * Captures errors, unhandled rejections, and console output.\n * Collects browser telemetry, session tracking, and source maps.\n *\n * Usage:\n * import { init, captureError } from 'scout-error'\n * init({ app: 'My App', project: 'my-project' }, { endpoint: 'https://...' })\n */\n\nconst defaultConfig = {\n trackUserInteractions: true,\n selfHealingErrors: false,\n attachStacktrace: true,\n handleSourceMaps: false,\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\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 if (config.debug) _consoleLog('[Scout] Sending:', event)\n if (config.endpoint) postData(config.endpoint, event)\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\n if (config.loadUAParser && config.browserDetails) {\n const s = document.createElement('script')\n s.src = 'https://cdn.jsdelivr.net/npm/ua-parser-js/dist/ua-parser.min.js'\n s.async = true\n s.onload = () => {\n if (typeof UAParser !== 'undefined') {\n window._uaParserResult = new UAParser().getResult()\n }\n }\n document.head.appendChild(s)\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 window.Scout = {\n init: (s, c) => { if (s?.user) { userContext = s.user; delete s.user }; scope = { ...scope, ...s }; if (c) config = { ...config, ...c } },\n setScope: (s) => { scope = { ...scope, ...s } },\n setConfig: (c) => { config = { ...config, ...c } },\n setUser,\n setContext,\n setTag,\n addBreadcrumb: _addBreadcrumb,\n error: captureError,\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["defaultConfig", "config", "scope", "userInteractions", "pageloadId", "initialized", "userContext", "customContext", "breadcrumbs", "MAX_BREADCRUMBS", "_consoleWarn", "_consoleLog", "generateId", "prefix", "getIds", "userId", "sessionId", "pageloadId", "getBrowser", "ua", "b", "getOS", "captureBrowserDetails", "conn", "userInteractions", "shouldIgnoreError", "msg", "config", "pattern", "postData", "url", "data", "controller", "timeout", "headers", "r", "argsToString", "args", "fmt", "rest", "m", "v", "_addBreadcrumb", "crumb", "breadcrumbs", "MAX_BREADCRUMBS", "pushErrorEvent", "obj", "details", "event", "scope", "userContext", "customContext", "lines", "filtered", "i", "stack", "match", "captureError", "setUser", "user", "setContext", "ctx", "setTag", "key", "value", "addBreadcrumb", "setupListeners", "e", "el", "tag", "text", "lastScroll", "now", "origPushState", "origFetch", "input", "init", "method", "start", "response", "err", "origOpen", "origSend", "self", "errorTrace", "_consoleWarn", "error", "s", "scopeOptions", "configOptions", "initialized", "c"]
4
+ "sourcesContent": ["/**\n * Scout.js Browser SDK\n *\n * Captures errors, unhandled rejections, and console output.\n * Collects browser telemetry, session tracking, and source maps.\n *\n * Usage:\n * import { init, captureError } from 'scout-error'\n * init({ app: 'My App', project: 'my-project' }, { endpoint: 'https://...' })\n */\n\n// UA Parser and Source Map are loaded at runtime from the same host as the endpoint\n// to avoid CDN/CSP issues. For npm/bundler users (Vue/React/Node), import them directly.\n\nconst defaultConfig = {\n trackUserInteractions: true,\n selfHealingErrors: false,\n attachStacktrace: true,\n handleSourceMaps: true,\n browserDetails: true,\n warnOnCapture: false,\n loadUAParser: true,\n ignoreErrors: null,\n sendErrors: true,\n sampleRate: 1.0,\n enabled: true,\n debug: false,\n endpoint: '',\n token: null,\n\n overrideOnError: false,\n overrideOnUnhandledRejection: false,\n addErrorEventListener: true,\n addUnhandledRejectionEventListener: true,\n\n overrideConsoleLog: false,\n overrideConsoleWarn: false,\n overrideConsoleInfo: false,\n overrideConsoleError: true,\n}\n\nlet config = { ...defaultConfig }\n\nlet scope = {\n environment: typeof window !== 'undefined' && window.location?.hostname === 'localhost' ? 'development' : 'production',\n sdk: 'javascript',\n sdkVersion: __SDK_VERSION__,\n project: null,\n release: null,\n version: null,\n app: null,\n}\n\nconst userInteractions = { clicks: 0, scrolls: 0 }\nlet pageloadId = null\nlet initialized = false\nlet userContext = null\nlet customContext = {}\nconst breadcrumbs = []\nconst MAX_BREADCRUMBS = 30\n\n// Save originals before any overrides\nconst _consoleError = console.error\nconst _consoleWarn = console.warn\nconst _consoleInfo = console.info\nconst _consoleLog = console.log\n\n// --- Utilities ---\n\nfunction generateId(prefix) {\n return `${prefix}_${Math.random().toString(36).substr(2, 9)}`\n}\n\nfunction getIds() {\n const userId = localStorage.getItem('__scoutUserId') || (localStorage.setItem('__scoutUserId', generateId('user')), localStorage.getItem('__scoutUserId'))\n const sessionId = sessionStorage.getItem('__scoutSessionId') || (sessionStorage.setItem('__scoutSessionId', generateId('session')), sessionStorage.getItem('__scoutSessionId'))\n pageloadId = pageloadId || generateId('pageload')\n return { pageloadId, userId, sessionId }\n}\n\nfunction getBrowser() {\n if (window._uaParserResult?.browser?.name) return window._uaParserResult.browser.name\n const ua = navigator.userAgent\n const map = [\n { p: /Chrome.*Mobile/, n: 'Chrome Mobile' },\n { p: /Chrome/, n: 'Chrome' },\n { p: /Firefox.*Mobile/, n: 'Firefox Mobile' },\n { p: /Firefox/, n: 'Firefox' },\n { p: /Safari.*Mobile/, n: 'Safari Mobile' },\n { p: /Safari/, n: 'Safari' },\n { p: /MSIE|Trident/, n: 'Internet Explorer' },\n { p: /Edge/, n: 'Edge' },\n ]\n return map.find(b => ua.match(b.p))?.n || 'Unknown'\n}\n\nfunction getOS() {\n if (window._uaParserResult?.os?.name) return window._uaParserResult.os.name\n const ua = navigator.userAgent\n const map = [\n { p: /Win/, n: 'Windows' },\n { p: /Mac/, n: 'Mac OS' },\n { p: /X11|Linux/, n: 'Linux' },\n { p: /Android/, n: 'Android' },\n { p: /iPhone|iPad/, n: 'iOS' },\n ]\n return map.find(o => ua.match(o.p))?.n || 'Unknown'\n}\n\nfunction captureBrowserDetails() {\n const conn = navigator.connection || navigator.mozConnection || navigator.webkitConnection\n return {\n connectionType: conn ? conn.effectiveType : 'unknown',\n userAgent: navigator.userAgent,\n width: window.innerWidth,\n height: window.innerHeight,\n screenWidth: screen.width,\n screenHeight: screen.height,\n errorTimestamp: Date.now(),\n timeLocale: Intl.DateTimeFormat().resolvedOptions().timeZone,\n browserLocale: navigator.language || navigator.userLanguage,\n sessionTime: Math.round(performance.now() / 1000),\n deviceMemory: navigator.deviceMemory || 'unknown',\n timezoneOffset: new Date().getTimezoneOffset(),\n cookiesEnabled: navigator.cookieEnabled,\n url: window.location.href,\n host: window.location.host,\n referrer: document.referrer,\n browser: getBrowser(),\n browserVersion: window._uaParserResult?.browser?.version || null,\n os: getOS(),\n osVersion: window._uaParserResult?.os?.version || null,\n deviceType: window._uaParserResult?.device?.type || null,\n deviceModel: window._uaParserResult?.device?.model || null,\n deviceVendor: window._uaParserResult?.device?.vendor || null,\n loadTime: Math.max(0, performance.timing.loadEventEnd - performance.timing.navigationStart),\n userClicks: userInteractions.clicks,\n userScrolls: userInteractions.scrolls,\n }\n}\n\nfunction shouldIgnoreError(msg) {\n if (!config.ignoreErrors || !Array.isArray(config.ignoreErrors)) return false\n return config.ignoreErrors.some(pattern => {\n if (typeof pattern === 'string') return msg.includes(pattern)\n if (pattern instanceof RegExp) return pattern.test(msg)\n return false\n })\n}\n\nfunction postData(url, data) {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), 5000)\n\n const headers = { 'Content-Type': 'application/json' }\n if (config.token) headers['X-Ingest-Token'] = config.token\n\n return fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(data),\n signal: controller.signal,\n })\n .then(r => { clearTimeout(timeout); return r })\n .catch(() => { clearTimeout(timeout) })\n}\n\nfunction argsToString(args) {\n const fmt = (args[0] || '') + ''\n const rest = [...args]\n return fmt.replace(/%[sdj]/g, (m) => {\n const v = rest.shift()\n if (m === '%s') return String(v)\n if (m === '%d') return Number(v)\n if (m === '%j') return JSON.stringify(v)\n return m\n })\n}\n\nfunction _loadScript(src, onload) {\n const s = document.createElement('script')\n s.src = src\n s.async = true\n if (onload) s.onload = onload\n document.head.appendChild(s)\n}\n\n// --- Source Maps ---\n\nasync function resolveSourceMap(sourceUrl, lineno, colno) {\n try {\n // Fetch the JS file to find sourceMappingURL\n const jsResponse = await fetch(sourceUrl)\n if (!jsResponse.ok) return null\n const jsCode = await jsResponse.text()\n\n const inlineMatch = jsCode.match(/\\/\\/# sourceMappingURL=data:application\\/json;base64,([^\\s]+)/)\n const externalMatch = jsCode.match(/\\/\\/# sourceMappingURL=(?!data:)([^\\s]+)/)\n\n let sourceMapData\n if (inlineMatch) {\n sourceMapData = JSON.parse(atob(inlineMatch[1]))\n } else if (externalMatch) {\n const mapURL = new URL(externalMatch[1], sourceUrl).href\n const mapResponse = await fetch(mapURL)\n if (!mapResponse.ok) return null\n sourceMapData = await mapResponse.json()\n } else {\n return null\n }\n\n if (!window.sourceMap?.SourceMapConsumer) return null\n const consumer = new window.sourceMap.SourceMapConsumer(sourceMapData)\n const pos = consumer.originalPositionFor({ line: lineno, column: colno })\n\n if (!pos.source) return null\n\n // Extract the original source snippet\n const sourceIndex = sourceMapData.sources.indexOf(pos.source)\n let snippet = null\n if (sourceMapData.sourcesContent && sourceMapData.sourcesContent[sourceIndex]) {\n snippet = sourceMapData.sourcesContent[sourceIndex]\n }\n\n return {\n originalSource: pos.source,\n originalLine: pos.line,\n originalColumn: pos.column,\n originalName: pos.name,\n snippet,\n }\n } catch (e) {\n return null\n }\n}\n\n// --- Breadcrumbs ---\n\nfunction _addBreadcrumb(crumb) {\n breadcrumbs.push({ timestamp: Date.now(), ...crumb })\n if (breadcrumbs.length > MAX_BREADCRUMBS) breadcrumbs.shift()\n}\n\n// --- Core ---\n\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 // Resolve source maps if enabled and we have a source location\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 event.originalSource = resolved.originalSource\n event.originalLine = resolved.originalLine\n event.originalColumn = resolved.originalColumn\n event.originalName = resolved.originalName\n event.highlightLineNumber = resolved.originalLine\n if (resolved.snippet) event.snippet = resolved.snippet\n }\n } catch (e) { /* fail silently */ }\n }\n\n if (config.debug) _consoleLog('[Scout] Sending:', event)\n if (config.endpoint) postData(config.endpoint, event)\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 window.Scout = {\n init: (s, c) => { if (s?.user) { userContext = s.user; delete s.user }; scope = { ...scope, ...s }; if (c) config = { ...config, ...c } },\n setScope: (s) => { scope = { ...scope, ...s } },\n setConfig: (c) => { config = { ...config, ...c } },\n setUser,\n setContext,\n setTag,\n addBreadcrumb: _addBreadcrumb,\n error: captureError,\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["defaultConfig", "config", "scope", "userInteractions", "pageloadId", "initialized", "userContext", "customContext", "breadcrumbs", "MAX_BREADCRUMBS", "_consoleWarn", "_consoleLog", "generateId", "prefix", "getIds", "userId", "sessionId", "pageloadId", "getBrowser", "ua", "b", "getOS", "o", "captureBrowserDetails", "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", "jsResponse", "jsCode", "inlineMatch", "externalMatch", "sourceMapData", "mapURL", "mapResponse", "pos", "sourceIndex", "snippet", "_addBreadcrumb", "crumb", "breadcrumbs", "MAX_BREADCRUMBS", "pushErrorEvent", "obj", "details", "event", "scope", "userContext", "customContext", "lines", "filtered", "i", "stack", "match", "resolved", "captureError", "setUser", "user", "setContext", "ctx", "setTag", "key", "value", "addBreadcrumb", "setupListeners", "e", "el", "tag", "text", "lastScroll", "now", "origPushState", "origFetch", "input", "init", "method", "start", "response", "err", "origOpen", "origSend", "self", "errorTrace", "_consoleWarn", "error", "baseUrl", "scopeOptions", "configOptions", "initialized", "c"]
7
7
  }
package/dist/node.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var p=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var f=(e,t)=>{for(var s in t)p(e,s,{get:t[s],enumerable:!0})},k=(e,t,s,u)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of m(t))!g.call(e,r)&&r!==s&&p(e,r,{get:()=>t[r],enumerable:!(u=l(t,r))||u.enumerable});return e};var h=e=>k(p({},"__esModule",{value:!0}),e);var j={};f(j,{addBreadcrumb:()=>b,captureError:()=>O,errorHandlingMiddleware:()=>D,initTracker:()=>x,setContext:()=>T,setTag:()=>y,setUser:()=>E});module.exports=h(j);var n={debug:!1,endpoint:"",token:null,sendErrors:!0,captureUserDetails:!1,captureRequestDetails:!0,captureStackTrace:!0},a={environment:process.env.NODE_ENV||"production",project:null,release:null,version:null,sdk:"node",sdkVersion:"0.2.3",nodeVersion:process.version,platform:process.platform,arch:process.arch},d=null,o={},c=[],S=30;function i(e){if(n.debug&&console.error("[Scout]:",e),d&&(e.user=d),Object.keys(o).length&&(e.context={...o}),e.breadcrumbs=c.slice(),n.endpoint&&n.sendErrors){let t={"Content-Type":"application/json"};n.token&&(t["X-Ingest-Token"]=n.token),fetch(n.endpoint,{method:"POST",headers:t,body:JSON.stringify(e)}).catch(s=>{console.error("[Scout] Failed to send error:",s.message)})}}function x(e={},t={}){a={...a,...e},n={...n,...t},process.on("uncaughtException",s=>{i({type:"uncaughtException",message:s.message,stack:s.stack,errorTrace:s.stack,timestamp:new Date().toISOString(),...a})}),process.on("unhandledRejection",s=>{i({type:"unhandledRejection",message:s?.message||"Unhandled Promise Rejection",stack:s?.stack||"No stack trace",errorTrace:s?.stack||"No stack trace",timestamp:new Date().toISOString(),...a})})}function D(e,t,s,u){let r={type:"expressError",message:e.message,stack:n.captureStackTrace?e.stack:void 0,errorTrace:n.captureStackTrace?e.stack:void 0,path:t.originalUrl,method:t.method,params:t.params,query:t.query,headers:n.captureRequestDetails?t.headers:void 0,timestamp:new Date().toISOString(),...a};n.captureUserDetails&&t.user&&(r.user={id:t.user.id||t.user._id,email:t.user.email,name:t.user.name||t.user.username}),i(r),s.status(500).json({error:"Internal Server Error"})}function E(e){d=e}function T(e){o={...o,...e}}function y(e,t){o[e]=t}function b(e){c.push({timestamp:Date.now(),...e}),c.length>S&&c.shift()}function O(e,t={}){let s={type:"manual",message:e?.message||String(e),stack:e?.stack,errorTrace:e?.stack,timestamp:new Date().toISOString(),...a};Object.keys(t).length&&(s.context={...o,...t}),i(s)}0&&(module.exports={addBreadcrumb,captureError,errorHandlingMiddleware,initTracker,setContext,setTag,setUser});
1
+ var p=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var f=(e,t)=>{for(var s in t)p(e,s,{get:t[s],enumerable:!0})},k=(e,t,s,u)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of m(t))!g.call(e,r)&&r!==s&&p(e,r,{get:()=>t[r],enumerable:!(u=l(t,r))||u.enumerable});return e};var h=e=>k(p({},"__esModule",{value:!0}),e);var j={};f(j,{addBreadcrumb:()=>b,captureError:()=>O,errorHandlingMiddleware:()=>D,initTracker:()=>x,setContext:()=>T,setTag:()=>y,setUser:()=>E});module.exports=h(j);var n={debug:!1,endpoint:"",token:null,sendErrors:!0,captureUserDetails:!1,captureRequestDetails:!0,captureStackTrace:!0},a={environment:process.env.NODE_ENV||"production",project:null,release:null,version:null,sdk:"node",sdkVersion:"0.2.4",nodeVersion:process.version,platform:process.platform,arch:process.arch},d=null,o={},c=[],S=30;function i(e){if(n.debug&&console.error("[Scout]:",e),d&&(e.user=d),Object.keys(o).length&&(e.context={...o}),e.breadcrumbs=c.slice(),n.endpoint&&n.sendErrors){let t={"Content-Type":"application/json"};n.token&&(t["X-Ingest-Token"]=n.token),fetch(n.endpoint,{method:"POST",headers:t,body:JSON.stringify(e)}).catch(s=>{console.error("[Scout] Failed to send error:",s.message)})}}function x(e={},t={}){a={...a,...e},n={...n,...t},process.on("uncaughtException",s=>{i({type:"uncaughtException",message:s.message,stack:s.stack,errorTrace:s.stack,timestamp:new Date().toISOString(),...a})}),process.on("unhandledRejection",s=>{i({type:"unhandledRejection",message:s?.message||"Unhandled Promise Rejection",stack:s?.stack||"No stack trace",errorTrace:s?.stack||"No stack trace",timestamp:new Date().toISOString(),...a})})}function D(e,t,s,u){let r={type:"expressError",message:e.message,stack:n.captureStackTrace?e.stack:void 0,errorTrace:n.captureStackTrace?e.stack:void 0,path:t.originalUrl,method:t.method,params:t.params,query:t.query,headers:n.captureRequestDetails?t.headers:void 0,timestamp:new Date().toISOString(),...a};n.captureUserDetails&&t.user&&(r.user={id:t.user.id||t.user._id,email:t.user.email,name:t.user.name||t.user.username}),i(r),s.status(500).json({error:"Internal Server Error"})}function E(e){d=e}function T(e){o={...o,...e}}function y(e,t){o[e]=t}function b(e){c.push({timestamp:Date.now(),...e}),c.length>S&&c.shift()}function O(e,t={}){let s={type:"manual",message:e?.message||String(e),stack:e?.stack,errorTrace:e?.stack,timestamp:new Date().toISOString(),...a};Object.keys(t).length&&(s.context={...o,...t}),i(s)}0&&(module.exports={addBreadcrumb,captureError,errorHandlingMiddleware,initTracker,setContext,setTag,setUser});
2
2
  //# sourceMappingURL=node.cjs.map
package/dist/node.js CHANGED
@@ -1,2 +1,2 @@
1
- var n={debug:!1,endpoint:"",token:null,sendErrors:!0,captureUserDetails:!1,captureRequestDetails:!0,captureStackTrace:!0},r={environment:process.env.NODE_ENV||"production",project:null,release:null,version:null,sdk:"node",sdkVersion:"0.2.3",nodeVersion:process.version,platform:process.platform,arch:process.arch},i=null,a={},o=[],p=30;function c(e){if(n.debug&&console.error("[Scout]:",e),i&&(e.user=i),Object.keys(a).length&&(e.context={...a}),e.breadcrumbs=o.slice(),n.endpoint&&n.sendErrors){let t={"Content-Type":"application/json"};n.token&&(t["X-Ingest-Token"]=n.token),fetch(n.endpoint,{method:"POST",headers:t,body:JSON.stringify(e)}).catch(s=>{console.error("[Scout] Failed to send error:",s.message)})}}function l(e={},t={}){r={...r,...e},n={...n,...t},process.on("uncaughtException",s=>{c({type:"uncaughtException",message:s.message,stack:s.stack,errorTrace:s.stack,timestamp:new Date().toISOString(),...r})}),process.on("unhandledRejection",s=>{c({type:"unhandledRejection",message:s?.message||"Unhandled Promise Rejection",stack:s?.stack||"No stack trace",errorTrace:s?.stack||"No stack trace",timestamp:new Date().toISOString(),...r})})}function m(e,t,s,d){let u={type:"expressError",message:e.message,stack:n.captureStackTrace?e.stack:void 0,errorTrace:n.captureStackTrace?e.stack:void 0,path:t.originalUrl,method:t.method,params:t.params,query:t.query,headers:n.captureRequestDetails?t.headers:void 0,timestamp:new Date().toISOString(),...r};n.captureUserDetails&&t.user&&(u.user={id:t.user.id||t.user._id,email:t.user.email,name:t.user.name||t.user.username}),c(u),s.status(500).json({error:"Internal Server Error"})}function g(e){i=e}function f(e){a={...a,...e}}function k(e,t){a[e]=t}function h(e){o.push({timestamp:Date.now(),...e}),o.length>p&&o.shift()}function S(e,t={}){let s={type:"manual",message:e?.message||String(e),stack:e?.stack,errorTrace:e?.stack,timestamp:new Date().toISOString(),...r};Object.keys(t).length&&(s.context={...a,...t}),c(s)}export{h as addBreadcrumb,S as captureError,m as errorHandlingMiddleware,l as initTracker,f as setContext,k as setTag,g as setUser};
1
+ var n={debug:!1,endpoint:"",token:null,sendErrors:!0,captureUserDetails:!1,captureRequestDetails:!0,captureStackTrace:!0},r={environment:process.env.NODE_ENV||"production",project:null,release:null,version:null,sdk:"node",sdkVersion:"0.2.4",nodeVersion:process.version,platform:process.platform,arch:process.arch},i=null,a={},o=[],p=30;function c(e){if(n.debug&&console.error("[Scout]:",e),i&&(e.user=i),Object.keys(a).length&&(e.context={...a}),e.breadcrumbs=o.slice(),n.endpoint&&n.sendErrors){let t={"Content-Type":"application/json"};n.token&&(t["X-Ingest-Token"]=n.token),fetch(n.endpoint,{method:"POST",headers:t,body:JSON.stringify(e)}).catch(s=>{console.error("[Scout] Failed to send error:",s.message)})}}function l(e={},t={}){r={...r,...e},n={...n,...t},process.on("uncaughtException",s=>{c({type:"uncaughtException",message:s.message,stack:s.stack,errorTrace:s.stack,timestamp:new Date().toISOString(),...r})}),process.on("unhandledRejection",s=>{c({type:"unhandledRejection",message:s?.message||"Unhandled Promise Rejection",stack:s?.stack||"No stack trace",errorTrace:s?.stack||"No stack trace",timestamp:new Date().toISOString(),...r})})}function m(e,t,s,d){let u={type:"expressError",message:e.message,stack:n.captureStackTrace?e.stack:void 0,errorTrace:n.captureStackTrace?e.stack:void 0,path:t.originalUrl,method:t.method,params:t.params,query:t.query,headers:n.captureRequestDetails?t.headers:void 0,timestamp:new Date().toISOString(),...r};n.captureUserDetails&&t.user&&(u.user={id:t.user.id||t.user._id,email:t.user.email,name:t.user.name||t.user.username}),c(u),s.status(500).json({error:"Internal Server Error"})}function g(e){i=e}function f(e){a={...a,...e}}function k(e,t){a[e]=t}function h(e){o.push({timestamp:Date.now(),...e}),o.length>p&&o.shift()}function S(e,t={}){let s={type:"manual",message:e?.message||String(e),stack:e?.stack,errorTrace:e?.stack,timestamp:new Date().toISOString(),...r};Object.keys(t).length&&(s.context={...a,...t}),c(s)}export{h as addBreadcrumb,S as captureError,m as errorHandlingMiddleware,l as initTracker,f as setContext,k as setTag,g as setUser};
2
2
  //# sourceMappingURL=node.js.map
package/dist/react.cjs CHANGED
@@ -1,5 +1,5 @@
1
- var v=Object.create;var c=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var k=Object.getPrototypeOf,_=Object.prototype.hasOwnProperty;var b=(e,r)=>{for(var t in r)c(e,t,{get:r[t],enumerable:!0})},f=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of S(r))!_.call(e,o)&&o!==t&&c(e,o,{get:()=>r[o],enumerable:!(n=y(r,o))||n.enumerable});return e};var I=(e,r,t)=>(t=e!=null?v(k(e)):{},f(r||!e||!e.__esModule?c(t,"default",{value:e,enumerable:!0}):t,e)),T=e=>f(c({},"__esModule",{value:!0}),e);var O={};b(O,{ScoutErrorBoundary:()=>d});module.exports=T(O);var E=I(require("react"),1);var R={trackUserInteractions:!0,selfHealingErrors:!1,attachStacktrace:!0,handleSourceMaps:!1,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},a={...R},C={environment:typeof window<"u"&&window.location?.hostname==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.2.3",project:null,release:null,version:null,app:null},p={clicks:0,scrolls:0},l=null;var g=null,m={},M=[];var h=console.log;function u(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function x(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",u("user")),localStorage.getItem("__scoutUserId")),r=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",u("session")),sessionStorage.getItem("__scoutSessionId"));return l=l||u("pageload"),{pageloadId:l,userId:e,sessionId:r}}function L(){if(window._uaParserResult?.browser?.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return[{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))?.n||"Unknown"}function D(){if(window._uaParserResult?.os?.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return[{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))?.n||"Unknown"}function P(){let e=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return{connectionType:e?e.effectiveType:"unknown",userAgent:navigator.userAgent,width:window.innerWidth,height:window.innerHeight,screenWidth:screen.width,screenHeight:screen.height,errorTimestamp:Date.now(),timeLocale:Intl.DateTimeFormat().resolvedOptions().timeZone,browserLocale:navigator.language||navigator.userLanguage,sessionTime:Math.round(performance.now()/1e3),deviceMemory:navigator.deviceMemory||"unknown",timezoneOffset:new Date().getTimezoneOffset(),cookiesEnabled:navigator.cookieEnabled,url:window.location.href,host:window.location.host,referrer:document.referrer,browser:L(),browserVersion:window._uaParserResult?.browser?.version||null,os:D(),osVersion:window._uaParserResult?.os?.version||null,deviceType:window._uaParserResult?.device?.type||null,deviceModel:window._uaParserResult?.device?.model||null,deviceVendor:window._uaParserResult?.device?.vendor||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:p.clicks,userScrolls:p.scrolls}}function U(e,r){let t=new AbortController,n=setTimeout(()=>t.abort(),5e3),o={"Content-Type":"application/json"};return a.token&&(o["X-Ingest-Token"]=a.token),fetch(e,{method:"POST",headers:o,body:JSON.stringify(r),signal:t.signal}).then(s=>(clearTimeout(n),s)).catch(()=>{clearTimeout(n)})}async function A(e){let r=a.browserDetails?P():{},t=Object.assign(e,r,C,x());if(g&&(t.user=g),Object.keys(m).length&&(t.context={...m}),t.breadcrumbs=M.slice(),a.sampleRate&&Math.random()<1-parseFloat(a.sampleRate)){a.debug&&h("[Scout] Suppressed by sampling");return}if(a.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let n=e.errorTrace.split(`
1
+ var C=Object.create;var u=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var L=Object.getPrototypeOf,I=Object.prototype.hasOwnProperty;var T=(e,t)=>{for(var r in t)u(e,r,{get:t[r],enumerable:!0})},w=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of b(t))!I.call(e,o)&&o!==r&&u(e,o,{get:()=>t[o],enumerable:!(n=R(t,o))||n.enumerable});return e};var x=(e,t,r)=>(r=e!=null?C(L(e)):{},w(t||!e||!e.__esModule?u(r,"default",{value:e,enumerable:!0}):r,e)),U=e=>w(u({},"__esModule",{value:!0}),e);var B={};T(B,{ScoutErrorBoundary:()=>p});module.exports=U(B);var _=x(require("react"),1);var D={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},a={...D},P={environment:typeof window<"u"&&window.location?.hostname==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.2.4",project:null,release:null,version:null,app:null},S={clicks:0,scrolls:0},d=null;var v=null,E={},A=[];var y=console.log;function f(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function N(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",f("user")),localStorage.getItem("__scoutUserId")),t=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",f("session")),sessionStorage.getItem("__scoutSessionId"));return d=d||f("pageload"),{pageloadId:d,userId:e,sessionId:t}}function O(){if(window._uaParserResult?.browser?.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return[{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))?.n||"Unknown"}function $(){if(window._uaParserResult?.os?.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return[{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))?.n||"Unknown"}function 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:O(),browserVersion:window._uaParserResult?.browser?.version||null,os:$(),osVersion:window._uaParserResult?.os?.version||null,deviceType:window._uaParserResult?.device?.type||null,deviceModel:window._uaParserResult?.device?.model||null,deviceVendor:window._uaParserResult?.device?.vendor||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:S.clicks,userScrolls:S.scrolls}}function H(e,t){let r=new AbortController,n=setTimeout(()=>r.abort(),5e3),o={"Content-Type":"application/json"};return a.token&&(o["X-Ingest-Token"]=a.token),fetch(e,{method:"POST",headers:o,body:JSON.stringify(t),signal:r.signal}).then(s=>(clearTimeout(n),s)).catch(()=>{clearTimeout(n)})}async function W(e,t,r){try{let n=await fetch(e);if(!n.ok)return null;let o=await n.text(),s=o.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),i=o.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),c;if(s)c=JSON.parse(atob(s[1]));else if(i){let M=new URL(i[1],e).href,h=await fetch(M);if(!h.ok)return null;c=await h.json()}else return null;if(!window.sourceMap?.SourceMapConsumer)return null;let l=new window.sourceMap.SourceMapConsumer(c).originalPositionFor({line:t,column:r});if(!l.source)return null;let g=c.sources.indexOf(l.source),m=null;return c.sourcesContent&&c.sourcesContent[g]&&(m=c.sourcesContent[g]),{originalSource:l.source,originalLine:l.line,originalColumn:l.column,originalName:l.name,snippet:m}}catch{return null}}async function X(e){let t=a.browserDetails?F():{},r=Object.assign(e,t,P,N());if(v&&(r.user=v),Object.keys(E).length&&(r.context={...E}),r.breadcrumbs=A.slice(),a.sampleRate&&Math.random()<1-parseFloat(a.sampleRate)){a.debug&&y("[Scout] Suppressed by sampling");return}if(a.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let n=e.errorTrace.split(`
2
2
  `),o=[n[0]];for(let s=1;s<n.length;s++)!n[s].includes("/scout")&&!n[s].includes("scout.js")&&!n[s].includes("scout-error")&&o.push(n[s]);o.length>1&&(e.errorTrace=o.join(`
3
3
  `))}catch{}if((e.errorTrace||e.stack)&&!e.source)try{let n=e.errorTrace||e.stack,o=n?n.split(`
4
- `):[];for(let s=1;s<o.length;s++){let i=o[s].trim().match(/(http.*?):(\d+):(\d+)/);if(i){e.source=i[1],e.lineno=parseInt(i[2],10),e.colno=parseInt(i[3],10);break}}}catch{}a.debug&&h("[Scout] Sending:",t),a.endpoint&&U(a.endpoint,t)}function w(e){a.enabled&&A(e)}var d=class extends E.default.Component{constructor(r){super(r),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(r,t){w({message:r.message,stack:r.stack,errorTrace:r.stack,component:t?.componentStack||"",type:"react-error-boundary"})}render(){return this.state.hasError?this.props.fallback||null:this.props.children}};
4
+ `):[];for(let s=1;s<o.length;s++){let i=o[s].trim().match(/(http.*?):(\d+):(\d+)/);if(i){e.source=i[1],e.lineno=parseInt(i[2],10),e.colno=parseInt(i[3],10);break}}}catch{}if(a.handleSourceMaps&&e.source&&e.lineno)try{let n=await W(e.source,e.lineno,e.colno||0);n&&(r.originalSource=n.originalSource,r.originalLine=n.originalLine,r.originalColumn=n.originalColumn,r.originalName=n.originalName,r.highlightLineNumber=n.originalLine,n.snippet&&(r.snippet=n.snippet))}catch{}a.debug&&y("[Scout] Sending:",r),a.endpoint&&H(a.endpoint,r)}function k(e){a.enabled&&X(e)}var p=class extends _.default.Component{constructor(t){super(t),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(t,r){k({message:t.message,stack:t.stack,errorTrace:t.stack,component:r?.componentStack||"",type:"react-error-boundary"})}render(){return this.state.hasError?this.props.fallback||null:this.props.children}};
5
5
  //# sourceMappingURL=react.cjs.map