UNPKG

2.12 kBJavaScriptView Raw
1'use strict';
2
3class YAMLError extends Error {
4 constructor(name, pos, code, message) {
5 super();
6 this.name = name;
7 this.code = code;
8 this.message = message;
9 this.pos = pos;
10 }
11}
12class YAMLParseError extends YAMLError {
13 constructor(pos, code, message) {
14 super('YAMLParseError', pos, code, message);
15 }
16}
17class YAMLWarning extends YAMLError {
18 constructor(pos, code, message) {
19 super('YAMLWarning', pos, code, message);
20 }
21}
22const prettifyError = (src, lc) => (error) => {
23 if (error.pos[0] === -1)
24 return;
25 error.linePos = error.pos.map(pos => lc.linePos(pos));
26 const { line, col } = error.linePos[0];
27 error.message += ` at line ${line}, column ${col}`;
28 let ci = col - 1;
29 let lineStr = src
30 .substring(lc.lineStarts[line - 1], lc.lineStarts[line])
31 .replace(/[\n\r]+$/, '');
32 // Trim to max 80 chars, keeping col position near the middle
33 if (ci >= 60 && lineStr.length > 80) {
34 const trimStart = Math.min(ci - 39, lineStr.length - 79);
35 lineStr = '…' + lineStr.substring(trimStart);
36 ci -= trimStart - 1;
37 }
38 if (lineStr.length > 80)
39 lineStr = lineStr.substring(0, 79) + '…';
40 // Include previous line in context if pointing at line start
41 if (line > 1 && /^ *$/.test(lineStr.substring(0, ci))) {
42 // Regexp won't match if start is trimmed
43 let prev = src.substring(lc.lineStarts[line - 2], lc.lineStarts[line - 1]);
44 if (prev.length > 80)
45 prev = prev.substring(0, 79) + '…\n';
46 lineStr = prev + lineStr;
47 }
48 if (/[^ ]/.test(lineStr)) {
49 let count = 1;
50 const end = error.linePos[1];
51 if (end && end.line === line && end.col > col) {
52 count = Math.max(1, Math.min(end.col - col, 80 - ci));
53 }
54 const pointer = ' '.repeat(ci) + '^'.repeat(count);
55 error.message += `:\n\n${lineStr}\n${pointer}\n`;
56 }
57};
58
59exports.YAMLError = YAMLError;
60exports.YAMLParseError = YAMLParseError;
61exports.YAMLWarning = YAMLWarning;
62exports.prettifyError = prettifyError;