| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 | (function(root, factory) {    'use strict';    // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.    /* istanbul ignore next */    if (typeof define === 'function' && define.amd) {        define('stackframe', [], factory);    } else if (typeof exports === 'object') {        module.exports = factory();    } else {        root.StackFrame = factory();    }}(this, function() {    'use strict';    function _isNumber(n) {        return !isNaN(parseFloat(n)) && isFinite(n);    }    function _capitalize(str) {        return str.charAt(0).toUpperCase() + str.substring(1);    }    function _getter(p) {        return function() {            return this[p];        };    }    var booleanProps = ['isConstructor', 'isEval', 'isNative', 'isToplevel'];    var numericProps = ['columnNumber', 'lineNumber'];    var stringProps = ['fileName', 'functionName', 'source'];    var arrayProps = ['args'];    var objectProps = ['evalOrigin'];    var props = booleanProps.concat(numericProps, stringProps, arrayProps, objectProps);    function StackFrame(obj) {        if (!obj) return;        for (var i = 0; i < props.length; i++) {            if (obj[props[i]] !== undefined) {                this['set' + _capitalize(props[i])](obj[props[i]]);            }        }    }    StackFrame.prototype = {        getArgs: function() {            return this.args;        },        setArgs: function(v) {            if (Object.prototype.toString.call(v) !== '[object Array]') {                throw new TypeError('Args must be an Array');            }            this.args = v;        },        getEvalOrigin: function() {            return this.evalOrigin;        },        setEvalOrigin: function(v) {            if (v instanceof StackFrame) {                this.evalOrigin = v;            } else if (v instanceof Object) {                this.evalOrigin = new StackFrame(v);            } else {                throw new TypeError('Eval Origin must be an Object or StackFrame');            }        },        toString: function() {            var fileName = this.getFileName() || '';            var lineNumber = this.getLineNumber() || '';            var columnNumber = this.getColumnNumber() || '';            var functionName = this.getFunctionName() || '';            if (this.getIsEval()) {                if (fileName) {                    return '[eval] (' + fileName + ':' + lineNumber + ':' + columnNumber + ')';                }                return '[eval]:' + lineNumber + ':' + columnNumber;            }            if (functionName) {                return functionName + ' (' + fileName + ':' + lineNumber + ':' + columnNumber + ')';            }            return fileName + ':' + lineNumber + ':' + columnNumber;        }    };    StackFrame.fromString = function StackFrame$$fromString(str) {        var argsStartIndex = str.indexOf('(');        var argsEndIndex = str.lastIndexOf(')');        var functionName = str.substring(0, argsStartIndex);        var args = str.substring(argsStartIndex + 1, argsEndIndex).split(',');        var locationString = str.substring(argsEndIndex + 1);        if (locationString.indexOf('@') === 0) {            var parts = /@(.+?)(?::(\d+))?(?::(\d+))?$/.exec(locationString, '');            var fileName = parts[1];            var lineNumber = parts[2];            var columnNumber = parts[3];        }        return new StackFrame({            functionName: functionName,            args: args || undefined,            fileName: fileName,            lineNumber: lineNumber || undefined,            columnNumber: columnNumber || undefined        });    };    for (var i = 0; i < booleanProps.length; i++) {        StackFrame.prototype['get' + _capitalize(booleanProps[i])] = _getter(booleanProps[i]);        StackFrame.prototype['set' + _capitalize(booleanProps[i])] = (function(p) {            return function(v) {                this[p] = Boolean(v);            };        })(booleanProps[i]);    }    for (var j = 0; j < numericProps.length; j++) {        StackFrame.prototype['get' + _capitalize(numericProps[j])] = _getter(numericProps[j]);        StackFrame.prototype['set' + _capitalize(numericProps[j])] = (function(p) {            return function(v) {                if (!_isNumber(v)) {                    throw new TypeError(p + ' must be a Number');                }                this[p] = Number(v);            };        })(numericProps[j]);    }    for (var k = 0; k < stringProps.length; k++) {        StackFrame.prototype['get' + _capitalize(stringProps[k])] = _getter(stringProps[k]);        StackFrame.prototype['set' + _capitalize(stringProps[k])] = (function(p) {            return function(v) {                this[p] = String(v);            };        })(stringProps[k]);    }    return StackFrame;}));
 |