UNPKG

stacklyn

Version:

Turn JavaScript stack traces into structured data.

1 lines 23.8 kB
"use strict";function ownKeys(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);n&&(o=o.filter(function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?ownKeys(Object(t),!0).forEach(function(n){_defineProperty(e,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}function _defineProperty(e,n,t){return(n=_toPropertyKey(n))in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function _toPropertyKey(e){var n=_toPrimitive(e,"string");return"symbol"==typeof n?n:n+""}function _toPrimitive(e,n){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var o=t.call(e,n||"default");if("object"!=typeof o)return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===n?String:Number)(e)}class Stacklyn{static parse(e,n={ALLOW_CALLSITES:!1,FULL_ERROR:!1}){if(!Stacklyn._isValidError(e))return;let t,o;function a(e,n=!1){var t;return n||!e.stack?{name:e.name,message:e.message,header:e.toString()}:null===(t=e.stack)||void 0===t?void 0:t.replace(e.toString()+"\n","")}e.toString=Error.prototype.toString;if(!!(("undefined"!=typeof window&&!!window.chrome||"undefined"!=typeof process)&&!0===n.ALLOW_CALLSITES&&e instanceof Error))o=Stacklyn.parseCS(e);else{var l,r,i,c,s;t=(null===(l=e.stack)||void 0===l?void 0:l.split("\n").filter(Boolean))||[],t.includes(e.toString())&&(t=a(e).split("\n").filter(Boolean));const n=null===(r=t)||void 0===r?void 0:r.some(e=>e.startsWith(" at ")),u=null===(i=t)||void 0===i?void 0:i.some(e=>e.startsWith(" at ")),m=null===(c=t)||void 0===c?void 0:c.some(e=>e.includes(" ^")),p=null===(s=t)||void 0===s?void 0:s.some(e=>/^.*?@.+?(:\d+)?(?::\d+)?$/.test(e));if("failed"!==Stacklyn._detectOperaMode(e))o=Stacklyn.parseOpera(e).filter(Boolean);else if(m)o=Stacklyn.parseEspruino(e).filter(Boolean);else if(n)t=a(e,!1).split("\n").filter(Boolean),o=t.map(e=>Stacklyn.parseV8(e,null)).filter(Boolean);else if(u)t=a(e,!1).split("\n").filter(Boolean),o=t.map(e=>Stacklyn.parseIE(e)).filter(Boolean);else{if(!p)throw new Stacklyn.Error("unsupported stacktrace format:",e,{cause:e});o=t.map(e=>Stacklyn.parseSpiderMonkey(e)).filter(Boolean)}}return o=Stacklyn._filterUndefined(o),n.FULL_ERROR&&(o=_objectSpread(_objectSpread({},Stacklyn.serializeError(e)),{},{parsedStack:Array.from(o)})),o}static parseCS(e,n={FULL_ERROR:!1}){if(!e instanceof Error)return;let t=0;const{stack:o,callSites:a}=Stacklyn.getCallSites(e);let l=Stacklyn._filterUndefined(o.split("\n").slice(1).map(e=>Stacklyn.parseV8(e,a[t++])));return n.FULL_ERROR&&(l=_objectSpread(_objectSpread({},Stacklyn.serializeError(e)),{},{parsedStack:Array.from(l),callSites:a})),l}static parseV8(e,n=void 0){var t;if(!e.startsWith(" at"))return;let o,a;const l={host:"Chromium",format:"V8",type:"browser"};let r,i,c;const s=/^ {4}at (.+?)(?: \[as ([^\]]+)\])?\s*\((.+)\)\s*$/,u=/^ {4}at (.+)$/;if(e.includes("(")&&e.includes(")")){const n=e.match(s);n&&([,r,i,c]=n)}else{const n=e.match(u);n&&([,c]=n)}const m=["native","unknown location","<anonymous>"].some(e=>c===e),p=["native:","<anonymous>:"].some(e=>c.startsWith(e));if(m||!c)o={sourceURL:c,anonymous:!0};else if(p){c.startsWith("native:")&&(l.host="Bun",l.type="runtime");const{line:e,column:n}=Stacklyn._extractLocation(c);o={sourceURL:null,fileName:null,line:e,column:n,anonymous:!0}}else if("unknown"===c)l.host="Bun",l.type="runtime",o={sourceURL:c,anonymous:!0};else if(c.startsWith("eval at"))o=function(e){let n=null,t=null,o=0;const a=e.match(/, ([^,]+:\d+:\d+)$/);a&&(t=a[1],e=e.slice(0,e.lastIndexOf(", ")));const l=[];for(;e.startsWith("eval at ",o);){o+=8;const n=e.indexOf(" (",o),t=e.slice(o,n);let a=1,r=n+2;for(o=r;r<e.length&&a>0;)"("===e[r]?a++:")"===e[r]&&a--,r++;const i=e.slice(o,r-1);l.push({name:t,location:null,inner:i}),e=i,o=0}l.length&&e.match(/:\d+:\d+$/)&&(l[l.length-1].location=e),t&&l.length&&(l[0].location=t);for(let e=l.length-1;e>=0;e--){var r;let t=null,o=null,a=null;const{name:i,location:c}=l[e],s=null==c?void 0:c.match(/^(.*):(\d+):(\d+)$/);s?[,t,o,a]=s:c&&(t=c),n={name:i,sourceURL:t||null,fileName:null!==(r=t)&&void 0!==r&&r.includes("://")?Stacklyn._getFilename(t):null,line:o?Number(o):null,column:a?Number(a):null,eval:n}}return n}(c);else if(c){c.startsWith("node:")&&(l.host="Node.js",l.type="runtime");const{line:e,column:n}=Stacklyn._extractLocation(c),t=Stacklyn._cleanPath(c);o={sourceURL:t,fileName:Stacklyn._getFilename(t),line:e,column:n,anonymous:!t}}if(null!==(t=r)&&void 0!==t&&t.includes("<anonymous>"))a=r.endsWith(".<anonymous>")?{name:r.replace(".<anonymous>",""),method:null,anonymous:!0}:{name:null,anonymous:!0};else if(r){["global code","module code","eval code"].some(e=>r===e)&&(l.host="Bun",l.type="runtime"),a=Stacklyn.parseFunctionName(r,{alias:i,rawName:r})}else r||(a={name:null,anonymous:!0});return Stacklyn._buildOutputObject({frameInfo:{raw:e,func:a,location:o},extra:{callSite:null!=n?n:void 0,environment:l}})}static parseSpiderMonkey(e){var n;if(!e||e.length<2)return;let t,o,a,l={host:"Firefox",format:"SpiderMonkey",type:"browser"};const r=e.lastIndexOf("@"),[i,c]=-1!==r?[e.slice(0,r),e.slice(r+1)]:[null,""];const{line:s,column:u}=Stacklyn._extractLocation(c),m=["[native code]","[wasm code]"].some(e=>c.includes(e)),p=["global code","module code","eval code"].some(e=>i.includes(e));if(c.includes(" line ")&&c.includes(" > "))o=function(e){let n=null;const t=e.split(" > ");for(let e=t.length-1;e>=0;e--){const o=t[e].match(/^(.*) line (\d+)$/)||t[e].match(/^(.*):(\d+):(\d+)$/);o&&(n={sourceURL:o[1].includes("://")?o[1]:null,fileName:o[1].includes("://")?Stacklyn._getFilename(o[1]):null,line:Number(o[2]),column:o[3]?Number(o[3]):null,type:o[1].includes("://")?"file":o[1],eval:n})}return n}(c);else if(c.startsWith("javascript:")){t={inlineSource:Stacklyn._cleanPath(c.replace("javascript:",""),"partial"),line:s,column:u,type:"JSUrl"}}else if(m||!c.match(/:(\d+)(?::(\d+))?$/))l={host:"Safari",format:"JavaScriptCore",type:"browser"},t={sourceURL:c,line:s,column:u,type:c.includes("[native code]")?"native":"wasm"};else{const e=Stacklyn._cleanPath(c);t={sourceURL:e,fileName:Stacklyn._getFilename(e),line:s,column:u}}if(i)if(i.includes("/")){const e=i.split("/"),n=[];e.forEach(e=>{let t;t=e.includes("<")?{name:e,index:e.match(/\[(\d+)\]</)||void 0,flags:["NESTED_ANON"]}:Stacklyn.parseFunctionName(e,{rawName:i}),n.push(t)});const t=_objectSpread({},n[0]);let o=t;for(let e=1;e<n.length;e++)o.func=_objectSpread({},n[e]),o=o.func;a=t}else if(i.includes("*")){const[e,n]=i.split("*"),t=Stacklyn._parseFunctionname(n,{rawName:i});e.includes("setTimeout handler")?t.flags.push("TIMEOUT_HANDLER"):e.includes("promise callback")&&t.flags.push("PROMISE_CALLBACK"),t.flags.push("ASYNC"),a=t}else if(p){l={host:"Safari",format:"JavaScriptCore",type:"browser"};a={name:null,anonymous:!0,flags:[i.split(" ")[0].toUpperCase()]}}else a=Stacklyn._parseFunctionname(i,{rawName:i});else a={name:null,anonymous:!0};return"anonymous"===i&&"Function"===(null===(n=t)||void 0===n?void 0:n.eval.type)&&(a.anonymous=!0),Stacklyn._buildOutputObject({frameInfo:{raw:e,func:a,location:o||t},extra:{environment:l}})}static parseIE(e){let n,t;const o=e.match(/^ {3}at\s+(.*?)\s+\((.*?)\)$/);if(!o)return;const[,a,l]=o;if(n=["Global code","Anonymous function"].some(e=>a.includes(e))?{name:null,anonymous:!0,flags:[a.split(" ")[0].toUpperCase()]}:Stacklyn.parseFunctionName(a,{rawName:a}),"native code"===l)t={sourceURL:null,fileName:null,anonymous:!0,type:"native"};else if(["eval code","Function code","Unknown script code"].some(e=>l.includes(e))){let e=l.split(" code")[0].toLowerCase();const{line:n,column:o}=Stacklyn._extractLocation(l);t={sourceURL:null,fileName:null,line:n,column:o,anonymous:!0,type:e}}else t=Stacklyn._extractLocation(l);return Stacklyn._buildOutputObject({frameInfo:{raw:e,func:n,location:t},extra:{environment:{host:"Internet Explorer",format:"IE",type:"browser"}}})}static parseOpera(e){if(!Stacklyn._isValidError(e))return;const n=[],t=Stacklyn._detectOperaMode(e);return Stacklyn._getOperaPairs(Stacklyn._getOperaStack(e)).forEach(e=>{if("carakan"===t)n.push(Stacklyn.parseCarakan(e.frame,e.context));else{if("linear-b"!==t)throw new Stacklyn.Error("Invalid Opera error provided for parsing");n.push(Stacklyn.parseLinearB(e.frame,e.context))}}),n}static parseCarakan(e,n){var t;let o,a,l,r="thrown";const i={"Error thrown at ":"thrown","Error created at ":"constructed","Error initially occurred at ":"rethrown","called via ToPrimitive() from ":"toPrimitive","called via Function.prototype.apply() from ":"functionPrototypeApply","called via Function.prototype.call() from ":"functionPrototypeCall","called as bound function from ":"functionPrototypeBind","called from ":"functionCall"};Object.keys(i).some(n=>e.startsWith(n)&&(r=i[n],!0));let[,c,s]=e.match(/in (.+?) in (.+)/)||[null,null];const[,u,m]=e.match(/line (\d+), column (\d+)/)||[null];c||([,l,s]=e.match(/[at|from] (.*?) in (.*)/)),c&&(c.includes("<anonymous function:")?a=c.replace("<anonymous function: ","").replace(">",""):c.includes("<anonymous function>")&&(a="!"),o="!"!==a?_objectSpread(_objectSpread({},Stacklyn.parseFunctionName(null!=a?a:c,{rawName:c})),{},{anonymous:c.startsWith("<a")}):{name:null,anonymous:!0}),s.endsWith(":")&&(s=s.slice(0,-1));const p={context:n,sourceURL:s,fileName:null!==(t=s)&&void 0!==t&&t.includes(" ")?void 0:Stacklyn._getFilename(s),line:+u,column:+m,anonymous:!s||"unknown location"===l||s.includes(" ")};return Stacklyn._buildOutputObject({frameInfo:{raw:e,func:o,location:p},extra:{type:r,environment:{host:"Opera",format:"carakan",type:"browser"}}})}static parseLinearB(e,n){const[,t,o,a,l,r]=e.match(/^Line (\d+) of ([a-z]+)(?:#(\d+))? script(?: in (.*?))?(?:: In function (.*))?$/),i={context:n,sourceURL:l,fileName:Stacklyn._getFilename(l),line:+t,anonymous:!l,script:{type:o||"unknown",index:+a}},c=r?Stacklyn.parseFunctionName(r,{rawName:r}):{name:null,anonymous:!r};return Stacklyn._buildOutputObject({frameInfo:{raw:e,func:c,location:i},extra:{environment:{host:"Opera",format:"linear-b",type:"browser"}}})}static parseEspruino(e){if(Stacklyn._isValidError(e))return Stacklyn._getEspruinoPairs(e.stack).map(e=>function(e,n,t){let o,a,l,r;const i=/^ {4}at (.*?) \((.+)\)$/,c=/^ {4}at (.+)$/;if(e.includes("(")&&e.includes(")")){const n=e.match(i);n&&([,l,r]=n)}else{const n=e.match(c);n&&([,r]=n)}if(r){const{line:e,column:n}=Stacklyn._extractLocation(r),t=Stacklyn._cleanPath(r);o={sourceURL:t,fileName:Stacklyn._getFilename(t),line:e,column:n,anonymous:!t}}a=l?Stacklyn.parseFunctionName(l,{rawName:l}):{name:null,anonymous:!0};const s=o;return!s.fileName&&s.line&&s.column&&"REPL"===a.name&&a.flags.push("REPL"),Stacklyn._buildOutputObject({frameInfo:{raw:e,func:a,location:_objectSpread({context:n,caret:t},o)},extra:{environment:{host:"Microcontroller Unit",format:"Espruino",type:"interpreter"}}})}(e.frame,e.context,e.caret))}static parseFunctionName(e,{alias:n,rawName:t}){if(!e||!t)return;let o,a;/\[.*?\]/.test(e)&&(e=e.replace(/\[(.*?)\]/g,(e,n)=>"."+n));const l=e.match(/^(.+?)\((.*)\)$/);if(l)try{a=new Function(`return [${l[2]}]`)()}catch(e){a=l[2].split(", ")}const r=l?l[1]:e;if(r.startsWith("./"))o={name:null,rawName:t,anonymous:!0};else if(r.includes(".")){const e=r.split("."),l=e.pop(),i=e.join(".");o={name:i,method:l,rawName:t,alias:n,flags:["DIRECT"],args:a,anonymous:!i}}else if(["get ","set ","new ","async "].some(e=>r.startsWith(e))){var i;let e,[l,c]=r.split(" ");if(c.includes(".")){const n=c.split(".");e=n.pop(),c=n.join(".")}const s=null!==(i={get:"GETTER",set:"SETTER",new:"CONSTRUCTOR",async:"ASYNC"}[l])&&void 0!==i?i:l.toUpperCase();o={name:c,method:e,rawName:t,alias:n,prefix:l,flags:["PREFIX",s],args:a,anonymous:!c}}else o={name:r,rawName:t,alias:n,flags:[],args:a,anonymous:!r};return o.name===t&&(o.rawName=void 0),void 0!==a&&o.flags.push("ARGS"),"eval"===r&&o.flags.push("EVAL"),o}static convert(e,n){var t;const o=[],a={Carakan:{host:"Opera",format:"carakan",type:"browser"},Chakra:{host:"Internet Explorer",format:"IE",type:"browser"},Espruino:{host:"MCU Unit",format:"Espruino",type:"interpreter"},LinearB:{host:"Opera",format:"linear-b",type:"browser"},SpiderMonkey:{host:"Firefox",format:"SpiderMonkey",type:"browser"},V8:{host:"Chromium",format:"V8",type:"browser"}},l=null===(t=Object.entries({Carakan:["Carakan"],Chakra:["Edge (Legacy)","Internet Explorer","IE"],Espruino:["Espruino"],LinearB:["LinearB","linear-b","Linear B"],SpiderMonkey:["Firefox","Netscape","Tor","SpiderMonkey","Mocha"],V8:["Brave","Chrome","Chromium","Edge","Opera","Opera GX","Vivaldi","Node.js","V8"]}).find(([,e])=>e.includes(n)))||void 0===t?void 0:t[0];if(!l||!a[l])throw new Stacklyn.Error(`invalid .convert() target: '${n}'`);return e.forEach(e=>{e.environment=a[l],o.push(Stacklyn.stringify(e))}),o.filter(Boolean).join("\n")}static stringify(e){if(Array.isArray(e))return e.map(e=>Stacklyn.stringify(e));let n="";const t=e.func.args?`(${e.func.args.join(", ")})`:"",o=(e.func.name||e.func.rawName||"")+(e.func.method?"."+e.func.method:"");function a(e){return e.line?":"+e.line+(e.column?":"+e.column:""):""}const l=a(e.location);if("V8"===e.environment.format){var r;if(null!==(r=e.location)&&void 0!==r&&null!==(r=r.eval)&&void 0!==r&&r.type)return"";const i=e.location.eval?s(e.location):e.location.sourceURL+l,c=e.func.alias?` [as ${e.func.alias}]`:"";function s(e){return`${function e(n){return n.eval?`eval at ${n.name} (${e(n.eval)})`:`eval at ${n.name} (${n.sourceURL}${a(n)})`}(e)}, ${e.sourceURL}${a(e)}`}n=" at "+(o?`${o}${t}${c} (${i})`:i)}else if("SpiderMonkey"===e.environment.format){if(e.location.eval&&e.location.sourceURL.includes("<anonymous>"))return"";const u=("eval"===e.func.name?"":o)+t;let m;m="JSUrl"===e.location.type?"javascript:"+e.location.inlineSource+l:e.location.eval?function e(n){var t,o,l;return n.eval?`${null!==(t=null!==(o=n.sourceURL)&&void 0!==o?o:n.type)&&void 0!==t?t:"eval"} line ${n.line} > ${e(n.eval)}`:`${null!==(l=n.sourceURL)&&void 0!==l?l:n.type}${a(n)}`}(e.location):(e.location.sourceURL||"debugger eval code")+l,n+=u+"@"+m}else if("carakan"===e.environment.format){const p={thrown:"Error thrown at",constructed:"Error created at",rethrown:"Error initially occurred at",toPrimitive:"called via ToPrimitive() from",functionPrototypeApply:"called via Function.prototype.apply() from",functionPrototypeCall:"called via Function.prototype.call() from",functionPrototypeBind:"called as bound function from",functionCall:"called from"},f=e.func.name?`<anonymous function: ${e.func.name}>`:"<anonymous function>",d=(e.func.anonymous?f:o)+t;n=p[e.type],e.location.anonymous&&!e.location.line&&(n+=" unknown location"),e.location.line&&(n+=` line ${e.location.line}, column ${e.location.column}`),n+=` in ${d} in ${e.location.sourceURL}:\n ${e.location.context}`}else if("linear-b"===e.environment.format){let y;"inline"===e.location.script.type&&(y="#"+e.location.script.index);const v=["unknown","function","eval"].some(n=>e.location.script.type===n);n=` Line ${e.location.line} of ${e.location.script.type}${y} script`,v||e.location.anonymous||(n+=` in ${e.location.sourceURL}`),o&&(n+=`: In function ${o}${t}`),n+=`\n ${e.location.context||"/* no source available */"}`}else if("IE"===e.environment.format){let h=S[e.location.type];const S={eval:"eval code",function:"Function code",unknown:"Unknown script code"};e.location.type||(h=e.location.sourceURL+l),n=` at ${e.func.rawName} (${h})`}else if("Espruino"===e.environment.format){const k=`:${e.location.line}:${e.location.column}`,g=`${e.location.fileName||""}${k}`;n=` at ${e.func.name?`${o} (${g})`:g}`,e.location.context&&(n+="\n "+e.location.context,e.location.caret?n+="\n"+e.location.caret:n+=`\n${" ".repeat(e.location.context.length+1)}^`)}return n}static serializeError(e){const n=e instanceof Error?Object.getPrototypeOf(e):Error.prototype,t=Object.create(n);return["name","message","stack","cause","errors","error","suppressed","toString","code","errno","syscall","address","port","path","dest","spawnargs","fileName","lineNumber","columnNumber","sourceURL","line","column","number","description","arguments","stacktrace","opera#sourceloc"].forEach(n=>{const o=e[n];(o||!1===o||null===o)&&(t[n]="function"==typeof o?o.call(e):o)}),t}static getCallSites(e){const n=Error.prepareStackTrace;try{Error.prepareStackTrace=(e,n)=>n;const t=e.stack;if(!Array.isArray(t))return null;function o(e){var n;return 0!==(null===(n=e.getPosition)||void 0===n?void 0:n.call(e))}const a=t.filter(o).map(e=>{var n,t,o,a,l,r,i,c,s,u,m,p,f,d,y,v,h,S,k,g,b,w;return{scope:(w=null===(n=e.getThis)||void 0===n?void 0:n.call(e),w.toString().replace(/\[object (\w+)]/,"$1").toLowerCase()),func:{name:null===(t=e.getFunctionName)||void 0===t?void 0:t.call(e),typeName:null===(o=e.getTypeName)||void 0===o?void 0:o.call(e),sourceCode:(null===(a=e.getFunction)||void 0===a||null===(a=a.call(e))||void 0===a||null===(l=a.toString)||void 0===l?void 0:l.call(a))||"",reference:null===(r=e.getFunction)||void 0===r?void 0:r.call(e),flags:{native:null===(i=e.isNative)||void 0===i?void 0:i.call(e),constructor:null===(c=e.isConstructor)||void 0===c?void 0:c.call(e),async:null===(s=e.isAsync)||void 0===s?void 0:s.call(e),topLevel:null===(u=e.isToplevel)||void 0===u?void 0:u.call(e)},eval:{origin:null===(m=e.getEvalOrigin)||void 0===m?void 0:m.call(e),isEval:null===(p=e.isEval)||void 0===p?void 0:p.call(e)},promise:{all:null===(f=e.isPromiseAll)||void 0===f?void 0:f.call(e),index:null===(d=e.getPromiseIndex)||void 0===d?void 0:d.call(e)}},location:{sourceURL:null===(y=e.getScriptNameOrSourceURL)||void 0===y?void 0:y.call(e),scriptHash:null===(v=e.getScriptHash)||void 0===v?void 0:v.call(e),line:null===(h=e.getLineNumber)||void 0===h?void 0:h.call(e),column:null===(S=e.getColumnNumber)||void 0===S?void 0:S.call(e),position:null===(k=e.getPosition)||void 0===k?void 0:k.call(e),enclosingLine:null===(g=e.getEnclosingLineNumber)||void 0===g?void 0:g.call(e),enclosingColumn:null===(b=e.getEnclosingColumnNumber)||void 0===b?void 0:b.call(e)}}}),l=`${e.toString()}\n${t.map(e=>" at "+e.toString()).join("\n")}`;return e.stack=l,{callSites:a,stack:l}}catch(r){return null}finally{Error.prepareStackTrace=n}}static async map(e){const n=[];for(let t of e){let e;const{sourceURL:o=null,fileName:a=null,line:l=null,column:r=null}=t.location,i=o+".map";try{e=await(await fetch(i)).json()}catch(e){throw new Stacklyn.Error(`Could not fetch source map ${i} (${e.toString()})\n Stacktrace:`)}const c=new Stacklyn._SourceMapper(e).originalPositionFor({line:l,column:r});t.func.name=c.name||t.func.name,t.func.anonymous=!c.name,t.location.sourceURL=c.source||o,t.location.fileName=Stacklyn._getFilename(c.source)||a,t.location.line=c.line||l,t.location.column=c.column||r,t.location.anonymous=!c.source||!o,t.raw=Stacklyn.stringify(t),t=_objectSpread(_objectSpread({},t),{},{sourcemapped:!0}),n.push(t)}return n}static async enrich(e,n=5){return(await Promise.all(e.map(e=>Stacklyn._prependContext(e,n)))).filter(Boolean)}static _getOperaStack(e){var n,t,o;const a=(null===(n=e.message)||void 0===n?void 0:n.split(/\n(?:\s+)?Backtrace:(?:\s+)?(?:\n)?/)[1])||null,l=(null===(t=e.message)||void 0===t?void 0:t.split(/\n(?:\s+)?stacktrace:(?:\s+)?(?:\n)?/)[1])||null;if(null!==(o=e.stacktrace)&&void 0!==o&&o.includes("opera:config#UserPrefs"))return a;if(!1===e.stacktrace)throw new Stacklyn.Error("The specified error came from somewherewith stack traces disabled, enable 'opera:config#UserPrefs|Exceptions Have Stacktrace' if this is your error.");return e.stacktrace||l||a}static _getOperaPairs(e){const n=e.split("\n"),t=[];for(let e=0;e<n.length;e++){const o=n[e],a=n[e-1];if(null!=o&&o.startsWith(" ")){const e=null!=a&&a.startsWith(" Line ")?a.slice(2):a,n=o.slice(4);t.push({frame:e,context:n})}}return t}static _detectOperaMode(e){let n="failed";try{const t=Stacklyn._getOperaStack(e);for(const e of t.split("\n")){n=["called via ","called from ","Error thrown ","Error created ","Error initially "].some(n=>e.includes(n))?"carakan":"linear-b";break}}catch(e){return n}return n}static _extractLocation(e,n=e.match(/:(\d+)(?::(\d+))?$/)){return{line:n?+n[1]:null,column:n?+n[2]:null}}static _getFilename(e){return decodeURIComponent(e.split("/").pop())}static _cleanPath(e,n="full"){const t=e.replace(/:\d+:\d+$/,"");return"full"===n?t.replace(/\\/g,"/"):"partial"===n?t.replace(/:\d+:\d+$/,""):void 0}static _buildOutputObject({frameInfo:e,extra:n={}}){return _objectSpread({raw:e.raw,func:e.func,location:e.location},n||void 0)}static async _prependContext(e,n){var t;if(!e.location||!e.location.fileName||e.location.anonymous)return;const o=await fetch(e.location.sourceURL).then(e=>e.text()),a=o.split(/\r?\n/);return/^\s*\/\/#\s*sourceMappingURL=.+/m.test(o)||e.location.fileName.includes(".min.")||o.length/a.length>100||a.length<2*n+1?void 0:_objectSpread({contextabove:a.slice(Math.max(0,e.location.line-1-n),e.location.line-1),context:null!==(t=a[e.location.line-1])&&void 0!==t?t:"",contextbelow:a.slice(e.location.line,e.location.line+n)},e)}static _getEspruinoPairs(e){const n=[],t=[],o=[];return e.split("\n").forEach(e=>{e.startsWith(" at ")?n.push(e):e.includes(" ^")?o.push(e):t.push(e)}),n.map((e,n)=>{var a;return{frame:e,context:null!==(a=t[n])&&void 0!==a&&a.startsWith(" ")?t[n].slice(4):t[n],caret:o[n]}})}static _isValidError(e){return e&&"object"==typeof e&&["stack","message","stacktrace"].some(n=>n in e)}static _filterUndefined(e){return e.map(e=>JSON.parse(JSON.stringify(e,(e,n)=>void 0===n?void 0:n)))}}Stacklyn._SourceMapper=class{constructor(e){this.sources=e.sources||[],this.names=e.names||[],this.mappings=this._parseMappings(e.mappings||"")}_parseMappings(e){function n(e,n){let t,o=0,a=0;var l={};for(let e=0;e<64;)l["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[e]]=e++;for(;null==(t=l[e[n++]])?(()=>{throw new Stacklyn.Error("bad VLQ character")})():(o|=(31&t)<<a,a+=5,32&t););return{value:(o>>1)*(1&o?-1:1),nextOffset:n}}let t=0,o=0,a=0,l=0,r=0;var i=[],c=e.split(";");for(let e=0;e<c.length;e++){let p=0;t=0;var s=c[e];if(s)for(;p<s.length;){var u=n(s,p),m=(t+=u.value,p=u.nextOffset,{generatedLine:e+1,generatedColumn:t});p<s.length&&","!==s[p]&&(o+=(u=n(s,p)).value,m.sourceIndex=o,a+=(u=n(s,p=u.nextOffset)).value,m.sourceLine=a,l+=(u=n(s,p=u.nextOffset)).value,m.sourceColumn=l,(p=u.nextOffset)<s.length)&&","!==s[p]&&(r+=(u=n(s,p)).value,m.nameIndex=r,p=u.nextOffset),i.push(m),p<s.length&&","===s[p]&&p++}}return i}originalPositionFor(e){let n=null,t=this.mappings.filter(n=>n.generatedLine===e.line);if(!t.length)return{source:null,line:null,column:null,name:null};for(const o of t){if(!(o.generatedColumn<=e.column))break;n=o}return n&&null!==n.sourceIndex?{source:this.sources[n.sourceIndex]||null,line:n.sourceLine+1,column:n.sourceColumn,name:null!==n.nameIndex?this.names[n.nameIndex]:null}:{source:null,line:null,column:null,name:null}}},Stacklyn.Error=class extends Error{constructor(e,n={}){super(e,n),this.name="StacklynError",n.cause&&(this.cause=n.cause)}},"function"==typeof define&&define.amd&&define("stacklyn",[],()=>Stacklyn),"undefined"!=typeof global&&(global.Stacklyn=Stacklyn),"undefined"!=typeof module&&(module.exports=Stacklyn),"undefined"!=typeof exports&&(exports.Stacklyn=Stacklyn),"undefined"!=typeof window&&(window.Stacklyn=Stacklyn),"undefined"!=typeof self&&(self.Stacklyn=Stacklyn),"undefined"!=typeof globalThis&&(globalThis.Stacklyn=Stacklyn);