--- /dev/null
+'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
+}