scout-error 0.3.2 → 0.3.3

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/cli.js CHANGED
@@ -1,38 +1,14 @@
1
1
  #!/usr/bin/env node
2
- import{readFileSync as P,writeFileSync as $,mkdirSync as S,readdirSync as O,unlinkSync as g,existsSync as h,renameSync as J,rmdirSync as M}from"fs";import{join as c}from"path";import{homedir as G}from"os";import{createInterface as H}from"readline";var j=".scout",D=".scout/errors",q=".scout/issues",B=".scout/archive",W=".bugs",K=/^[0-9a-f]{8}\.md$/,k=/^\d+\.md$/,T=".scout.json",y=c(G(),".scout.json");function U(e){if(!h(e))return null;try{return JSON.parse(P(e,"utf8"))}catch(s){console.error(`Error parsing ${e}: ${s.message}`),process.exit(1)}}function I({requireProject:e=!0}={}){let s=U(y)||{},t=U(c(process.cwd(),T))||{},o={...s,...t};process.env.SCOUT_USERNAME&&(o.username=process.env.SCOUT_USERNAME),process.env.SCOUT_PASSWORD&&(o.password=process.env.SCOUT_PASSWORD),process.env.SCOUT_ENDPOINT&&(o.endpoint=process.env.SCOUT_ENDPOINT),process.env.SCOUT_PROJECT&&(o.project=process.env.SCOUT_PROJECT);let n=[];return o.endpoint||n.push("endpoint"),o.username||n.push("username"),o.password||n.push("password"),e&&!o.project&&n.push("project"),n.length&&(console.error(`Missing config: ${n.join(", ")}`),console.error(`
3
- Run \`scout init\` to set up, or edit ${y} / ${T}`),process.exit(1)),o}function V(){return H({input:process.stdin,output:process.stdout})}function N(e,s){return new Promise(t=>e.question(s,o=>t(o.trim())))}async function v(e,s,t){let o=t?` [${t}]`:"";return await N(e,`${s}${o}: `)||t||""}async function X(e,s,t=!0){let n=(await N(e,`${s}${t?" [Y/n]":" [y/N]"}: `)).toLowerCase();return n?n==="y"||n==="yes":t}function b(e){return{"X-Username":e.username,"X-Password":e.password}}async function R(e,s){let t=`${e.endpoint.replace(/\/$/,"")}${s}`,o;try{o=await fetch(t,{headers:b(e)})}catch(r){console.error(`Could not connect to ${e.endpoint}. Check the endpoint URL.`),console.error(r.message),process.exit(1)}o.status===401&&(console.error("Authentication failed. Check your username and password."),process.exit(1)),o.ok||(console.error(`Server error: ${o.status} ${o.statusText}`),process.exit(1));let n=o.headers.get("content-type")||"";if(!n.includes("application/json")){let r=new Error(`Expected JSON from ${s}, got ${n||"unknown"} \u2014 is your Scout server up to date?`);throw r.code="NOT_JSON",r}return await o.json()}async function L(e,s,t){let o=`${e.endpoint.replace(/\/$/,"")}/issues/${encodeURIComponent(s)}`,n;try{n=await fetch(o,{method:"PATCH",headers:{"Content-Type":"application/json",...b(e)},body:JSON.stringify(t)})}catch(r){console.error(`Could not connect to ${e.endpoint}. ${r.message}`),process.exit(1)}return n.status===401&&(console.error("Authentication failed."),process.exit(1)),n.status===404&&(console.error(`Issue #${s} not found`),process.exit(1)),n.ok||(console.error(`Server error: ${n.status} ${n.statusText}`),process.exit(1)),await n.json()}async function Y(e){return R(e,`/errors?project=${encodeURIComponent(e.project)}`)}async function z(e){return R(e,`/issues?project=${encodeURIComponent(e.project)}&status=all`)}async function Q(e){return R(e,"/projects?showHidden=true")}function Z(e){let s=e.events[0]||{},t=e.combinedFields||{},o=[],n=t.message||s.args||s.type||"Unknown Error";o.push(`# ${n}`),o.push(""),o.push(`- **Hash:** ${e.hash}`),o.push(`- **Project:** ${t.project||""}`),t.app&&t.app!==t.project&&o.push(`- **App:** ${t.app}`),o.push(`- **Count:** ${e.count} total, ${e.last24HoursCount} last 24h, ${e.last30DaysCount} last 30d`),o.push(`- **Users:** ${e.uniqueUserCount} unique`);let r=s.timestamp||s.errorTimestamp;if(r){let i=typeof r=="string"?r:new Date(r).toISOString();o.push(`- **Last seen:** ${i}`)}if(s.environment&&o.push(`- **Environment:** ${s.environment}`),s.type&&o.push(`- **Type:** ${s.type}`),s.url&&o.push(`- **URL:** ${s.url}`),s.context&&Object.keys(s.context).length>0){o.push(""),o.push("## Context");for(let[i,u]of Object.entries(s.context)){let p=typeof u=="object"?JSON.stringify(u):String(u);o.push(`- **${i}:** ${p}`)}}let d=t.errorTrace||s.stack||s.errorTrace;if(d&&(o.push(""),o.push("## Stack Trace"),o.push("```"),o.push(d),o.push("```")),o.push(""),o.push("## Latest Event"),s.sdk==="node"?(s.method&&s.path&&o.push(`- **Endpoint:** ${s.method} ${s.path}`),s.nodeVersion&&o.push(`- **Node.js:** ${s.nodeVersion}`),s.platform&&o.push(`- **Platform:** ${s.platform}/${s.arch||""}`)):(s.browser&&o.push(`- **Browser:** ${s.browser}`),s.os&&o.push(`- **OS:** ${s.os}`)),s.user&&typeof s.user=="object"){let i=s.user.name||s.user.email||s.user.id;i&&o.push(`- **User:** ${i}`)}return s.sdk&&o.push(`- **SDK:** ${s.sdk} ${s.sdkVersion||""}`.trim()),o.push(""),o.join(`
4
- `)}function x(e){if(!e)return null;try{return new Date(e).toISOString()}catch{return null}}function ee(e){let s=[];s.push(`# ${e.title}`),s.push(""),s.push(`- **ID:** #${e.id}`),s.push(`- **Type:** ${e.type}`),s.push(`- **Status:** ${e.status}`),s.push(`- **Author:** ${e.author}`),s.push(`- **Project:** ${e.project}`);let t=x(e.createdAt);t&&s.push(`- **Created:** ${t}`);let o=x(e.updatedAt);if(o&&s.push(`- **Updated:** ${o}`),e.status==="closed"){let n=x(e.closedAt);n&&s.push(`- **Closed:** ${n}`)}return s.push(""),s.push("---"),s.push(""),s.push(e.description||"_No description._"),s.push(""),s.join(`
5
- `)}function se(){let e=c(process.cwd(),W);if(!h(e))return;let s=c(process.cwd(),D);S(s,{recursive:!0});let t=0;for(let o of O(e)){if(o==="CLAUDE.md"){g(c(e,o));continue}let n=c(e,o),r=c(s,o);h(r)?g(n):(J(n,r),t++)}try{M(e)}catch{}console.log(`Migrated ${t} file(s) from .bugs/ to .scout/errors/`)}function oe(e){let s=c(process.cwd(),D);S(s,{recursive:!0});let t=new Set,o=0,n=0,r=0;for(let i of e){let u=i.hash.slice(0,8)+".md";t.add(u);let p=c(s,u),f=Z(i);h(p)?P(p,"utf8")!==f?($(p,f),n++):r++:($(p,f),o++)}let d=0;for(let i of O(s))K.test(i)&&!t.has(i)&&(g(c(s,i)),d++);console.log(`Errors: ${e.length} synced (${o} new, ${n} updated, ${r} unchanged, ${d} removed)`)}function te(e){let s=c(process.cwd(),q),t=c(process.cwd(),B);S(s,{recursive:!0}),S(t,{recursive:!0});let o=new Set,n=new Set,r=0,d=0,i=0;for(let a of e){let m=`${a.id}.md`,l=ee(a),w=a.status==="closed"?t:s,E=a.status==="closed"?s:t;a.status==="closed"?n.add(m):o.add(m);let A=c(E,m);h(A)&&g(A);let C=c(w,m);h(C)?P(C,"utf8")!==l?($(C,l),d++):i++:($(C,l),r++)}let u=0;for(let a of O(s))k.test(a)&&!o.has(a)&&(g(c(s,a)),u++);for(let a of O(t))k.test(a)&&!n.has(a)&&(g(c(t,a)),u++);let p=e.filter(a=>a.status==="open").length,f=e.length-p;console.log(`Issues: ${e.length} synced (${p} open, ${f} closed; ${r} new, ${d} updated, ${i} unchanged, ${u} removed)`)}function F(){let e=`# Scout Tracking Directory
6
-
7
- Synced from Scout.js by \`scout sync\`.
8
-
9
- ## errors/
10
- Auto-captured production errors. Filename: \`{8-char-hash}.md\`.
11
- Focus on high recent counts. Files are overwritten on sync.
12
-
13
- ## issues/
14
- Open human-filed tickets (bug, feature, task). Filename: \`{id}.md\`.
15
- After landing a fix: \`scout close <id>\`.
16
-
17
- ## archive/
18
- Closed issues \u2014 reference only.
19
-
20
- ## Rules
21
- 1. **Do NOT edit** files in errors/, issues/, or archive/ \u2014 they get overwritten on sync
22
- 2. Keep investigation notes in separate files (e.g., \`issues/42.notes.md\`) \u2014 those are yours
23
- 3. Managed files match \`{8-char-hash}.md\` or \`{digit}.md\` in their respective dirs
24
- 4. Everything else in this directory is yours
25
-
26
- ## Commands
27
- - \`scout sync\` \u2014 refresh errors and issues
28
- - \`scout close <id>\` / \`scout reopen <id>\` \u2014 change issue state
29
- `;S(c(process.cwd(),j),{recursive:!0});let s=c(process.cwd(),j,"AGENTS.md");h(s)||$(s,e);let t=c(process.cwd(),j,"CLAUDE.md");if(h(t))try{g(t)}catch{}}async function ne(){let e=V();try{console.log(`Scout setup
30
- `);let s=U(y)||{},t=U(c(process.cwd(),T))||{},{endpoint:o,username:n,password:r}=s;o&&n&&r&&(console.log(`Using saved credentials from ${y}`),console.log(` endpoint: ${o}`),console.log(` username: ${n}`),await X(e,"Use these credentials?",!0)||(o=null,n=null,r=null)),(!o||!n||!r)&&(o=await v(e,"Scout endpoint URL",o||t.endpoint||"https://admin.scoutjs.com"),n=await v(e,"Username",n||t.username||"scout"),r=await v(e,"Password",r||t.password||""),(!o||!n||!r)&&(console.error(`
31
- endpoint, username, and password are required.`),process.exit(1)),$(y,JSON.stringify({endpoint:o,username:n,password:r},null,2)),console.log(`Saved credentials to ${y}`));let d={endpoint:o,username:n,password:r};console.log(`
32
- Fetching projects...`);let i=await Q(d);i.sort((l,w)=>(l.project||"").localeCompare(w.project||"")),console.log(`
33
- Select a project:`),console.log(" 1) New Project (enter name)"),i.forEach((l,w)=>{let E=l.hidden?" (hidden)":"";console.log(` ${w+2}) ${l.project}${E}`)});let u=t.project&&i.findIndex(l=>l.project===t.project)+2||"",p=await v(e,`
34
- Choice`,u?String(u):""),f=parseInt(p,10),a;f===1?(a=await N(e,"Project name: "),a||(console.error("Project name required."),process.exit(1))):f>=2&&f-2<i.length?a=i[f-2].project:(console.error("Invalid choice."),process.exit(1));let m=c(process.cwd(),T);$(m,JSON.stringify({project:a},null,2)),console.log(`
35
- Saved project to ${m}`),F(),console.log("Created .scout/AGENTS.md"),console.log("\nRun `scout sync` to pull errors and issues into .scout/")}finally{e.close()}}async function re(){let e=I();se();let s=c(process.cwd(),j),t=!h(s);S(s,{recursive:!0}),t&&console.log("Tip: Add .scout/ to your .gitignore"),console.log(`Fetching errors for project "${e.project}"...`);let o=await Y(e);oe(o),console.log(`Fetching issues for project "${e.project}"...`);try{let r=await z(e);te(r)}catch(r){r.code==="NOT_JSON"?console.error(`Issues: skipped \u2014 ${r.message}`):console.error(`Issues: skipped \u2014 ${r.message}`)}let n=c(process.cwd(),j,"AGENTS.md");h(n)||F()}async function ce(e){e||(console.error("Usage: scout close <id>"),process.exit(1));let s=I({requireProject:!1});await L(s,e,{status:"closed"}),console.log(`Closed issue #${e}`)}async function ie(e){e||(console.error("Usage: scout reopen <id>"),process.exit(1));let s=I({requireProject:!1});await L(s,e,{status:"open"}),console.log(`Reopened issue #${e}`)}function _(){console.log(`scout-error \u2014 Sync errors and issues to local .scout/
2
+ import{readFileSync as I,writeFileSync as y,mkdirSync as w,readdirSync as x,unlinkSync as g,existsSync as h,renameSync as J,rmdirSync as q}from"fs";import{join as c}from"path";import{homedir as G}from"os";import{createInterface as M}from"readline";var j=".scout",_=".scout/errors",H=".scout/issues",B=".scout/archive",W=".bugs",Y=/^[0-9a-f]{8}\.md$/,A=/^\d+\.md$/,O=".scout.json",$=c(G(),".scout.json");function E(e){if(!h(e))return null;try{return JSON.parse(I(e,"utf8"))}catch(s){console.error(`Error parsing ${e}: ${s.message}`),process.exit(1)}}function k({requireProject:e=!0}={}){let s=E($)||{},t=E(c(process.cwd(),O))||{},o={...s,...t};process.env.SCOUT_USERNAME&&(o.username=process.env.SCOUT_USERNAME),process.env.SCOUT_PASSWORD&&(o.password=process.env.SCOUT_PASSWORD),process.env.SCOUT_ENDPOINT&&(o.endpoint=process.env.SCOUT_ENDPOINT),process.env.SCOUT_PROJECT&&(o.project=process.env.SCOUT_PROJECT);let r=[];return o.endpoint||r.push("endpoint"),o.username||r.push("username"),o.password||r.push("password"),e&&!o.project&&r.push("project"),r.length&&(console.error(`Missing config: ${r.join(", ")}`),console.error(`
3
+ Run \`scout init\` to set up, or edit ${$} / ${O}`),process.exit(1)),o}function z(){return M({input:process.stdin,output:process.stdout})}function R(e,s){return new Promise(t=>e.question(s,o=>t(o.trim())))}async function C(e,s,t){let o=t?` [${t}]`:"";return await R(e,`${s}${o}: `)||t||""}async function K(e,s,t=!0){let r=(await R(e,`${s}${t?" [Y/n]":" [y/N]"}: `)).toLowerCase();return r?r==="y"||r==="yes":t}function b(e){return{"X-Username":e.username,"X-Password":e.password}}async function P(e,s){let t=`${e.endpoint.replace(/\/$/,"")}${s}`,o;try{o=await fetch(t,{headers:b(e)})}catch(n){console.error(`Could not connect to ${e.endpoint}. Check the endpoint URL.`),console.error(n.message),process.exit(1)}o.status===401&&(console.error("Authentication failed. Check your username and password."),process.exit(1)),o.ok||(console.error(`Server error: ${o.status} ${o.statusText}`),process.exit(1));let r=o.headers.get("content-type")||"";if(!r.includes("application/json")){let n=new Error(`Expected JSON from ${s}, got ${r||"unknown"} \u2014 is your Scout server up to date?`);throw n.code="NOT_JSON",n}return await o.json()}async function L(e,s,t){let o=`${e.endpoint.replace(/\/$/,"")}/issues/${encodeURIComponent(s)}`,r;try{r=await fetch(o,{method:"PATCH",headers:{"Content-Type":"application/json",...b(e)},body:JSON.stringify(t)})}catch(n){console.error(`Could not connect to ${e.endpoint}. ${n.message}`),process.exit(1)}return r.status===401&&(console.error("Authentication failed."),process.exit(1)),r.status===404&&(console.error(`Issue #${s} not found`),process.exit(1)),r.ok||(console.error(`Server error: ${r.status} ${r.statusText}`),process.exit(1)),await r.json()}async function V(e){return P(e,`/errors?project=${encodeURIComponent(e.project)}`)}async function X(e){return P(e,`/issues?project=${encodeURIComponent(e.project)}&status=all`)}async function Q(e){return P(e,"/projects?showHidden=true")}function Z(e){let s=e.events[0]||{},t=e.combinedFields||{},o=[],r=t.message||s.args||s.type||"Unknown Error";o.push(`# ${r}`),o.push(""),o.push(`- **Hash:** ${e.hash}`),o.push(`- **Project:** ${t.project||""}`),t.app&&t.app!==t.project&&o.push(`- **App:** ${t.app}`),o.push(`- **Count:** ${e.count} total, ${e.last24HoursCount} last 24h, ${e.last30DaysCount} last 30d`),o.push(`- **Users:** ${e.uniqueUserCount} unique`);let n=s.timestamp||s.errorTimestamp;if(n){let i=typeof n=="string"?n:new Date(n).toISOString();o.push(`- **Last seen:** ${i}`)}if(s.environment&&o.push(`- **Environment:** ${s.environment}`),s.type&&o.push(`- **Type:** ${s.type}`),s.url&&o.push(`- **URL:** ${s.url}`),s.context&&Object.keys(s.context).length>0){o.push(""),o.push("## Context");for(let[i,u]of Object.entries(s.context)){let p=typeof u=="object"?JSON.stringify(u):String(u);o.push(`- **${i}:** ${p}`)}}let l=t.errorTrace||s.stack||s.errorTrace;if(l&&(o.push(""),o.push("## Stack Trace"),o.push("```"),o.push(l),o.push("```")),o.push(""),o.push("## Latest Event"),s.sdk==="node"?(s.method&&s.path&&o.push(`- **Endpoint:** ${s.method} ${s.path}`),s.nodeVersion&&o.push(`- **Node.js:** ${s.nodeVersion}`),s.platform&&o.push(`- **Platform:** ${s.platform}/${s.arch||""}`)):(s.browser&&o.push(`- **Browser:** ${s.browser}`),s.os&&o.push(`- **OS:** ${s.os}`)),s.user&&typeof s.user=="object"){let i=s.user.name||s.user.email||s.user.id;i&&o.push(`- **User:** ${i}`)}return s.sdk&&o.push(`- **SDK:** ${s.sdk} ${s.sdkVersion||""}`.trim()),o.push(""),o.join(`
4
+ `)}function U(e){if(!e)return null;try{return new Date(e).toISOString()}catch{return null}}function ee(e){let s=[];s.push(`# ${e.title}`),s.push(""),s.push(`- **ID:** #${e.id}`),s.push(`- **Type:** ${e.type}`),s.push(`- **Status:** ${e.status}`),s.push(`- **Author:** ${e.author}`),s.push(`- **Project:** ${e.project}`);let t=U(e.createdAt);t&&s.push(`- **Created:** ${t}`);let o=U(e.updatedAt);if(o&&s.push(`- **Updated:** ${o}`),e.status==="closed"){let r=U(e.closedAt);r&&s.push(`- **Closed:** ${r}`)}return s.push(""),s.push("---"),s.push(""),s.push(e.description||"_No description._"),s.push(""),s.join(`
5
+ `)}function se(){let e=c(process.cwd(),W);if(!h(e))return;let s=c(process.cwd(),_);w(s,{recursive:!0});let t=0;for(let o of x(e)){if(o==="CLAUDE.md"){g(c(e,o));continue}let r=c(e,o),n=c(s,o);h(n)?g(r):(J(r,n),t++)}try{q(e)}catch{}console.log(`Migrated ${t} file(s) from .bugs/ to .scout/errors/`)}function oe(e){let s=c(process.cwd(),_);w(s,{recursive:!0});let t=new Set,o=0,r=0,n=0;for(let i of e){let u=i.hash.slice(0,8)+".md";t.add(u);let p=c(s,u),f=Z(i);h(p)?I(p,"utf8")!==f?(y(p,f),r++):n++:(y(p,f),o++)}let l=0;for(let i of x(s))Y.test(i)&&!t.has(i)&&(g(c(s,i)),l++);console.log(`Errors: ${e.length} synced (${o} new, ${r} updated, ${n} unchanged, ${l} removed)`)}function te(e){let s=c(process.cwd(),H),t=c(process.cwd(),B);w(s,{recursive:!0}),w(t,{recursive:!0});let o=new Set,r=new Set,n=0,l=0,i=0;for(let a of e){let m=`${a.id}.md`,d=ee(a),S=a.status==="closed"?t:s,T=a.status==="closed"?s:t;a.status==="closed"?r.add(m):o.add(m);let N=c(T,m);h(N)&&g(N);let v=c(S,m);h(v)?I(v,"utf8")!==d?(y(v,d),l++):i++:(y(v,d),n++)}let u=0;for(let a of x(s))A.test(a)&&!o.has(a)&&(g(c(s,a)),u++);for(let a of x(t))A.test(a)&&!r.has(a)&&(g(c(t,a)),u++);let p=e.filter(a=>a.status==="open").length,f=e.length-p;console.log(`Issues: ${e.length} synced (${p} open, ${f} closed; ${n} new, ${l} updated, ${i} unchanged, ${u} removed)`)}function F(){let e="# Scout Tracking Directory\n\nSynced from Scout.js by `scout sync`. Contains **errors** (auto-captured from production) and **issues** (human-filed tickets) for this project. Your job is to work through them and improve the app.\n\n## Layout\n\n- `errors/` \u2014 production errors captured by the Scout SDK. Filename: `{8-char-hash}.md`.\n- `issues/` \u2014 open human-filed tickets (bug, feature, task). Filename: `{id}.md`.\n- `archive/` \u2014 closed issues, reference only.\n\n## Workflow: errors\n\n1. **Prioritize** by recent activity \u2014 errors with high `last 24h` counts or many unique users are most impactful.\n2. **Investigate:**\n - Read the stack trace. If a GitHub URL is included for a frame, open it to see the source.\n - Otherwise find the matching file/line in this repo.\n - Check the **Context** section for developer-set tags (e.g. `fn`, `step`, `route`) \u2014 these are often the most useful clues.\n - Check **Breadcrumbs** for what the user did leading up to the error.\n3. **Decide one of three actions:**\n - **Fix** \u2014 land the fix, run tests, commit. Resolved errors disappear from `errors/` on the next sync automatically.\n - **Filter** \u2014 if the error isn't actionable (third-party noise, intentional, unfixable browser quirks), add a pattern to the `ignoreErrors` array in the `Scout.init` call. Accepts string substrings or RegExp:\n ```js\n Scout.init({ ... }, {\n endpoint: '...',\n ignoreErrors: [\n /ResizeObserver loop/,\n 'NetworkError when attempting to fetch',\n ],\n })\n ```\n Filtered errors are dropped client-side and won't reach the server.\n - **Document** \u2014 if you can't determine the cause, create `errors/{hash}.notes.md` with your findings so a human can follow up.\n\n## Workflow: issues\n\n1. Read the issue description. Bug reports, feature requests, or tasks.\n2. **Implement** \u2014 investigate, make changes, run tests.\n3. **Commit** with reference (e.g. `fix #42: ...`).\n4. **Close** \u2014 run `scout close <id>` once the fix is landed. The file moves to `archive/` on next sync.\n5. If unclear, leave `issues/{id}.notes.md` with questions \u2014 don't edit the issue description (it's overwritten on sync).\n\n## Rules\n\n1. **Do NOT edit** managed files in `errors/`, `issues/`, or `archive/` \u2014 they are overwritten on each sync.\n2. Investigation notes belong in **separate** files:\n - `errors/{hash}.notes.md` \u2014 your findings on an error\n - `issues/{id}.notes.md` \u2014 your work on an issue\n - These are yours; sync never touches them.\n3. Managed filenames: `{8-char-hash}.md` for errors, `{digit}.md` for issues. Anything else is safe.\n\n## Scope\n\n- Focus on this project's code. Don't patch node_modules or third-party scripts.\n- If an error originates in a third party, investigate whether your calling code is misusing it; if not, filter it via `ignoreErrors`.\n- Prefer fixing root causes over suppressing symptoms. Reserve `ignoreErrors` for true noise.\n\n## Commands\n\n- `scout sync` \u2014 refresh errors and issues from the Scout server\n- `scout close <id>` \u2014 close an issue (after landing a fix)\n- `scout reopen <id>` \u2014 reopen a closed issue\n";w(c(process.cwd(),j),{recursive:!0});let s=c(process.cwd(),j,"AGENTS.md");h(s)||y(s,e);let t=c(process.cwd(),j,"CLAUDE.md");if(h(t))try{g(t)}catch{}}async function re(){let e=z();try{console.log(`Scout setup
6
+ `);let s=E($)||{},t=E(c(process.cwd(),O))||{},{endpoint:o,username:r,password:n}=s;o&&r&&n&&(console.log(`Using saved credentials from ${$}`),console.log(` endpoint: ${o}`),console.log(` username: ${r}`),await K(e,"Use these credentials?",!0)||(o=null,r=null,n=null)),(!o||!r||!n)&&(o=await C(e,"Scout endpoint URL",o||t.endpoint||"https://admin.scoutjs.com"),r=await C(e,"Username",r||t.username||"scout"),n=await C(e,"Password",n||t.password||""),(!o||!r||!n)&&(console.error(`
7
+ endpoint, username, and password are required.`),process.exit(1)),y($,JSON.stringify({endpoint:o,username:r,password:n},null,2)),console.log(`Saved credentials to ${$}`));let l={endpoint:o,username:r,password:n};console.log(`
8
+ Fetching projects...`);let i=await Q(l);i.sort((d,S)=>(d.project||"").localeCompare(S.project||"")),console.log(`
9
+ Select a project:`),console.log(" 1) New Project (enter name)"),i.forEach((d,S)=>{let T=d.hidden?" (hidden)":"";console.log(` ${S+2}) ${d.project}${T}`)});let u=t.project&&i.findIndex(d=>d.project===t.project)+2||"",p=await C(e,`
10
+ Choice`,u?String(u):""),f=parseInt(p,10),a;f===1?(a=await R(e,"Project name: "),a||(console.error("Project name required."),process.exit(1))):f>=2&&f-2<i.length?a=i[f-2].project:(console.error("Invalid choice."),process.exit(1));let m=c(process.cwd(),O);y(m,JSON.stringify({project:a},null,2)),console.log(`
11
+ Saved project to ${m}`),F(),console.log("Created .scout/AGENTS.md"),console.log("\nRun `scout sync` to pull errors and issues into .scout/")}finally{e.close()}}async function ne(){let e=k();se();let s=c(process.cwd(),j),t=!h(s);w(s,{recursive:!0}),t&&console.log("Tip: Add .scout/ to your .gitignore"),console.log(`Fetching errors for project "${e.project}"...`);let o=await V(e);oe(o),console.log(`Fetching issues for project "${e.project}"...`);try{let n=await X(e);te(n)}catch(n){n.code==="NOT_JSON"?console.error(`Issues: skipped \u2014 ${n.message}`):console.error(`Issues: skipped \u2014 ${n.message}`)}let r=c(process.cwd(),j,"AGENTS.md");h(r)||F()}async function ce(e){e||(console.error("Usage: scout close <id>"),process.exit(1));let s=k({requireProject:!1});await L(s,e,{status:"closed"}),console.log(`Closed issue #${e}`)}async function ie(e){e||(console.error("Usage: scout reopen <id>"),process.exit(1));let s=k({requireProject:!1});await L(s,e,{status:"open"}),console.log(`Reopened issue #${e}`)}function D(){console.log(`scout-error \u2014 Sync errors and issues to local .scout/
36
12
 
37
13
  Usage:
38
14
  scout init Configure credentials and select a project
@@ -47,6 +23,6 @@ Config files:
47
23
 
48
24
  Environment variables override both:
49
25
  SCOUT_ENDPOINT, SCOUT_USERNAME, SCOUT_PASSWORD, SCOUT_PROJECT
50
- `)}async function ae(){let e=process.argv[2];(!e||e==="help"||e==="--help"||e==="-h")&&(_(),process.exit(0)),e==="init"?await ne():e==="sync"?await re():e==="close"?await ce(process.argv[3]):e==="reopen"?await ie(process.argv[3]):(console.error(`Unknown command: ${e}
51
- `),_(),process.exit(1))}ae().catch(e=>{console.error(e.message),process.exit(1)});
26
+ `)}async function ae(){let e=process.argv[2];(!e||e==="help"||e==="--help"||e==="-h")&&(D(),process.exit(0)),e==="init"?await re():e==="sync"?await ne():e==="close"?await ce(process.argv[3]):e==="reopen"?await ie(process.argv[3]):(console.error(`Unknown command: ${e}
27
+ `),D(),process.exit(1))}ae().catch(e=>{console.error(e.message),process.exit(1)});
52
28
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/cli.js"],
4
- "sourcesContent": ["import { readFileSync, writeFileSync, mkdirSync, readdirSync, unlinkSync, existsSync, renameSync, rmdirSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { createInterface } from 'readline'\n\n// --- Paths ---\n\nconst SCOUT_DIR = '.scout'\nconst ERRORS_DIR = '.scout/errors'\nconst ISSUES_DIR = '.scout/issues'\nconst ARCHIVE_DIR = '.scout/archive'\nconst LEGACY_BUGS_DIR = '.bugs'\n\nconst HASH_FILE_PATTERN = /^[0-9a-f]{8}\\.md$/\nconst ISSUE_FILE_PATTERN = /^\\d+\\.md$/\n\nconst LOCAL_CONFIG = '.scout.json'\nconst GLOBAL_CONFIG = join(homedir(), '.scout.json')\n\n// --- Config ---\n\nfunction readJson(path) {\n if (!existsSync(path)) return null\n try {\n return JSON.parse(readFileSync(path, 'utf8'))\n } catch (e) {\n console.error(`Error parsing ${path}: ${e.message}`)\n process.exit(1)\n }\n}\n\nfunction loadConfig({ requireProject = true } = {}) {\n const global = readJson(GLOBAL_CONFIG) || {}\n const local = readJson(join(process.cwd(), LOCAL_CONFIG)) || {}\n const config = { ...global, ...local }\n\n if (process.env.SCOUT_USERNAME) config.username = process.env.SCOUT_USERNAME\n if (process.env.SCOUT_PASSWORD) config.password = process.env.SCOUT_PASSWORD\n if (process.env.SCOUT_ENDPOINT) config.endpoint = process.env.SCOUT_ENDPOINT\n if (process.env.SCOUT_PROJECT) config.project = process.env.SCOUT_PROJECT\n\n const missing = []\n if (!config.endpoint) missing.push('endpoint')\n if (!config.username) missing.push('username')\n if (!config.password) missing.push('password')\n if (requireProject && !config.project) missing.push('project')\n\n if (missing.length) {\n console.error(`Missing config: ${missing.join(', ')}`)\n console.error(`\\nRun \\`scout init\\` to set up, or edit ${GLOBAL_CONFIG} / ${LOCAL_CONFIG}`)\n process.exit(1)\n }\n\n return config\n}\n\n// --- Prompts ---\n\nfunction createPrompt() {\n return createInterface({ input: process.stdin, output: process.stdout })\n}\n\nfunction ask(rl, question) {\n return new Promise(resolve => rl.question(question, answer => resolve(answer.trim())))\n}\n\nasync function askWithDefault(rl, question, defaultValue) {\n const suffix = defaultValue ? ` [${defaultValue}]` : ''\n const answer = await ask(rl, `${question}${suffix}: `)\n return answer || defaultValue || ''\n}\n\nasync function askYesNo(rl, question, defaultYes = true) {\n const suffix = defaultYes ? ' [Y/n]' : ' [y/N]'\n const answer = (await ask(rl, `${question}${suffix}: `)).toLowerCase()\n if (!answer) return defaultYes\n return answer === 'y' || answer === 'yes'\n}\n\n// --- Fetch helpers ---\n\nfunction authHeaders(config) {\n return {\n 'X-Username': config.username,\n 'X-Password': config.password,\n }\n}\n\nasync function fetchJson(config, path) {\n const url = `${config.endpoint.replace(/\\/$/, '')}${path}`\n\n let response\n try {\n response = await fetch(url, { headers: authHeaders(config) })\n } catch (e) {\n console.error(`Could not connect to ${config.endpoint}. Check the endpoint URL.`)\n console.error(e.message)\n process.exit(1)\n }\n\n if (response.status === 401) {\n console.error('Authentication failed. Check your username and password.')\n process.exit(1)\n }\n\n if (!response.ok) {\n console.error(`Server error: ${response.status} ${response.statusText}`)\n process.exit(1)\n }\n\n // Detect HTML responses (e.g. SPA catch-all when endpoint doesn't exist server-side)\n const contentType = response.headers.get('content-type') || ''\n if (!contentType.includes('application/json')) {\n const err = new Error(`Expected JSON from ${path}, got ${contentType || 'unknown'} \u2014 is your Scout server up to date?`)\n err.code = 'NOT_JSON'\n throw err\n }\n\n return await response.json()\n}\n\nasync function patchIssue(config, id, patch) {\n const url = `${config.endpoint.replace(/\\/$/, '')}/issues/${encodeURIComponent(id)}`\n let res\n try {\n res = await fetch(url, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n ...authHeaders(config),\n },\n body: JSON.stringify(patch),\n })\n } catch (e) {\n console.error(`Could not connect to ${config.endpoint}. ${e.message}`)\n process.exit(1)\n }\n\n if (res.status === 401) {\n console.error('Authentication failed.')\n process.exit(1)\n }\n if (res.status === 404) {\n console.error(`Issue #${id} not found`)\n process.exit(1)\n }\n if (!res.ok) {\n console.error(`Server error: ${res.status} ${res.statusText}`)\n process.exit(1)\n }\n return await res.json()\n}\n\nasync function fetchErrors(config) {\n return fetchJson(config, `/errors?project=${encodeURIComponent(config.project)}`)\n}\n\nasync function fetchIssues(config) {\n return fetchJson(config, `/issues?project=${encodeURIComponent(config.project)}&status=all`)\n}\n\nasync function fetchProjects(config) {\n return fetchJson(config, '/projects?showHidden=true')\n}\n\n// --- Markdown rendering ---\n\nfunction renderErrorMarkdown(error) {\n const event = error.events[0] || {}\n const cf = error.combinedFields || {}\n const lines = []\n\n const title = cf.message || event.args || event.type || 'Unknown Error'\n lines.push(`# ${title}`)\n lines.push('')\n\n lines.push(`- **Hash:** ${error.hash}`)\n lines.push(`- **Project:** ${cf.project || ''}`)\n if (cf.app && cf.app !== cf.project) lines.push(`- **App:** ${cf.app}`)\n lines.push(`- **Count:** ${error.count} total, ${error.last24HoursCount} last 24h, ${error.last30DaysCount} last 30d`)\n lines.push(`- **Users:** ${error.uniqueUserCount} unique`)\n\n const lastSeen = event.timestamp || event.errorTimestamp\n if (lastSeen) {\n const ts = typeof lastSeen === 'string' ? lastSeen : new Date(lastSeen).toISOString()\n lines.push(`- **Last seen:** ${ts}`)\n }\n\n if (event.environment) lines.push(`- **Environment:** ${event.environment}`)\n if (event.type) lines.push(`- **Type:** ${event.type}`)\n if (event.url) lines.push(`- **URL:** ${event.url}`)\n\n if (event.context && Object.keys(event.context).length > 0) {\n lines.push('')\n lines.push('## Context')\n for (const [key, value] of Object.entries(event.context)) {\n const formatted = typeof value === 'object' ? JSON.stringify(value) : String(value)\n lines.push(`- **${key}:** ${formatted}`)\n }\n }\n\n const trace = cf.errorTrace || event.stack || event.errorTrace\n if (trace) {\n lines.push('')\n lines.push('## Stack Trace')\n lines.push('```')\n lines.push(trace)\n lines.push('```')\n }\n\n lines.push('')\n lines.push('## Latest Event')\n if (event.sdk === 'node') {\n if (event.method && event.path) lines.push(`- **Endpoint:** ${event.method} ${event.path}`)\n if (event.nodeVersion) lines.push(`- **Node.js:** ${event.nodeVersion}`)\n if (event.platform) lines.push(`- **Platform:** ${event.platform}/${event.arch || ''}`)\n } else {\n if (event.browser) lines.push(`- **Browser:** ${event.browser}`)\n if (event.os) lines.push(`- **OS:** ${event.os}`)\n }\n if (event.user && typeof event.user === 'object') {\n const userName = event.user.name || event.user.email || event.user.id\n if (userName) lines.push(`- **User:** ${userName}`)\n }\n if (event.sdk) lines.push(`- **SDK:** ${event.sdk} ${event.sdkVersion || ''}`.trim())\n\n lines.push('')\n return lines.join('\\n')\n}\n\nfunction isoOrNull(value) {\n if (!value) return null\n try {\n return new Date(value).toISOString()\n } catch {\n return null\n }\n}\n\nfunction renderIssueMarkdown(issue) {\n const lines = []\n lines.push(`# ${issue.title}`)\n lines.push('')\n lines.push(`- **ID:** #${issue.id}`)\n lines.push(`- **Type:** ${issue.type}`)\n lines.push(`- **Status:** ${issue.status}`)\n lines.push(`- **Author:** ${issue.author}`)\n lines.push(`- **Project:** ${issue.project}`)\n\n const created = isoOrNull(issue.createdAt)\n if (created) lines.push(`- **Created:** ${created}`)\n\n const updated = isoOrNull(issue.updatedAt)\n if (updated) lines.push(`- **Updated:** ${updated}`)\n\n if (issue.status === 'closed') {\n const closed = isoOrNull(issue.closedAt)\n if (closed) lines.push(`- **Closed:** ${closed}`)\n }\n\n lines.push('')\n lines.push('---')\n lines.push('')\n lines.push(issue.description || '_No description._')\n lines.push('')\n return lines.join('\\n')\n}\n\n// --- Migration ---\n\nfunction migrateLegacyBugs() {\n const legacy = join(process.cwd(), LEGACY_BUGS_DIR)\n if (!existsSync(legacy)) return\n\n const target = join(process.cwd(), ERRORS_DIR)\n mkdirSync(target, { recursive: true })\n\n let moved = 0\n for (const f of readdirSync(legacy)) {\n if (f === 'CLAUDE.md') {\n // Old CLAUDE.md \u2014 we'll write a new one at .scout/CLAUDE.md\n unlinkSync(join(legacy, f))\n continue\n }\n const src = join(legacy, f)\n const dst = join(target, f)\n if (!existsSync(dst)) {\n renameSync(src, dst)\n moved++\n } else {\n unlinkSync(src)\n }\n }\n\n try { rmdirSync(legacy) } catch { /* not empty, leave it */ }\n console.log(`Migrated ${moved} file(s) from .bugs/ to .scout/errors/`)\n}\n\n// --- Sync ---\n\nfunction syncErrorsDir(errors) {\n const target = join(process.cwd(), ERRORS_DIR)\n mkdirSync(target, { recursive: true })\n\n const expected = new Set()\n let created = 0, updated = 0, unchanged = 0\n\n for (const error of errors) {\n const filename = error.hash.slice(0, 8) + '.md'\n expected.add(filename)\n const filePath = join(target, filename)\n const content = renderErrorMarkdown(error)\n\n if (existsSync(filePath)) {\n const existing = readFileSync(filePath, 'utf8')\n if (existing !== content) { writeFileSync(filePath, content); updated++ }\n else unchanged++\n } else {\n writeFileSync(filePath, content)\n created++\n }\n }\n\n let removed = 0\n for (const file of readdirSync(target)) {\n if (HASH_FILE_PATTERN.test(file) && !expected.has(file)) {\n unlinkSync(join(target, file))\n removed++\n }\n }\n\n console.log(`Errors: ${errors.length} synced (${created} new, ${updated} updated, ${unchanged} unchanged, ${removed} removed)`)\n}\n\nfunction syncIssuesDir(issues) {\n const issuesPath = join(process.cwd(), ISSUES_DIR)\n const archivePath = join(process.cwd(), ARCHIVE_DIR)\n mkdirSync(issuesPath, { recursive: true })\n mkdirSync(archivePath, { recursive: true })\n\n const expectedOpen = new Set()\n const expectedClosed = new Set()\n let created = 0, updated = 0, unchanged = 0\n\n for (const issue of issues) {\n const filename = `${issue.id}.md`\n const content = renderIssueMarkdown(issue)\n const targetDir = issue.status === 'closed' ? archivePath : issuesPath\n const otherDir = issue.status === 'closed' ? issuesPath : archivePath\n\n if (issue.status === 'closed') expectedClosed.add(filename)\n else expectedOpen.add(filename)\n\n // Remove from the other dir if transitioning\n const otherPath = join(otherDir, filename)\n if (existsSync(otherPath)) unlinkSync(otherPath)\n\n const filePath = join(targetDir, filename)\n if (existsSync(filePath)) {\n const existing = readFileSync(filePath, 'utf8')\n if (existing !== content) { writeFileSync(filePath, content); updated++ }\n else unchanged++\n } else {\n writeFileSync(filePath, content)\n created++\n }\n }\n\n let removed = 0\n for (const file of readdirSync(issuesPath)) {\n if (ISSUE_FILE_PATTERN.test(file) && !expectedOpen.has(file)) {\n unlinkSync(join(issuesPath, file))\n removed++\n }\n }\n for (const file of readdirSync(archivePath)) {\n if (ISSUE_FILE_PATTERN.test(file) && !expectedClosed.has(file)) {\n unlinkSync(join(archivePath, file))\n removed++\n }\n }\n\n const openCount = issues.filter(i => i.status === 'open').length\n const closedCount = issues.length - openCount\n console.log(`Issues: ${issues.length} synced (${openCount} open, ${closedCount} closed; ${created} new, ${updated} updated, ${unchanged} unchanged, ${removed} removed)`)\n}\n\nfunction writeAgentsMd() {\n const content = `# Scout Tracking Directory\n\nSynced from Scout.js by \\`scout sync\\`.\n\n## errors/\nAuto-captured production errors. Filename: \\`{8-char-hash}.md\\`.\nFocus on high recent counts. Files are overwritten on sync.\n\n## issues/\nOpen human-filed tickets (bug, feature, task). Filename: \\`{id}.md\\`.\nAfter landing a fix: \\`scout close <id>\\`.\n\n## archive/\nClosed issues \u2014 reference only.\n\n## Rules\n1. **Do NOT edit** files in errors/, issues/, or archive/ \u2014 they get overwritten on sync\n2. Keep investigation notes in separate files (e.g., \\`issues/42.notes.md\\`) \u2014 those are yours\n3. Managed files match \\`{8-char-hash}.md\\` or \\`{digit}.md\\` in their respective dirs\n4. Everything else in this directory is yours\n\n## Commands\n- \\`scout sync\\` \u2014 refresh errors and issues\n- \\`scout close <id>\\` / \\`scout reopen <id>\\` \u2014 change issue state\n`\n\n mkdirSync(join(process.cwd(), SCOUT_DIR), { recursive: true })\n const filePath = join(process.cwd(), SCOUT_DIR, 'AGENTS.md')\n // Only create if missing \u2014 never overwrite user edits\n if (!existsSync(filePath)) {\n writeFileSync(filePath, content)\n }\n\n // Clean up old CLAUDE.md if present (from pre-0.3.1 versions)\n const oldPath = join(process.cwd(), SCOUT_DIR, 'CLAUDE.md')\n if (existsSync(oldPath)) {\n try { unlinkSync(oldPath) } catch {}\n }\n}\n\n// --- Commands ---\n\nasync function cmdInit() {\n const rl = createPrompt()\n\n try {\n console.log('Scout setup\\n')\n\n const global = readJson(GLOBAL_CONFIG) || {}\n const local = readJson(join(process.cwd(), LOCAL_CONFIG)) || {}\n\n let { endpoint, username, password } = global\n\n if (endpoint && username && password) {\n console.log(`Using saved credentials from ${GLOBAL_CONFIG}`)\n console.log(` endpoint: ${endpoint}`)\n console.log(` username: ${username}`)\n const reuse = await askYesNo(rl, 'Use these credentials?', true)\n if (!reuse) {\n endpoint = null; username = null; password = null\n }\n }\n\n if (!endpoint || !username || !password) {\n endpoint = await askWithDefault(rl, 'Scout endpoint URL', endpoint || local.endpoint || 'https://admin.scoutjs.com')\n username = await askWithDefault(rl, 'Username', username || local.username || 'scout')\n password = await askWithDefault(rl, 'Password', password || local.password || '')\n\n if (!endpoint || !username || !password) {\n console.error('\\nendpoint, username, and password are required.')\n process.exit(1)\n }\n\n writeFileSync(GLOBAL_CONFIG, JSON.stringify({ endpoint, username, password }, null, 2))\n console.log(`Saved credentials to ${GLOBAL_CONFIG}`)\n }\n\n const config = { endpoint, username, password }\n\n console.log('\\nFetching projects...')\n const projects = await fetchProjects(config)\n projects.sort((a, b) => (a.project || '').localeCompare(b.project || ''))\n\n console.log('\\nSelect a project:')\n console.log(' 1) New Project (enter name)')\n projects.forEach((p, i) => {\n const tag = p.hidden ? ' (hidden)' : ''\n console.log(` ${i + 2}) ${p.project}${tag}`)\n })\n\n const defaultIdx = local.project\n ? (projects.findIndex(p => p.project === local.project) + 2) || ''\n : ''\n const choice = await askWithDefault(rl, '\\nChoice', defaultIdx ? String(defaultIdx) : '')\n const idx = parseInt(choice, 10)\n\n let selectedProject\n if (idx === 1) {\n selectedProject = await ask(rl, 'Project name: ')\n if (!selectedProject) {\n console.error('Project name required.')\n process.exit(1)\n }\n } else if (idx >= 2 && idx - 2 < projects.length) {\n selectedProject = projects[idx - 2].project\n } else {\n console.error('Invalid choice.')\n process.exit(1)\n }\n\n const localPath = join(process.cwd(), LOCAL_CONFIG)\n writeFileSync(localPath, JSON.stringify({ project: selectedProject }, null, 2))\n console.log(`\\nSaved project to ${localPath}`)\n\n // Scaffold .scout/ with AGENTS.md so agents have context even before first sync\n writeAgentsMd()\n console.log(`Created .scout/AGENTS.md`)\n\n console.log(`\\nRun \\`scout sync\\` to pull errors and issues into .scout/`)\n } finally {\n rl.close()\n }\n}\n\nasync function cmdSync() {\n const config = loadConfig()\n\n migrateLegacyBugs()\n const scoutPath = join(process.cwd(), SCOUT_DIR)\n const firstRun = !existsSync(scoutPath)\n mkdirSync(scoutPath, { recursive: true })\n if (firstRun) {\n console.log('Tip: Add .scout/ to your .gitignore')\n }\n\n console.log(`Fetching errors for project \"${config.project}\"...`)\n const errors = await fetchErrors(config)\n syncErrorsDir(errors)\n\n console.log(`Fetching issues for project \"${config.project}\"...`)\n try {\n const issues = await fetchIssues(config)\n syncIssuesDir(issues)\n } catch (e) {\n if (e.code === 'NOT_JSON') {\n console.error(`Issues: skipped \u2014 ${e.message}`)\n } else {\n console.error(`Issues: skipped \u2014 ${e.message}`)\n }\n }\n\n // AGENTS.md is only created on init (so user edits persist across syncs)\n // But back-fill it if it's missing entirely\n const agentsPath = join(process.cwd(), SCOUT_DIR, 'AGENTS.md')\n if (!existsSync(agentsPath)) writeAgentsMd()\n}\n\nasync function cmdClose(id) {\n if (!id) {\n console.error('Usage: scout close <id>')\n process.exit(1)\n }\n const config = loadConfig({ requireProject: false })\n await patchIssue(config, id, { status: 'closed' })\n console.log(`Closed issue #${id}`)\n}\n\nasync function cmdReopen(id) {\n if (!id) {\n console.error('Usage: scout reopen <id>')\n process.exit(1)\n }\n const config = loadConfig({ requireProject: false })\n await patchIssue(config, id, { status: 'open' })\n console.log(`Reopened issue #${id}`)\n}\n\n// --- Main ---\n\nfunction printUsage() {\n console.log(`scout-error \u2014 Sync errors and issues to local .scout/\n\nUsage:\n scout init Configure credentials and select a project\n scout sync Fetch errors and issues into .scout/\n scout close <id> Mark an issue as closed\n scout reopen <id> Reopen a closed issue\n scout help Show this help\n\nConfig files:\n ~/.scout.json Global credentials (endpoint, username, password)\n ./.scout.json Per-project (project name)\n\nEnvironment variables override both:\n SCOUT_ENDPOINT, SCOUT_USERNAME, SCOUT_PASSWORD, SCOUT_PROJECT\n`)\n}\n\nasync function main() {\n const command = process.argv[2]\n\n if (!command || command === 'help' || command === '--help' || command === '-h') {\n printUsage()\n process.exit(0)\n }\n\n if (command === 'init') {\n await cmdInit()\n } else if (command === 'sync') {\n await cmdSync()\n } else if (command === 'close') {\n await cmdClose(process.argv[3])\n } else if (command === 'reopen') {\n await cmdReopen(process.argv[3])\n } else {\n console.error(`Unknown command: ${command}\\n`)\n printUsage()\n process.exit(1)\n }\n}\n\nmain().catch(e => {\n console.error(e.message)\n process.exit(1)\n})\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { readFileSync, writeFileSync, mkdirSync, readdirSync, unlinkSync, existsSync, renameSync, rmdirSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\nimport { createInterface } from 'readline'\n\n// --- Paths ---\n\nconst SCOUT_DIR = '.scout'\nconst ERRORS_DIR = '.scout/errors'\nconst ISSUES_DIR = '.scout/issues'\nconst ARCHIVE_DIR = '.scout/archive'\nconst LEGACY_BUGS_DIR = '.bugs'\n\nconst HASH_FILE_PATTERN = /^[0-9a-f]{8}\\.md$/\nconst ISSUE_FILE_PATTERN = /^\\d+\\.md$/\n\nconst LOCAL_CONFIG = '.scout.json'\nconst GLOBAL_CONFIG = join(homedir(), '.scout.json')\n\n// --- Config ---\n\nfunction readJson(path) {\n if (!existsSync(path)) return null\n try {\n return JSON.parse(readFileSync(path, 'utf8'))\n } catch (e) {\n console.error(`Error parsing ${path}: ${e.message}`)\n process.exit(1)\n }\n}\n\nfunction loadConfig({ requireProject = true } = {}) {\n const global = readJson(GLOBAL_CONFIG) || {}\n const local = readJson(join(process.cwd(), LOCAL_CONFIG)) || {}\n const config = { ...global, ...local }\n\n if (process.env.SCOUT_USERNAME) config.username = process.env.SCOUT_USERNAME\n if (process.env.SCOUT_PASSWORD) config.password = process.env.SCOUT_PASSWORD\n if (process.env.SCOUT_ENDPOINT) config.endpoint = process.env.SCOUT_ENDPOINT\n if (process.env.SCOUT_PROJECT) config.project = process.env.SCOUT_PROJECT\n\n const missing = []\n if (!config.endpoint) missing.push('endpoint')\n if (!config.username) missing.push('username')\n if (!config.password) missing.push('password')\n if (requireProject && !config.project) missing.push('project')\n\n if (missing.length) {\n console.error(`Missing config: ${missing.join(', ')}`)\n console.error(`\\nRun \\`scout init\\` to set up, or edit ${GLOBAL_CONFIG} / ${LOCAL_CONFIG}`)\n process.exit(1)\n }\n\n return config\n}\n\n// --- Prompts ---\n\nfunction createPrompt() {\n return createInterface({ input: process.stdin, output: process.stdout })\n}\n\nfunction ask(rl, question) {\n return new Promise(resolve => rl.question(question, answer => resolve(answer.trim())))\n}\n\nasync function askWithDefault(rl, question, defaultValue) {\n const suffix = defaultValue ? ` [${defaultValue}]` : ''\n const answer = await ask(rl, `${question}${suffix}: `)\n return answer || defaultValue || ''\n}\n\nasync function askYesNo(rl, question, defaultYes = true) {\n const suffix = defaultYes ? ' [Y/n]' : ' [y/N]'\n const answer = (await ask(rl, `${question}${suffix}: `)).toLowerCase()\n if (!answer) return defaultYes\n return answer === 'y' || answer === 'yes'\n}\n\n// --- Fetch helpers ---\n\nfunction authHeaders(config) {\n return {\n 'X-Username': config.username,\n 'X-Password': config.password,\n }\n}\n\nasync function fetchJson(config, path) {\n const url = `${config.endpoint.replace(/\\/$/, '')}${path}`\n\n let response\n try {\n response = await fetch(url, { headers: authHeaders(config) })\n } catch (e) {\n console.error(`Could not connect to ${config.endpoint}. Check the endpoint URL.`)\n console.error(e.message)\n process.exit(1)\n }\n\n if (response.status === 401) {\n console.error('Authentication failed. Check your username and password.')\n process.exit(1)\n }\n\n if (!response.ok) {\n console.error(`Server error: ${response.status} ${response.statusText}`)\n process.exit(1)\n }\n\n // Detect HTML responses (e.g. SPA catch-all when endpoint doesn't exist server-side)\n const contentType = response.headers.get('content-type') || ''\n if (!contentType.includes('application/json')) {\n const err = new Error(`Expected JSON from ${path}, got ${contentType || 'unknown'} \u2014 is your Scout server up to date?`)\n err.code = 'NOT_JSON'\n throw err\n }\n\n return await response.json()\n}\n\nasync function patchIssue(config, id, patch) {\n const url = `${config.endpoint.replace(/\\/$/, '')}/issues/${encodeURIComponent(id)}`\n let res\n try {\n res = await fetch(url, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n ...authHeaders(config),\n },\n body: JSON.stringify(patch),\n })\n } catch (e) {\n console.error(`Could not connect to ${config.endpoint}. ${e.message}`)\n process.exit(1)\n }\n\n if (res.status === 401) {\n console.error('Authentication failed.')\n process.exit(1)\n }\n if (res.status === 404) {\n console.error(`Issue #${id} not found`)\n process.exit(1)\n }\n if (!res.ok) {\n console.error(`Server error: ${res.status} ${res.statusText}`)\n process.exit(1)\n }\n return await res.json()\n}\n\nasync function fetchErrors(config) {\n return fetchJson(config, `/errors?project=${encodeURIComponent(config.project)}`)\n}\n\nasync function fetchIssues(config) {\n return fetchJson(config, `/issues?project=${encodeURIComponent(config.project)}&status=all`)\n}\n\nasync function fetchProjects(config) {\n return fetchJson(config, '/projects?showHidden=true')\n}\n\n// --- Markdown rendering ---\n\nfunction renderErrorMarkdown(error) {\n const event = error.events[0] || {}\n const cf = error.combinedFields || {}\n const lines = []\n\n const title = cf.message || event.args || event.type || 'Unknown Error'\n lines.push(`# ${title}`)\n lines.push('')\n\n lines.push(`- **Hash:** ${error.hash}`)\n lines.push(`- **Project:** ${cf.project || ''}`)\n if (cf.app && cf.app !== cf.project) lines.push(`- **App:** ${cf.app}`)\n lines.push(`- **Count:** ${error.count} total, ${error.last24HoursCount} last 24h, ${error.last30DaysCount} last 30d`)\n lines.push(`- **Users:** ${error.uniqueUserCount} unique`)\n\n const lastSeen = event.timestamp || event.errorTimestamp\n if (lastSeen) {\n const ts = typeof lastSeen === 'string' ? lastSeen : new Date(lastSeen).toISOString()\n lines.push(`- **Last seen:** ${ts}`)\n }\n\n if (event.environment) lines.push(`- **Environment:** ${event.environment}`)\n if (event.type) lines.push(`- **Type:** ${event.type}`)\n if (event.url) lines.push(`- **URL:** ${event.url}`)\n\n if (event.context && Object.keys(event.context).length > 0) {\n lines.push('')\n lines.push('## Context')\n for (const [key, value] of Object.entries(event.context)) {\n const formatted = typeof value === 'object' ? JSON.stringify(value) : String(value)\n lines.push(`- **${key}:** ${formatted}`)\n }\n }\n\n const trace = cf.errorTrace || event.stack || event.errorTrace\n if (trace) {\n lines.push('')\n lines.push('## Stack Trace')\n lines.push('```')\n lines.push(trace)\n lines.push('```')\n }\n\n lines.push('')\n lines.push('## Latest Event')\n if (event.sdk === 'node') {\n if (event.method && event.path) lines.push(`- **Endpoint:** ${event.method} ${event.path}`)\n if (event.nodeVersion) lines.push(`- **Node.js:** ${event.nodeVersion}`)\n if (event.platform) lines.push(`- **Platform:** ${event.platform}/${event.arch || ''}`)\n } else {\n if (event.browser) lines.push(`- **Browser:** ${event.browser}`)\n if (event.os) lines.push(`- **OS:** ${event.os}`)\n }\n if (event.user && typeof event.user === 'object') {\n const userName = event.user.name || event.user.email || event.user.id\n if (userName) lines.push(`- **User:** ${userName}`)\n }\n if (event.sdk) lines.push(`- **SDK:** ${event.sdk} ${event.sdkVersion || ''}`.trim())\n\n lines.push('')\n return lines.join('\\n')\n}\n\nfunction isoOrNull(value) {\n if (!value) return null\n try {\n return new Date(value).toISOString()\n } catch {\n return null\n }\n}\n\nfunction renderIssueMarkdown(issue) {\n const lines = []\n lines.push(`# ${issue.title}`)\n lines.push('')\n lines.push(`- **ID:** #${issue.id}`)\n lines.push(`- **Type:** ${issue.type}`)\n lines.push(`- **Status:** ${issue.status}`)\n lines.push(`- **Author:** ${issue.author}`)\n lines.push(`- **Project:** ${issue.project}`)\n\n const created = isoOrNull(issue.createdAt)\n if (created) lines.push(`- **Created:** ${created}`)\n\n const updated = isoOrNull(issue.updatedAt)\n if (updated) lines.push(`- **Updated:** ${updated}`)\n\n if (issue.status === 'closed') {\n const closed = isoOrNull(issue.closedAt)\n if (closed) lines.push(`- **Closed:** ${closed}`)\n }\n\n lines.push('')\n lines.push('---')\n lines.push('')\n lines.push(issue.description || '_No description._')\n lines.push('')\n return lines.join('\\n')\n}\n\n// --- Migration ---\n\nfunction migrateLegacyBugs() {\n const legacy = join(process.cwd(), LEGACY_BUGS_DIR)\n if (!existsSync(legacy)) return\n\n const target = join(process.cwd(), ERRORS_DIR)\n mkdirSync(target, { recursive: true })\n\n let moved = 0\n for (const f of readdirSync(legacy)) {\n if (f === 'CLAUDE.md') {\n // Old CLAUDE.md \u2014 we'll write a new one at .scout/CLAUDE.md\n unlinkSync(join(legacy, f))\n continue\n }\n const src = join(legacy, f)\n const dst = join(target, f)\n if (!existsSync(dst)) {\n renameSync(src, dst)\n moved++\n } else {\n unlinkSync(src)\n }\n }\n\n try { rmdirSync(legacy) } catch { /* not empty, leave it */ }\n console.log(`Migrated ${moved} file(s) from .bugs/ to .scout/errors/`)\n}\n\n// --- Sync ---\n\nfunction syncErrorsDir(errors) {\n const target = join(process.cwd(), ERRORS_DIR)\n mkdirSync(target, { recursive: true })\n\n const expected = new Set()\n let created = 0, updated = 0, unchanged = 0\n\n for (const error of errors) {\n const filename = error.hash.slice(0, 8) + '.md'\n expected.add(filename)\n const filePath = join(target, filename)\n const content = renderErrorMarkdown(error)\n\n if (existsSync(filePath)) {\n const existing = readFileSync(filePath, 'utf8')\n if (existing !== content) { writeFileSync(filePath, content); updated++ }\n else unchanged++\n } else {\n writeFileSync(filePath, content)\n created++\n }\n }\n\n let removed = 0\n for (const file of readdirSync(target)) {\n if (HASH_FILE_PATTERN.test(file) && !expected.has(file)) {\n unlinkSync(join(target, file))\n removed++\n }\n }\n\n console.log(`Errors: ${errors.length} synced (${created} new, ${updated} updated, ${unchanged} unchanged, ${removed} removed)`)\n}\n\nfunction syncIssuesDir(issues) {\n const issuesPath = join(process.cwd(), ISSUES_DIR)\n const archivePath = join(process.cwd(), ARCHIVE_DIR)\n mkdirSync(issuesPath, { recursive: true })\n mkdirSync(archivePath, { recursive: true })\n\n const expectedOpen = new Set()\n const expectedClosed = new Set()\n let created = 0, updated = 0, unchanged = 0\n\n for (const issue of issues) {\n const filename = `${issue.id}.md`\n const content = renderIssueMarkdown(issue)\n const targetDir = issue.status === 'closed' ? archivePath : issuesPath\n const otherDir = issue.status === 'closed' ? issuesPath : archivePath\n\n if (issue.status === 'closed') expectedClosed.add(filename)\n else expectedOpen.add(filename)\n\n // Remove from the other dir if transitioning\n const otherPath = join(otherDir, filename)\n if (existsSync(otherPath)) unlinkSync(otherPath)\n\n const filePath = join(targetDir, filename)\n if (existsSync(filePath)) {\n const existing = readFileSync(filePath, 'utf8')\n if (existing !== content) { writeFileSync(filePath, content); updated++ }\n else unchanged++\n } else {\n writeFileSync(filePath, content)\n created++\n }\n }\n\n let removed = 0\n for (const file of readdirSync(issuesPath)) {\n if (ISSUE_FILE_PATTERN.test(file) && !expectedOpen.has(file)) {\n unlinkSync(join(issuesPath, file))\n removed++\n }\n }\n for (const file of readdirSync(archivePath)) {\n if (ISSUE_FILE_PATTERN.test(file) && !expectedClosed.has(file)) {\n unlinkSync(join(archivePath, file))\n removed++\n }\n }\n\n const openCount = issues.filter(i => i.status === 'open').length\n const closedCount = issues.length - openCount\n console.log(`Issues: ${issues.length} synced (${openCount} open, ${closedCount} closed; ${created} new, ${updated} updated, ${unchanged} unchanged, ${removed} removed)`)\n}\n\nfunction writeAgentsMd() {\n const content = `# Scout Tracking Directory\n\nSynced from Scout.js by \\`scout sync\\`. Contains **errors** (auto-captured from production) and **issues** (human-filed tickets) for this project. Your job is to work through them and improve the app.\n\n## Layout\n\n- \\`errors/\\` \u2014 production errors captured by the Scout SDK. Filename: \\`{8-char-hash}.md\\`.\n- \\`issues/\\` \u2014 open human-filed tickets (bug, feature, task). Filename: \\`{id}.md\\`.\n- \\`archive/\\` \u2014 closed issues, reference only.\n\n## Workflow: errors\n\n1. **Prioritize** by recent activity \u2014 errors with high \\`last 24h\\` counts or many unique users are most impactful.\n2. **Investigate:**\n - Read the stack trace. If a GitHub URL is included for a frame, open it to see the source.\n - Otherwise find the matching file/line in this repo.\n - Check the **Context** section for developer-set tags (e.g. \\`fn\\`, \\`step\\`, \\`route\\`) \u2014 these are often the most useful clues.\n - Check **Breadcrumbs** for what the user did leading up to the error.\n3. **Decide one of three actions:**\n - **Fix** \u2014 land the fix, run tests, commit. Resolved errors disappear from \\`errors/\\` on the next sync automatically.\n - **Filter** \u2014 if the error isn't actionable (third-party noise, intentional, unfixable browser quirks), add a pattern to the \\`ignoreErrors\\` array in the \\`Scout.init\\` call. Accepts string substrings or RegExp:\n \\`\\`\\`js\n Scout.init({ ... }, {\n endpoint: '...',\n ignoreErrors: [\n /ResizeObserver loop/,\n 'NetworkError when attempting to fetch',\n ],\n })\n \\`\\`\\`\n Filtered errors are dropped client-side and won't reach the server.\n - **Document** \u2014 if you can't determine the cause, create \\`errors/{hash}.notes.md\\` with your findings so a human can follow up.\n\n## Workflow: issues\n\n1. Read the issue description. Bug reports, feature requests, or tasks.\n2. **Implement** \u2014 investigate, make changes, run tests.\n3. **Commit** with reference (e.g. \\`fix #42: ...\\`).\n4. **Close** \u2014 run \\`scout close <id>\\` once the fix is landed. The file moves to \\`archive/\\` on next sync.\n5. If unclear, leave \\`issues/{id}.notes.md\\` with questions \u2014 don't edit the issue description (it's overwritten on sync).\n\n## Rules\n\n1. **Do NOT edit** managed files in \\`errors/\\`, \\`issues/\\`, or \\`archive/\\` \u2014 they are overwritten on each sync.\n2. Investigation notes belong in **separate** files:\n - \\`errors/{hash}.notes.md\\` \u2014 your findings on an error\n - \\`issues/{id}.notes.md\\` \u2014 your work on an issue\n - These are yours; sync never touches them.\n3. Managed filenames: \\`{8-char-hash}.md\\` for errors, \\`{digit}.md\\` for issues. Anything else is safe.\n\n## Scope\n\n- Focus on this project's code. Don't patch node_modules or third-party scripts.\n- If an error originates in a third party, investigate whether your calling code is misusing it; if not, filter it via \\`ignoreErrors\\`.\n- Prefer fixing root causes over suppressing symptoms. Reserve \\`ignoreErrors\\` for true noise.\n\n## Commands\n\n- \\`scout sync\\` \u2014 refresh errors and issues from the Scout server\n- \\`scout close <id>\\` \u2014 close an issue (after landing a fix)\n- \\`scout reopen <id>\\` \u2014 reopen a closed issue\n`\n\n mkdirSync(join(process.cwd(), SCOUT_DIR), { recursive: true })\n const filePath = join(process.cwd(), SCOUT_DIR, 'AGENTS.md')\n // Only create if missing \u2014 never overwrite user edits\n if (!existsSync(filePath)) {\n writeFileSync(filePath, content)\n }\n\n // Clean up old CLAUDE.md if present (from pre-0.3.1 versions)\n const oldPath = join(process.cwd(), SCOUT_DIR, 'CLAUDE.md')\n if (existsSync(oldPath)) {\n try { unlinkSync(oldPath) } catch {}\n }\n}\n\n// --- Commands ---\n\nasync function cmdInit() {\n const rl = createPrompt()\n\n try {\n console.log('Scout setup\\n')\n\n const global = readJson(GLOBAL_CONFIG) || {}\n const local = readJson(join(process.cwd(), LOCAL_CONFIG)) || {}\n\n let { endpoint, username, password } = global\n\n if (endpoint && username && password) {\n console.log(`Using saved credentials from ${GLOBAL_CONFIG}`)\n console.log(` endpoint: ${endpoint}`)\n console.log(` username: ${username}`)\n const reuse = await askYesNo(rl, 'Use these credentials?', true)\n if (!reuse) {\n endpoint = null; username = null; password = null\n }\n }\n\n if (!endpoint || !username || !password) {\n endpoint = await askWithDefault(rl, 'Scout endpoint URL', endpoint || local.endpoint || 'https://admin.scoutjs.com')\n username = await askWithDefault(rl, 'Username', username || local.username || 'scout')\n password = await askWithDefault(rl, 'Password', password || local.password || '')\n\n if (!endpoint || !username || !password) {\n console.error('\\nendpoint, username, and password are required.')\n process.exit(1)\n }\n\n writeFileSync(GLOBAL_CONFIG, JSON.stringify({ endpoint, username, password }, null, 2))\n console.log(`Saved credentials to ${GLOBAL_CONFIG}`)\n }\n\n const config = { endpoint, username, password }\n\n console.log('\\nFetching projects...')\n const projects = await fetchProjects(config)\n projects.sort((a, b) => (a.project || '').localeCompare(b.project || ''))\n\n console.log('\\nSelect a project:')\n console.log(' 1) New Project (enter name)')\n projects.forEach((p, i) => {\n const tag = p.hidden ? ' (hidden)' : ''\n console.log(` ${i + 2}) ${p.project}${tag}`)\n })\n\n const defaultIdx = local.project\n ? (projects.findIndex(p => p.project === local.project) + 2) || ''\n : ''\n const choice = await askWithDefault(rl, '\\nChoice', defaultIdx ? String(defaultIdx) : '')\n const idx = parseInt(choice, 10)\n\n let selectedProject\n if (idx === 1) {\n selectedProject = await ask(rl, 'Project name: ')\n if (!selectedProject) {\n console.error('Project name required.')\n process.exit(1)\n }\n } else if (idx >= 2 && idx - 2 < projects.length) {\n selectedProject = projects[idx - 2].project\n } else {\n console.error('Invalid choice.')\n process.exit(1)\n }\n\n const localPath = join(process.cwd(), LOCAL_CONFIG)\n writeFileSync(localPath, JSON.stringify({ project: selectedProject }, null, 2))\n console.log(`\\nSaved project to ${localPath}`)\n\n // Scaffold .scout/ with AGENTS.md so agents have context even before first sync\n writeAgentsMd()\n console.log(`Created .scout/AGENTS.md`)\n\n console.log(`\\nRun \\`scout sync\\` to pull errors and issues into .scout/`)\n } finally {\n rl.close()\n }\n}\n\nasync function cmdSync() {\n const config = loadConfig()\n\n migrateLegacyBugs()\n const scoutPath = join(process.cwd(), SCOUT_DIR)\n const firstRun = !existsSync(scoutPath)\n mkdirSync(scoutPath, { recursive: true })\n if (firstRun) {\n console.log('Tip: Add .scout/ to your .gitignore')\n }\n\n console.log(`Fetching errors for project \"${config.project}\"...`)\n const errors = await fetchErrors(config)\n syncErrorsDir(errors)\n\n console.log(`Fetching issues for project \"${config.project}\"...`)\n try {\n const issues = await fetchIssues(config)\n syncIssuesDir(issues)\n } catch (e) {\n if (e.code === 'NOT_JSON') {\n console.error(`Issues: skipped \u2014 ${e.message}`)\n } else {\n console.error(`Issues: skipped \u2014 ${e.message}`)\n }\n }\n\n // AGENTS.md is only created on init (so user edits persist across syncs)\n // But back-fill it if it's missing entirely\n const agentsPath = join(process.cwd(), SCOUT_DIR, 'AGENTS.md')\n if (!existsSync(agentsPath)) writeAgentsMd()\n}\n\nasync function cmdClose(id) {\n if (!id) {\n console.error('Usage: scout close <id>')\n process.exit(1)\n }\n const config = loadConfig({ requireProject: false })\n await patchIssue(config, id, { status: 'closed' })\n console.log(`Closed issue #${id}`)\n}\n\nasync function cmdReopen(id) {\n if (!id) {\n console.error('Usage: scout reopen <id>')\n process.exit(1)\n }\n const config = loadConfig({ requireProject: false })\n await patchIssue(config, id, { status: 'open' })\n console.log(`Reopened issue #${id}`)\n}\n\n// --- Main ---\n\nfunction printUsage() {\n console.log(`scout-error \u2014 Sync errors and issues to local .scout/\n\nUsage:\n scout init Configure credentials and select a project\n scout sync Fetch errors and issues into .scout/\n scout close <id> Mark an issue as closed\n scout reopen <id> Reopen a closed issue\n scout help Show this help\n\nConfig files:\n ~/.scout.json Global credentials (endpoint, username, password)\n ./.scout.json Per-project (project name)\n\nEnvironment variables override both:\n SCOUT_ENDPOINT, SCOUT_USERNAME, SCOUT_PASSWORD, SCOUT_PROJECT\n`)\n}\n\nasync function main() {\n const command = process.argv[2]\n\n if (!command || command === 'help' || command === '--help' || command === '-h') {\n printUsage()\n process.exit(0)\n }\n\n if (command === 'init') {\n await cmdInit()\n } else if (command === 'sync') {\n await cmdSync()\n } else if (command === 'close') {\n await cmdClose(process.argv[3])\n } else if (command === 'reopen') {\n await cmdReopen(process.argv[3])\n } else {\n console.error(`Unknown command: ${command}\\n`)\n printUsage()\n process.exit(1)\n }\n}\n\nmain().catch(e => {\n console.error(e.message)\n process.exit(1)\n})\n"],
5
+ "mappings": "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",
6
6
  "names": ["readFileSync", "writeFileSync", "mkdirSync", "readdirSync", "unlinkSync", "existsSync", "renameSync", "rmdirSync", "join", "homedir", "createInterface", "SCOUT_DIR", "ERRORS_DIR", "ISSUES_DIR", "ARCHIVE_DIR", "LEGACY_BUGS_DIR", "HASH_FILE_PATTERN", "ISSUE_FILE_PATTERN", "LOCAL_CONFIG", "GLOBAL_CONFIG", "readJson", "path", "e", "loadConfig", "requireProject", "global", "local", "config", "missing", "createPrompt", "ask", "rl", "question", "resolve", "answer", "askWithDefault", "defaultValue", "suffix", "askYesNo", "defaultYes", "authHeaders", "fetchJson", "url", "response", "contentType", "err", "patchIssue", "id", "patch", "res", "fetchErrors", "fetchIssues", "fetchProjects", "renderErrorMarkdown", "error", "event", "cf", "lines", "title", "lastSeen", "ts", "key", "value", "formatted", "trace", "userName", "isoOrNull", "renderIssueMarkdown", "issue", "created", "updated", "closed", "migrateLegacyBugs", "legacy", "target", "moved", "f", "src", "dst", "syncErrorsDir", "errors", "expected", "unchanged", "filename", "filePath", "content", "removed", "file", "syncIssuesDir", "issues", "issuesPath", "archivePath", "expectedOpen", "expectedClosed", "targetDir", "otherDir", "otherPath", "openCount", "i", "closedCount", "writeAgentsMd", "oldPath", "cmdInit", "endpoint", "username", "password", "projects", "a", "b", "p", "tag", "defaultIdx", "choice", "idx", "selectedProject", "localPath", "cmdSync", "scoutPath", "firstRun", "agentsPath", "cmdClose", "cmdReopen", "printUsage", "main", "command"]
7
7
  }
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- var h=Object.defineProperty,V=Object.defineProperties,q=Object.getOwnPropertyDescriptor,z=Object.getOwnPropertyDescriptors,J=Object.getOwnPropertyNames,T=Object.getOwnPropertySymbols;var U=Object.prototype.hasOwnProperty,G=Object.prototype.propertyIsEnumerable;var x=(e,r,t)=>r in e?h(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t,l=(e,r)=>{for(var t in r||(r={}))U.call(r,t)&&x(e,t,r[t]);if(T)for(var t of T(r))G.call(r,t)&&x(e,t,r[t]);return e},P=(e,r)=>V(e,z(r));var K=(e,r)=>{for(var t in r)h(e,t,{get:r[t],enumerable:!0})},Z=(e,r,t,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of J(r))!U.call(e,a)&&a!==t&&h(e,a,{get:()=>r[a],enumerable:!(s=q(r,a))||s.enumerable});return e};var Q=e=>Z(h({},"__esModule",{value:!0}),e);var S=(e,r,t)=>new Promise((s,a)=>{var n=c=>{try{u(t.next(c))}catch(f){a(f)}},o=c=>{try{u(t.throw(c))}catch(f){a(f)}},u=c=>c.done?s(c.value):Promise.resolve(c.value).then(n,o);u((t=t.apply(e,r)).next())});var ce={};K(ce,{addBreadcrumb:()=>ae,captureError:()=>H,init:()=>X,setContext:()=>B,setTag:()=>W,setUser:()=>F});module.exports=Q(ce);var Y={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},i=l({},Y),$,p={environment:typeof window!="undefined"&&(($=window.location)==null?void 0:$.hostname)==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.3.2",project:null,release:null,version:null,app:null},M={clicks:0,scrolls:0},R=null,D=!1,k=null,w={},_=[],ee=30;var v=console.warn;var A=console.log;function C(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function ne(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",C("user")),localStorage.getItem("__scoutUserId")),r=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",C("session")),sessionStorage.getItem("__scoutSessionId"));return R=R||C("pageload"),{pageloadId:R,userId:e,sessionId:r}}function re(){var t,s,a;if((s=(t=window._uaParserResult)==null?void 0:t.browser)!=null&&s.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return((a=[{p:/Chrome.*Mobile/,n:"Chrome Mobile"},{p:/Chrome/,n:"Chrome"},{p:/Firefox.*Mobile/,n:"Firefox Mobile"},{p:/Firefox/,n:"Firefox"},{p:/Safari.*Mobile/,n:"Safari Mobile"},{p:/Safari/,n:"Safari"},{p:/MSIE|Trident/,n:"Internet Explorer"},{p:/Edge/,n:"Edge"}].find(n=>e.match(n.p)))==null?void 0:a.n)||"Unknown"}function te(){var t,s,a;if((s=(t=window._uaParserResult)==null?void 0:t.os)!=null&&s.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return((a=[{p:/Win/,n:"Windows"},{p:/Mac/,n:"Mac OS"},{p:/X11|Linux/,n:"Linux"},{p:/Android/,n:"Android"},{p:/iPhone|iPad/,n:"iOS"}].find(n=>e.match(n.p)))==null?void 0:a.n)||"Unknown"}function oe(){var r,t,s,a,n,o,u,c,f,d;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:re(),browserVersion:((t=(r=window._uaParserResult)==null?void 0:r.browser)==null?void 0:t.version)||null,os:te(),osVersion:((a=(s=window._uaParserResult)==null?void 0:s.os)==null?void 0:a.version)||null,deviceType:((o=(n=window._uaParserResult)==null?void 0:n.device)==null?void 0:o.type)||null,deviceModel:((c=(u=window._uaParserResult)==null?void 0:u.device)==null?void 0:c.model)||null,deviceVendor:((d=(f=window._uaParserResult)==null?void 0:f.device)==null?void 0:d.vendor)||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:M.clicks,userScrolls:M.scrolls}}function y(e){return!i.ignoreErrors||!Array.isArray(i.ignoreErrors)?!1:i.ignoreErrors.some(r=>typeof r=="string"?e.includes(r):r instanceof RegExp?r.test(e):!1)}function N(e,r){let t=new AbortController,s=setTimeout(()=>t.abort(),5e3),a={"Content-Type":"application/json"};return i.token&&(a["X-Ingest-Token"]=i.token),fetch(e,{method:"POST",headers:a,body:JSON.stringify(r),signal:t.signal}).then(n=>(clearTimeout(s),n)).catch(()=>{clearTimeout(s)})}function E(e){let r=(e[0]||"")+"",t=[...e];return r.replace(/%[sdj]/g,s=>{let a=t.shift();return s==="%s"?String(a):s==="%d"?Number(a):s==="%j"?JSON.stringify(a):s})}function O(e,r){let t=document.createElement("script");t.src=e,t.async=!0,r&&(t.onload=r),document.head.appendChild(t)}function se(e,r,t){return S(this,null,function*(){var s;try{let a=yield fetch(e);if(!a.ok)return null;let n=yield a.text(),o=n.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),u=n.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),c;if(o)c=JSON.parse(atob(o[1]));else if(u){let j=new URL(u[1],e).href,I=yield fetch(j);if(!I.ok)return null;c=yield I.json()}else return null;if(!((s=window.sourceMap)!=null&&s.SourceMapConsumer))return null;let d=new window.sourceMap.SourceMapConsumer(c).originalPositionFor({line:r,column:t});if(!d.source)return null;let L=c.sources.indexOf(d.source),b=null;return c.sourcesContent&&c.sourcesContent[L]&&(b=c.sourcesContent[L]),{originalSource:d.source,originalLine:d.line,originalColumn:d.column,originalName:d.name,snippet:b}}catch(a){return null}})}function g(e){_.push(l({timestamp:Date.now()},e)),_.length>ee&&_.shift()}function m(e){return S(this,null,function*(){let r=i.browserDetails?oe():{},t=Object.assign(e,r,p,ne());if(k&&(t.user=k),Object.keys(w).length&&(t.context=l({},w)),t.breadcrumbs=_.slice(),i.sampleRate&&Math.random()<1-parseFloat(i.sampleRate)){i.debug&&A("[Scout] Suppressed by sampling");return}if(i.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let s=e.errorTrace.split(`
1
+ var h=Object.defineProperty,V=Object.defineProperties,q=Object.getOwnPropertyDescriptor,z=Object.getOwnPropertyDescriptors,J=Object.getOwnPropertyNames,T=Object.getOwnPropertySymbols;var U=Object.prototype.hasOwnProperty,G=Object.prototype.propertyIsEnumerable;var x=(e,r,t)=>r in e?h(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t,l=(e,r)=>{for(var t in r||(r={}))U.call(r,t)&&x(e,t,r[t]);if(T)for(var t of T(r))G.call(r,t)&&x(e,t,r[t]);return e},P=(e,r)=>V(e,z(r));var K=(e,r)=>{for(var t in r)h(e,t,{get:r[t],enumerable:!0})},Z=(e,r,t,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of J(r))!U.call(e,a)&&a!==t&&h(e,a,{get:()=>r[a],enumerable:!(s=q(r,a))||s.enumerable});return e};var Q=e=>Z(h({},"__esModule",{value:!0}),e);var S=(e,r,t)=>new Promise((s,a)=>{var n=c=>{try{u(t.next(c))}catch(f){a(f)}},o=c=>{try{u(t.throw(c))}catch(f){a(f)}},u=c=>c.done?s(c.value):Promise.resolve(c.value).then(n,o);u((t=t.apply(e,r)).next())});var ce={};K(ce,{addBreadcrumb:()=>ae,captureError:()=>H,init:()=>X,setContext:()=>B,setTag:()=>W,setUser:()=>F});module.exports=Q(ce);var Y={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},i=l({},Y),$,p={environment:typeof window!="undefined"&&(($=window.location)==null?void 0:$.hostname)==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.3.3",project:null,release:null,version:null,app:null},M={clicks:0,scrolls:0},R=null,D=!1,k=null,w={},_=[],ee=30;var v=console.warn;var A=console.log;function C(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function ne(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",C("user")),localStorage.getItem("__scoutUserId")),r=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",C("session")),sessionStorage.getItem("__scoutSessionId"));return R=R||C("pageload"),{pageloadId:R,userId:e,sessionId:r}}function re(){var t,s,a;if((s=(t=window._uaParserResult)==null?void 0:t.browser)!=null&&s.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return((a=[{p:/Chrome.*Mobile/,n:"Chrome Mobile"},{p:/Chrome/,n:"Chrome"},{p:/Firefox.*Mobile/,n:"Firefox Mobile"},{p:/Firefox/,n:"Firefox"},{p:/Safari.*Mobile/,n:"Safari Mobile"},{p:/Safari/,n:"Safari"},{p:/MSIE|Trident/,n:"Internet Explorer"},{p:/Edge/,n:"Edge"}].find(n=>e.match(n.p)))==null?void 0:a.n)||"Unknown"}function te(){var t,s,a;if((s=(t=window._uaParserResult)==null?void 0:t.os)!=null&&s.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return((a=[{p:/Win/,n:"Windows"},{p:/Mac/,n:"Mac OS"},{p:/X11|Linux/,n:"Linux"},{p:/Android/,n:"Android"},{p:/iPhone|iPad/,n:"iOS"}].find(n=>e.match(n.p)))==null?void 0:a.n)||"Unknown"}function oe(){var r,t,s,a,n,o,u,c,f,d;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:re(),browserVersion:((t=(r=window._uaParserResult)==null?void 0:r.browser)==null?void 0:t.version)||null,os:te(),osVersion:((a=(s=window._uaParserResult)==null?void 0:s.os)==null?void 0:a.version)||null,deviceType:((o=(n=window._uaParserResult)==null?void 0:n.device)==null?void 0:o.type)||null,deviceModel:((c=(u=window._uaParserResult)==null?void 0:u.device)==null?void 0:c.model)||null,deviceVendor:((d=(f=window._uaParserResult)==null?void 0:f.device)==null?void 0:d.vendor)||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:M.clicks,userScrolls:M.scrolls}}function y(e){return!i.ignoreErrors||!Array.isArray(i.ignoreErrors)?!1:i.ignoreErrors.some(r=>typeof r=="string"?e.includes(r):r instanceof RegExp?r.test(e):!1)}function N(e,r){let t=new AbortController,s=setTimeout(()=>t.abort(),5e3),a={"Content-Type":"application/json"};return i.token&&(a["X-Ingest-Token"]=i.token),fetch(e,{method:"POST",headers:a,body:JSON.stringify(r),signal:t.signal}).then(n=>(clearTimeout(s),n)).catch(()=>{clearTimeout(s)})}function E(e){let r=(e[0]||"")+"",t=[...e];return r.replace(/%[sdj]/g,s=>{let a=t.shift();return s==="%s"?String(a):s==="%d"?Number(a):s==="%j"?JSON.stringify(a):s})}function O(e,r){let t=document.createElement("script");t.src=e,t.async=!0,r&&(t.onload=r),document.head.appendChild(t)}function se(e,r,t){return S(this,null,function*(){var s;try{let a=yield fetch(e);if(!a.ok)return null;let n=yield a.text(),o=n.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),u=n.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),c;if(o)c=JSON.parse(atob(o[1]));else if(u){let j=new URL(u[1],e).href,I=yield fetch(j);if(!I.ok)return null;c=yield I.json()}else return null;if(!((s=window.sourceMap)!=null&&s.SourceMapConsumer))return null;let d=new window.sourceMap.SourceMapConsumer(c).originalPositionFor({line:r,column:t});if(!d.source)return null;let L=c.sources.indexOf(d.source),b=null;return c.sourcesContent&&c.sourcesContent[L]&&(b=c.sourcesContent[L]),{originalSource:d.source,originalLine:d.line,originalColumn:d.column,originalName:d.name,snippet:b}}catch(a){return null}})}function g(e){_.push(l({timestamp:Date.now()},e)),_.length>ee&&_.shift()}function m(e){return S(this,null,function*(){let r=i.browserDetails?oe():{},t=Object.assign(e,r,p,ne());if(k&&(t.user=k),Object.keys(w).length&&(t.context=l({},w)),t.breadcrumbs=_.slice(),i.sampleRate&&Math.random()<1-parseFloat(i.sampleRate)){i.debug&&A("[Scout] Suppressed by sampling");return}if(i.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let s=e.errorTrace.split(`
2
2
  `),a=[s[0]];for(let n=1;n<s.length;n++)!s[n].includes("/scout")&&!s[n].includes("scout.js")&&!s[n].includes("scout-error")&&a.push(s[n]);a.length>1&&(e.errorTrace=a.join(`
3
3
  `))}catch(s){}if((e.errorTrace||e.stack)&&!e.source)try{let s=e.errorTrace||e.stack,a=s?s.split(`
4
4
  `):[];for(let n=1;n<a.length;n++){let o=a[n].trim().match(/(http.*?):(\d+):(\d+)/);if(o){e.source=o[1],e.lineno=parseInt(o[2],10),e.colno=parseInt(o[3],10);break}}}catch(s){}if(i.debug&&A("[Scout] Sending:",t),i.endpoint&&N(i.endpoint,t),i.handleSourceMaps&&e.source&&e.lineno)try{let s=yield se(e.source,e.lineno,e.colno||0);if(s){let a=P(l({},t),{originalSource:s.originalSource,originalLine:s.originalLine,originalColumn:s.originalColumn,originalName:s.originalName,highlightLineNumber:s.originalLine});s.snippet&&(a.snippet=s.snippet),i.endpoint&&N(i.endpoint,a)}}catch(s){}})}function H(e){i.enabled&&m(e)}function F(e){k=e}function B(e){w=l(l({},w),e)}function W(e,r){w[e]=r}function ae(e){g(e)}function ie(){if(i.trackUserInteractions){document.addEventListener("click",o=>{M.clicks++;let u=o.target,c=u.tagName?u.tagName.toLowerCase():"",f=(u.textContent||"").trim().slice(0,50);g({category:"click",message:c+(f?": "+f:"")})});let n=0;window.addEventListener("scroll",()=>{let o=Date.now();o-n>100&&(M.scrolls++,n=o)})}let e=history.pushState;history.pushState=function(){e.apply(this,arguments),g({category:"navigation",message:window.location.href})},window.addEventListener("popstate",()=>{g({category:"navigation",message:window.location.href})});let r=window.fetch;window.fetch=function(n,o){let u=typeof n=="string"?n:(n==null?void 0:n.url)||"",c=(o==null?void 0:o.method)||"GET",f=Date.now();return r.apply(this,arguments).then(d=>(g({category:"fetch",message:`${c} ${u}`,data:{status:d.status,duration:Date.now()-f}}),d)).catch(d=>{throw g({category:"fetch",message:`${c} ${u}`,data:{error:d.message,duration:Date.now()-f}}),d})};let t=XMLHttpRequest.prototype.open,s=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(n,o){return this._scoutMethod=n,this._scoutUrl=o,t.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){let n=this,o=Date.now();return n.addEventListener("loadend",()=>{g({category:"xhr",message:`${n._scoutMethod||"GET"} ${n._scoutUrl||""}`,data:{status:n.status,duration:Date.now()-o}})}),s.apply(this,arguments)},i.addErrorEventListener&&window.addEventListener("error",n=>S(this,null,function*(){if(i.enabled){try{let o=n.error?n.error.stack:"No stack trace available";if(y(n.message))return;i.sendErrors&&m({type:"window.onerror",message:n.message,source:n.filename,lineno:n.lineno,colno:n.colno,errorTrace:o})}catch(o){v("[Scout] Error handler failure:",o)}i.selfHealingErrors&&n.preventDefault()}})),i.addUnhandledRejectionEventListener&&window.addEventListener("unhandledrejection",n=>{if(i.enabled){try{let o=n.reason,u=(o==null?void 0:o.stack)||"No stack trace available";if(y((o==null?void 0:o.message)||""))return;i.sendErrors&&m({type:"Unhandled Promise Rejection",message:(o==null?void 0:o.message)||"Unhandled Promise Rejection",reason:n.reason,errorTrace:u})}catch(o){v("[Scout] Rejection handler failure:",o)}i.selfHealingErrors&&n.preventDefault()}}),i.overrideConsoleError&&(console.error=function(...n){if(i.enabled)try{let o=new Error().stack;if(y(E(n)))return;i.sendErrors&&m({type:"console.error",errorTrace:o,args:E(n)})}catch(o){v("[Scout] console.error override failure:",o)}}),i.overrideConsoleWarn&&(console.warn=function(...n){if(i.enabled)try{let o=new Error().stack;if(y(E(n)))return;i.sendErrors&&m({type:"console.warn",errorTrace:o,args:E(n)})}catch(o){v("[Scout] console.warn override failure:",o)}});let a=i.endpoint?new URL(i.endpoint).origin:"";i.loadUAParser&&i.browserDetails&&a&&O(`${a}/vendor/ua-parser.min.js`,()=>{typeof UAParser!="undefined"&&(window._uaParserResult=new UAParser().getResult())}),i.handleSourceMaps&&a&&O(`${a}/vendor/source-map.min.js`)}function X(e={},r={}){if(e.user&&(k=e.user,delete e.user),D){p=l(l({},p),e),i=l(l({},i),r);return}p=l(l({},p),e),i=l(l({},i),r),D=!0,typeof window!="undefined"&&ie()}typeof window!="undefined"&&(window.Scout={init:X,setScope:e=>{p=l(l({},p),e)},setConfig:e=>{i=l(l({},i),e)},setUser:F,setContext:B,setTag:W,addBreadcrumb:g,error:H});
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- var $=Object.defineProperty,H=Object.defineProperties;var F=Object.getOwnPropertyDescriptors;var I=Object.getOwnPropertySymbols;var B=Object.prototype.hasOwnProperty,W=Object.prototype.propertyIsEnumerable;var T=(e,s,t)=>s in e?$(e,s,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[s]=t,l=(e,s)=>{for(var t in s||(s={}))B.call(s,t)&&T(e,t,s[t]);if(I)for(var t of I(s))W.call(s,t)&&T(e,t,s[t]);return e},x=(e,s)=>H(e,F(s));var h=(e,s,t)=>new Promise((o,i)=>{var n=c=>{try{u(t.next(c))}catch(f){i(f)}},r=c=>{try{u(t.throw(c))}catch(f){i(f)}},u=c=>c.done?o(c.value):Promise.resolve(c.value).then(n,r);u((t=t.apply(e,s)).next())});var X={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=l({},X),N,p={environment:typeof window!="undefined"&&((N=window.location)==null?void 0:N.hostname)==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.3.2",project:null,release:null,version:null,app:null},_={clicks:0,scrolls:0},k=null,U=!1,M=null,w={},E=[],j=30;var S=console.warn;var P=console.log;function R(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function V(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",R("user")),localStorage.getItem("__scoutUserId")),s=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",R("session")),sessionStorage.getItem("__scoutSessionId"));return k=k||R("pageload"),{pageloadId:k,userId:e,sessionId:s}}function q(){var t,o,i;if((o=(t=window._uaParserResult)==null?void 0:t.browser)!=null&&o.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return((i=[{p:/Chrome.*Mobile/,n:"Chrome Mobile"},{p:/Chrome/,n:"Chrome"},{p:/Firefox.*Mobile/,n:"Firefox Mobile"},{p:/Firefox/,n:"Firefox"},{p:/Safari.*Mobile/,n:"Safari Mobile"},{p:/Safari/,n:"Safari"},{p:/MSIE|Trident/,n:"Internet Explorer"},{p:/Edge/,n:"Edge"}].find(n=>e.match(n.p)))==null?void 0:i.n)||"Unknown"}function z(){var t,o,i;if((o=(t=window._uaParserResult)==null?void 0:t.os)!=null&&o.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return((i=[{p:/Win/,n:"Windows"},{p:/Mac/,n:"Mac OS"},{p:/X11|Linux/,n:"Linux"},{p:/Android/,n:"Android"},{p:/iPhone|iPad/,n:"iOS"}].find(n=>e.match(n.p)))==null?void 0:i.n)||"Unknown"}function J(){var s,t,o,i,n,r,u,c,f,d;let e=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return{connectionType:e?e.effectiveType:"unknown",userAgent:navigator.userAgent,width:window.innerWidth,height:window.innerHeight,screenWidth:screen.width,screenHeight:screen.height,errorTimestamp:Date.now(),timeLocale:Intl.DateTimeFormat().resolvedOptions().timeZone,browserLocale:navigator.language||navigator.userLanguage,sessionTime:Math.round(performance.now()/1e3),deviceMemory:navigator.deviceMemory||"unknown",timezoneOffset:new Date().getTimezoneOffset(),cookiesEnabled:navigator.cookieEnabled,url:window.location.href,host:window.location.host,referrer:document.referrer,browser:q(),browserVersion:((t=(s=window._uaParserResult)==null?void 0:s.browser)==null?void 0:t.version)||null,os:z(),osVersion:((i=(o=window._uaParserResult)==null?void 0:o.os)==null?void 0:i.version)||null,deviceType:((r=(n=window._uaParserResult)==null?void 0:n.device)==null?void 0:r.type)||null,deviceModel:((c=(u=window._uaParserResult)==null?void 0:u.device)==null?void 0:c.model)||null,deviceVendor:((d=(f=window._uaParserResult)==null?void 0:f.device)==null?void 0:d.vendor)||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:_.clicks,userScrolls:_.scrolls}}function v(e){return!a.ignoreErrors||!Array.isArray(a.ignoreErrors)?!1:a.ignoreErrors.some(s=>typeof s=="string"?e.includes(s):s instanceof RegExp?s.test(e):!1)}function D(e,s){let t=new AbortController,o=setTimeout(()=>t.abort(),5e3),i={"Content-Type":"application/json"};return a.token&&(i["X-Ingest-Token"]=a.token),fetch(e,{method:"POST",headers:i,body:JSON.stringify(s),signal:t.signal}).then(n=>(clearTimeout(o),n)).catch(()=>{clearTimeout(o)})}function y(e){let s=(e[0]||"")+"",t=[...e];return s.replace(/%[sdj]/g,o=>{let i=t.shift();return o==="%s"?String(i):o==="%d"?Number(i):o==="%j"?JSON.stringify(i):o})}function A(e,s){let t=document.createElement("script");t.src=e,t.async=!0,s&&(t.onload=s),document.head.appendChild(t)}function G(e,s,t){return h(this,null,function*(){var o;try{let i=yield fetch(e);if(!i.ok)return null;let n=yield i.text(),r=n.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),u=n.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),c;if(r)c=JSON.parse(atob(r[1]));else if(u){let O=new URL(u[1],e).href,b=yield fetch(O);if(!b.ok)return null;c=yield b.json()}else return null;if(!((o=window.sourceMap)!=null&&o.SourceMapConsumer))return null;let d=new window.sourceMap.SourceMapConsumer(c).originalPositionFor({line:s,column:t});if(!d.source)return null;let C=c.sources.indexOf(d.source),L=null;return c.sourcesContent&&c.sourcesContent[C]&&(L=c.sourcesContent[C]),{originalSource:d.source,originalLine:d.line,originalColumn:d.column,originalName:d.name,snippet:L}}catch(i){return null}})}function g(e){E.push(l({timestamp:Date.now()},e)),E.length>j&&E.shift()}function m(e){return h(this,null,function*(){let s=a.browserDetails?J():{},t=Object.assign(e,s,p,V());if(M&&(t.user=M),Object.keys(w).length&&(t.context=l({},w)),t.breadcrumbs=E.slice(),a.sampleRate&&Math.random()<1-parseFloat(a.sampleRate)){a.debug&&P("[Scout] Suppressed by sampling");return}if(a.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let o=e.errorTrace.split(`
1
+ var $=Object.defineProperty,H=Object.defineProperties;var F=Object.getOwnPropertyDescriptors;var I=Object.getOwnPropertySymbols;var B=Object.prototype.hasOwnProperty,W=Object.prototype.propertyIsEnumerable;var T=(e,s,t)=>s in e?$(e,s,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[s]=t,l=(e,s)=>{for(var t in s||(s={}))B.call(s,t)&&T(e,t,s[t]);if(I)for(var t of I(s))W.call(s,t)&&T(e,t,s[t]);return e},x=(e,s)=>H(e,F(s));var h=(e,s,t)=>new Promise((o,i)=>{var n=c=>{try{u(t.next(c))}catch(f){i(f)}},r=c=>{try{u(t.throw(c))}catch(f){i(f)}},u=c=>c.done?o(c.value):Promise.resolve(c.value).then(n,r);u((t=t.apply(e,s)).next())});var X={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=l({},X),N,p={environment:typeof window!="undefined"&&((N=window.location)==null?void 0:N.hostname)==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.3.3",project:null,release:null,version:null,app:null},_={clicks:0,scrolls:0},k=null,U=!1,M=null,w={},E=[],j=30;var S=console.warn;var P=console.log;function R(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function V(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",R("user")),localStorage.getItem("__scoutUserId")),s=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",R("session")),sessionStorage.getItem("__scoutSessionId"));return k=k||R("pageload"),{pageloadId:k,userId:e,sessionId:s}}function q(){var t,o,i;if((o=(t=window._uaParserResult)==null?void 0:t.browser)!=null&&o.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return((i=[{p:/Chrome.*Mobile/,n:"Chrome Mobile"},{p:/Chrome/,n:"Chrome"},{p:/Firefox.*Mobile/,n:"Firefox Mobile"},{p:/Firefox/,n:"Firefox"},{p:/Safari.*Mobile/,n:"Safari Mobile"},{p:/Safari/,n:"Safari"},{p:/MSIE|Trident/,n:"Internet Explorer"},{p:/Edge/,n:"Edge"}].find(n=>e.match(n.p)))==null?void 0:i.n)||"Unknown"}function z(){var t,o,i;if((o=(t=window._uaParserResult)==null?void 0:t.os)!=null&&o.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return((i=[{p:/Win/,n:"Windows"},{p:/Mac/,n:"Mac OS"},{p:/X11|Linux/,n:"Linux"},{p:/Android/,n:"Android"},{p:/iPhone|iPad/,n:"iOS"}].find(n=>e.match(n.p)))==null?void 0:i.n)||"Unknown"}function J(){var s,t,o,i,n,r,u,c,f,d;let e=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return{connectionType:e?e.effectiveType:"unknown",userAgent:navigator.userAgent,width:window.innerWidth,height:window.innerHeight,screenWidth:screen.width,screenHeight:screen.height,errorTimestamp:Date.now(),timeLocale:Intl.DateTimeFormat().resolvedOptions().timeZone,browserLocale:navigator.language||navigator.userLanguage,sessionTime:Math.round(performance.now()/1e3),deviceMemory:navigator.deviceMemory||"unknown",timezoneOffset:new Date().getTimezoneOffset(),cookiesEnabled:navigator.cookieEnabled,url:window.location.href,host:window.location.host,referrer:document.referrer,browser:q(),browserVersion:((t=(s=window._uaParserResult)==null?void 0:s.browser)==null?void 0:t.version)||null,os:z(),osVersion:((i=(o=window._uaParserResult)==null?void 0:o.os)==null?void 0:i.version)||null,deviceType:((r=(n=window._uaParserResult)==null?void 0:n.device)==null?void 0:r.type)||null,deviceModel:((c=(u=window._uaParserResult)==null?void 0:u.device)==null?void 0:c.model)||null,deviceVendor:((d=(f=window._uaParserResult)==null?void 0:f.device)==null?void 0:d.vendor)||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:_.clicks,userScrolls:_.scrolls}}function v(e){return!a.ignoreErrors||!Array.isArray(a.ignoreErrors)?!1:a.ignoreErrors.some(s=>typeof s=="string"?e.includes(s):s instanceof RegExp?s.test(e):!1)}function D(e,s){let t=new AbortController,o=setTimeout(()=>t.abort(),5e3),i={"Content-Type":"application/json"};return a.token&&(i["X-Ingest-Token"]=a.token),fetch(e,{method:"POST",headers:i,body:JSON.stringify(s),signal:t.signal}).then(n=>(clearTimeout(o),n)).catch(()=>{clearTimeout(o)})}function y(e){let s=(e[0]||"")+"",t=[...e];return s.replace(/%[sdj]/g,o=>{let i=t.shift();return o==="%s"?String(i):o==="%d"?Number(i):o==="%j"?JSON.stringify(i):o})}function A(e,s){let t=document.createElement("script");t.src=e,t.async=!0,s&&(t.onload=s),document.head.appendChild(t)}function G(e,s,t){return h(this,null,function*(){var o;try{let i=yield fetch(e);if(!i.ok)return null;let n=yield i.text(),r=n.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),u=n.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),c;if(r)c=JSON.parse(atob(r[1]));else if(u){let O=new URL(u[1],e).href,b=yield fetch(O);if(!b.ok)return null;c=yield b.json()}else return null;if(!((o=window.sourceMap)!=null&&o.SourceMapConsumer))return null;let d=new window.sourceMap.SourceMapConsumer(c).originalPositionFor({line:s,column:t});if(!d.source)return null;let C=c.sources.indexOf(d.source),L=null;return c.sourcesContent&&c.sourcesContent[C]&&(L=c.sourcesContent[C]),{originalSource:d.source,originalLine:d.line,originalColumn:d.column,originalName:d.name,snippet:L}}catch(i){return null}})}function g(e){E.push(l({timestamp:Date.now()},e)),E.length>j&&E.shift()}function m(e){return h(this,null,function*(){let s=a.browserDetails?J():{},t=Object.assign(e,s,p,V());if(M&&(t.user=M),Object.keys(w).length&&(t.context=l({},w)),t.breadcrumbs=E.slice(),a.sampleRate&&Math.random()<1-parseFloat(a.sampleRate)){a.debug&&P("[Scout] Suppressed by sampling");return}if(a.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let o=e.errorTrace.split(`
2
2
  `),i=[o[0]];for(let n=1;n<o.length;n++)!o[n].includes("/scout")&&!o[n].includes("scout.js")&&!o[n].includes("scout-error")&&i.push(o[n]);i.length>1&&(e.errorTrace=i.join(`
3
3
  `))}catch(o){}if((e.errorTrace||e.stack)&&!e.source)try{let o=e.errorTrace||e.stack,i=o?o.split(`
4
4
  `):[];for(let n=1;n<i.length;n++){let r=i[n].trim().match(/(http.*?):(\d+):(\d+)/);if(r){e.source=r[1],e.lineno=parseInt(r[2],10),e.colno=parseInt(r[3],10);break}}}catch(o){}if(a.debug&&P("[Scout] Sending:",t),a.endpoint&&D(a.endpoint,t),a.handleSourceMaps&&e.source&&e.lineno)try{let o=yield G(e.source,e.lineno,e.colno||0);if(o){let i=x(l({},t),{originalSource:o.originalSource,originalLine:o.originalLine,originalColumn:o.originalColumn,originalName:o.originalName,highlightLineNumber:o.originalLine});o.snippet&&(i.snippet=o.snippet),a.endpoint&&D(a.endpoint,i)}}catch(o){}})}function K(e){a.enabled&&m(e)}function Z(e){M=e}function Q(e){w=l(l({},w),e)}function Y(e,s){w[e]=s}function te(e){g(e)}function ee(){if(a.trackUserInteractions){document.addEventListener("click",r=>{_.clicks++;let u=r.target,c=u.tagName?u.tagName.toLowerCase():"",f=(u.textContent||"").trim().slice(0,50);g({category:"click",message:c+(f?": "+f:"")})});let n=0;window.addEventListener("scroll",()=>{let r=Date.now();r-n>100&&(_.scrolls++,n=r)})}let e=history.pushState;history.pushState=function(){e.apply(this,arguments),g({category:"navigation",message:window.location.href})},window.addEventListener("popstate",()=>{g({category:"navigation",message:window.location.href})});let s=window.fetch;window.fetch=function(n,r){let u=typeof n=="string"?n:(n==null?void 0:n.url)||"",c=(r==null?void 0:r.method)||"GET",f=Date.now();return s.apply(this,arguments).then(d=>(g({category:"fetch",message:`${c} ${u}`,data:{status:d.status,duration:Date.now()-f}}),d)).catch(d=>{throw g({category:"fetch",message:`${c} ${u}`,data:{error:d.message,duration:Date.now()-f}}),d})};let t=XMLHttpRequest.prototype.open,o=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(n,r){return this._scoutMethod=n,this._scoutUrl=r,t.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){let n=this,r=Date.now();return n.addEventListener("loadend",()=>{g({category:"xhr",message:`${n._scoutMethod||"GET"} ${n._scoutUrl||""}`,data:{status:n.status,duration:Date.now()-r}})}),o.apply(this,arguments)},a.addErrorEventListener&&window.addEventListener("error",n=>h(this,null,function*(){if(a.enabled){try{let r=n.error?n.error.stack:"No stack trace available";if(v(n.message))return;a.sendErrors&&m({type:"window.onerror",message:n.message,source:n.filename,lineno:n.lineno,colno:n.colno,errorTrace:r})}catch(r){S("[Scout] Error handler failure:",r)}a.selfHealingErrors&&n.preventDefault()}})),a.addUnhandledRejectionEventListener&&window.addEventListener("unhandledrejection",n=>{if(a.enabled){try{let r=n.reason,u=(r==null?void 0:r.stack)||"No stack trace available";if(v((r==null?void 0:r.message)||""))return;a.sendErrors&&m({type:"Unhandled Promise Rejection",message:(r==null?void 0:r.message)||"Unhandled Promise Rejection",reason:n.reason,errorTrace:u})}catch(r){S("[Scout] Rejection handler failure:",r)}a.selfHealingErrors&&n.preventDefault()}}),a.overrideConsoleError&&(console.error=function(...n){if(a.enabled)try{let r=new Error().stack;if(v(y(n)))return;a.sendErrors&&m({type:"console.error",errorTrace:r,args:y(n)})}catch(r){S("[Scout] console.error override failure:",r)}}),a.overrideConsoleWarn&&(console.warn=function(...n){if(a.enabled)try{let r=new Error().stack;if(v(y(n)))return;a.sendErrors&&m({type:"console.warn",errorTrace:r,args:y(n)})}catch(r){S("[Scout] console.warn override failure:",r)}});let i=a.endpoint?new URL(a.endpoint).origin:"";a.loadUAParser&&a.browserDetails&&i&&A(`${i}/vendor/ua-parser.min.js`,()=>{typeof UAParser!="undefined"&&(window._uaParserResult=new UAParser().getResult())}),a.handleSourceMaps&&i&&A(`${i}/vendor/source-map.min.js`)}function ne(e={},s={}){if(e.user&&(M=e.user,delete e.user),U){p=l(l({},p),e),a=l(l({},a),s);return}p=l(l({},p),e),a=l(l({},a),s),U=!0,typeof window!="undefined"&&ee()}typeof window!="undefined"&&(window.Scout={init:ne,setScope:e=>{p=l(l({},p),e)},setConfig:e=>{a=l(l({},a),e)},setUser:Z,setContext:Q,setTag:Y,addBreadcrumb:g,error:K});export{te as addBreadcrumb,K as captureError,ne as init,Q as setContext,Y as setTag,Z as setUser};
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.3.2",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.3.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});
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.3.2",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.3.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};
2
2
  //# sourceMappingURL=node.js.map
package/dist/react.cjs CHANGED
@@ -1,4 +1,4 @@
1
- var j=Object.create;var m=Object.defineProperty,V=Object.defineProperties,q=Object.getOwnPropertyDescriptor,z=Object.getOwnPropertyDescriptors,J=Object.getOwnPropertyNames,U=Object.getOwnPropertySymbols,G=Object.getPrototypeOf,P=Object.prototype.hasOwnProperty,K=Object.prototype.propertyIsEnumerable;var D=(e,r,t)=>r in e?m(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t,l=(e,r)=>{for(var t in r||(r={}))P.call(r,t)&&D(e,t,r[t]);if(U)for(var t of U(r))K.call(r,t)&&D(e,t,r[t]);return e},A=(e,r)=>V(e,z(r));var Z=(e,r)=>{for(var t in r)m(e,t,{get:r[t],enumerable:!0})},N=(e,r,t,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of J(r))!P.call(e,a)&&a!==t&&m(e,a,{get:()=>r[a],enumerable:!(s=q(r,a))||s.enumerable});return e};var Q=(e,r,t)=>(t=e!=null?j(G(e)):{},N(r||!e||!e.__esModule?m(t,"default",{value:e,enumerable:!0}):t,e)),Y=e=>N(m({},"__esModule",{value:!0}),e);var S=(e,r,t)=>new Promise((s,a)=>{var n=c=>{try{u(t.next(c))}catch(f){a(f)}},o=c=>{try{u(t.throw(c))}catch(f){a(f)}},u=c=>c.done?s(c.value):Promise.resolve(c.value).then(n,o);u((t=t.apply(e,r)).next())});var fe={};Z(fe,{ScoutErrorBoundary:()=>L});module.exports=Y(fe);var X=Q(require("react"),1);var ee={trackUserInteractions:!0,selfHealingErrors:!1,attachStacktrace:!0,handleSourceMaps:!0,browserDetails:!0,warnOnCapture:!1,loadUAParser:!0,ignoreErrors:null,sendErrors:!0,sampleRate:1,enabled:!0,debug:!1,endpoint:"",token:null,overrideOnError:!1,overrideOnUnhandledRejection:!1,addErrorEventListener:!0,addUnhandledRejectionEventListener:!0,overrideConsoleLog:!1,overrideConsoleWarn:!1,overrideConsoleInfo:!1,overrideConsoleError:!0},i=l({},ee),W,g={environment:typeof window!="undefined"&&((W=window.location)==null?void 0:W.hostname)==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.3.2",project:null,release:null,version:null,app:null},_={clicks:0,scrolls:0},C=null,O=!1,M=null,w={},k=[],re=30;var v=console.warn;var $=console.log;function R(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function ne(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",R("user")),localStorage.getItem("__scoutUserId")),r=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",R("session")),sessionStorage.getItem("__scoutSessionId"));return C=C||R("pageload"),{pageloadId:C,userId:e,sessionId:r}}function te(){var t,s,a;if((s=(t=window._uaParserResult)==null?void 0:t.browser)!=null&&s.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return((a=[{p:/Chrome.*Mobile/,n:"Chrome Mobile"},{p:/Chrome/,n:"Chrome"},{p:/Firefox.*Mobile/,n:"Firefox Mobile"},{p:/Firefox/,n:"Firefox"},{p:/Safari.*Mobile/,n:"Safari Mobile"},{p:/Safari/,n:"Safari"},{p:/MSIE|Trident/,n:"Internet Explorer"},{p:/Edge/,n:"Edge"}].find(n=>e.match(n.p)))==null?void 0:a.n)||"Unknown"}function oe(){var t,s,a;if((s=(t=window._uaParserResult)==null?void 0:t.os)!=null&&s.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return((a=[{p:/Win/,n:"Windows"},{p:/Mac/,n:"Mac OS"},{p:/X11|Linux/,n:"Linux"},{p:/Android/,n:"Android"},{p:/iPhone|iPad/,n:"iOS"}].find(n=>e.match(n.p)))==null?void 0:a.n)||"Unknown"}function se(){var r,t,s,a,n,o,u,c,f,d;let e=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return{connectionType:e?e.effectiveType:"unknown",userAgent:navigator.userAgent,width:window.innerWidth,height:window.innerHeight,screenWidth:screen.width,screenHeight:screen.height,errorTimestamp:Date.now(),timeLocale:Intl.DateTimeFormat().resolvedOptions().timeZone,browserLocale:navigator.language||navigator.userLanguage,sessionTime:Math.round(performance.now()/1e3),deviceMemory:navigator.deviceMemory||"unknown",timezoneOffset:new Date().getTimezoneOffset(),cookiesEnabled:navigator.cookieEnabled,url:window.location.href,host:window.location.host,referrer:document.referrer,browser:te(),browserVersion:((t=(r=window._uaParserResult)==null?void 0:r.browser)==null?void 0:t.version)||null,os:oe(),osVersion:((a=(s=window._uaParserResult)==null?void 0:s.os)==null?void 0:a.version)||null,deviceType:((o=(n=window._uaParserResult)==null?void 0:n.device)==null?void 0:o.type)||null,deviceModel:((c=(u=window._uaParserResult)==null?void 0:u.device)==null?void 0:c.model)||null,deviceVendor:((d=(f=window._uaParserResult)==null?void 0:f.device)==null?void 0:d.vendor)||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:_.clicks,userScrolls:_.scrolls}}function y(e){return!i.ignoreErrors||!Array.isArray(i.ignoreErrors)?!1:i.ignoreErrors.some(r=>typeof r=="string"?e.includes(r):r instanceof RegExp?r.test(e):!1)}function F(e,r){let t=new AbortController,s=setTimeout(()=>t.abort(),5e3),a={"Content-Type":"application/json"};return i.token&&(a["X-Ingest-Token"]=i.token),fetch(e,{method:"POST",headers:a,body:JSON.stringify(r),signal:t.signal}).then(n=>(clearTimeout(s),n)).catch(()=>{clearTimeout(s)})}function E(e){let r=(e[0]||"")+"",t=[...e];return r.replace(/%[sdj]/g,s=>{let a=t.shift();return s==="%s"?String(a):s==="%d"?Number(a):s==="%j"?JSON.stringify(a):s})}function H(e,r){let t=document.createElement("script");t.src=e,t.async=!0,r&&(t.onload=r),document.head.appendChild(t)}function ae(e,r,t){return S(this,null,function*(){var s;try{let a=yield fetch(e);if(!a.ok)return null;let n=yield a.text(),o=n.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),u=n.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),c;if(o)c=JSON.parse(atob(o[1]));else if(u){let B=new URL(u[1],e).href,I=yield fetch(B);if(!I.ok)return null;c=yield I.json()}else return null;if(!((s=window.sourceMap)!=null&&s.SourceMapConsumer))return null;let d=new window.sourceMap.SourceMapConsumer(c).originalPositionFor({line:r,column:t});if(!d.source)return null;let T=c.sources.indexOf(d.source),x=null;return c.sourcesContent&&c.sourcesContent[T]&&(x=c.sourcesContent[T]),{originalSource:d.source,originalLine:d.line,originalColumn:d.column,originalName:d.name,snippet:x}}catch(a){return null}})}function p(e){k.push(l({timestamp:Date.now()},e)),k.length>re&&k.shift()}function h(e){return S(this,null,function*(){let r=i.browserDetails?se():{},t=Object.assign(e,r,g,ne());if(M&&(t.user=M),Object.keys(w).length&&(t.context=l({},w)),t.breadcrumbs=k.slice(),i.sampleRate&&Math.random()<1-parseFloat(i.sampleRate)){i.debug&&$("[Scout] Suppressed by sampling");return}if(i.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let s=e.errorTrace.split(`
1
+ var j=Object.create;var m=Object.defineProperty,V=Object.defineProperties,q=Object.getOwnPropertyDescriptor,z=Object.getOwnPropertyDescriptors,J=Object.getOwnPropertyNames,U=Object.getOwnPropertySymbols,G=Object.getPrototypeOf,P=Object.prototype.hasOwnProperty,K=Object.prototype.propertyIsEnumerable;var D=(e,r,t)=>r in e?m(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t,l=(e,r)=>{for(var t in r||(r={}))P.call(r,t)&&D(e,t,r[t]);if(U)for(var t of U(r))K.call(r,t)&&D(e,t,r[t]);return e},A=(e,r)=>V(e,z(r));var Z=(e,r)=>{for(var t in r)m(e,t,{get:r[t],enumerable:!0})},N=(e,r,t,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of J(r))!P.call(e,a)&&a!==t&&m(e,a,{get:()=>r[a],enumerable:!(s=q(r,a))||s.enumerable});return e};var Q=(e,r,t)=>(t=e!=null?j(G(e)):{},N(r||!e||!e.__esModule?m(t,"default",{value:e,enumerable:!0}):t,e)),Y=e=>N(m({},"__esModule",{value:!0}),e);var S=(e,r,t)=>new Promise((s,a)=>{var n=c=>{try{u(t.next(c))}catch(f){a(f)}},o=c=>{try{u(t.throw(c))}catch(f){a(f)}},u=c=>c.done?s(c.value):Promise.resolve(c.value).then(n,o);u((t=t.apply(e,r)).next())});var fe={};Z(fe,{ScoutErrorBoundary:()=>L});module.exports=Y(fe);var X=Q(require("react"),1);var ee={trackUserInteractions:!0,selfHealingErrors:!1,attachStacktrace:!0,handleSourceMaps:!0,browserDetails:!0,warnOnCapture:!1,loadUAParser:!0,ignoreErrors:null,sendErrors:!0,sampleRate:1,enabled:!0,debug:!1,endpoint:"",token:null,overrideOnError:!1,overrideOnUnhandledRejection:!1,addErrorEventListener:!0,addUnhandledRejectionEventListener:!0,overrideConsoleLog:!1,overrideConsoleWarn:!1,overrideConsoleInfo:!1,overrideConsoleError:!0},i=l({},ee),W,g={environment:typeof window!="undefined"&&((W=window.location)==null?void 0:W.hostname)==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.3.3",project:null,release:null,version:null,app:null},_={clicks:0,scrolls:0},C=null,O=!1,M=null,w={},k=[],re=30;var v=console.warn;var $=console.log;function R(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function ne(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",R("user")),localStorage.getItem("__scoutUserId")),r=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",R("session")),sessionStorage.getItem("__scoutSessionId"));return C=C||R("pageload"),{pageloadId:C,userId:e,sessionId:r}}function te(){var t,s,a;if((s=(t=window._uaParserResult)==null?void 0:t.browser)!=null&&s.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return((a=[{p:/Chrome.*Mobile/,n:"Chrome Mobile"},{p:/Chrome/,n:"Chrome"},{p:/Firefox.*Mobile/,n:"Firefox Mobile"},{p:/Firefox/,n:"Firefox"},{p:/Safari.*Mobile/,n:"Safari Mobile"},{p:/Safari/,n:"Safari"},{p:/MSIE|Trident/,n:"Internet Explorer"},{p:/Edge/,n:"Edge"}].find(n=>e.match(n.p)))==null?void 0:a.n)||"Unknown"}function oe(){var t,s,a;if((s=(t=window._uaParserResult)==null?void 0:t.os)!=null&&s.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return((a=[{p:/Win/,n:"Windows"},{p:/Mac/,n:"Mac OS"},{p:/X11|Linux/,n:"Linux"},{p:/Android/,n:"Android"},{p:/iPhone|iPad/,n:"iOS"}].find(n=>e.match(n.p)))==null?void 0:a.n)||"Unknown"}function se(){var r,t,s,a,n,o,u,c,f,d;let e=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return{connectionType:e?e.effectiveType:"unknown",userAgent:navigator.userAgent,width:window.innerWidth,height:window.innerHeight,screenWidth:screen.width,screenHeight:screen.height,errorTimestamp:Date.now(),timeLocale:Intl.DateTimeFormat().resolvedOptions().timeZone,browserLocale:navigator.language||navigator.userLanguage,sessionTime:Math.round(performance.now()/1e3),deviceMemory:navigator.deviceMemory||"unknown",timezoneOffset:new Date().getTimezoneOffset(),cookiesEnabled:navigator.cookieEnabled,url:window.location.href,host:window.location.host,referrer:document.referrer,browser:te(),browserVersion:((t=(r=window._uaParserResult)==null?void 0:r.browser)==null?void 0:t.version)||null,os:oe(),osVersion:((a=(s=window._uaParserResult)==null?void 0:s.os)==null?void 0:a.version)||null,deviceType:((o=(n=window._uaParserResult)==null?void 0:n.device)==null?void 0:o.type)||null,deviceModel:((c=(u=window._uaParserResult)==null?void 0:u.device)==null?void 0:c.model)||null,deviceVendor:((d=(f=window._uaParserResult)==null?void 0:f.device)==null?void 0:d.vendor)||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:_.clicks,userScrolls:_.scrolls}}function y(e){return!i.ignoreErrors||!Array.isArray(i.ignoreErrors)?!1:i.ignoreErrors.some(r=>typeof r=="string"?e.includes(r):r instanceof RegExp?r.test(e):!1)}function F(e,r){let t=new AbortController,s=setTimeout(()=>t.abort(),5e3),a={"Content-Type":"application/json"};return i.token&&(a["X-Ingest-Token"]=i.token),fetch(e,{method:"POST",headers:a,body:JSON.stringify(r),signal:t.signal}).then(n=>(clearTimeout(s),n)).catch(()=>{clearTimeout(s)})}function E(e){let r=(e[0]||"")+"",t=[...e];return r.replace(/%[sdj]/g,s=>{let a=t.shift();return s==="%s"?String(a):s==="%d"?Number(a):s==="%j"?JSON.stringify(a):s})}function H(e,r){let t=document.createElement("script");t.src=e,t.async=!0,r&&(t.onload=r),document.head.appendChild(t)}function ae(e,r,t){return S(this,null,function*(){var s;try{let a=yield fetch(e);if(!a.ok)return null;let n=yield a.text(),o=n.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),u=n.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),c;if(o)c=JSON.parse(atob(o[1]));else if(u){let B=new URL(u[1],e).href,I=yield fetch(B);if(!I.ok)return null;c=yield I.json()}else return null;if(!((s=window.sourceMap)!=null&&s.SourceMapConsumer))return null;let d=new window.sourceMap.SourceMapConsumer(c).originalPositionFor({line:r,column:t});if(!d.source)return null;let T=c.sources.indexOf(d.source),x=null;return c.sourcesContent&&c.sourcesContent[T]&&(x=c.sourcesContent[T]),{originalSource:d.source,originalLine:d.line,originalColumn:d.column,originalName:d.name,snippet:x}}catch(a){return null}})}function p(e){k.push(l({timestamp:Date.now()},e)),k.length>re&&k.shift()}function h(e){return S(this,null,function*(){let r=i.browserDetails?se():{},t=Object.assign(e,r,g,ne());if(M&&(t.user=M),Object.keys(w).length&&(t.context=l({},w)),t.breadcrumbs=k.slice(),i.sampleRate&&Math.random()<1-parseFloat(i.sampleRate)){i.debug&&$("[Scout] Suppressed by sampling");return}if(i.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let s=e.errorTrace.split(`
2
2
  `),a=[s[0]];for(let n=1;n<s.length;n++)!s[n].includes("/scout")&&!s[n].includes("scout.js")&&!s[n].includes("scout-error")&&a.push(s[n]);a.length>1&&(e.errorTrace=a.join(`
3
3
  `))}catch(s){}if((e.errorTrace||e.stack)&&!e.source)try{let s=e.errorTrace||e.stack,a=s?s.split(`
4
4
  `):[];for(let n=1;n<a.length;n++){let o=a[n].trim().match(/(http.*?):(\d+):(\d+)/);if(o){e.source=o[1],e.lineno=parseInt(o[2],10),e.colno=parseInt(o[3],10);break}}}catch(s){}if(i.debug&&$("[Scout] Sending:",t),i.endpoint&&F(i.endpoint,t),i.handleSourceMaps&&e.source&&e.lineno)try{let s=yield ae(e.source,e.lineno,e.colno||0);if(s){let a=A(l({},t),{originalSource:s.originalSource,originalLine:s.originalLine,originalColumn:s.originalColumn,originalName:s.originalName,highlightLineNumber:s.originalLine});s.snippet&&(a.snippet=s.snippet),i.endpoint&&F(i.endpoint,a)}}catch(s){}})}function b(e){i.enabled&&h(e)}function ie(e){M=e}function ce(e){w=l(l({},w),e)}function le(e,r){w[e]=r}function ue(){if(i.trackUserInteractions){document.addEventListener("click",o=>{_.clicks++;let u=o.target,c=u.tagName?u.tagName.toLowerCase():"",f=(u.textContent||"").trim().slice(0,50);p({category:"click",message:c+(f?": "+f:"")})});let n=0;window.addEventListener("scroll",()=>{let o=Date.now();o-n>100&&(_.scrolls++,n=o)})}let e=history.pushState;history.pushState=function(){e.apply(this,arguments),p({category:"navigation",message:window.location.href})},window.addEventListener("popstate",()=>{p({category:"navigation",message:window.location.href})});let r=window.fetch;window.fetch=function(n,o){let u=typeof n=="string"?n:(n==null?void 0:n.url)||"",c=(o==null?void 0:o.method)||"GET",f=Date.now();return r.apply(this,arguments).then(d=>(p({category:"fetch",message:`${c} ${u}`,data:{status:d.status,duration:Date.now()-f}}),d)).catch(d=>{throw p({category:"fetch",message:`${c} ${u}`,data:{error:d.message,duration:Date.now()-f}}),d})};let t=XMLHttpRequest.prototype.open,s=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(n,o){return this._scoutMethod=n,this._scoutUrl=o,t.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){let n=this,o=Date.now();return n.addEventListener("loadend",()=>{p({category:"xhr",message:`${n._scoutMethod||"GET"} ${n._scoutUrl||""}`,data:{status:n.status,duration:Date.now()-o}})}),s.apply(this,arguments)},i.addErrorEventListener&&window.addEventListener("error",n=>S(this,null,function*(){if(i.enabled){try{let o=n.error?n.error.stack:"No stack trace available";if(y(n.message))return;i.sendErrors&&h({type:"window.onerror",message:n.message,source:n.filename,lineno:n.lineno,colno:n.colno,errorTrace:o})}catch(o){v("[Scout] Error handler failure:",o)}i.selfHealingErrors&&n.preventDefault()}})),i.addUnhandledRejectionEventListener&&window.addEventListener("unhandledrejection",n=>{if(i.enabled){try{let o=n.reason,u=(o==null?void 0:o.stack)||"No stack trace available";if(y((o==null?void 0:o.message)||""))return;i.sendErrors&&h({type:"Unhandled Promise Rejection",message:(o==null?void 0:o.message)||"Unhandled Promise Rejection",reason:n.reason,errorTrace:u})}catch(o){v("[Scout] Rejection handler failure:",o)}i.selfHealingErrors&&n.preventDefault()}}),i.overrideConsoleError&&(console.error=function(...n){if(i.enabled)try{let o=new Error().stack;if(y(E(n)))return;i.sendErrors&&h({type:"console.error",errorTrace:o,args:E(n)})}catch(o){v("[Scout] console.error override failure:",o)}}),i.overrideConsoleWarn&&(console.warn=function(...n){if(i.enabled)try{let o=new Error().stack;if(y(E(n)))return;i.sendErrors&&h({type:"console.warn",errorTrace:o,args:E(n)})}catch(o){v("[Scout] console.warn override failure:",o)}});let a=i.endpoint?new URL(i.endpoint).origin:"";i.loadUAParser&&i.browserDetails&&a&&H(`${a}/vendor/ua-parser.min.js`,()=>{typeof UAParser!="undefined"&&(window._uaParserResult=new UAParser().getResult())}),i.handleSourceMaps&&a&&H(`${a}/vendor/source-map.min.js`)}function de(e={},r={}){if(e.user&&(M=e.user,delete e.user),O){g=l(l({},g),e),i=l(l({},i),r);return}g=l(l({},g),e),i=l(l({},i),r),O=!0,typeof window!="undefined"&&ue()}typeof window!="undefined"&&(window.Scout={init:de,setScope:e=>{g=l(l({},g),e)},setConfig:e=>{i=l(l({},i),e)},setUser:ie,setContext:ce,setTag:le,addBreadcrumb:p,error:b});var L=class extends X.default.Component{constructor(r){super(r),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(r,t){b({message:r.message,stack:r.stack,errorTrace:r.stack,component:(t==null?void 0:t.componentStack)||"",type:"react-error-boundary"})}render(){return this.state.hasError?this.props.fallback||null:this.props.children}};
package/dist/react.js CHANGED
@@ -1,4 +1,4 @@
1
- var H=Object.defineProperty,W=Object.defineProperties;var X=Object.getOwnPropertyDescriptors;var x=Object.getOwnPropertySymbols;var B=Object.prototype.hasOwnProperty,j=Object.prototype.propertyIsEnumerable;var I=(e,n,t)=>n in e?H(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t,l=(e,n)=>{for(var t in n||(n={}))B.call(n,t)&&I(e,t,n[t]);if(x)for(var t of x(n))j.call(n,t)&&I(e,t,n[t]);return e},U=(e,n)=>W(e,X(n));var w=(e,n,t)=>new Promise((s,i)=>{var r=c=>{try{u(t.next(c))}catch(f){i(f)}},o=c=>{try{u(t.throw(c))}catch(f){i(f)}},u=c=>c.done?s(c.value):Promise.resolve(c.value).then(r,o);u((t=t.apply(e,n)).next())});import te from"react";var V={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=l({},V),O,g={environment:typeof window!="undefined"&&((O=window.location)==null?void 0:O.hostname)==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.3.2",project:null,release:null,version:null,app:null},k={clicks:0,scrolls:0},M=null,D=!1,_=null,h={},E=[],q=30;var S=console.warn;var P=console.log;function C(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function z(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",C("user")),localStorage.getItem("__scoutUserId")),n=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",C("session")),sessionStorage.getItem("__scoutSessionId"));return M=M||C("pageload"),{pageloadId:M,userId:e,sessionId:n}}function J(){var t,s,i;if((s=(t=window._uaParserResult)==null?void 0:t.browser)!=null&&s.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return((i=[{p:/Chrome.*Mobile/,n:"Chrome Mobile"},{p:/Chrome/,n:"Chrome"},{p:/Firefox.*Mobile/,n:"Firefox Mobile"},{p:/Firefox/,n:"Firefox"},{p:/Safari.*Mobile/,n:"Safari Mobile"},{p:/Safari/,n:"Safari"},{p:/MSIE|Trident/,n:"Internet Explorer"},{p:/Edge/,n:"Edge"}].find(r=>e.match(r.p)))==null?void 0:i.n)||"Unknown"}function G(){var t,s,i;if((s=(t=window._uaParserResult)==null?void 0:t.os)!=null&&s.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return((i=[{p:/Win/,n:"Windows"},{p:/Mac/,n:"Mac OS"},{p:/X11|Linux/,n:"Linux"},{p:/Android/,n:"Android"},{p:/iPhone|iPad/,n:"iOS"}].find(r=>e.match(r.p)))==null?void 0:i.n)||"Unknown"}function K(){var n,t,s,i,r,o,u,c,f,d;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:((t=(n=window._uaParserResult)==null?void 0:n.browser)==null?void 0:t.version)||null,os:G(),osVersion:((i=(s=window._uaParserResult)==null?void 0:s.os)==null?void 0:i.version)||null,deviceType:((o=(r=window._uaParserResult)==null?void 0:r.device)==null?void 0:o.type)||null,deviceModel:((c=(u=window._uaParserResult)==null?void 0:u.device)==null?void 0:c.model)||null,deviceVendor:((d=(f=window._uaParserResult)==null?void 0:f.device)==null?void 0:d.vendor)||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:k.clicks,userScrolls:k.scrolls}}function v(e){return!a.ignoreErrors||!Array.isArray(a.ignoreErrors)?!1:a.ignoreErrors.some(n=>typeof n=="string"?e.includes(n):n instanceof RegExp?n.test(e):!1)}function A(e,n){let t=new AbortController,s=setTimeout(()=>t.abort(),5e3),i={"Content-Type":"application/json"};return a.token&&(i["X-Ingest-Token"]=a.token),fetch(e,{method:"POST",headers:i,body:JSON.stringify(n),signal:t.signal}).then(r=>(clearTimeout(s),r)).catch(()=>{clearTimeout(s)})}function y(e){let n=(e[0]||"")+"",t=[...e];return n.replace(/%[sdj]/g,s=>{let i=t.shift();return s==="%s"?String(i):s==="%d"?Number(i):s==="%j"?JSON.stringify(i):s})}function N(e,n){let t=document.createElement("script");t.src=e,t.async=!0,n&&(t.onload=n),document.head.appendChild(t)}function Z(e,n,t){return w(this,null,function*(){var s;try{let i=yield fetch(e);if(!i.ok)return null;let r=yield i.text(),o=r.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),u=r.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),c;if(o)c=JSON.parse(atob(o[1]));else if(u){let F=new URL(u[1],e).href,T=yield fetch(F);if(!T.ok)return null;c=yield T.json()}else return null;if(!((s=window.sourceMap)!=null&&s.SourceMapConsumer))return null;let d=new window.sourceMap.SourceMapConsumer(c).originalPositionFor({line:n,column:t});if(!d.source)return null;let b=c.sources.indexOf(d.source),L=null;return c.sourcesContent&&c.sourcesContent[b]&&(L=c.sourcesContent[b]),{originalSource:d.source,originalLine:d.line,originalColumn:d.column,originalName:d.name,snippet:L}}catch(i){return null}})}function p(e){E.push(l({timestamp:Date.now()},e)),E.length>q&&E.shift()}function m(e){return w(this,null,function*(){let n=a.browserDetails?K():{},t=Object.assign(e,n,g,z());if(_&&(t.user=_),Object.keys(h).length&&(t.context=l({},h)),t.breadcrumbs=E.slice(),a.sampleRate&&Math.random()<1-parseFloat(a.sampleRate)){a.debug&&P("[Scout] Suppressed by sampling");return}if(a.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let s=e.errorTrace.split(`
1
+ var H=Object.defineProperty,W=Object.defineProperties;var X=Object.getOwnPropertyDescriptors;var x=Object.getOwnPropertySymbols;var B=Object.prototype.hasOwnProperty,j=Object.prototype.propertyIsEnumerable;var I=(e,n,t)=>n in e?H(e,n,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[n]=t,l=(e,n)=>{for(var t in n||(n={}))B.call(n,t)&&I(e,t,n[t]);if(x)for(var t of x(n))j.call(n,t)&&I(e,t,n[t]);return e},U=(e,n)=>W(e,X(n));var w=(e,n,t)=>new Promise((s,i)=>{var r=c=>{try{u(t.next(c))}catch(f){i(f)}},o=c=>{try{u(t.throw(c))}catch(f){i(f)}},u=c=>c.done?s(c.value):Promise.resolve(c.value).then(r,o);u((t=t.apply(e,n)).next())});import te from"react";var V={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=l({},V),O,g={environment:typeof window!="undefined"&&((O=window.location)==null?void 0:O.hostname)==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.3.3",project:null,release:null,version:null,app:null},k={clicks:0,scrolls:0},M=null,D=!1,_=null,h={},E=[],q=30;var S=console.warn;var P=console.log;function C(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function z(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",C("user")),localStorage.getItem("__scoutUserId")),n=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",C("session")),sessionStorage.getItem("__scoutSessionId"));return M=M||C("pageload"),{pageloadId:M,userId:e,sessionId:n}}function J(){var t,s,i;if((s=(t=window._uaParserResult)==null?void 0:t.browser)!=null&&s.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return((i=[{p:/Chrome.*Mobile/,n:"Chrome Mobile"},{p:/Chrome/,n:"Chrome"},{p:/Firefox.*Mobile/,n:"Firefox Mobile"},{p:/Firefox/,n:"Firefox"},{p:/Safari.*Mobile/,n:"Safari Mobile"},{p:/Safari/,n:"Safari"},{p:/MSIE|Trident/,n:"Internet Explorer"},{p:/Edge/,n:"Edge"}].find(r=>e.match(r.p)))==null?void 0:i.n)||"Unknown"}function G(){var t,s,i;if((s=(t=window._uaParserResult)==null?void 0:t.os)!=null&&s.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return((i=[{p:/Win/,n:"Windows"},{p:/Mac/,n:"Mac OS"},{p:/X11|Linux/,n:"Linux"},{p:/Android/,n:"Android"},{p:/iPhone|iPad/,n:"iOS"}].find(r=>e.match(r.p)))==null?void 0:i.n)||"Unknown"}function K(){var n,t,s,i,r,o,u,c,f,d;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:((t=(n=window._uaParserResult)==null?void 0:n.browser)==null?void 0:t.version)||null,os:G(),osVersion:((i=(s=window._uaParserResult)==null?void 0:s.os)==null?void 0:i.version)||null,deviceType:((o=(r=window._uaParserResult)==null?void 0:r.device)==null?void 0:o.type)||null,deviceModel:((c=(u=window._uaParserResult)==null?void 0:u.device)==null?void 0:c.model)||null,deviceVendor:((d=(f=window._uaParserResult)==null?void 0:f.device)==null?void 0:d.vendor)||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:k.clicks,userScrolls:k.scrolls}}function v(e){return!a.ignoreErrors||!Array.isArray(a.ignoreErrors)?!1:a.ignoreErrors.some(n=>typeof n=="string"?e.includes(n):n instanceof RegExp?n.test(e):!1)}function A(e,n){let t=new AbortController,s=setTimeout(()=>t.abort(),5e3),i={"Content-Type":"application/json"};return a.token&&(i["X-Ingest-Token"]=a.token),fetch(e,{method:"POST",headers:i,body:JSON.stringify(n),signal:t.signal}).then(r=>(clearTimeout(s),r)).catch(()=>{clearTimeout(s)})}function y(e){let n=(e[0]||"")+"",t=[...e];return n.replace(/%[sdj]/g,s=>{let i=t.shift();return s==="%s"?String(i):s==="%d"?Number(i):s==="%j"?JSON.stringify(i):s})}function N(e,n){let t=document.createElement("script");t.src=e,t.async=!0,n&&(t.onload=n),document.head.appendChild(t)}function Z(e,n,t){return w(this,null,function*(){var s;try{let i=yield fetch(e);if(!i.ok)return null;let r=yield i.text(),o=r.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),u=r.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),c;if(o)c=JSON.parse(atob(o[1]));else if(u){let F=new URL(u[1],e).href,T=yield fetch(F);if(!T.ok)return null;c=yield T.json()}else return null;if(!((s=window.sourceMap)!=null&&s.SourceMapConsumer))return null;let d=new window.sourceMap.SourceMapConsumer(c).originalPositionFor({line:n,column:t});if(!d.source)return null;let b=c.sources.indexOf(d.source),L=null;return c.sourcesContent&&c.sourcesContent[b]&&(L=c.sourcesContent[b]),{originalSource:d.source,originalLine:d.line,originalColumn:d.column,originalName:d.name,snippet:L}}catch(i){return null}})}function p(e){E.push(l({timestamp:Date.now()},e)),E.length>q&&E.shift()}function m(e){return w(this,null,function*(){let n=a.browserDetails?K():{},t=Object.assign(e,n,g,z());if(_&&(t.user=_),Object.keys(h).length&&(t.context=l({},h)),t.breadcrumbs=E.slice(),a.sampleRate&&Math.random()<1-parseFloat(a.sampleRate)){a.debug&&P("[Scout] Suppressed by sampling");return}if(a.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let s=e.errorTrace.split(`
2
2
  `),i=[s[0]];for(let r=1;r<s.length;r++)!s[r].includes("/scout")&&!s[r].includes("scout.js")&&!s[r].includes("scout-error")&&i.push(s[r]);i.length>1&&(e.errorTrace=i.join(`
3
3
  `))}catch(s){}if((e.errorTrace||e.stack)&&!e.source)try{let s=e.errorTrace||e.stack,i=s?s.split(`
4
4
  `):[];for(let r=1;r<i.length;r++){let o=i[r].trim().match(/(http.*?):(\d+):(\d+)/);if(o){e.source=o[1],e.lineno=parseInt(o[2],10),e.colno=parseInt(o[3],10);break}}}catch(s){}if(a.debug&&P("[Scout] Sending:",t),a.endpoint&&A(a.endpoint,t),a.handleSourceMaps&&e.source&&e.lineno)try{let s=yield Z(e.source,e.lineno,e.colno||0);if(s){let i=U(l({},t),{originalSource:s.originalSource,originalLine:s.originalLine,originalColumn:s.originalColumn,originalName:s.originalName,highlightLineNumber:s.originalLine});s.snippet&&(i.snippet=s.snippet),a.endpoint&&A(a.endpoint,i)}}catch(s){}})}function R(e){a.enabled&&m(e)}function Q(e){_=e}function Y(e){h=l(l({},h),e)}function ee(e,n){h[e]=n}function re(){if(a.trackUserInteractions){document.addEventListener("click",o=>{k.clicks++;let u=o.target,c=u.tagName?u.tagName.toLowerCase():"",f=(u.textContent||"").trim().slice(0,50);p({category:"click",message:c+(f?": "+f:"")})});let r=0;window.addEventListener("scroll",()=>{let o=Date.now();o-r>100&&(k.scrolls++,r=o)})}let e=history.pushState;history.pushState=function(){e.apply(this,arguments),p({category:"navigation",message:window.location.href})},window.addEventListener("popstate",()=>{p({category:"navigation",message:window.location.href})});let n=window.fetch;window.fetch=function(r,o){let u=typeof r=="string"?r:(r==null?void 0:r.url)||"",c=(o==null?void 0:o.method)||"GET",f=Date.now();return n.apply(this,arguments).then(d=>(p({category:"fetch",message:`${c} ${u}`,data:{status:d.status,duration:Date.now()-f}}),d)).catch(d=>{throw p({category:"fetch",message:`${c} ${u}`,data:{error:d.message,duration:Date.now()-f}}),d})};let t=XMLHttpRequest.prototype.open,s=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(r,o){return this._scoutMethod=r,this._scoutUrl=o,t.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){let r=this,o=Date.now();return r.addEventListener("loadend",()=>{p({category:"xhr",message:`${r._scoutMethod||"GET"} ${r._scoutUrl||""}`,data:{status:r.status,duration:Date.now()-o}})}),s.apply(this,arguments)},a.addErrorEventListener&&window.addEventListener("error",r=>w(this,null,function*(){if(a.enabled){try{let o=r.error?r.error.stack:"No stack trace available";if(v(r.message))return;a.sendErrors&&m({type:"window.onerror",message:r.message,source:r.filename,lineno:r.lineno,colno:r.colno,errorTrace:o})}catch(o){S("[Scout] Error handler failure:",o)}a.selfHealingErrors&&r.preventDefault()}})),a.addUnhandledRejectionEventListener&&window.addEventListener("unhandledrejection",r=>{if(a.enabled){try{let o=r.reason,u=(o==null?void 0:o.stack)||"No stack trace available";if(v((o==null?void 0:o.message)||""))return;a.sendErrors&&m({type:"Unhandled Promise Rejection",message:(o==null?void 0:o.message)||"Unhandled Promise Rejection",reason:r.reason,errorTrace:u})}catch(o){S("[Scout] Rejection handler failure:",o)}a.selfHealingErrors&&r.preventDefault()}}),a.overrideConsoleError&&(console.error=function(...r){if(a.enabled)try{let o=new Error().stack;if(v(y(r)))return;a.sendErrors&&m({type:"console.error",errorTrace:o,args:y(r)})}catch(o){S("[Scout] console.error override failure:",o)}}),a.overrideConsoleWarn&&(console.warn=function(...r){if(a.enabled)try{let o=new Error().stack;if(v(y(r)))return;a.sendErrors&&m({type:"console.warn",errorTrace:o,args:y(r)})}catch(o){S("[Scout] console.warn override failure:",o)}});let i=a.endpoint?new URL(a.endpoint).origin:"";a.loadUAParser&&a.browserDetails&&i&&N(`${i}/vendor/ua-parser.min.js`,()=>{typeof UAParser!="undefined"&&(window._uaParserResult=new UAParser().getResult())}),a.handleSourceMaps&&i&&N(`${i}/vendor/source-map.min.js`)}function ne(e={},n={}){if(e.user&&(_=e.user,delete e.user),D){g=l(l({},g),e),a=l(l({},a),n);return}g=l(l({},g),e),a=l(l({},a),n),D=!0,typeof window!="undefined"&&re()}typeof window!="undefined"&&(window.Scout={init:ne,setScope:e=>{g=l(l({},g),e)},setConfig:e=>{a=l(l({},a),e)},setUser:Q,setContext:Y,setTag:ee,addBreadcrumb:p,error:R});var $=class extends te.Component{constructor(n){super(n),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n,t){R({message:n.message,stack:n.stack,errorTrace:n.stack,component:(t==null?void 0:t.componentStack)||"",type:"react-error-boundary"})}render(){return this.state.hasError?this.props.fallback||null:this.props.children}};export{$ as ScoutErrorBoundary};
@@ -1,4 +1,4 @@
1
- (()=>{var $=Object.defineProperty,H=Object.defineProperties;var F=Object.getOwnPropertyDescriptors;var I=Object.getOwnPropertySymbols;var B=Object.prototype.hasOwnProperty,W=Object.prototype.propertyIsEnumerable;var T=(e,s,t)=>s in e?$(e,s,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[s]=t,l=(e,s)=>{for(var t in s||(s={}))B.call(s,t)&&T(e,t,s[t]);if(I)for(var t of I(s))W.call(s,t)&&T(e,t,s[t]);return e},x=(e,s)=>H(e,F(s));var h=(e,s,t)=>new Promise((o,i)=>{var n=c=>{try{u(t.next(c))}catch(f){i(f)}},r=c=>{try{u(t.throw(c))}catch(f){i(f)}},u=c=>c.done?o(c.value):Promise.resolve(c.value).then(n,r);u((t=t.apply(e,s)).next())});var X={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=l({},X),N,p={environment:typeof window!="undefined"&&((N=window.location)==null?void 0:N.hostname)==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.3.2",project:null,release:null,version:null,app:null},_={clicks:0,scrolls:0},k=null,U=!1,M=null,w={},E=[],j=30;var S=console.warn;var P=console.log;function R(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function V(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",R("user")),localStorage.getItem("__scoutUserId")),s=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",R("session")),sessionStorage.getItem("__scoutSessionId"));return k=k||R("pageload"),{pageloadId:k,userId:e,sessionId:s}}function q(){var t,o,i;if((o=(t=window._uaParserResult)==null?void 0:t.browser)!=null&&o.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return((i=[{p:/Chrome.*Mobile/,n:"Chrome Mobile"},{p:/Chrome/,n:"Chrome"},{p:/Firefox.*Mobile/,n:"Firefox Mobile"},{p:/Firefox/,n:"Firefox"},{p:/Safari.*Mobile/,n:"Safari Mobile"},{p:/Safari/,n:"Safari"},{p:/MSIE|Trident/,n:"Internet Explorer"},{p:/Edge/,n:"Edge"}].find(n=>e.match(n.p)))==null?void 0:i.n)||"Unknown"}function z(){var t,o,i;if((o=(t=window._uaParserResult)==null?void 0:t.os)!=null&&o.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return((i=[{p:/Win/,n:"Windows"},{p:/Mac/,n:"Mac OS"},{p:/X11|Linux/,n:"Linux"},{p:/Android/,n:"Android"},{p:/iPhone|iPad/,n:"iOS"}].find(n=>e.match(n.p)))==null?void 0:i.n)||"Unknown"}function J(){var s,t,o,i,n,r,u,c,f,d;let e=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return{connectionType:e?e.effectiveType:"unknown",userAgent:navigator.userAgent,width:window.innerWidth,height:window.innerHeight,screenWidth:screen.width,screenHeight:screen.height,errorTimestamp:Date.now(),timeLocale:Intl.DateTimeFormat().resolvedOptions().timeZone,browserLocale:navigator.language||navigator.userLanguage,sessionTime:Math.round(performance.now()/1e3),deviceMemory:navigator.deviceMemory||"unknown",timezoneOffset:new Date().getTimezoneOffset(),cookiesEnabled:navigator.cookieEnabled,url:window.location.href,host:window.location.host,referrer:document.referrer,browser:q(),browserVersion:((t=(s=window._uaParserResult)==null?void 0:s.browser)==null?void 0:t.version)||null,os:z(),osVersion:((i=(o=window._uaParserResult)==null?void 0:o.os)==null?void 0:i.version)||null,deviceType:((r=(n=window._uaParserResult)==null?void 0:n.device)==null?void 0:r.type)||null,deviceModel:((c=(u=window._uaParserResult)==null?void 0:u.device)==null?void 0:c.model)||null,deviceVendor:((d=(f=window._uaParserResult)==null?void 0:f.device)==null?void 0:d.vendor)||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:_.clicks,userScrolls:_.scrolls}}function v(e){return!a.ignoreErrors||!Array.isArray(a.ignoreErrors)?!1:a.ignoreErrors.some(s=>typeof s=="string"?e.includes(s):s instanceof RegExp?s.test(e):!1)}function D(e,s){let t=new AbortController,o=setTimeout(()=>t.abort(),5e3),i={"Content-Type":"application/json"};return a.token&&(i["X-Ingest-Token"]=a.token),fetch(e,{method:"POST",headers:i,body:JSON.stringify(s),signal:t.signal}).then(n=>(clearTimeout(o),n)).catch(()=>{clearTimeout(o)})}function y(e){let s=(e[0]||"")+"",t=[...e];return s.replace(/%[sdj]/g,o=>{let i=t.shift();return o==="%s"?String(i):o==="%d"?Number(i):o==="%j"?JSON.stringify(i):o})}function A(e,s){let t=document.createElement("script");t.src=e,t.async=!0,s&&(t.onload=s),document.head.appendChild(t)}function G(e,s,t){return h(this,null,function*(){var o;try{let i=yield fetch(e);if(!i.ok)return null;let n=yield i.text(),r=n.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),u=n.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),c;if(r)c=JSON.parse(atob(r[1]));else if(u){let O=new URL(u[1],e).href,b=yield fetch(O);if(!b.ok)return null;c=yield b.json()}else return null;if(!((o=window.sourceMap)!=null&&o.SourceMapConsumer))return null;let d=new window.sourceMap.SourceMapConsumer(c).originalPositionFor({line:s,column:t});if(!d.source)return null;let C=c.sources.indexOf(d.source),L=null;return c.sourcesContent&&c.sourcesContent[C]&&(L=c.sourcesContent[C]),{originalSource:d.source,originalLine:d.line,originalColumn:d.column,originalName:d.name,snippet:L}}catch(i){return null}})}function g(e){E.push(l({timestamp:Date.now()},e)),E.length>j&&E.shift()}function m(e){return h(this,null,function*(){let s=a.browserDetails?J():{},t=Object.assign(e,s,p,V());if(M&&(t.user=M),Object.keys(w).length&&(t.context=l({},w)),t.breadcrumbs=E.slice(),a.sampleRate&&Math.random()<1-parseFloat(a.sampleRate)){a.debug&&P("[Scout] Suppressed by sampling");return}if(a.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let o=e.errorTrace.split(`
1
+ (()=>{var $=Object.defineProperty,H=Object.defineProperties;var F=Object.getOwnPropertyDescriptors;var I=Object.getOwnPropertySymbols;var B=Object.prototype.hasOwnProperty,W=Object.prototype.propertyIsEnumerable;var T=(e,s,t)=>s in e?$(e,s,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[s]=t,l=(e,s)=>{for(var t in s||(s={}))B.call(s,t)&&T(e,t,s[t]);if(I)for(var t of I(s))W.call(s,t)&&T(e,t,s[t]);return e},x=(e,s)=>H(e,F(s));var h=(e,s,t)=>new Promise((o,i)=>{var n=c=>{try{u(t.next(c))}catch(f){i(f)}},r=c=>{try{u(t.throw(c))}catch(f){i(f)}},u=c=>c.done?o(c.value):Promise.resolve(c.value).then(n,r);u((t=t.apply(e,s)).next())});var X={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=l({},X),N,p={environment:typeof window!="undefined"&&((N=window.location)==null?void 0:N.hostname)==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.3.3",project:null,release:null,version:null,app:null},_={clicks:0,scrolls:0},k=null,U=!1,M=null,w={},E=[],j=30;var S=console.warn;var P=console.log;function R(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function V(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",R("user")),localStorage.getItem("__scoutUserId")),s=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",R("session")),sessionStorage.getItem("__scoutSessionId"));return k=k||R("pageload"),{pageloadId:k,userId:e,sessionId:s}}function q(){var t,o,i;if((o=(t=window._uaParserResult)==null?void 0:t.browser)!=null&&o.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return((i=[{p:/Chrome.*Mobile/,n:"Chrome Mobile"},{p:/Chrome/,n:"Chrome"},{p:/Firefox.*Mobile/,n:"Firefox Mobile"},{p:/Firefox/,n:"Firefox"},{p:/Safari.*Mobile/,n:"Safari Mobile"},{p:/Safari/,n:"Safari"},{p:/MSIE|Trident/,n:"Internet Explorer"},{p:/Edge/,n:"Edge"}].find(n=>e.match(n.p)))==null?void 0:i.n)||"Unknown"}function z(){var t,o,i;if((o=(t=window._uaParserResult)==null?void 0:t.os)!=null&&o.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return((i=[{p:/Win/,n:"Windows"},{p:/Mac/,n:"Mac OS"},{p:/X11|Linux/,n:"Linux"},{p:/Android/,n:"Android"},{p:/iPhone|iPad/,n:"iOS"}].find(n=>e.match(n.p)))==null?void 0:i.n)||"Unknown"}function J(){var s,t,o,i,n,r,u,c,f,d;let e=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return{connectionType:e?e.effectiveType:"unknown",userAgent:navigator.userAgent,width:window.innerWidth,height:window.innerHeight,screenWidth:screen.width,screenHeight:screen.height,errorTimestamp:Date.now(),timeLocale:Intl.DateTimeFormat().resolvedOptions().timeZone,browserLocale:navigator.language||navigator.userLanguage,sessionTime:Math.round(performance.now()/1e3),deviceMemory:navigator.deviceMemory||"unknown",timezoneOffset:new Date().getTimezoneOffset(),cookiesEnabled:navigator.cookieEnabled,url:window.location.href,host:window.location.host,referrer:document.referrer,browser:q(),browserVersion:((t=(s=window._uaParserResult)==null?void 0:s.browser)==null?void 0:t.version)||null,os:z(),osVersion:((i=(o=window._uaParserResult)==null?void 0:o.os)==null?void 0:i.version)||null,deviceType:((r=(n=window._uaParserResult)==null?void 0:n.device)==null?void 0:r.type)||null,deviceModel:((c=(u=window._uaParserResult)==null?void 0:u.device)==null?void 0:c.model)||null,deviceVendor:((d=(f=window._uaParserResult)==null?void 0:f.device)==null?void 0:d.vendor)||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:_.clicks,userScrolls:_.scrolls}}function v(e){return!a.ignoreErrors||!Array.isArray(a.ignoreErrors)?!1:a.ignoreErrors.some(s=>typeof s=="string"?e.includes(s):s instanceof RegExp?s.test(e):!1)}function D(e,s){let t=new AbortController,o=setTimeout(()=>t.abort(),5e3),i={"Content-Type":"application/json"};return a.token&&(i["X-Ingest-Token"]=a.token),fetch(e,{method:"POST",headers:i,body:JSON.stringify(s),signal:t.signal}).then(n=>(clearTimeout(o),n)).catch(()=>{clearTimeout(o)})}function y(e){let s=(e[0]||"")+"",t=[...e];return s.replace(/%[sdj]/g,o=>{let i=t.shift();return o==="%s"?String(i):o==="%d"?Number(i):o==="%j"?JSON.stringify(i):o})}function A(e,s){let t=document.createElement("script");t.src=e,t.async=!0,s&&(t.onload=s),document.head.appendChild(t)}function G(e,s,t){return h(this,null,function*(){var o;try{let i=yield fetch(e);if(!i.ok)return null;let n=yield i.text(),r=n.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),u=n.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),c;if(r)c=JSON.parse(atob(r[1]));else if(u){let O=new URL(u[1],e).href,b=yield fetch(O);if(!b.ok)return null;c=yield b.json()}else return null;if(!((o=window.sourceMap)!=null&&o.SourceMapConsumer))return null;let d=new window.sourceMap.SourceMapConsumer(c).originalPositionFor({line:s,column:t});if(!d.source)return null;let C=c.sources.indexOf(d.source),L=null;return c.sourcesContent&&c.sourcesContent[C]&&(L=c.sourcesContent[C]),{originalSource:d.source,originalLine:d.line,originalColumn:d.column,originalName:d.name,snippet:L}}catch(i){return null}})}function g(e){E.push(l({timestamp:Date.now()},e)),E.length>j&&E.shift()}function m(e){return h(this,null,function*(){let s=a.browserDetails?J():{},t=Object.assign(e,s,p,V());if(M&&(t.user=M),Object.keys(w).length&&(t.context=l({},w)),t.breadcrumbs=E.slice(),a.sampleRate&&Math.random()<1-parseFloat(a.sampleRate)){a.debug&&P("[Scout] Suppressed by sampling");return}if(a.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let o=e.errorTrace.split(`
2
2
  `),i=[o[0]];for(let n=1;n<o.length;n++)!o[n].includes("/scout")&&!o[n].includes("scout.js")&&!o[n].includes("scout-error")&&i.push(o[n]);i.length>1&&(e.errorTrace=i.join(`
3
3
  `))}catch(o){}if((e.errorTrace||e.stack)&&!e.source)try{let o=e.errorTrace||e.stack,i=o?o.split(`
4
4
  `):[];for(let n=1;n<i.length;n++){let r=i[n].trim().match(/(http.*?):(\d+):(\d+)/);if(r){e.source=r[1],e.lineno=parseInt(r[2],10),e.colno=parseInt(r[3],10);break}}}catch(o){}if(a.debug&&P("[Scout] Sending:",t),a.endpoint&&D(a.endpoint,t),a.handleSourceMaps&&e.source&&e.lineno)try{let o=yield G(e.source,e.lineno,e.colno||0);if(o){let i=x(l({},t),{originalSource:o.originalSource,originalLine:o.originalLine,originalColumn:o.originalColumn,originalName:o.originalName,highlightLineNumber:o.originalLine});o.snippet&&(i.snippet=o.snippet),a.endpoint&&D(a.endpoint,i)}}catch(o){}})}function K(e){a.enabled&&m(e)}function Z(e){M=e}function Q(e){w=l(l({},w),e)}function Y(e,s){w[e]=s}function te(e){g(e)}function ee(){if(a.trackUserInteractions){document.addEventListener("click",r=>{_.clicks++;let u=r.target,c=u.tagName?u.tagName.toLowerCase():"",f=(u.textContent||"").trim().slice(0,50);g({category:"click",message:c+(f?": "+f:"")})});let n=0;window.addEventListener("scroll",()=>{let r=Date.now();r-n>100&&(_.scrolls++,n=r)})}let e=history.pushState;history.pushState=function(){e.apply(this,arguments),g({category:"navigation",message:window.location.href})},window.addEventListener("popstate",()=>{g({category:"navigation",message:window.location.href})});let s=window.fetch;window.fetch=function(n,r){let u=typeof n=="string"?n:(n==null?void 0:n.url)||"",c=(r==null?void 0:r.method)||"GET",f=Date.now();return s.apply(this,arguments).then(d=>(g({category:"fetch",message:`${c} ${u}`,data:{status:d.status,duration:Date.now()-f}}),d)).catch(d=>{throw g({category:"fetch",message:`${c} ${u}`,data:{error:d.message,duration:Date.now()-f}}),d})};let t=XMLHttpRequest.prototype.open,o=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(n,r){return this._scoutMethod=n,this._scoutUrl=r,t.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){let n=this,r=Date.now();return n.addEventListener("loadend",()=>{g({category:"xhr",message:`${n._scoutMethod||"GET"} ${n._scoutUrl||""}`,data:{status:n.status,duration:Date.now()-r}})}),o.apply(this,arguments)},a.addErrorEventListener&&window.addEventListener("error",n=>h(this,null,function*(){if(a.enabled){try{let r=n.error?n.error.stack:"No stack trace available";if(v(n.message))return;a.sendErrors&&m({type:"window.onerror",message:n.message,source:n.filename,lineno:n.lineno,colno:n.colno,errorTrace:r})}catch(r){S("[Scout] Error handler failure:",r)}a.selfHealingErrors&&n.preventDefault()}})),a.addUnhandledRejectionEventListener&&window.addEventListener("unhandledrejection",n=>{if(a.enabled){try{let r=n.reason,u=(r==null?void 0:r.stack)||"No stack trace available";if(v((r==null?void 0:r.message)||""))return;a.sendErrors&&m({type:"Unhandled Promise Rejection",message:(r==null?void 0:r.message)||"Unhandled Promise Rejection",reason:n.reason,errorTrace:u})}catch(r){S("[Scout] Rejection handler failure:",r)}a.selfHealingErrors&&n.preventDefault()}}),a.overrideConsoleError&&(console.error=function(...n){if(a.enabled)try{let r=new Error().stack;if(v(y(n)))return;a.sendErrors&&m({type:"console.error",errorTrace:r,args:y(n)})}catch(r){S("[Scout] console.error override failure:",r)}}),a.overrideConsoleWarn&&(console.warn=function(...n){if(a.enabled)try{let r=new Error().stack;if(v(y(n)))return;a.sendErrors&&m({type:"console.warn",errorTrace:r,args:y(n)})}catch(r){S("[Scout] console.warn override failure:",r)}});let i=a.endpoint?new URL(a.endpoint).origin:"";a.loadUAParser&&a.browserDetails&&i&&A(`${i}/vendor/ua-parser.min.js`,()=>{typeof UAParser!="undefined"&&(window._uaParserResult=new UAParser().getResult())}),a.handleSourceMaps&&i&&A(`${i}/vendor/source-map.min.js`)}function ne(e={},s={}){if(e.user&&(M=e.user,delete e.user),U){p=l(l({},p),e),a=l(l({},a),s);return}p=l(l({},p),e),a=l(l({},a),s),U=!0,typeof window!="undefined"&&ee()}typeof window!="undefined"&&(window.Scout={init:ne,setScope:e=>{p=l(l({},p),e)},setConfig:e=>{a=l(l({},a),e)},setUser:Z,setContext:Q,setTag:Y,addBreadcrumb:g,error:K});})();
package/dist/vue.cjs CHANGED
@@ -1,4 +1,4 @@
1
- var h=Object.defineProperty,B=Object.defineProperties,W=Object.getOwnPropertyDescriptor,X=Object.getOwnPropertyDescriptors,V=Object.getOwnPropertyNames,x=Object.getOwnPropertySymbols;var P=Object.prototype.hasOwnProperty,j=Object.prototype.propertyIsEnumerable;var U=(e,o,r)=>o in e?h(e,o,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[o]=r,l=(e,o)=>{for(var r in o||(o={}))P.call(o,r)&&U(e,r,o[r]);if(x)for(var r of x(o))j.call(o,r)&&U(e,r,o[r]);return e},D=(e,o)=>B(e,X(o));var q=(e,o)=>{for(var r in o)h(e,r,{get:o[r],enumerable:!0})},z=(e,o,r,t)=>{if(o&&typeof o=="object"||typeof o=="function")for(let s of V(o))!P.call(e,s)&&s!==r&&h(e,s,{get:()=>o[s],enumerable:!(t=W(o,s))||t.enumerable});return e};var J=e=>z(h({},"__esModule",{value:!0}),e);var S=(e,o,r)=>new Promise((t,s)=>{var n=c=>{try{u(r.next(c))}catch(f){s(f)}},a=c=>{try{u(r.throw(c))}catch(f){s(f)}},u=c=>c.done?t(c.value):Promise.resolve(c.value).then(n,a);u((r=r.apply(e,o)).next())});var ce={};q(ce,{ScoutVue:()=>ie});module.exports=J(ce);var G={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},i=l({},G),H,g={environment:typeof window!="undefined"&&((H=window.location)==null?void 0:H.hostname)==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.3.2",project:null,release:null,version:null,app:null},v={clicks:0,scrolls:0},C=null,A=!1,M=null,m={},k=[],K=30;var y=console.warn;var $=console.log;function L(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function Z(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",L("user")),localStorage.getItem("__scoutUserId")),o=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",L("session")),sessionStorage.getItem("__scoutSessionId"));return C=C||L("pageload"),{pageloadId:C,userId:e,sessionId:o}}function Q(){var r,t,s;if((t=(r=window._uaParserResult)==null?void 0:r.browser)!=null&&t.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return((s=[{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)))==null?void 0:s.n)||"Unknown"}function Y(){var r,t,s;if((t=(r=window._uaParserResult)==null?void 0:r.os)!=null&&t.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return((s=[{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)))==null?void 0:s.n)||"Unknown"}function ee(){var o,r,t,s,n,a,u,c,f,d;let e=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return{connectionType:e?e.effectiveType:"unknown",userAgent:navigator.userAgent,width:window.innerWidth,height:window.innerHeight,screenWidth:screen.width,screenHeight:screen.height,errorTimestamp:Date.now(),timeLocale:Intl.DateTimeFormat().resolvedOptions().timeZone,browserLocale:navigator.language||navigator.userLanguage,sessionTime:Math.round(performance.now()/1e3),deviceMemory:navigator.deviceMemory||"unknown",timezoneOffset:new Date().getTimezoneOffset(),cookiesEnabled:navigator.cookieEnabled,url:window.location.href,host:window.location.host,referrer:document.referrer,browser:Q(),browserVersion:((r=(o=window._uaParserResult)==null?void 0:o.browser)==null?void 0:r.version)||null,os:Y(),osVersion:((s=(t=window._uaParserResult)==null?void 0:t.os)==null?void 0:s.version)||null,deviceType:((a=(n=window._uaParserResult)==null?void 0:n.device)==null?void 0:a.type)||null,deviceModel:((c=(u=window._uaParserResult)==null?void 0:u.device)==null?void 0:c.model)||null,deviceVendor:((d=(f=window._uaParserResult)==null?void 0:f.device)==null?void 0:d.vendor)||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:v.clicks,userScrolls:v.scrolls}}function E(e){return!i.ignoreErrors||!Array.isArray(i.ignoreErrors)?!1:i.ignoreErrors.some(o=>typeof o=="string"?e.includes(o):o instanceof RegExp?o.test(e):!1)}function N(e,o){let r=new AbortController,t=setTimeout(()=>r.abort(),5e3),s={"Content-Type":"application/json"};return i.token&&(s["X-Ingest-Token"]=i.token),fetch(e,{method:"POST",headers:s,body:JSON.stringify(o),signal:r.signal}).then(n=>(clearTimeout(t),n)).catch(()=>{clearTimeout(t)})}function _(e){let o=(e[0]||"")+"",r=[...e];return o.replace(/%[sdj]/g,t=>{let s=r.shift();return t==="%s"?String(s):t==="%d"?Number(s):t==="%j"?JSON.stringify(s):t})}function O(e,o){let r=document.createElement("script");r.src=e,r.async=!0,o&&(r.onload=o),document.head.appendChild(r)}function ne(e,o,r){return S(this,null,function*(){var t;try{let s=yield fetch(e);if(!s.ok)return null;let n=yield s.text(),a=n.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),u=n.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),c;if(a)c=JSON.parse(atob(a[1]));else if(u){let F=new URL(u[1],e).href,T=yield fetch(F);if(!T.ok)return null;c=yield T.json()}else return null;if(!((t=window.sourceMap)!=null&&t.SourceMapConsumer))return null;let d=new window.sourceMap.SourceMapConsumer(c).originalPositionFor({line:o,column:r});if(!d.source)return null;let b=c.sources.indexOf(d.source),I=null;return c.sourcesContent&&c.sourcesContent[b]&&(I=c.sourcesContent[b]),{originalSource:d.source,originalLine:d.line,originalColumn:d.column,originalName:d.name,snippet:I}}catch(s){return null}})}function p(e){k.push(l({timestamp:Date.now()},e)),k.length>K&&k.shift()}function w(e){return S(this,null,function*(){let o=i.browserDetails?ee():{},r=Object.assign(e,o,g,Z());if(M&&(r.user=M),Object.keys(m).length&&(r.context=l({},m)),r.breadcrumbs=k.slice(),i.sampleRate&&Math.random()<1-parseFloat(i.sampleRate)){i.debug&&$("[Scout] Suppressed by sampling");return}if(i.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let t=e.errorTrace.split(`
1
+ var h=Object.defineProperty,B=Object.defineProperties,W=Object.getOwnPropertyDescriptor,X=Object.getOwnPropertyDescriptors,V=Object.getOwnPropertyNames,x=Object.getOwnPropertySymbols;var P=Object.prototype.hasOwnProperty,j=Object.prototype.propertyIsEnumerable;var U=(e,o,r)=>o in e?h(e,o,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[o]=r,l=(e,o)=>{for(var r in o||(o={}))P.call(o,r)&&U(e,r,o[r]);if(x)for(var r of x(o))j.call(o,r)&&U(e,r,o[r]);return e},D=(e,o)=>B(e,X(o));var q=(e,o)=>{for(var r in o)h(e,r,{get:o[r],enumerable:!0})},z=(e,o,r,t)=>{if(o&&typeof o=="object"||typeof o=="function")for(let s of V(o))!P.call(e,s)&&s!==r&&h(e,s,{get:()=>o[s],enumerable:!(t=W(o,s))||t.enumerable});return e};var J=e=>z(h({},"__esModule",{value:!0}),e);var S=(e,o,r)=>new Promise((t,s)=>{var n=c=>{try{u(r.next(c))}catch(f){s(f)}},a=c=>{try{u(r.throw(c))}catch(f){s(f)}},u=c=>c.done?t(c.value):Promise.resolve(c.value).then(n,a);u((r=r.apply(e,o)).next())});var ce={};q(ce,{ScoutVue:()=>ie});module.exports=J(ce);var G={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},i=l({},G),H,g={environment:typeof window!="undefined"&&((H=window.location)==null?void 0:H.hostname)==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.3.3",project:null,release:null,version:null,app:null},v={clicks:0,scrolls:0},C=null,A=!1,M=null,m={},k=[],K=30;var y=console.warn;var $=console.log;function L(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function Z(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",L("user")),localStorage.getItem("__scoutUserId")),o=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",L("session")),sessionStorage.getItem("__scoutSessionId"));return C=C||L("pageload"),{pageloadId:C,userId:e,sessionId:o}}function Q(){var r,t,s;if((t=(r=window._uaParserResult)==null?void 0:r.browser)!=null&&t.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return((s=[{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)))==null?void 0:s.n)||"Unknown"}function Y(){var r,t,s;if((t=(r=window._uaParserResult)==null?void 0:r.os)!=null&&t.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return((s=[{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)))==null?void 0:s.n)||"Unknown"}function ee(){var o,r,t,s,n,a,u,c,f,d;let e=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return{connectionType:e?e.effectiveType:"unknown",userAgent:navigator.userAgent,width:window.innerWidth,height:window.innerHeight,screenWidth:screen.width,screenHeight:screen.height,errorTimestamp:Date.now(),timeLocale:Intl.DateTimeFormat().resolvedOptions().timeZone,browserLocale:navigator.language||navigator.userLanguage,sessionTime:Math.round(performance.now()/1e3),deviceMemory:navigator.deviceMemory||"unknown",timezoneOffset:new Date().getTimezoneOffset(),cookiesEnabled:navigator.cookieEnabled,url:window.location.href,host:window.location.host,referrer:document.referrer,browser:Q(),browserVersion:((r=(o=window._uaParserResult)==null?void 0:o.browser)==null?void 0:r.version)||null,os:Y(),osVersion:((s=(t=window._uaParserResult)==null?void 0:t.os)==null?void 0:s.version)||null,deviceType:((a=(n=window._uaParserResult)==null?void 0:n.device)==null?void 0:a.type)||null,deviceModel:((c=(u=window._uaParserResult)==null?void 0:u.device)==null?void 0:c.model)||null,deviceVendor:((d=(f=window._uaParserResult)==null?void 0:f.device)==null?void 0:d.vendor)||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:v.clicks,userScrolls:v.scrolls}}function E(e){return!i.ignoreErrors||!Array.isArray(i.ignoreErrors)?!1:i.ignoreErrors.some(o=>typeof o=="string"?e.includes(o):o instanceof RegExp?o.test(e):!1)}function N(e,o){let r=new AbortController,t=setTimeout(()=>r.abort(),5e3),s={"Content-Type":"application/json"};return i.token&&(s["X-Ingest-Token"]=i.token),fetch(e,{method:"POST",headers:s,body:JSON.stringify(o),signal:r.signal}).then(n=>(clearTimeout(t),n)).catch(()=>{clearTimeout(t)})}function _(e){let o=(e[0]||"")+"",r=[...e];return o.replace(/%[sdj]/g,t=>{let s=r.shift();return t==="%s"?String(s):t==="%d"?Number(s):t==="%j"?JSON.stringify(s):t})}function O(e,o){let r=document.createElement("script");r.src=e,r.async=!0,o&&(r.onload=o),document.head.appendChild(r)}function ne(e,o,r){return S(this,null,function*(){var t;try{let s=yield fetch(e);if(!s.ok)return null;let n=yield s.text(),a=n.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),u=n.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),c;if(a)c=JSON.parse(atob(a[1]));else if(u){let F=new URL(u[1],e).href,T=yield fetch(F);if(!T.ok)return null;c=yield T.json()}else return null;if(!((t=window.sourceMap)!=null&&t.SourceMapConsumer))return null;let d=new window.sourceMap.SourceMapConsumer(c).originalPositionFor({line:o,column:r});if(!d.source)return null;let b=c.sources.indexOf(d.source),I=null;return c.sourcesContent&&c.sourcesContent[b]&&(I=c.sourcesContent[b]),{originalSource:d.source,originalLine:d.line,originalColumn:d.column,originalName:d.name,snippet:I}}catch(s){return null}})}function p(e){k.push(l({timestamp:Date.now()},e)),k.length>K&&k.shift()}function w(e){return S(this,null,function*(){let o=i.browserDetails?ee():{},r=Object.assign(e,o,g,Z());if(M&&(r.user=M),Object.keys(m).length&&(r.context=l({},m)),r.breadcrumbs=k.slice(),i.sampleRate&&Math.random()<1-parseFloat(i.sampleRate)){i.debug&&$("[Scout] Suppressed by sampling");return}if(i.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let t=e.errorTrace.split(`
2
2
  `),s=[t[0]];for(let n=1;n<t.length;n++)!t[n].includes("/scout")&&!t[n].includes("scout.js")&&!t[n].includes("scout-error")&&s.push(t[n]);s.length>1&&(e.errorTrace=s.join(`
3
3
  `))}catch(t){}if((e.errorTrace||e.stack)&&!e.source)try{let t=e.errorTrace||e.stack,s=t?t.split(`
4
4
  `):[];for(let n=1;n<s.length;n++){let a=s[n].trim().match(/(http.*?):(\d+):(\d+)/);if(a){e.source=a[1],e.lineno=parseInt(a[2],10),e.colno=parseInt(a[3],10);break}}}catch(t){}if(i.debug&&$("[Scout] Sending:",r),i.endpoint&&N(i.endpoint,r),i.handleSourceMaps&&e.source&&e.lineno)try{let t=yield ne(e.source,e.lineno,e.colno||0);if(t){let s=D(l({},r),{originalSource:t.originalSource,originalLine:t.originalLine,originalColumn:t.originalColumn,originalName:t.originalName,highlightLineNumber:t.originalLine});t.snippet&&(s.snippet=t.snippet),i.endpoint&&N(i.endpoint,s)}}catch(t){}})}function R(e){i.enabled&&w(e)}function re(e){M=e}function oe(e){m=l(l({},m),e)}function te(e,o){m[e]=o}function se(){if(i.trackUserInteractions){document.addEventListener("click",a=>{v.clicks++;let u=a.target,c=u.tagName?u.tagName.toLowerCase():"",f=(u.textContent||"").trim().slice(0,50);p({category:"click",message:c+(f?": "+f:"")})});let n=0;window.addEventListener("scroll",()=>{let a=Date.now();a-n>100&&(v.scrolls++,n=a)})}let e=history.pushState;history.pushState=function(){e.apply(this,arguments),p({category:"navigation",message:window.location.href})},window.addEventListener("popstate",()=>{p({category:"navigation",message:window.location.href})});let o=window.fetch;window.fetch=function(n,a){let u=typeof n=="string"?n:(n==null?void 0:n.url)||"",c=(a==null?void 0:a.method)||"GET",f=Date.now();return o.apply(this,arguments).then(d=>(p({category:"fetch",message:`${c} ${u}`,data:{status:d.status,duration:Date.now()-f}}),d)).catch(d=>{throw p({category:"fetch",message:`${c} ${u}`,data:{error:d.message,duration:Date.now()-f}}),d})};let r=XMLHttpRequest.prototype.open,t=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(n,a){return this._scoutMethod=n,this._scoutUrl=a,r.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){let n=this,a=Date.now();return n.addEventListener("loadend",()=>{p({category:"xhr",message:`${n._scoutMethod||"GET"} ${n._scoutUrl||""}`,data:{status:n.status,duration:Date.now()-a}})}),t.apply(this,arguments)},i.addErrorEventListener&&window.addEventListener("error",n=>S(this,null,function*(){if(i.enabled){try{let a=n.error?n.error.stack:"No stack trace available";if(E(n.message))return;i.sendErrors&&w({type:"window.onerror",message:n.message,source:n.filename,lineno:n.lineno,colno:n.colno,errorTrace:a})}catch(a){y("[Scout] Error handler failure:",a)}i.selfHealingErrors&&n.preventDefault()}})),i.addUnhandledRejectionEventListener&&window.addEventListener("unhandledrejection",n=>{if(i.enabled){try{let a=n.reason,u=(a==null?void 0:a.stack)||"No stack trace available";if(E((a==null?void 0:a.message)||""))return;i.sendErrors&&w({type:"Unhandled Promise Rejection",message:(a==null?void 0:a.message)||"Unhandled Promise Rejection",reason:n.reason,errorTrace:u})}catch(a){y("[Scout] Rejection handler failure:",a)}i.selfHealingErrors&&n.preventDefault()}}),i.overrideConsoleError&&(console.error=function(...n){if(i.enabled)try{let a=new Error().stack;if(E(_(n)))return;i.sendErrors&&w({type:"console.error",errorTrace:a,args:_(n)})}catch(a){y("[Scout] console.error override failure:",a)}}),i.overrideConsoleWarn&&(console.warn=function(...n){if(i.enabled)try{let a=new Error().stack;if(E(_(n)))return;i.sendErrors&&w({type:"console.warn",errorTrace:a,args:_(n)})}catch(a){y("[Scout] console.warn override failure:",a)}});let s=i.endpoint?new URL(i.endpoint).origin:"";i.loadUAParser&&i.browserDetails&&s&&O(`${s}/vendor/ua-parser.min.js`,()=>{typeof UAParser!="undefined"&&(window._uaParserResult=new UAParser().getResult())}),i.handleSourceMaps&&s&&O(`${s}/vendor/source-map.min.js`)}function ae(e={},o={}){if(e.user&&(M=e.user,delete e.user),A){g=l(l({},g),e),i=l(l({},i),o);return}g=l(l({},g),e),i=l(l({},i),o),A=!0,typeof window!="undefined"&&se()}typeof window!="undefined"&&(window.Scout={init:ae,setScope:e=>{g=l(l({},g),e)},setConfig:e=>{i=l(l({},i),e)},setUser:re,setContext:oe,setTag:te,addBreadcrumb:p,error:R});var ie={install(e){e.config.errorHandler=(o,r,t)=>{var s,n;R({message:o.message,stack:o.stack,errorTrace:o.stack,component:((s=r==null?void 0:r.$options)==null?void 0:s.name)||((n=r==null?void 0:r.$options)==null?void 0:n.__name)||"Anonymous",type:"vue-error-handler",info:t})},e.config.warnHandler=(o,r,t)=>{var s,n;R({message:o,component:((s=r==null?void 0:r.$options)==null?void 0:s.name)||((n=r==null?void 0:r.$options)==null?void 0:n.__name)||"Anonymous",type:"vue-warn-handler",errorTrace:t})}}};
package/dist/vue.js CHANGED
@@ -1,4 +1,4 @@
1
- var H=Object.defineProperty,F=Object.defineProperties;var B=Object.getOwnPropertyDescriptors;var T=Object.getOwnPropertySymbols;var W=Object.prototype.hasOwnProperty,X=Object.prototype.propertyIsEnumerable;var x=(e,o,r)=>o in e?H(e,o,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[o]=r,l=(e,o)=>{for(var r in o||(o={}))W.call(o,r)&&x(e,r,o[r]);if(T)for(var r of T(o))X.call(o,r)&&x(e,r,o[r]);return e},U=(e,o)=>F(e,B(o));var h=(e,o,r)=>new Promise((t,a)=>{var n=c=>{try{u(r.next(c))}catch(f){a(f)}},s=c=>{try{u(r.throw(c))}catch(f){a(f)}},u=c=>c.done?t(c.value):Promise.resolve(c.value).then(n,s);u((r=r.apply(e,o)).next())});var V={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},i=l({},V),N,g={environment:typeof window!="undefined"&&((N=window.location)==null?void 0:N.hostname)==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.3.2",project:null,release:null,version:null,app:null},k={clicks:0,scrolls:0},R=null,P=!1,v=null,m={},_=[],j=30;var S=console.warn;var D=console.log;function C(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function q(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",C("user")),localStorage.getItem("__scoutUserId")),o=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",C("session")),sessionStorage.getItem("__scoutSessionId"));return R=R||C("pageload"),{pageloadId:R,userId:e,sessionId:o}}function z(){var r,t,a;if((t=(r=window._uaParserResult)==null?void 0:r.browser)!=null&&t.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return((a=[{p:/Chrome.*Mobile/,n:"Chrome Mobile"},{p:/Chrome/,n:"Chrome"},{p:/Firefox.*Mobile/,n:"Firefox Mobile"},{p:/Firefox/,n:"Firefox"},{p:/Safari.*Mobile/,n:"Safari Mobile"},{p:/Safari/,n:"Safari"},{p:/MSIE|Trident/,n:"Internet Explorer"},{p:/Edge/,n:"Edge"}].find(n=>e.match(n.p)))==null?void 0:a.n)||"Unknown"}function J(){var r,t,a;if((t=(r=window._uaParserResult)==null?void 0:r.os)!=null&&t.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return((a=[{p:/Win/,n:"Windows"},{p:/Mac/,n:"Mac OS"},{p:/X11|Linux/,n:"Linux"},{p:/Android/,n:"Android"},{p:/iPhone|iPad/,n:"iOS"}].find(n=>e.match(n.p)))==null?void 0:a.n)||"Unknown"}function G(){var o,r,t,a,n,s,u,c,f,d;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:z(),browserVersion:((r=(o=window._uaParserResult)==null?void 0:o.browser)==null?void 0:r.version)||null,os:J(),osVersion:((a=(t=window._uaParserResult)==null?void 0:t.os)==null?void 0:a.version)||null,deviceType:((s=(n=window._uaParserResult)==null?void 0:n.device)==null?void 0:s.type)||null,deviceModel:((c=(u=window._uaParserResult)==null?void 0:u.device)==null?void 0:c.model)||null,deviceVendor:((d=(f=window._uaParserResult)==null?void 0:f.device)==null?void 0:d.vendor)||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:k.clicks,userScrolls:k.scrolls}}function y(e){return!i.ignoreErrors||!Array.isArray(i.ignoreErrors)?!1:i.ignoreErrors.some(o=>typeof o=="string"?e.includes(o):o instanceof RegExp?o.test(e):!1)}function A(e,o){let r=new AbortController,t=setTimeout(()=>r.abort(),5e3),a={"Content-Type":"application/json"};return i.token&&(a["X-Ingest-Token"]=i.token),fetch(e,{method:"POST",headers:a,body:JSON.stringify(o),signal:r.signal}).then(n=>(clearTimeout(t),n)).catch(()=>{clearTimeout(t)})}function E(e){let o=(e[0]||"")+"",r=[...e];return o.replace(/%[sdj]/g,t=>{let a=r.shift();return t==="%s"?String(a):t==="%d"?Number(a):t==="%j"?JSON.stringify(a):t})}function $(e,o){let r=document.createElement("script");r.src=e,r.async=!0,o&&(r.onload=o),document.head.appendChild(r)}function K(e,o,r){return h(this,null,function*(){var t;try{let a=yield fetch(e);if(!a.ok)return null;let n=yield a.text(),s=n.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),u=n.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),c;if(s)c=JSON.parse(atob(s[1]));else if(u){let O=new URL(u[1],e).href,I=yield fetch(O);if(!I.ok)return null;c=yield I.json()}else return null;if(!((t=window.sourceMap)!=null&&t.SourceMapConsumer))return null;let d=new window.sourceMap.SourceMapConsumer(c).originalPositionFor({line:o,column:r});if(!d.source)return null;let L=c.sources.indexOf(d.source),b=null;return c.sourcesContent&&c.sourcesContent[L]&&(b=c.sourcesContent[L]),{originalSource:d.source,originalLine:d.line,originalColumn:d.column,originalName:d.name,snippet:b}}catch(a){return null}})}function p(e){_.push(l({timestamp:Date.now()},e)),_.length>j&&_.shift()}function w(e){return h(this,null,function*(){let o=i.browserDetails?G():{},r=Object.assign(e,o,g,q());if(v&&(r.user=v),Object.keys(m).length&&(r.context=l({},m)),r.breadcrumbs=_.slice(),i.sampleRate&&Math.random()<1-parseFloat(i.sampleRate)){i.debug&&D("[Scout] Suppressed by sampling");return}if(i.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let t=e.errorTrace.split(`
1
+ var H=Object.defineProperty,F=Object.defineProperties;var B=Object.getOwnPropertyDescriptors;var T=Object.getOwnPropertySymbols;var W=Object.prototype.hasOwnProperty,X=Object.prototype.propertyIsEnumerable;var x=(e,o,r)=>o in e?H(e,o,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[o]=r,l=(e,o)=>{for(var r in o||(o={}))W.call(o,r)&&x(e,r,o[r]);if(T)for(var r of T(o))X.call(o,r)&&x(e,r,o[r]);return e},U=(e,o)=>F(e,B(o));var h=(e,o,r)=>new Promise((t,a)=>{var n=c=>{try{u(r.next(c))}catch(f){a(f)}},s=c=>{try{u(r.throw(c))}catch(f){a(f)}},u=c=>c.done?t(c.value):Promise.resolve(c.value).then(n,s);u((r=r.apply(e,o)).next())});var V={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},i=l({},V),N,g={environment:typeof window!="undefined"&&((N=window.location)==null?void 0:N.hostname)==="localhost"?"development":"production",sdk:"javascript",sdkVersion:"0.3.3",project:null,release:null,version:null,app:null},k={clicks:0,scrolls:0},R=null,P=!1,v=null,m={},_=[],j=30;var S=console.warn;var D=console.log;function C(e){return`${e}_${Math.random().toString(36).substr(2,9)}`}function q(){let e=localStorage.getItem("__scoutUserId")||(localStorage.setItem("__scoutUserId",C("user")),localStorage.getItem("__scoutUserId")),o=sessionStorage.getItem("__scoutSessionId")||(sessionStorage.setItem("__scoutSessionId",C("session")),sessionStorage.getItem("__scoutSessionId"));return R=R||C("pageload"),{pageloadId:R,userId:e,sessionId:o}}function z(){var r,t,a;if((t=(r=window._uaParserResult)==null?void 0:r.browser)!=null&&t.name)return window._uaParserResult.browser.name;let e=navigator.userAgent;return((a=[{p:/Chrome.*Mobile/,n:"Chrome Mobile"},{p:/Chrome/,n:"Chrome"},{p:/Firefox.*Mobile/,n:"Firefox Mobile"},{p:/Firefox/,n:"Firefox"},{p:/Safari.*Mobile/,n:"Safari Mobile"},{p:/Safari/,n:"Safari"},{p:/MSIE|Trident/,n:"Internet Explorer"},{p:/Edge/,n:"Edge"}].find(n=>e.match(n.p)))==null?void 0:a.n)||"Unknown"}function J(){var r,t,a;if((t=(r=window._uaParserResult)==null?void 0:r.os)!=null&&t.name)return window._uaParserResult.os.name;let e=navigator.userAgent;return((a=[{p:/Win/,n:"Windows"},{p:/Mac/,n:"Mac OS"},{p:/X11|Linux/,n:"Linux"},{p:/Android/,n:"Android"},{p:/iPhone|iPad/,n:"iOS"}].find(n=>e.match(n.p)))==null?void 0:a.n)||"Unknown"}function G(){var o,r,t,a,n,s,u,c,f,d;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:z(),browserVersion:((r=(o=window._uaParserResult)==null?void 0:o.browser)==null?void 0:r.version)||null,os:J(),osVersion:((a=(t=window._uaParserResult)==null?void 0:t.os)==null?void 0:a.version)||null,deviceType:((s=(n=window._uaParserResult)==null?void 0:n.device)==null?void 0:s.type)||null,deviceModel:((c=(u=window._uaParserResult)==null?void 0:u.device)==null?void 0:c.model)||null,deviceVendor:((d=(f=window._uaParserResult)==null?void 0:f.device)==null?void 0:d.vendor)||null,loadTime:Math.max(0,performance.timing.loadEventEnd-performance.timing.navigationStart),userClicks:k.clicks,userScrolls:k.scrolls}}function y(e){return!i.ignoreErrors||!Array.isArray(i.ignoreErrors)?!1:i.ignoreErrors.some(o=>typeof o=="string"?e.includes(o):o instanceof RegExp?o.test(e):!1)}function A(e,o){let r=new AbortController,t=setTimeout(()=>r.abort(),5e3),a={"Content-Type":"application/json"};return i.token&&(a["X-Ingest-Token"]=i.token),fetch(e,{method:"POST",headers:a,body:JSON.stringify(o),signal:r.signal}).then(n=>(clearTimeout(t),n)).catch(()=>{clearTimeout(t)})}function E(e){let o=(e[0]||"")+"",r=[...e];return o.replace(/%[sdj]/g,t=>{let a=r.shift();return t==="%s"?String(a):t==="%d"?Number(a):t==="%j"?JSON.stringify(a):t})}function $(e,o){let r=document.createElement("script");r.src=e,r.async=!0,o&&(r.onload=o),document.head.appendChild(r)}function K(e,o,r){return h(this,null,function*(){var t;try{let a=yield fetch(e);if(!a.ok)return null;let n=yield a.text(),s=n.match(/\/\/# sourceMappingURL=data:application\/json;base64,([^\s]+)/),u=n.match(/\/\/# sourceMappingURL=(?!data:)([^\s]+)/),c;if(s)c=JSON.parse(atob(s[1]));else if(u){let O=new URL(u[1],e).href,I=yield fetch(O);if(!I.ok)return null;c=yield I.json()}else return null;if(!((t=window.sourceMap)!=null&&t.SourceMapConsumer))return null;let d=new window.sourceMap.SourceMapConsumer(c).originalPositionFor({line:o,column:r});if(!d.source)return null;let L=c.sources.indexOf(d.source),b=null;return c.sourcesContent&&c.sourcesContent[L]&&(b=c.sourcesContent[L]),{originalSource:d.source,originalLine:d.line,originalColumn:d.column,originalName:d.name,snippet:b}}catch(a){return null}})}function p(e){_.push(l({timestamp:Date.now()},e)),_.length>j&&_.shift()}function w(e){return h(this,null,function*(){let o=i.browserDetails?G():{},r=Object.assign(e,o,g,q());if(v&&(r.user=v),Object.keys(m).length&&(r.context=l({},m)),r.breadcrumbs=_.slice(),i.sampleRate&&Math.random()<1-parseFloat(i.sampleRate)){i.debug&&D("[Scout] Suppressed by sampling");return}if(i.attachStacktrace||(e.errorTrace=null),e.errorTrace)try{let t=e.errorTrace.split(`
2
2
  `),a=[t[0]];for(let n=1;n<t.length;n++)!t[n].includes("/scout")&&!t[n].includes("scout.js")&&!t[n].includes("scout-error")&&a.push(t[n]);a.length>1&&(e.errorTrace=a.join(`
3
3
  `))}catch(t){}if((e.errorTrace||e.stack)&&!e.source)try{let t=e.errorTrace||e.stack,a=t?t.split(`
4
4
  `):[];for(let n=1;n<a.length;n++){let s=a[n].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(t){}if(i.debug&&D("[Scout] Sending:",r),i.endpoint&&A(i.endpoint,r),i.handleSourceMaps&&e.source&&e.lineno)try{let t=yield K(e.source,e.lineno,e.colno||0);if(t){let a=U(l({},r),{originalSource:t.originalSource,originalLine:t.originalLine,originalColumn:t.originalColumn,originalName:t.originalName,highlightLineNumber:t.originalLine});t.snippet&&(a.snippet=t.snippet),i.endpoint&&A(i.endpoint,a)}}catch(t){}})}function M(e){i.enabled&&w(e)}function Z(e){v=e}function Q(e){m=l(l({},m),e)}function Y(e,o){m[e]=o}function ee(){if(i.trackUserInteractions){document.addEventListener("click",s=>{k.clicks++;let u=s.target,c=u.tagName?u.tagName.toLowerCase():"",f=(u.textContent||"").trim().slice(0,50);p({category:"click",message:c+(f?": "+f:"")})});let n=0;window.addEventListener("scroll",()=>{let s=Date.now();s-n>100&&(k.scrolls++,n=s)})}let e=history.pushState;history.pushState=function(){e.apply(this,arguments),p({category:"navigation",message:window.location.href})},window.addEventListener("popstate",()=>{p({category:"navigation",message:window.location.href})});let o=window.fetch;window.fetch=function(n,s){let u=typeof n=="string"?n:(n==null?void 0:n.url)||"",c=(s==null?void 0:s.method)||"GET",f=Date.now();return o.apply(this,arguments).then(d=>(p({category:"fetch",message:`${c} ${u}`,data:{status:d.status,duration:Date.now()-f}}),d)).catch(d=>{throw p({category:"fetch",message:`${c} ${u}`,data:{error:d.message,duration:Date.now()-f}}),d})};let r=XMLHttpRequest.prototype.open,t=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(n,s){return this._scoutMethod=n,this._scoutUrl=s,r.apply(this,arguments)},XMLHttpRequest.prototype.send=function(){let n=this,s=Date.now();return n.addEventListener("loadend",()=>{p({category:"xhr",message:`${n._scoutMethod||"GET"} ${n._scoutUrl||""}`,data:{status:n.status,duration:Date.now()-s}})}),t.apply(this,arguments)},i.addErrorEventListener&&window.addEventListener("error",n=>h(this,null,function*(){if(i.enabled){try{let s=n.error?n.error.stack:"No stack trace available";if(y(n.message))return;i.sendErrors&&w({type:"window.onerror",message:n.message,source:n.filename,lineno:n.lineno,colno:n.colno,errorTrace:s})}catch(s){S("[Scout] Error handler failure:",s)}i.selfHealingErrors&&n.preventDefault()}})),i.addUnhandledRejectionEventListener&&window.addEventListener("unhandledrejection",n=>{if(i.enabled){try{let s=n.reason,u=(s==null?void 0:s.stack)||"No stack trace available";if(y((s==null?void 0:s.message)||""))return;i.sendErrors&&w({type:"Unhandled Promise Rejection",message:(s==null?void 0:s.message)||"Unhandled Promise Rejection",reason:n.reason,errorTrace:u})}catch(s){S("[Scout] Rejection handler failure:",s)}i.selfHealingErrors&&n.preventDefault()}}),i.overrideConsoleError&&(console.error=function(...n){if(i.enabled)try{let s=new Error().stack;if(y(E(n)))return;i.sendErrors&&w({type:"console.error",errorTrace:s,args:E(n)})}catch(s){S("[Scout] console.error override failure:",s)}}),i.overrideConsoleWarn&&(console.warn=function(...n){if(i.enabled)try{let s=new Error().stack;if(y(E(n)))return;i.sendErrors&&w({type:"console.warn",errorTrace:s,args:E(n)})}catch(s){S("[Scout] console.warn override failure:",s)}});let a=i.endpoint?new URL(i.endpoint).origin:"";i.loadUAParser&&i.browserDetails&&a&&$(`${a}/vendor/ua-parser.min.js`,()=>{typeof UAParser!="undefined"&&(window._uaParserResult=new UAParser().getResult())}),i.handleSourceMaps&&a&&$(`${a}/vendor/source-map.min.js`)}function ne(e={},o={}){if(e.user&&(v=e.user,delete e.user),P){g=l(l({},g),e),i=l(l({},i),o);return}g=l(l({},g),e),i=l(l({},i),o),P=!0,typeof window!="undefined"&&ee()}typeof window!="undefined"&&(window.Scout={init:ne,setScope:e=>{g=l(l({},g),e)},setConfig:e=>{i=l(l({},i),e)},setUser:Z,setContext:Q,setTag:Y,addBreadcrumb:p,error:M});var ae={install(e){e.config.errorHandler=(o,r,t)=>{var a,n;M({message:o.message,stack:o.stack,errorTrace:o.stack,component:((a=r==null?void 0:r.$options)==null?void 0:a.name)||((n=r==null?void 0:r.$options)==null?void 0:n.__name)||"Anonymous",type:"vue-error-handler",info:t})},e.config.warnHandler=(o,r,t)=>{var a,n;M({message:o,component:((a=r==null?void 0:r.$options)==null?void 0:a.name)||((n=r==null?void 0:r.$options)==null?void 0:n.__name)||"Anonymous",type:"vue-warn-handler",errorTrace:t})}}};export{ae as ScoutVue};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scout-error",
3
- "version": "0.3.2",
3
+ "version": "0.3.3",
4
4
  "description": "Lightweight error tracking for JavaScript applications",
5
5
  "author": "James Futhey",
6
6
  "license": "MIT",