UNPKG

2.23 kBJavaScriptView Raw
1'use strict';
2
3module.exports = {
4
5 /**
6 * Create error message with explanation
7 *
8 * @example
9 * ```
10 * Error: Unexpected token: name (foo) (line: 7437, col: 12, pos: 312592)
11 * 7435 | };
12 * 7436 | } else {
13 * 7437 | let foo = 'bar';
14 * --------------------^
15 * 7438 | result = {
16 * 7439 | result: 0
17 * ```
18 *
19 * @param lines
20 * @param error
21 */
22 explain: function(lines, error) {
23 var lineNumber = error.line - 1;
24 var result = [
25 renderLine(lineNumber, lines[lineNumber]),
26 renderPointer(error.col)
27 ];
28 var i = lineNumber - 1;
29 var linesAround = 2;
30 while (i >= 0 && i >= (lineNumber - linesAround)) {
31 result.unshift(renderLine(i, lines[i]));
32 i--;
33 }
34 i = lineNumber + 1;
35 while (i < lines.length && i <= (lineNumber + linesAround)) {
36 result.push(renderLine(i, lines[i]));
37 i++;
38 }
39 result.unshift(error.message + " (line: " + error.line + ", col: " + error.col + ", pos: " + error.pos + ")");
40 return result.join('\n');
41
42 }
43};
44
45// Thanks to jscs for these functions :)
46
47/**
48 * Renders single line of code in style error formatted output.
49 *
50 * @param {Number} n line number
51 * @param {String} line
52 * @returns {String}
53 */
54function renderLine(n, line) {
55 // Convert tabs to spaces, so errors in code lines with tabs as indention symbol
56 // could be correctly rendered, plus it will provide less verbose output
57 line = line.replace(/\t/g, ' ');
58
59 // "n + 1" to print lines in human way (counted from 1)
60 var lineNumber = prependSpaces((n + 1).toString(), 5) + ' |';
61 return ' ' + lineNumber + line;
62}
63
64/**
65 * Renders pointer:
66 * ---------------^
67 *
68 * @param {Number} column
69 * @returns {String}
70 */
71function renderPointer(column) {
72 return (new Array(column + 9)).join('-') + '^';
73}
74
75/**
76 * Simple util for prepending spaces to the string until it fits specified size.
77 *
78 * @param {String} s
79 * @param {Number} len
80 * @returns {String}
81 */
82function prependSpaces(s, len) {
83 while (s.length < len) {
84 s = ' ' + s;
85 }
86 return s;
87}
88