You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.4 KiB
51 lines
1.4 KiB
'use strict'; |
|
|
|
module.exports = makeError; |
|
function makeError(code, message, options) { |
|
var line = options.line; |
|
var column = options.column; |
|
var filename = options.filename; |
|
var src = options.src; |
|
var fullMessage; |
|
var location = line + (column ? ':' + column : ''); |
|
if (src && line >= 1 && line <= src.split('\n').length) { |
|
var lines = src.split('\n'); |
|
var start = Math.max(line - 3, 0); |
|
var end = Math.min(lines.length, line + 3); |
|
// Error context |
|
var context = lines |
|
.slice(start, end) |
|
.map(function(text, i) { |
|
var curr = i + start + 1; |
|
var preamble = (curr == line ? ' > ' : ' ') + curr + '| '; |
|
var out = preamble + text; |
|
if (curr === line && column > 0) { |
|
out += '\n'; |
|
out += Array(preamble.length + column).join('-') + '^'; |
|
} |
|
return out; |
|
}) |
|
.join('\n'); |
|
fullMessage = |
|
(filename || 'Pug') + ':' + location + '\n' + context + '\n\n' + message; |
|
} else { |
|
fullMessage = (filename || 'Pug') + ':' + location + '\n\n' + message; |
|
} |
|
var err = new Error(fullMessage); |
|
err.code = 'PUG:' + code; |
|
err.msg = message; |
|
err.line = line; |
|
err.column = column; |
|
err.filename = filename; |
|
err.src = src; |
|
err.toJSON = function() { |
|
return { |
|
code: this.code, |
|
msg: this.msg, |
|
line: this.line, |
|
column: this.column, |
|
filename: this.filename, |
|
}; |
|
}; |
|
return err; |
|
}
|
|
|