69 lines
1.5 KiB
Plaintext
69 lines
1.5 KiB
Plaintext
const errorProps = [
|
|
'description',
|
|
'fileName',
|
|
'lineNumber',
|
|
'endLineNumber',
|
|
'message',
|
|
'name',
|
|
'number',
|
|
'stack'
|
|
];
|
|
|
|
function Exception(message, node) {
|
|
let loc = node && node.loc,
|
|
line,
|
|
endLineNumber,
|
|
column,
|
|
endColumn;
|
|
|
|
if (loc) {
|
|
line = loc.start.line;
|
|
endLineNumber = loc.end.line;
|
|
column = loc.start.column;
|
|
endColumn = loc.end.column;
|
|
|
|
message += ' - ' + line + ':' + column;
|
|
}
|
|
|
|
let tmp = Error.prototype.constructor.call(this, message);
|
|
|
|
// Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.
|
|
for (let idx = 0; idx < errorProps.length; idx++) {
|
|
this[errorProps[idx]] = tmp[errorProps[idx]];
|
|
}
|
|
|
|
/* istanbul ignore else */
|
|
if (Error.captureStackTrace) {
|
|
Error.captureStackTrace(this, Exception);
|
|
}
|
|
|
|
try {
|
|
if (loc) {
|
|
this.lineNumber = line;
|
|
this.endLineNumber = endLineNumber;
|
|
|
|
// Work around issue under safari where we can't directly set the column value
|
|
/* istanbul ignore next */
|
|
if (Object.defineProperty) {
|
|
Object.defineProperty(this, 'column', {
|
|
value: column,
|
|
enumerable: true
|
|
});
|
|
Object.defineProperty(this, 'endColumn', {
|
|
value: endColumn,
|
|
enumerable: true
|
|
});
|
|
} else {
|
|
this.column = column;
|
|
this.endColumn = endColumn;
|
|
}
|
|
}
|
|
} catch (nop) {
|
|
/* Ignore if the browser is very particular */
|
|
}
|
|
}
|
|
|
|
Exception.prototype = new Error();
|
|
|
|
export default Exception;
|