package/package.json000644 0000003205 3560116604 011546 0ustar00000000 000000 { "name": "stackframe", "description": "JS Object representation of a stack frame", "maintainers": [ "Eric Wendelin (https://www.eriwen.com)", "Victor Homyakov (https://github.com/victor-homyakov)", "Oliver Salzburg (https://github.com/oliversalzburg)" ], "version": "1.1.1", "license": "MIT", "keywords": [ "stacktrace", "error", "debugger", "stack frame" ], "homepage": "https://www.stacktracejs.com", "repository": { "type": "git", "url": "git://github.com/stacktracejs/stackframe.git" }, "devDependencies": { "eslint": "^6.8.0", "jasmine": "^3.5.0", "jasmine-core": "^3.5.0", "karma": "^4.4.1", "karma-chrome-launcher": "^3.1.0", "karma-coverage": "^2.0.1", "karma-coveralls": "^2.1.0", "karma-firefox-launcher": "^1.2.0", "karma-ie-launcher": "^1.0.0", "karma-jasmine": "^1.1.2", "karma-opera-launcher": "^1.0.0", "karma-phantomjs-launcher": "^1.0.4", "karma-safari-launcher": "^1.0.0", "karma-sauce-launcher": "^2.0.2", "karma-spec-reporter": "0.0.32", "uglify-es": "^3.3.9" }, "bugs": { "url": "https://github.com/stacktracejs/stackframe/issues" }, "main": "./stackframe.js", "scripts": { "lint": "eslint --fix .", "test": "karma start karma.conf.js --single-run", "test-pr": "karma start karma.conf.js --single-run --browsers Firefox,Chrome_Travis", "test-ci": "karma start karma.conf.ci.js --single-run", "prepare": "cp stackframe.js dist/ && uglifyjs stackframe.js -o dist/stackframe.min.js --compress --mangle --source-map \"url=stackframe.min.js.map\"" } } package/.eslintrc.yml000644 0000000600 3560116604 011700 0ustar00000000 000000 env: browser: true commonjs: true node: true extends: 'eslint:recommended' globals: define: false describe: false expect: false it: false parserOptions: ecmaVersion: 5 rules: indent: - error - 4 linebreak-style: - error - unix quotes: - error - single semi: - error - always no-console: - error - allow: - error package/bower.json000644 0000001346 3560116604 011275 0ustar00000000 000000 { "name": "stackframe", "main": "./stackframe.js", "homepage": "https://github.com/stacktracejs/stackframe", "authors": [ "Eric Wendelin (https://www.eriwen.com)", "Victor Homyakov (https://github.com/victor-homyakov)" ], "description": "JS Object representation of a stack frame", "moduleType": [ "amd", "globals", "node" ], "keywords": [ "stacktrace", "stack-trace", "backtrace", "cross-browser", "framework-agnostic", "error", "debugger" ], "license": "MIT", "ignore": [ "**/.*", "node_modules", "spec", "coverage" ] } package/CHANGELOG.md000644 0000001536 3560116604 011076 0ustar00000000 000000 ## v1.0.x StackFrame v1.0 is out! Major features: * `eval`, native, and global code can now be represented. * `evalOrigin` represents location of code within an eval'd String or Function * BREAKING CHANGE: `new StackFrame(obj)` is now constructed with an Object parameter. For example: ```js var stackFrame = new StackFrame({ functionName: 'funName', args: ['args'], fileName: 'http://localhost:3000/file.js', lineNumber: 1, columnNumber: 3288, isEval: true, isNative: false, source: 'ORIGINAL_STACK_LINE' }); ``` ## v0.3.x * Add source (original stack line) to StackFrame definition ## v0.2.2 * Add name to AMD definition * Better docs ## v0.2.1 * Add minified/source-mapped distribution ## v0.2.0 * Add .toString() method compatible with stacktrace.js ## v0.1.1 * Clean up npm package ## v0.1.0 * Draft implementation package/component.json000644 0000000531 3560116604 012154 0ustar00000000 000000 { "name": "stackframe", "repository": "stacktracejs/stackframe", "description": "JS Object representation of a stack frame", "version": "1.0.2", "keywords": [ "stacktrace", "error", "debugger", "stack frame" ], "main": "stackframe.js", "scripts": [ "stackframe.js" ] } package/CONTRIBUTING.md000644 0000002320 3560116604 011506 0ustar00000000 000000 ## Submitting bugs Please include the following information to help us reproduce and fix: * What you did * What you expected to happen * What actually happened * Browser and version * Example code that reproduces the problem (if possible) * *(l33t mode)* A failing test ## Making contributions Want to be listed as a *Contributor*? Make a pull request with: * Unit and/or functional tests that validate changes you're making. * Run unit tests in the latest IE, Firefox, Chrome, Safari and Opera and make sure they pass. * Rebase your changes onto origin/HEAD if you can do so cleanly. * If submitting additional functionality, provide an example of how to use it. * Please keep code style consistent with surrounding code. ## Dev Setup * Make sure you have [NodeJS v0.10](http://nodejs.org/) installed * Run `npm install` from the project directory ## Testing * (Local) Run `gulp test`. Make sure [Karma Local Config](karma.conf.js) has the browsers you want. * (Any browser, remotely) If you have a [Sauce Labs](https://saucelabs.com) account, you can run `gulp test-ci`. Make sure the target browser is enabled in [Karma CI Config](karma.conf.ci.js). Otherwise, Travis will run all browsers if you submit a Pull Request. package/karma.conf.ci.js000644 0000005676 3560116604 012245 0ustar00000000 000000 module.exports = function(config) { if (!process.env.SAUCE_USERNAME || !process.env.SAUCE_ACCESS_KEY) { console.error('Make sure the SAUCE_USERNAME and SAUCE_ACCESS_KEY environment variables are set.'); process.exit(1); } // Check out https://saucelabs.com/platforms for all browser/platform combos var customLaunchers = { slChrome: { base: 'SauceLabs', browserName: 'chrome', version: 'latest' }, slChromeBeta: { base: 'SauceLabs', browserName: 'chrome', version: 'beta' }, slFirefox: { base: 'SauceLabs', browserName: 'firefox', version: 'latest' }, slFirefoxBeta: { base: 'SauceLabs', browserName: 'firefox', version: 'beta' }, slSafari: { base: 'SauceLabs', browserName: 'safari', platform: 'OS X 10.14', version: 'latest' }, slEdge: { base: 'SauceLabs', browserName: 'microsoftedge', platform: 'Windows 10', version: 'latest' }, slIE11: { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 8.1', version: '11' }, slIE10: { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 7', version: '10' }, slIE9: { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 7', version: '10', 'x-ua-compatible': 'IE=EmulateIE9' }, slIE8: { base: 'SauceLabs', browserName: 'internet explorer', platform: 'Windows 7', version: '10', 'x-ua-compatible': 'IE=EmulateIE8' } }; config.set({ basePath: '', frameworks: ['jasmine'], files: [ 'stackframe.js', 'spec/*-spec.js' ], exclude: [], port: 9876, colors: false, logLevel: config.LOG_INFO, autoWatch: false, browserDisconnectTimeout: 10000, browserDisconnectTolerance: 1, browserNoActivityTimeout: 240000, captureTimeout: 240000, sauceLabs: { testName: 'stackframe unit tests', recordScreenshots: false, connectOptions: { port: 5757, logfile: 'sauce_connect.log' } }, customLaunchers: customLaunchers, browsers: Object.keys(customLaunchers), reporters: ['dots', 'saucelabs', 'coverage', 'coveralls'], preprocessors: { 'stackframe.js': 'coverage' }, coverageReporter: { type: 'lcov', dir: 'coverage' }, singleRun: true }); }; package/karma.conf.js000644 0000001044 3560116604 011634 0ustar00000000 000000 module.exports = function (config) { config.set({ basePath: '', frameworks: ['jasmine'], files: [ 'stackframe.js', 'spec/*-spec.js' ], reporters: ['spec'], port: 9876, colors: true, logLevel: config.LOG_INFO, autoWatch: true, customLaunchers: { Chrome_Travis: { base: 'Chrome', flags: ['--no-sandbox'] } }, browsers: ['PhantomJS'], singleRun: false }); }; package/LICENSE000644 0000002070 3560116604 010264 0ustar00000000 000000 Copyright (c) 2017 Eric Wendelin and other contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. package/README.md000644 0000004652 3560116604 010546 0ustar00000000 000000 stackframe ========== ## JS Object representation of a stack frame [![Build Status](https://travis-ci.org/stacktracejs/stackframe.svg?branch=master)](https://travis-ci.org/stacktracejs/stackframe) [![Coverage Status](https://img.shields.io/coveralls/stacktracejs/stackframe.svg)](https://coveralls.io/r/stacktracejs/stackframe?branch=master) [![GitHub license](https://img.shields.io/github/license/stacktracejs/stackframe.svg)](https://opensource.org/licenses/MITx) Underlies functionality of other modules within [stacktrace.js](https://www.stacktracejs.com). Written to closely resemble StackFrame representations in [Gecko](http://mxr.mozilla.org/mozilla-central/source/xpcom/base/nsIException.idl#14) and [V8](https://github.com/v8/v8/wiki/Stack%20Trace%20API) ## Usage ```js // Create StackFrame and set properties var stackFrame = new StackFrame({ functionName: 'funName', args: ['args'], fileName: 'http://localhost:3000/file.js', lineNumber: 1, columnNumber: 3288, isEval: true, isNative: false, source: 'ORIGINAL_STACK_LINE' }); stackFrame.functionName // => "funName" stackFrame.setFunctionName('newName') stackFrame.getFunctionName() // => "newName" stackFrame.args // => ["args"] stackFrame.setArgs([]) stackFrame.getArgs() // => [] stackFrame.fileName // => 'http://localhost:3000/file.min.js' stackFrame.setFileName('http://localhost:3000/file.js') stackFrame.getFileName() // => 'http://localhost:3000/file.js' stackFrame.lineNumber // => 1 stackFrame.setLineNumber(325) stackFrame.getLineNumber() // => 325 stackFrame.columnNumber // => 3288 stackFrame.setColumnNumber(20) stackFrame.getColumnNumber() // => 20 stackFrame.source // => 'ORIGINAL_STACK_LINE' stackFrame.setSource('NEW_SOURCE') stackFrame.getSource() // => 'NEW_SOURCE' stackFrame.isEval // => true stackFrame.setIsEval(false) stackFrame.getIsEval() // => false stackFrame.isNative // => false stackFrame.setIsNative(true) stackFrame.getIsNative() // => true stackFrame.toString() // => 'funName(args)@http://localhost:3000/file.js:325:20' ``` ## Browser Support [![Sauce Test Status](https://saucelabs.com/browser-matrix/stacktracejs.svg)](https://saucelabs.com/u/stacktracejs) ## Installation ``` npm install stackframe bower install stackframe https://raw.githubusercontent.com/stacktracejs/stackframe/master/dist/stackframe.min.js ``` package/stackframe-tests.ts000644 0000002653 3560116604 013116 0ustar00000000 000000 /// // Create StackFrame and set properties var stackFrame = new StackFrame({ functionName: 'funName', args: ['args'], fileName: 'http://localhost:3000/file.js', lineNumber: 1, columnNumber: 3288, isEval: true, isNative: false, source: 'ORIGINAL_STACK_LINE' }); stackFrame.functionName; // => "funName" stackFrame.setFunctionName('newName'); stackFrame.getFunctionName(); // => "newName" stackFrame.args; // => ["args"] stackFrame.setArgs([]); stackFrame.getArgs(); // => [] stackFrame.fileName; // => 'http://localhost:3000/file.min.js' stackFrame.setFileName('http://localhost:3000/file.js'); stackFrame.getFileName(); // => 'http://localhost:3000/file.js' stackFrame.lineNumber; // => 1 stackFrame.setLineNumber(325); stackFrame.getLineNumber(); // => 325 stackFrame.columnNumber; // => 3288 stackFrame.setColumnNumber(20); stackFrame.getColumnNumber(); // => 20 stackFrame.source; // => 'ORIGINAL_STACK_LINE' stackFrame.setSource('NEW_SOURCE'); stackFrame.getSource(); // => 'NEW_SOURCE' stackFrame.isEval; // => true stackFrame.setIsEval(false); stackFrame.getIsEval(); // => false stackFrame.isNative; // => false stackFrame.setIsNative(true); stackFrame.getIsNative(); // => true stackFrame.toString(); // => 'funName(args)@http://localhost:3000/file.js:325:20' package/stackframe.d.ts000644 0000003710 3560116604 012173 0ustar00000000 000000 // Type definitions for StackFrame v1.0.0 // Project: https://github.com/stacktracejs/stackframe // Definitions by: Eric Wendelin // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped export as namespace StackFrame; // global for non-module UMD users export = StackFrame; declare namespace StackFrame { export interface StackFrameOptions { isConstructor?: boolean; isEval?: boolean; isNative?: boolean; isToplevel?: boolean; columnNumber?: number; lineNumber?: number; fileName?: string; functionName?: string; source?: string; args?: any[]; } } declare class StackFrame { constructor(obj: StackFrame.StackFrameOptions); args?: any[]; getArgs(): any[] | undefined; setArgs(args: any[]): void; evalOrigin?: StackFrame; getEvalOrigin(): StackFrame | undefined; setEvalOrigin(stackframe: StackFrame): void; isConstructor?: boolean; getIsConstructor(): boolean | undefined; setIsConstructor(isConstructor: boolean): void; isEval?: boolean; getIsEval(): boolean | undefined; setIsEval(isEval: boolean): void; isNative?: boolean; getIsNative(): boolean | undefined; setIsNative(isNative: boolean): void; isToplevel?: boolean; getIsToplevel(): boolean | undefined; setIsToplevel(isToplevel: boolean): void; columnNumber?: number; getColumnNumber(): number | undefined; setColumnNumber(columnNumber: number): void; lineNumber?: number; getLineNumber(): number | undefined; setLineNumber(lineNumber: number): void; fileName?: string; getFileName(): string | undefined; setFileName(fileName: string): void; functionName?: string; getFunctionName(): string | undefined; setFunctionName(functionName: string): void; source?: string; getSource(): string | undefined; setSource(source: string): void; toString(): string; } package/stackframe.js000644 0000011435 3560116604 011742 0ustar00000000 000000 (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 props = booleanProps.concat(numericProps, stringProps, arrayProps); 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; })); package/dist/stackframe.js000644 0000011435 3560116604 012705 0ustar00000000 000000 (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 props = booleanProps.concat(numericProps, stringProps, arrayProps); 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; })); package/dist/stackframe.min.js000644 0000004114 3560116604 013463 0ustar00000000 000000 !function(t,e){"use strict";"function"==typeof define&&define.amd?define("stackframe",[],e):"object"==typeof exports?module.exports=e():t.StackFrame=e()}(this,function(){"use strict";function t(t){return t.charAt(0).toUpperCase()+t.substring(1)}function e(t){return function(){return this[t]}}var r=["isConstructor","isEval","isNative","isToplevel"],n=["columnNumber","lineNumber"],i=["fileName","functionName","source"],o=r.concat(n,i,["args"]);function s(e){if(e)for(var r=0;r