var esprima = require('esprima'); module.exports = function (src, file) { if (typeof src !== 'string') src = String(src); try { Function(src); return; } catch (err) { if (err.constructor.name !== 'SyntaxError') throw err; return errorInfo(src, file); } }; function errorInfo (src, file) { try { esprima.parse(src); return; } catch (err) { return new ParseError(err, src, file); } } function ParseError (err, src, file) { SyntaxError.call(this); this.message = err.message.replace(/^Line \d+: /, ''); this.line = err.lineNumber; this.column = err.column; this.annotated = '\n' + (file || '(anonymous file)') + ':' + this.line + '\n' + src.split('\n')[this.line - 1] + '\n' + Array(this.column).join(' ') + '^' + '\n' + 'ParseError: ' + this.message ; } ParseError.prototype = Object.create(SyntaxError.prototype); ParseError.prototype.toString = function () { return this.annotated; }; ParseError.prototype.inspect = function () { return this.annotated; };