UNPKG

1.76 kBJavaScriptView Raw
1exports.get = function(belowFn) {
2 var dummyObject = {};
3 Error.captureStackTrace(dummyObject, belowFn || exports.get);
4
5 var v8Handler = Error.prepareStackTrace;
6 Error.prepareStackTrace = function(dummyObject, v8StackTrace) {
7 return v8StackTrace;
8 };
9
10 var v8StackTrace = dummyObject.stack;
11 Error.prepareStackTrace = v8Handler;
12
13 return v8StackTrace;
14};
15
16exports.parse = function(err) {
17 var self = this;
18 var lines = err.stack.split('\n').slice(1);
19
20 return lines.map(function(line) {
21 var lineMatch = line.match(/at ([^\s]+)\s+\((.+?):(\d+):(\d+)\)/);
22 var methodMatch = lineMatch[1].match(/([^\.]+)(?:\.(.+))?/);
23 var object = methodMatch[1];
24 var method = methodMatch[2];
25
26 var functionName = lineMatch[1];
27 var methodName = null;
28 var typeName = 'Object';
29
30 if (method) {
31 typeName = object;
32 methodName = method;
33 }
34
35 if (method === '<anonymous>') {
36 methodName = null;
37 functionName = '';
38 }
39
40 var properties = {
41 fileName: lineMatch[2],
42 lineNumber: parseInt(lineMatch[3], 10),
43 functionName: functionName,
44 typeName: typeName,
45 methodName: methodName,
46 columnNumber: parseInt(lineMatch[4], 10),
47 };
48
49 return self._createParsedCallSite(properties);
50 });
51};
52
53exports._createParsedCallSite = function(properties) {
54 var methods = {};
55 for (var property in properties) {
56 var method = 'get' + property.substr(0, 1).toUpperCase() + property.substr(1);
57
58 (function(property) {
59 methods[method] = function() {
60 return properties[property];
61 }
62 })(property);
63 }
64
65 var callSite = Object.create(methods);
66 for (var property in properties) {
67 callSite[property] = properties[property];
68 }
69
70 return callSite;
71};