1 | ;
|
2 |
|
3 | module.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 | */
|
54 | function 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 | */
|
71 | function 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 | */
|
82 | function prependSpaces(s, len) {
|
83 | while (s.length < len) {
|
84 | s = ' ' + s;
|
85 | }
|
86 | return s;
|
87 | }
|
88 |
|