blob: c913753249edadeac436ed3e593aeb5c8a46af39 [file] [log] [blame]
'use strict'
var stringify = require('unist-util-stringify-position')
module.exports = VMessage
// Inherit from `Error#`.
function VMessagePrototype() {}
VMessagePrototype.prototype = Error.prototype
VMessage.prototype = new VMessagePrototype()
// Message properties.
var proto = VMessage.prototype
proto.file = ''
proto.name = ''
proto.reason = ''
proto.message = ''
proto.stack = ''
proto.fatal = null
proto.column = null
proto.line = null
// Construct a new VMessage.
//
// Note: We cannot invoke `Error` on the created context, as that adds readonly
// `line` and `column` attributes on Safari 9, thus throwing and failing the
// data.
function VMessage(reason, position, origin) {
var parts
var range
var location
if (typeof position === 'string') {
origin = position
position = null
}
parts = parseOrigin(origin)
range = stringify(position) || '1:1'
location = {
start: {line: null, column: null},
end: {line: null, column: null}
}
// Node.
if (position && position.position) {
position = position.position
}
if (position) {
// Position.
if (position.start) {
location = position
position = position.start
} else {
// Point.
location.start = position
}
}
if (reason.stack) {
this.stack = reason.stack
reason = reason.message
}
this.message = reason
this.name = range
this.reason = reason
this.line = position ? position.line : null
this.column = position ? position.column : null
this.location = location
this.source = parts[0]
this.ruleId = parts[1]
}
function parseOrigin(origin) {
var result = [null, null]
var index
if (typeof origin === 'string') {
index = origin.indexOf(':')
if (index === -1) {
result[1] = origin
} else {
result[0] = origin.slice(0, index)
result[1] = origin.slice(index + 1)
}
}
return result
}