UNPKG

astx

Version:

super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring

148 lines (135 loc) 13.7 kB
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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