error-stack-parser.min.js.map 17.9 KB
{"version":3,"sources":["stackframe.js","error-stack-parser.js"],"names":["root","factory","define","amd","exports","module","StackFrame","this","_isNumber","n","isNaN","parseFloat","isFinite","_capitalize","str","charAt","toUpperCase","substring","_getter","p","obj","Object","i","props","length","hasOwnProperty","undefined","booleanProps","numericProps","stringProps","arrayProps","concat","prototype","getArgs","args","setArgs","v","toString","call","TypeError","getEvalOrigin","evalOrigin","setEvalOrigin","functionName","getFunctionName","join","fileName","getFileName","lineNumber","getLineNumber","columnNumber","getColumnNumber","Boolean","j","Number","k","String","require","ErrorStackParser","FIREFOX_SAFARI_STACK_REGEXP","CHROME_IE_STACK_REGEXP","SAFARI_NATIVE_CODE_REGEXP","parse","error","stacktrace","parseOpera","stack","match","parseV8OrIE","parseFFOrSafari","Error","extractLocation","urlLike","indexOf","regExp","parts","exec","replace","filtered","split","filter","line","map","tokens","slice","locationParts","pop","source","functionNameRegex","matches","e","message","parseOpera9","parseOpera11","parseOpera10","lineRE","lines","result","len","push","argsRaw","functionCall","shift"],"mappings":"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","file":"error-stack-parser.min.js","sourcesContent":["(function(root, factory) {\n    'use strict';\n    // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.\n\n    /* istanbul ignore next */\n    if (typeof define === 'function' && define.amd) {\n        define('stackframe', [], factory);\n    } else if (typeof exports === 'object') {\n        module.exports = factory();\n    } else {\n        root.StackFrame = factory();\n    }\n}(this, function() {\n    'use strict';\n    function _isNumber(n) {\n        return !isNaN(parseFloat(n)) && isFinite(n);\n    }\n\n    function _capitalize(str) {\n        return str.charAt(0).toUpperCase() + str.substring(1);\n    }\n\n    function _getter(p) {\n        return function() {\n            return this[p];\n        };\n    }\n\n    var booleanProps = ['isConstructor', 'isEval', 'isNative', 'isToplevel'];\n    var numericProps = ['columnNumber', 'lineNumber'];\n    var stringProps = ['fileName', 'functionName', 'source'];\n    var arrayProps = ['args'];\n\n    var props = booleanProps.concat(numericProps, stringProps, arrayProps);\n\n    function StackFrame(obj) {\n        if (obj instanceof Object) {\n            for (var i = 0; i < props.length; i++) {\n                if (obj.hasOwnProperty(props[i]) && obj[props[i]] !== undefined) {\n                    this['set' + _capitalize(props[i])](obj[props[i]]);\n                }\n            }\n        }\n    }\n\n    StackFrame.prototype = {\n        getArgs: function() {\n            return this.args;\n        },\n        setArgs: function(v) {\n            if (Object.prototype.toString.call(v) !== '[object Array]') {\n                throw new TypeError('Args must be an Array');\n            }\n            this.args = v;\n        },\n\n        getEvalOrigin: function() {\n            return this.evalOrigin;\n        },\n        setEvalOrigin: function(v) {\n            if (v instanceof StackFrame) {\n                this.evalOrigin = v;\n            } else if (v instanceof Object) {\n                this.evalOrigin = new StackFrame(v);\n            } else {\n                throw new TypeError('Eval Origin must be an Object or StackFrame');\n            }\n        },\n\n        toString: function() {\n            var functionName = this.getFunctionName() || '{anonymous}';\n            var args = '(' + (this.getArgs() || []).join(',') + ')';\n            var fileName = this.getFileName() ? ('@' + this.getFileName()) : '';\n            var lineNumber = _isNumber(this.getLineNumber()) ? (':' + this.getLineNumber()) : '';\n            var columnNumber = _isNumber(this.getColumnNumber()) ? (':' + this.getColumnNumber()) : '';\n            return functionName + args + fileName + lineNumber + columnNumber;\n        }\n    };\n\n    for (var i = 0; i < booleanProps.length; i++) {\n        StackFrame.prototype['get' + _capitalize(booleanProps[i])] = _getter(booleanProps[i]);\n        StackFrame.prototype['set' + _capitalize(booleanProps[i])] = (function(p) {\n            return function(v) {\n                this[p] = Boolean(v);\n            };\n        })(booleanProps[i]);\n    }\n\n    for (var j = 0; j < numericProps.length; j++) {\n        StackFrame.prototype['get' + _capitalize(numericProps[j])] = _getter(numericProps[j]);\n        StackFrame.prototype['set' + _capitalize(numericProps[j])] = (function(p) {\n            return function(v) {\n                if (!_isNumber(v)) {\n                    throw new TypeError(p + ' must be a Number');\n                }\n                this[p] = Number(v);\n            };\n        })(numericProps[j]);\n    }\n\n    for (var k = 0; k < stringProps.length; k++) {\n        StackFrame.prototype['get' + _capitalize(stringProps[k])] = _getter(stringProps[k]);\n        StackFrame.prototype['set' + _capitalize(stringProps[k])] = (function(p) {\n            return function(v) {\n                this[p] = String(v);\n            };\n        })(stringProps[k]);\n    }\n\n    return StackFrame;\n}));\n","(function(root, factory) {\n    'use strict';\n    // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.\n\n    /* istanbul ignore next */\n    if (typeof define === 'function' && define.amd) {\n        define('error-stack-parser', ['stackframe'], factory);\n    } else if (typeof exports === 'object') {\n        module.exports = factory(require('stackframe'));\n    } else {\n        root.ErrorStackParser = factory(root.StackFrame);\n    }\n}(this, function ErrorStackParser(StackFrame) {\n    'use strict';\n\n    var FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+\\:\\d+/;\n    var CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+\\:\\d+|\\(native\\))/m;\n    var SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code\\])?$/;\n\n    return {\n        /**\n         * Given an Error object, extract the most information from it.\n         *\n         * @param {Error} error object\n         * @return {Array} of StackFrames\n         */\n        parse: function ErrorStackParser$$parse(error) {\n            if (typeof error.stacktrace !== 'undefined' || typeof error['opera#sourceloc'] !== 'undefined') {\n                return this.parseOpera(error);\n            } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\n                return this.parseV8OrIE(error);\n            } else if (error.stack) {\n                return this.parseFFOrSafari(error);\n            } else {\n                throw new Error('Cannot parse given Error object');\n            }\n        },\n\n        // Separate line and column numbers from a string of the form: (URI:Line:Column)\n        extractLocation: function ErrorStackParser$$extractLocation(urlLike) {\n            // Fail-fast but return locations like \"(native)\"\n            if (urlLike.indexOf(':') === -1) {\n                return [urlLike];\n            }\n\n            var regExp = /(.+?)(?:\\:(\\d+))?(?:\\:(\\d+))?$/;\n            var parts = regExp.exec(urlLike.replace(/[\\(\\)]/g, ''));\n            return [parts[1], parts[2] || undefined, parts[3] || undefined];\n        },\n\n        parseV8OrIE: function ErrorStackParser$$parseV8OrIE(error) {\n            var filtered = error.stack.split('\\n').filter(function(line) {\n                return !!line.match(CHROME_IE_STACK_REGEXP);\n            }, this);\n\n            return filtered.map(function(line) {\n                if (line.indexOf('(eval ') > -1) {\n                    // Throw away eval information until we implement stacktrace.js/stackframe#8\n                    line = line.replace(/eval code/g, 'eval').replace(/(\\(eval at [^\\()]*)|(\\)\\,.*$)/g, '');\n                }\n                var tokens = line.replace(/^\\s+/, '').replace(/\\(eval code/g, '(').split(/\\s+/).slice(1);\n                var locationParts = this.extractLocation(tokens.pop());\n                var functionName = tokens.join(' ') || undefined;\n                var fileName = ['eval', '<anonymous>'].indexOf(locationParts[0]) > -1 ? undefined : locationParts[0];\n\n                return new StackFrame({\n                    functionName: functionName,\n                    fileName: fileName,\n                    lineNumber: locationParts[1],\n                    columnNumber: locationParts[2],\n                    source: line\n                });\n            }, this);\n        },\n\n        parseFFOrSafari: function ErrorStackParser$$parseFFOrSafari(error) {\n            var filtered = error.stack.split('\\n').filter(function(line) {\n                return !line.match(SAFARI_NATIVE_CODE_REGEXP);\n            }, this);\n\n            return filtered.map(function(line) {\n                // Throw away eval information until we implement stacktrace.js/stackframe#8\n                if (line.indexOf(' > eval') > -1) {\n                    line = line.replace(/ line (\\d+)(?: > eval line \\d+)* > eval\\:\\d+\\:\\d+/g, ':$1');\n                }\n\n                if (line.indexOf('@') === -1 && line.indexOf(':') === -1) {\n                    // Safari eval frames only have function names and nothing else\n                    return new StackFrame({\n                        functionName: line\n                    });\n                } else {\n                    var functionNameRegex = /((.*\".+\"[^@]*)?[^@]*)(?:@)/;\n                    var matches = line.match(functionNameRegex);\n                    var functionName = matches && matches[1] ? matches[1] : undefined;\n                    var locationParts = this.extractLocation(line.replace(functionNameRegex, ''));\n\n                    return new StackFrame({\n                        functionName: functionName,\n                        fileName: locationParts[0],\n                        lineNumber: locationParts[1],\n                        columnNumber: locationParts[2],\n                        source: line\n                    });\n                }\n            }, this);\n        },\n\n        parseOpera: function ErrorStackParser$$parseOpera(e) {\n            if (!e.stacktrace || (e.message.indexOf('\\n') > -1 &&\n                e.message.split('\\n').length > e.stacktrace.split('\\n').length)) {\n                return this.parseOpera9(e);\n            } else if (!e.stack) {\n                return this.parseOpera10(e);\n            } else {\n                return this.parseOpera11(e);\n            }\n        },\n\n        parseOpera9: function ErrorStackParser$$parseOpera9(e) {\n            var lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\n            var lines = e.message.split('\\n');\n            var result = [];\n\n            for (var i = 2, len = lines.length; i < len; i += 2) {\n                var match = lineRE.exec(lines[i]);\n                if (match) {\n                    result.push(new StackFrame({\n                        fileName: match[2],\n                        lineNumber: match[1],\n                        source: lines[i]\n                    }));\n                }\n            }\n\n            return result;\n        },\n\n        parseOpera10: function ErrorStackParser$$parseOpera10(e) {\n            var lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\n            var lines = e.stacktrace.split('\\n');\n            var result = [];\n\n            for (var i = 0, len = lines.length; i < len; i += 2) {\n                var match = lineRE.exec(lines[i]);\n                if (match) {\n                    result.push(\n                        new StackFrame({\n                            functionName: match[3] || undefined,\n                            fileName: match[2],\n                            lineNumber: match[1],\n                            source: lines[i]\n                        })\n                    );\n                }\n            }\n\n            return result;\n        },\n\n        // Opera 10.65+ Error.stack very similar to FF/Safari\n        parseOpera11: function ErrorStackParser$$parseOpera11(error) {\n            var filtered = error.stack.split('\\n').filter(function(line) {\n                return !!line.match(FIREFOX_SAFARI_STACK_REGEXP) && !line.match(/^Error created at/);\n            }, this);\n\n            return filtered.map(function(line) {\n                var tokens = line.split('@');\n                var locationParts = this.extractLocation(tokens.pop());\n                var functionCall = (tokens.shift() || '');\n                var functionName = functionCall\n                        .replace(/<anonymous function(: (\\w+))?>/, '$2')\n                        .replace(/\\([^\\)]*\\)/g, '') || undefined;\n                var argsRaw;\n                if (functionCall.match(/\\(([^\\)]*)\\)/)) {\n                    argsRaw = functionCall.replace(/^[^\\(]+\\(([^\\)]*)\\)$/, '$1');\n                }\n                var args = (argsRaw === undefined || argsRaw === '[arguments not available]') ?\n                    undefined : argsRaw.split(',');\n\n                return new StackFrame({\n                    functionName: functionName,\n                    args: args,\n                    fileName: locationParts[0],\n                    lineNumber: locationParts[1],\n                    columnNumber: locationParts[2],\n                    source: line\n                });\n            }, this);\n        }\n    };\n}));\n"]}