(stack)
| 135 | } |
| 136 | |
| 137 | parse (stack) { |
| 138 | if (!stack || stack.length === 0) return false |
| 139 | |
| 140 | for (var i = 0, len = stack.length; i < len; i++) { |
| 141 | var callsite = stack[i] |
| 142 | |
| 143 | // avoid null values |
| 144 | if (typeof callsite !== 'object') continue |
| 145 | if (!callsite.file_name || !callsite.line_number) continue |
| 146 | |
| 147 | var type = this.isAbsolute(callsite.file_name) || callsite.file_name[0] === '.' ? 'user' : 'core' |
| 148 | |
| 149 | // only use the callsite if its inside user space |
| 150 | if (!callsite || type === 'core' || callsite.file_name.indexOf('node_modules') > -1 || |
| 151 | callsite.file_name.indexOf('vxx') > -1) { |
| 152 | continue |
| 153 | } |
| 154 | |
| 155 | // get the whole context (all lines) and cache them if necessary |
| 156 | var context = this._cache.get(callsite.file_name) |
| 157 | var source = [] |
| 158 | if (context && context.length > 0) { |
| 159 | // get line before the call |
| 160 | var preLine = callsite.line_number - this._context_size - 1 |
| 161 | var pre = context.slice(preLine > 0 ? preLine : 0, callsite.line_number - 1) |
| 162 | if (pre && pre.length > 0) { |
| 163 | pre.forEach(function (line) { |
| 164 | source.push(line.replace(/\t/g, ' ')) |
| 165 | }) |
| 166 | } |
| 167 | // get the line where the call has been made |
| 168 | if (context[callsite.line_number - 1]) { |
| 169 | source.push(context[callsite.line_number - 1].replace(/\t/g, ' ').replace(' ', '>>')) |
| 170 | } |
| 171 | // and get the line after the call |
| 172 | var postLine = callsite.line_number + this._context_size |
| 173 | var post = context.slice(callsite.line_number, postLine) |
| 174 | if (post && post.length > 0) { |
| 175 | post.forEach(function (line) { |
| 176 | source.push(line.replace(/\t/g, ' ')) |
| 177 | }) |
| 178 | } |
| 179 | } |
| 180 | return { |
| 181 | context: source.length > 0 ? source.join('\n') : 'cannot retrieve source context', |
| 182 | callsite: [ callsite.file_name, callsite.line_number ].join(':') |
| 183 | } |
| 184 | } |
| 185 | return false |
| 186 | } |
| 187 | |
| 188 | attachContext (error) { |
| 189 | if (!error) return error |
no test coverage detected