astx
Version:
super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring
148 lines (135 loc) • 13.7 kB
JavaScript
import CompilePathError from './CompilePathError.mjs'
import generate from '@babel/generator'
import { codeFrameColumns } from '@babel/code-frame'
import chalk from 'chalk'
import dedent from 'dedent-js'
function formatSource(path) {
var _path3, _generate
while ((_path = path) !== null && _path !== void 0 && _path.parentPath) {
var _path, _path2
path =
(_path2 = path) === null || _path2 === void 0 ? void 0 : _path2.parentPath
}
const node =
(_path3 = path) === null || _path3 === void 0 ? void 0 : _path3.node
if (!node) return undefined
return (_generate = generate(node, {
retainLines: true,
})) === null || _generate === void 0
? void 0
: _generate.code
}
export default class CodeFrameError extends Error {
filename
source
path
loc
constructor(message, { filename, source, path, loc }) {
var _path$node
super(message)
this.filename = filename
this.path = path
this.source =
source !== null && source !== void 0 ? source : formatSource(path)
if (
loc == null &&
path !== null &&
path !== void 0 &&
(_path$node = path.node) !== null &&
_path$node !== void 0 &&
_path$node.loc
) {
const { start, end } = (
path === null || path === void 0 ? void 0 : path.node
).loc
loc = {
start: {
line: start.line,
column: start.column,
},
end: {
line: end.line,
column: end.column,
},
}
}
this.loc = loc
}
static rethrow(error, { filename, source }) {
if (error instanceof CodeFrameError) {
if (filename) error.filename = filename
if (source) error.source = source
throw error
}
if (error instanceof CompilePathError) {
throw new CodeFrameError(error.message, {
filename,
source,
path: error.path,
})
}
if (error instanceof SyntaxError) {
const { lineNumber, columnNumber, loc } = error
throw new CodeFrameError(error.message.replace(/\s*\(\d+:\d+\)$/, ''), {
filename,
source,
loc:
typeof (loc === null || loc === void 0 ? void 0 : loc.line) ===
'number' &&
typeof (loc === null || loc === void 0 ? void 0 : loc.column) ===
'number'
? {
start: loc,
}
: typeof lineNumber === 'number' && typeof columnNumber === 'number'
? {
start: {
line: lineNumber,
column: columnNumber,
},
}
: undefined,
})
}
throw error
}
format(options) {
const red =
options.highlightCode || options.forceColor ? chalk.red : (s) => s
const { loc, source, stack, message, filename } = this
if (!loc || !source) return red(options.stack && stack ? stack : message)
const start = {
line: loc.start.line,
column: loc.start.column + 1,
}
const end = loc.end
? {
line: loc.end.line,
column: loc.end.column + 1,
}
: undefined
return dedent`
${red(`Error in ${filename} (${start.line}:${start.column})`)}
${codeFrameColumns(
source,
{
start,
end,
},
{
message,
...options,
}
)}${
options.stack && stack
? '\n' +
red(
stack === null || stack === void 0
? void 0
: stack.replace(/^.*?(\r\n?|\n)/, '')
)
: ''
}
`
}
} //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDb21waWxlUGF0aEVycm9yIiwiZ2VuZXJhdGUiLCJjb2RlRnJhbWVDb2x1bW5zIiwiY2hhbGsiLCJkZWRlbnQiLCJmb3JtYXRTb3VyY2UiLCJwYXRoIiwicGFyZW50UGF0aCIsIm5vZGUiLCJ1bmRlZmluZWQiLCJyZXRhaW5MaW5lcyIsImNvZGUiLCJDb2RlRnJhbWVFcnJvciIsIkVycm9yIiwiZmlsZW5hbWUiLCJzb3VyY2UiLCJsb2MiLCJjb25zdHJ1Y3RvciIsIm1lc3NhZ2UiLCJzdGFydCIsImVuZCIsImxpbmUiLCJjb2x1bW4iLCJyZXRocm93IiwiZXJyb3IiLCJTeW50YXhFcnJvciIsImxpbmVOdW1iZXIiLCJjb2x1bW5OdW1iZXIiLCJyZXBsYWNlIiwiZm9ybWF0Iiwib3B0aW9ucyIsInJlZCIsImhpZ2hsaWdodENvZGUiLCJmb3JjZUNvbG9yIiwicyIsInN0YWNrIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWwvQ29kZUZyYW1lRXJyb3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvbXBpbGVQYXRoRXJyb3IgZnJvbSAnLi9Db21waWxlUGF0aEVycm9yJ1xuaW1wb3J0IGdlbmVyYXRlIGZyb20gJ0BiYWJlbC9nZW5lcmF0b3InXG5pbXBvcnQgeyBOb2RlUGF0aCB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgY29kZUZyYW1lQ29sdW1ucyB9IGZyb20gJ0BiYWJlbC9jb2RlLWZyYW1lJ1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuaW1wb3J0IGRlZGVudCBmcm9tICdkZWRlbnQtanMnXG5cbmludGVyZmFjZSBCYWJlbENvZGVGcmFtZU9wdGlvbnMge1xuICAvKiogU3ludGF4IGhpZ2hsaWdodCB0aGUgY29kZSBhcyBKYXZhU2NyaXB0IGZvciB0ZXJtaW5hbHMuIGRlZmF1bHQ6IGZhbHNlICovXG4gIGhpZ2hsaWdodENvZGU/OiBib29sZWFuIHwgdW5kZWZpbmVkXG4gIC8qKiAgVGhlIG51bWJlciBvZiBsaW5lcyB0byBzaG93IGFib3ZlIHRoZSBlcnJvci4gZGVmYXVsdDogMiAqL1xuICBsaW5lc0Fib3ZlPzogbnVtYmVyIHwgdW5kZWZpbmVkXG4gIC8qKiAgVGhlIG51bWJlciBvZiBsaW5lcyB0byBzaG93IGJlbG93IHRoZSBlcnJvci4gZGVmYXVsdDogMyAqL1xuICBsaW5lc0JlbG93PzogbnVtYmVyIHwgdW5kZWZpbmVkXG4gIC8qKlxuICAgKiBGb3JjaWJseSBzeW50YXggaGlnaGxpZ2h0IHRoZSBjb2RlIGFzIEphdmFTY3JpcHQgKGZvciBub24tdGVybWluYWxzKTtcbiAgICogb3ZlcnJpZGVzIGhpZ2hsaWdodENvZGUuXG4gICAqIGRlZmF1bHQ6IGZhbHNlXG4gICAqL1xuICBmb3JjZUNvbG9yPzogYm9vbGVhbiB8IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZUxvY2F0aW9uIHtcbiAgc3RhcnQ6IHtcbiAgICBsaW5lOiBudW1iZXJcbiAgICBjb2x1bW46IG51bWJlclxuICB9XG4gIGVuZD86IHtcbiAgICBsaW5lOiBudW1iZXJcbiAgICBjb2x1bW46IG51bWJlclxuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFNvdXJjZShwYXRoOiBOb2RlUGF0aCB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB3aGlsZSAocGF0aD8ucGFyZW50UGF0aCkgcGF0aCA9IHBhdGg/LnBhcmVudFBhdGhcbiAgY29uc3Qgbm9kZSA9IHBhdGg/Lm5vZGVcbiAgaWYgKCFub2RlKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiBnZW5lcmF0ZShub2RlIGFzIGFueSwgeyByZXRhaW5MaW5lczogdHJ1ZSB9KT8uY29kZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb2RlRnJhbWVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgZmlsZW5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBzb3VyY2U6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBwYXRoOiBOb2RlUGF0aCB8IHVuZGVmaW5lZFxuICBsb2M6IFNvdXJjZUxvY2F0aW9uIHwgdW5kZWZpbmVkXG5cbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHtcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgc291cmNlLFxuICAgICAgcGF0aCxcbiAgICAgIGxvYyxcbiAgICB9OiB7XG4gICAgICBmaWxlbmFtZT86IHN0cmluZ1xuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgICBwYXRoPzogTm9kZVBhdGhcbiAgICAgIGxvYz86IFNvdXJjZUxvY2F0aW9uXG4gICAgfVxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKVxuICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZVxuICAgIHRoaXMucGF0aCA9IHBhdGhcbiAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZSA/PyBmb3JtYXRTb3VyY2UocGF0aClcbiAgICBpZiAobG9jID09IG51bGwgJiYgKHBhdGg/Lm5vZGUgYXMgYW55KT8ubG9jKSB7XG4gICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IChwYXRoPy5ub2RlIGFzIGFueSkubG9jXG4gICAgICBsb2MgPSB7XG4gICAgICAgIHN0YXJ0OiB7IGxpbmU6IHN0YXJ0LmxpbmUsIGNvbHVtbjogc3RhcnQuY29sdW1uIH0sXG4gICAgICAgIGVuZDogeyBsaW5lOiBlbmQubGluZSwgY29sdW1uOiBlbmQuY29sdW1uIH0sXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubG9jID0gbG9jXG4gIH1cblxuICBzdGF0aWMgcmV0aHJvdyhcbiAgICBlcnJvcjogRXJyb3IsXG4gICAgeyBmaWxlbmFtZSwgc291cmNlIH06IHsgZmlsZW5hbWU/OiBzdHJpbmc7IHNvdXJjZT86IHN0cmluZyB9XG4gICk6IHZvaWQge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIENvZGVGcmFtZUVycm9yKSB7XG4gICAgICBpZiAoZmlsZW5hbWUpIGVycm9yLmZpbGVuYW1lID0gZmlsZW5hbWVcbiAgICAgIGlmIChzb3VyY2UpIGVycm9yLnNvdXJjZSA9IHNvdXJjZVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ29tcGlsZVBhdGhFcnJvcikge1xuICAgICAgdGhyb3cgbmV3IENvZGVGcmFtZUVycm9yKGVycm9yLm1lc3NhZ2UsIHtcbiAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgcGF0aDogZXJyb3IucGF0aCxcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICBjb25zdCB7IGxpbmVOdW1iZXIsIGNvbHVtbk51bWJlciwgbG9jIH0gPSBlcnJvciBhcyBhbnlcbiAgICAgIHRocm93IG5ldyBDb2RlRnJhbWVFcnJvcihlcnJvci5tZXNzYWdlLnJlcGxhY2UoL1xccypcXChcXGQrOlxcZCtcXCkkLywgJycpLCB7XG4gICAgICAgIGZpbGVuYW1lLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGxvYzpcbiAgICAgICAgICB0eXBlb2YgbG9jPy5saW5lID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgbG9jPy5jb2x1bW4gPT09ICdudW1iZXInXG4gICAgICAgICAgICA/IHsgc3RhcnQ6IGxvYyB9XG4gICAgICAgICAgICA6IHR5cGVvZiBsaW5lTnVtYmVyID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgY29sdW1uTnVtYmVyID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgPyB7IHN0YXJ0OiB7IGxpbmU6IGxpbmVOdW1iZXIsIGNvbHVtbjogY29sdW1uTnVtYmVyIH0gfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICB9KVxuICAgIH1cbiAgICB0aHJvdyBlcnJvclxuICB9XG5cbiAgZm9ybWF0KG9wdGlvbnM6IEJhYmVsQ29kZUZyYW1lT3B0aW9ucyAmIHsgc3RhY2s/OiBib29sZWFuIH0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHJlZCA9XG4gICAgICBvcHRpb25zLmhpZ2hsaWdodENvZGUgfHwgb3B0aW9ucy5mb3JjZUNvbG9yID8gY2hhbGsucmVkIDogKHM6IHN0cmluZykgPT4gc1xuICAgIGNvbnN0IHsgbG9jLCBzb3VyY2UsIHN0YWNrLCBtZXNzYWdlLCBmaWxlbmFtZSB9ID0gdGhpc1xuICAgIGlmICghbG9jIHx8ICFzb3VyY2UpIHJldHVybiByZWQob3B0aW9ucy5zdGFjayAmJiBzdGFjayA/IHN0YWNrIDogbWVzc2FnZSlcbiAgICBjb25zdCBzdGFydCA9IHtcbiAgICAgIGxpbmU6IGxvYy5zdGFydC5saW5lLFxuICAgICAgY29sdW1uOiBsb2Muc3RhcnQuY29sdW1uICsgMSxcbiAgICB9XG4gICAgY29uc3QgZW5kID0gbG9jLmVuZFxuICAgICAgPyB7XG4gICAgICAgICAgbGluZTogbG9jLmVuZC5saW5lLFxuICAgICAgICAgIGNvbHVtbjogbG9jLmVuZC5jb2x1bW4gKyAxLFxuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZFxuICAgIHJldHVybiBkZWRlbnRgXG4gICAgICAke3JlZChgRXJyb3IgaW4gJHtmaWxlbmFtZX0gKCR7c3RhcnQubGluZX06JHtzdGFydC5jb2x1bW59KWApfVxuICAgICAgJHtjb2RlRnJhbWVDb2x1bW5zKHNvdXJjZSwgeyBzdGFydCwgZW5kIH0sIHsgbWVzc2FnZSwgLi4ub3B0aW9ucyB9KX0ke1xuICAgICAgb3B0aW9ucy5zdGFjayAmJiBzdGFja1xuICAgICAgICA/ICdcXG4nICsgcmVkKHN0YWNrPy5yZXBsYWNlKC9eLio/KFxcclxcbj98XFxuKS8sICcnKSlcbiAgICAgICAgOiAnJ1xuICAgIH1cbiAgICBgXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsZ0JBQVAsTUFBNkIsb0JBQTdCO0FBQ0EsT0FBT0MsUUFBUCxNQUFxQixrQkFBckI7O0FBRUEsU0FBU0MsZ0JBQVQsUUFBaUMsbUJBQWpDO0FBQ0EsT0FBT0MsS0FBUCxNQUFrQixPQUFsQjtBQUNBLE9BQU9DLE1BQVAsTUFBbUIsV0FBbkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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