Skip to content

Commit b41e009

Browse files
author
Eric Wendelin
committed
Fix ES6Promise not defined. Fixes #103.
1 parent fe0bc71 commit b41e009

File tree

5 files changed

+92
-68
lines changed

5 files changed

+92
-68
lines changed

dist/stacktrace.js

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
} else {
99
root.StackTrace = factory(root.ErrorStackParser, root.StackGenerator, root.StackTraceGPS, root.ES6Promise);
1010
}
11-
}(this, function StackTrace(ErrorStackParser, StackGenerator, StackTraceGPS, RSVP) {
11+
}(this, function StackTrace(ErrorStackParser, StackGenerator, StackTraceGPS, ES6Promise) {
1212
ES6Promise.polyfill();
1313
var Promise = ES6Promise.Promise;
1414

@@ -39,7 +39,10 @@
3939
this.options = {
4040
filter: function (stackframe) {
4141
// Filter out stackframes for this library by default
42-
return (stackframe.fileName || '').indexOf('stacktrace.') === -1;
42+
return (stackframe.functionName || '').indexOf('StackTrace$$') !== 0 &&
43+
(stackframe.functionName || '').indexOf('ErrorStackParser$$') !== 0 &&
44+
(stackframe.functionName || '').indexOf('StackTraceGPS$$') !== 0 &&
45+
(stackframe.functionName || '').indexOf('StackGenerator$$') !== 0;
4346
}
4447
};
4548

@@ -48,15 +51,12 @@
4851
* @param opts Options Object
4952
* @return Array[StackFrame]
5053
*/
51-
this.get = function (opts) {
52-
try {
53-
throw new Error('From StackTrace.get()');
54-
} catch (e) {
55-
if (e.stack || e['opera#sourceloc']) {
56-
return this.fromError(e, _merge(this.options, opts));
57-
} else {
58-
return this.generateArtificially(_merge(this.options, opts));
59-
}
54+
this.get = function StackTrace$$get(opts) {
55+
var err = new Error();
56+
if (err.stack || err['opera#sourceloc']) {
57+
return this.fromError(err, opts);
58+
} else {
59+
return this.generateArtificially(opts);
6060
}
6161
};
6262

@@ -66,26 +66,26 @@
6666
* @param opts Object for options
6767
* @return Array[StackFrame]
6868
*/
69-
this.fromError = function fromError(error, opts) {
69+
this.fromError = function StackTrace$$fromError(error, opts) {
7070
opts = _merge(this.options, opts);
7171
return new Promise(function (resolve) {
7272
var stackframes = ErrorStackParser.parse(error);
7373
if (typeof opts.filter === 'function') {
7474
stackframes = stackframes.filter(opts.filter);
7575
}
76-
7776
resolve(Promise.all(stackframes.map(this.getMappedLocation)));
7877
}.bind(this));
7978
};
8079

81-
this.getMappedLocation = function getMappedLocation(stackframe) {
82-
return new Promise(function(resolve) {
80+
this.getMappedLocation = function StackTrace$$getMappedLocation(stackframe) {
81+
return new Promise(function (resolve) {
82+
// TODO: pass along pre-cache
8383
new StackTraceGPS().getMappedLocation(stackframe)
84-
.then(function (loc) {
84+
.then(function onResolved(loc) {
8585
resolve(new StackFrame(loc.name, stackframe.args, loc.source, loc.line, loc.column));
86-
})['catch'](function() {
87-
resolve(stackframe);
88-
});
86+
})['catch'](function onError() {
87+
resolve(stackframe);
88+
});
8989
});
9090
};
9191

@@ -94,8 +94,13 @@
9494
* @param opts Object options
9595
* @returns Array[StackFrame]
9696
*/
97-
this.generateArtificially = function generateArtificially(opts) {
98-
return StackGenerator.backtrace(opts);
97+
this.generateArtificially = function StackTrace$$generateArtificially(opts) {
98+
opts = _merge(this.options, opts);
99+
var stackFrames = StackGenerator.backtrace(opts);
100+
if (typeof opts.filter === 'function') {
101+
stackFrames = stackFrames.filter(opts.filter);
102+
}
103+
return Promise.resolve(stackFrames);
99104
};
100105
};
101106
}));

dist/stacktrace.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/stacktrace.min.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

spec/stacktrace-spec.js

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ describe('StackTrace', function () {
2626

2727
describe('#get', function () {
2828
it('gets stacktrace from current location', function () {
29-
runs(function () {
30-
new StackTrace().get().then(callback, errback);
29+
runs(function testStackTraceGet() {
30+
new StackTrace().get().then(callback, errback)['catch'](debugErrback);
3131
});
3232
waits(100);
3333
runs(function () {
3434
expect(callback).toHaveBeenCalled();
35-
expect(callback.mostRecentCall.args[0][0].fileName).toMatch(/stacktrace\-spec\.js\b/);
35+
expect(callback.mostRecentCall.args[0][0].functionName).toEqual('testStackTraceGet');
3636
expect(errback).not.toHaveBeenCalled();
3737
});
3838
});
@@ -41,7 +41,8 @@ describe('StackTrace', function () {
4141
describe('#fromError', function () {
4242
it('rejects with Error given non-Error object', function () {
4343
runs(function () {
44-
new StackTrace().fromError('BOGUS').then(callback, errback);
44+
new StackTrace().fromError('BOGUS')
45+
.then(callback, errback)['catch'](errback);
4546
});
4647
waits(100);
4748
runs(function () {
@@ -51,11 +52,13 @@ describe('StackTrace', function () {
5152
});
5253

5354
it('parses stacktrace from given Error object', function () {
55+
//FIXME: shims for IE9
5456
runs(function () {
5557
try {
5658
throw new Error('Yikes!');
5759
} catch (e) {
58-
new StackTrace().fromError(e).then(callback, errback);
60+
new StackTrace().fromError(e)
61+
.then(callback, errback)['catch'](errback);
5962
}
6063
});
6164
waits(100);
@@ -66,7 +69,9 @@ describe('StackTrace', function () {
6669
});
6770

6871
it('totally extracts function names', function () {
69-
var TEST_FUNCTION = function () {
72+
//FIXME: shims for IE9
73+
//FIXME: need function name for opera 12
74+
var TEST_FUNCTION = function TEST_FUNCTION() {
7075
try {
7176
throw new Error('Yikes!');
7277
} catch (e) {
@@ -75,7 +80,7 @@ describe('StackTrace', function () {
7580
}
7681

7782
new StackTrace().fromError(e, {filter: onlySpecSourcesPlease})
78-
.then(callback, errback);
83+
.then(callback, errback)['catch'](errback);
7984
}
8085
};
8186
runs(TEST_FUNCTION);
@@ -95,7 +100,7 @@ describe('StackTrace', function () {
95100
});
96101
});
97102

98-
describe('#getMappedLocation', function() {
103+
describe('#getMappedLocation', function () {
99104
var server;
100105
beforeEach(function () {
101106
server = sinon.fakeServer.create();
@@ -104,34 +109,34 @@ describe('StackTrace', function () {
104109
server.restore();
105110
});
106111

107-
it('defaults to given stackframe if source map location not found', function() {
108-
runs(function() {
112+
it('defaults to given stackframe if source map location not found', function () {
113+
runs(function () {
109114
var stackframe = new StackFrame(undefined, [], 'http://localhost:9999/test.min.js', 1, 32);
110-
new StackTrace().getMappedLocation(stackframe).then(callback, errback);
115+
new StackTrace().getMappedLocation(stackframe).then(callback, errback)['catch'](debugErrback);
111116
server.requests[0].respond(404, {}, '');
112117
});
113118
waits(100);
114-
runs(function() {
119+
runs(function () {
115120
expect(callback).toHaveBeenCalled();
116121
expect(callback.mostRecentCall.args[0]).toMatchStackFrame([undefined, [], 'http://localhost:9999/test.min.js', 1, 32]);
117122
expect(errback).not.toHaveBeenCalled();
118123
});
119124
});
120125

121126
it('uses source maps to enhance stack frames', function () {
122-
runs(function() {
127+
runs(function () {
123128
var stackframe = new StackFrame(undefined, [], 'http://localhost:9999/test.min.js', 1, 32);
124-
new StackTrace().getMappedLocation(stackframe).then(callback, errback);
129+
new StackTrace().getMappedLocation(stackframe).then(callback, errback)['catch'](debugErrback);
125130
var source = 'var foo=function(){};function bar(){}var baz=eval("XXX");\n//@ sourceMappingURL=test.js.map';
126-
server.requests[0].respond(200, { 'Content-Type': 'application/x-javascript' }, source);
131+
server.requests[0].respond(200, {'Content-Type': 'application/x-javascript'}, source);
127132
});
128133
waits(100);
129-
runs(function() {
134+
runs(function () {
130135
var sourceMap = '{"version":3,"sources":["./test.js"],"names":["foo","bar","baz","eval"],"mappings":"AAAA,GAAIA,KAAM,YACV,SAASC,QACT,GAAIC,KAAMC,KAAK","file":"test.min.js"}';
131-
server.requests[1].respond(200, { 'Content-Type': 'application/json' }, sourceMap);
136+
server.requests[1].respond(200, {'Content-Type': 'application/json'}, sourceMap);
132137
});
133138
waits(100);
134-
runs(function() {
139+
runs(function () {
135140
expect(callback).toHaveBeenCalled();
136141
expect(callback.mostRecentCall.args[0]).toMatchStackFrame(['bar', [], './test.js', 2, 9]);
137142
expect(errback).not.toHaveBeenCalled();
@@ -140,12 +145,21 @@ describe('StackTrace', function () {
140145
});
141146

142147
describe('#generateArtificially', function () {
143-
var unit = new StackTrace();
144-
it('gets stacktrace from current location', function testGenerateArtificially() {
145-
var stackFrames = unit.generateArtificially().filter(function (stackFrame) {
146-
return stackFrame.getFunctionName() && stackFrame.getFunctionName().indexOf('testGenerateArtificially') > -1;
148+
it('gets stacktrace from current location', function () {
149+
runs(function testGenerateArtificially() {
150+
var stackFrameFilter = function (stackFrame) {
151+
return stackFrame.getFunctionName() &&
152+
stackFrame.getFunctionName().indexOf('testGenerateArtificially') > -1;
153+
};
154+
new StackTrace().generateArtificially({filter: stackFrameFilter})
155+
.then(callback, errback)['catch'](debugErrback);
156+
});
157+
waits(100);
158+
runs(function () {
159+
expect(callback).toHaveBeenCalled();
160+
expect(callback.mostRecentCall.args[0][0]).toMatchStackFrame(['testGenerateArtificially', []]);
161+
expect(errback).not.toHaveBeenCalled();
147162
});
148-
expect(stackFrames.length).toEqual(1);
149163
});
150164
});
151165
});

stacktrace.js

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
} else {
99
root.StackTrace = factory(root.ErrorStackParser, root.StackGenerator, root.StackTraceGPS, root.ES6Promise);
1010
}
11-
}(this, function StackTrace(ErrorStackParser, StackGenerator, StackTraceGPS, RSVP) {
11+
}(this, function StackTrace(ErrorStackParser, StackGenerator, StackTraceGPS, ES6Promise) {
1212
ES6Promise.polyfill();
1313
var Promise = ES6Promise.Promise;
1414

@@ -39,7 +39,10 @@
3939
this.options = {
4040
filter: function (stackframe) {
4141
// Filter out stackframes for this library by default
42-
return (stackframe.fileName || '').indexOf('stacktrace.') === -1;
42+
return (stackframe.functionName || '').indexOf('StackTrace$$') !== 0 &&
43+
(stackframe.functionName || '').indexOf('ErrorStackParser$$') !== 0 &&
44+
(stackframe.functionName || '').indexOf('StackTraceGPS$$') !== 0 &&
45+
(stackframe.functionName || '').indexOf('StackGenerator$$') !== 0;
4346
}
4447
};
4548

@@ -48,15 +51,12 @@
4851
* @param opts Options Object
4952
* @return Array[StackFrame]
5053
*/
51-
this.get = function (opts) {
52-
try {
53-
throw new Error('From StackTrace.get()');
54-
} catch (e) {
55-
if (e.stack || e['opera#sourceloc']) {
56-
return this.fromError(e, _merge(this.options, opts));
57-
} else {
58-
return this.generateArtificially(_merge(this.options, opts));
59-
}
54+
this.get = function StackTrace$$get(opts) {
55+
var err = new Error();
56+
if (err.stack || err['opera#sourceloc']) {
57+
return this.fromError(err, opts);
58+
} else {
59+
return this.generateArtificially(opts);
6060
}
6161
};
6262

@@ -66,26 +66,26 @@
6666
* @param opts Object for options
6767
* @return Array[StackFrame]
6868
*/
69-
this.fromError = function fromError(error, opts) {
69+
this.fromError = function StackTrace$$fromError(error, opts) {
7070
opts = _merge(this.options, opts);
7171
return new Promise(function (resolve) {
7272
var stackframes = ErrorStackParser.parse(error);
7373
if (typeof opts.filter === 'function') {
7474
stackframes = stackframes.filter(opts.filter);
7575
}
76-
7776
resolve(Promise.all(stackframes.map(this.getMappedLocation)));
7877
}.bind(this));
7978
};
8079

81-
this.getMappedLocation = function getMappedLocation(stackframe) {
82-
return new Promise(function(resolve) {
80+
this.getMappedLocation = function StackTrace$$getMappedLocation(stackframe) {
81+
return new Promise(function (resolve) {
82+
// TODO: pass along pre-cache
8383
new StackTraceGPS().getMappedLocation(stackframe)
84-
.then(function (loc) {
84+
.then(function onResolved(loc) {
8585
resolve(new StackFrame(loc.name, stackframe.args, loc.source, loc.line, loc.column));
86-
})['catch'](function() {
87-
resolve(stackframe);
88-
});
86+
})['catch'](function onError() {
87+
resolve(stackframe);
88+
});
8989
});
9090
};
9191

@@ -94,8 +94,13 @@
9494
* @param opts Object options
9595
* @returns Array[StackFrame]
9696
*/
97-
this.generateArtificially = function generateArtificially(opts) {
98-
return StackGenerator.backtrace(opts);
97+
this.generateArtificially = function StackTrace$$generateArtificially(opts) {
98+
opts = _merge(this.options, opts);
99+
var stackFrames = StackGenerator.backtrace(opts);
100+
if (typeof opts.filter === 'function') {
101+
stackFrames = stackFrames.filter(opts.filter);
102+
}
103+
return Promise.resolve(stackFrames);
99104
};
100105
};
101106
}));

0 commit comments

Comments
 (0)