1 | exports.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 |
|
16 | exports.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 |
|
53 | exports._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 | };
|