astx
Version:
super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring
78 lines (63 loc) • 8.87 kB
JavaScript
import { Backend } from '../backend/Backend.mjs'
import * as defaultRecast from 'recast'
export default class RecastBackend extends Backend {
wrapped
t
parse
parseExpression
parseStatements
generate
location
comments
constructor({ wrapped, recast = defaultRecast, parseOptions }) {
super()
this.wrapped = wrapped
this.t = wrapped.t
parseOptions = { ...parseOptions, parser: wrapped }
this.parse = (code) => recast.parse(code, parseOptions)
this.parseStatements = (code) => {
const ast = recast.parse(code, parseOptions)
const errors = ast.type === 'File' ? ast.program.errors : ast.errors
if (errors !== null && errors !== void 0 && errors.length) {
// Flow parser returns a bogus AST instead of throwing when the grammar is invalid,
// but it at least includes parse errors in this array
throw new Error(errors[0].message)
}
return ast.program.body
}
this.parseExpression = (code) => {
var _statements$ // wrap code in `(...)` to force evaluation as expression
const statements = this.parseStatements(`(${code})`)
let expression
if (
((_statements$ = statements[0]) === null || _statements$ === void 0
? void 0
: _statements$.type) === 'ExpressionStatement'
) {
expression = statements[0].expression
} else {
throw new Error(`invalid expression: ${code}`)
} // Remove added parens
if (expression.extra) {
expression.extra.parenthesized = false
}
return expression
}
this.generate = (node) => recast.print(node)
this.location = wrapped.location
this.comments = function* comments(node, kind) {
var _node$comments
if (!node.comments) return
yield* (_node$comments = node.comments) === null ||
_node$comments === void 0
? void 0
: _node$comments.filter(
(comment) =>
!kind ||
(kind === 'inner'
? !comment.leading && !comment.trailing
: comment[kind] === true)
)
}
}
} //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCYWNrZW5kIiwiZGVmYXVsdFJlY2FzdCIsIlJlY2FzdEJhY2tlbmQiLCJ3cmFwcGVkIiwidCIsInBhcnNlIiwicGFyc2VFeHByZXNzaW9uIiwicGFyc2VTdGF0ZW1lbnRzIiwiZ2VuZXJhdGUiLCJsb2NhdGlvbiIsImNvbW1lbnRzIiwiY29uc3RydWN0b3IiLCJyZWNhc3QiLCJwYXJzZU9wdGlvbnMiLCJwYXJzZXIiLCJjb2RlIiwiYXN0IiwiZXJyb3JzIiwidHlwZSIsInByb2dyYW0iLCJsZW5ndGgiLCJFcnJvciIsIm1lc3NhZ2UiLCJib2R5Iiwic3RhdGVtZW50cyIsImV4cHJlc3Npb24iLCJleHRyYSIsInBhcmVudGhlc2l6ZWQiLCJub2RlIiwicHJpbnQiLCJraW5kIiwiZmlsdGVyIiwiY29tbWVudCIsImxlYWRpbmciLCJ0cmFpbGluZyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWNhc3QvUmVjYXN0QmFja2VuZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaWxlLCBTdGF0ZW1lbnQsIEV4cHJlc3Npb24sIExvY2F0aW9uLCBDb21tZW50IH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBCYWNrZW5kIH0gZnJvbSAnLi4vYmFja2VuZC9CYWNrZW5kJ1xuaW1wb3J0ICogYXMgZGVmYXVsdFJlY2FzdCBmcm9tICdyZWNhc3QnXG5pbXBvcnQgKiBhcyBBc3RUeXBlcyBmcm9tICdhc3QtdHlwZXMnXG5pbXBvcnQgKiBhcyBrIGZyb20gJ2FzdC10eXBlcy9nZW4va2luZHMnXG5cbnR5cGUgTm9kZSA9IGsuTm9kZUtpbmRcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVjYXN0QmFja2VuZCBleHRlbmRzIEJhY2tlbmQ8Tm9kZT4ge1xuICByZWFkb25seSB3cmFwcGVkOiBCYWNrZW5kXG4gIHJlYWRvbmx5IHQ6IHR5cGVvZiBBc3RUeXBlc1xuICByZWFkb25seSBwYXJzZTogKGNvZGU6IHN0cmluZykgPT4gTm9kZVxuICByZWFkb25seSBwYXJzZUV4cHJlc3Npb246IChjb2RlOiBzdHJpbmcpID0+IEV4cHJlc3Npb25cbiAgcmVhZG9ubHkgcGFyc2VTdGF0ZW1lbnRzOiAoY29kZTogc3RyaW5nKSA9PiBTdGF0ZW1lbnRbXVxuICByZWFkb25seSBnZW5lcmF0ZTogKG5vZGU6IE5vZGUpID0+IHsgY29kZTogc3RyaW5nIH1cbiAgcmVhZG9ubHkgbG9jYXRpb246IChub2RlOiBOb2RlKSA9PiBMb2NhdGlvblxuICByZWFkb25seSBjb21tZW50czogKFxuICAgIG5vZGU6IE5vZGUsXG4gICAga2luZD86ICdsZWFkaW5nJyB8ICd0cmFpbGluZycgfCAnaW5uZXInXG4gICkgPT4gSXRlcmFibGU8Q29tbWVudD5cblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgd3JhcHBlZCxcbiAgICByZWNhc3QgPSBkZWZhdWx0UmVjYXN0LFxuICAgIHBhcnNlT3B0aW9ucyxcbiAgfToge1xuICAgIHdyYXBwZWQ6IEJhY2tlbmRcbiAgICByZWNhc3Q/OiB0eXBlb2YgZGVmYXVsdFJlY2FzdFxuICAgIHBhcnNlT3B0aW9ucz86IGRlZmF1bHRSZWNhc3QuT3B0aW9uc1xuICB9KSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWRcbiAgICB0aGlzLnQgPSB3cmFwcGVkLnRcbiAgICBwYXJzZU9wdGlvbnMgPSB7IC4uLnBhcnNlT3B0aW9ucywgcGFyc2VyOiB3cmFwcGVkIH1cbiAgICB0aGlzLnBhcnNlID0gKGNvZGU6IHN0cmluZykgPT4gcmVjYXN0LnBhcnNlKGNvZGUsIHBhcnNlT3B0aW9ucylcbiAgICB0aGlzLnBhcnNlU3RhdGVtZW50cyA9IChjb2RlOiBzdHJpbmcpOiBTdGF0ZW1lbnRbXSA9PiB7XG4gICAgICBjb25zdCBhc3Q6IEZpbGUgPSByZWNhc3QucGFyc2UoY29kZSwgcGFyc2VPcHRpb25zKVxuICAgICAgY29uc3QgZXJyb3JzID1cbiAgICAgICAgYXN0LnR5cGUgPT09ICdGaWxlJyA/IChhc3QucHJvZ3JhbSBhcyBhbnkpLmVycm9ycyA6IChhc3QgYXMgYW55KS5lcnJvcnNcbiAgICAgIGlmIChlcnJvcnM/Lmxlbmd0aCkge1xuICAgICAgICAvLyBGbG93IHBhcnNlciByZXR1cm5zIGEgYm9ndXMgQVNUIGluc3RlYWQgb2YgdGhyb3dpbmcgd2hlbiB0aGUgZ3JhbW1hciBpcyBpbnZhbGlkLFxuICAgICAgICAvLyBidXQgaXQgYXQgbGVhc3QgaW5jbHVkZXMgcGFyc2UgZXJyb3JzIGluIHRoaXMgYXJyYXlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yc1swXS5tZXNzYWdlKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFzdC5wcm9ncmFtLmJvZHlcbiAgICB9XG4gICAgdGhpcy5wYXJzZUV4cHJlc3Npb24gPSAoY29kZTogc3RyaW5nKTogRXhwcmVzc2lvbiA9PiB7XG4gICAgICAvLyB3cmFwIGNvZGUgaW4gYCguLi4pYCB0byBmb3JjZSBldmFsdWF0aW9uIGFzIGV4cHJlc3Npb25cbiAgICAgIGNvbnN0IHN0YXRlbWVudHMgPSB0aGlzLnBhcnNlU3RhdGVtZW50cyhgKCR7Y29kZX0pYClcbiAgICAgIGxldCBleHByZXNzaW9uOiBFeHByZXNzaW9uXG4gICAgICBpZiAoc3RhdGVtZW50c1swXT8udHlwZSA9PT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnKSB7XG4gICAgICAgIGV4cHJlc3Npb24gPSBzdGF0ZW1lbnRzWzBdLmV4cHJlc3Npb25cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBleHByZXNzaW9uOiAke2NvZGV9YClcbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIGFkZGVkIHBhcmVuc1xuICAgICAgaWYgKChleHByZXNzaW9uIGFzIGFueSkuZXh0cmEpIHtcbiAgICAgICAgOyhleHByZXNzaW9uIGFzIGFueSkuZXh0cmEucGFyZW50aGVzaXplZCA9IGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBleHByZXNzaW9uXG4gICAgfVxuICAgIHRoaXMuZ2VuZXJhdGUgPSAobm9kZTogTm9kZSk6IHsgY29kZTogc3RyaW5nIH0gPT4gcmVjYXN0LnByaW50KG5vZGUgYXMgYW55KVxuICAgIHRoaXMubG9jYXRpb24gPSB3cmFwcGVkLmxvY2F0aW9uXG4gICAgdGhpcy5jb21tZW50cyA9IGZ1bmN0aW9uKiBjb21tZW50cyhcbiAgICAgIG5vZGU6IE5vZGUsXG4gICAgICBraW5kPzogJ2xlYWRpbmcnIHwgJ2lubmVyJyB8ICd0cmFpbGluZydcbiAgICApOiBJdGVyYWJsZTxDb21tZW50PiB7XG4gICAgICBpZiAoIW5vZGUuY29tbWVudHMpIHJldHVyblxuICAgICAgeWllbGQqIG5vZGUuY29tbWVudHM/LmZpbHRlcihcbiAgICAgICAgKGNvbW1lbnQpID0+XG4gICAgICAgICAgIWtpbmQgfHxcbiAgICAgICAgICAoa2luZCA9PT0gJ2lubmVyJ1xuICAgICAgICAgICAgPyAhY29tbWVudC5sZWFkaW5nICYmICFjb21tZW50LnRyYWlsaW5nXG4gICAgICAgICAgICA6IGNvbW1lbnRba2luZF0gPT09IHRydWUpXG4gICAgICApXG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7QUFDQSxTQUFTQSxPQUFULFFBQXdCLG9CQUF4QjtBQUNBLE9BQU8sS0FBS0MsYUFBWixNQUErQixRQUEvQjs7Ozs7O0FBTUEsZUFBZSxNQUFNQyxhQUFOLFNBQTRCRixPQUE1QixDQUEwQztFQUM5Q0csT0FBTztFQUNQQyxDQUFDO0VBQ0RDLEtBQUs7RUFDTEMsZUFBZTtFQUNmQyxlQUFlO0VBQ2ZDLFFBQVE7RUFDUkMsUUFBUTtFQUNSQyxRQUFROzs7OztFQUtqQkMsV0FBVyxDQUFDO0lBQ1ZSLE9BRFU7SUFFVlMsTUFBTSxHQUFHWCxhQUZDO0lBR1ZZLFlBSFUsRUFBRDs7Ozs7RUFRUjtJQUNEO0lBQ0EsS0FBS1YsT0FBTCxHQUFlQSxPQUFmO0lBQ0EsS0FBS0MsQ0FBTCxHQUFTRCxPQUFPLENBQUNDLENBQWpCO0lBQ0FTLFlBQVksR0FBRyxFQUFFLEdBQUdBLFlBQUwsRUFBbUJDLE1BQU0sRUFBRVgsT0FBM0IsRUFBZjtJQUNBLEtBQUtFLEtBQUwsR0FBYSxDQUFDVSxJQUFELEtBQWtCSCxNQUFNLENBQUNQLEtBQVAsQ0FBYVUsSUFBYixFQUFtQkYsWUFBbkIsQ0FBL0I7SUFDQSxLQUFLTixlQUFMLEdBQXVCLENBQUNRLElBQUQsS0FBK0I7TUFDcEQsTUFBTUMsR0FBUyxHQUFHSixNQUFNLENBQUNQLEtBQVAsQ0FBYVUsSUFBYixFQUFtQkYsWUFBbkIsQ0FBbEI7TUFDQSxNQUFNSSxNQUFNO01BQ1ZELEdBQUcsQ0FBQ0UsSUFBSixLQUFhLE1BQWIsR0FBdUJGLEdBQUcsQ0FBQ0csT0FBTCxDQUFxQkYsTUFBM0MsR0FBcURELEdBQUQsQ0FBYUMsTUFEbkU7TUFFQSxJQUFJQSxNQUFKLGFBQUlBLE1BQUosZUFBSUEsTUFBTSxDQUFFRyxNQUFaLEVBQW9CO1FBQ2xCO1FBQ0E7UUFDQSxNQUFNLElBQUlDLEtBQUosQ0FBVUosTUFBTSxDQUFDLENBQUQsQ0FBTixDQUFVSyxPQUFwQixDQUFOO01BQ0Q7TUFDRCxPQUFPTixHQUFHLENBQUNHLE9BQUosQ0FBWUksSUFBbkI7SUFDRCxDQVZEO0lBV0EsS0FBS2pCLGVBQUwsR0FBdUIsQ0FBQ1MsSUFBRCxLQUE4QjtNQUNuRDtNQUNBLE1BQU1TLFVBQVUsR0FBRyxLQUFLakIsZUFBTCxDQUFzQixJQUFHUSxJQUFLLEdBQTlCLENBQW5CO01BQ0EsSUFBSVUsVUFBSjtNQUNBLElBQUksaUJBQUFELFVBQVUsQ0FBQyxDQUFELENBQVYsOERBQWVOLElBQWYsTUFBd0IscUJBQTVCLEVBQW1EO1FBQ2pETyxVQUFVLEdBQUdELFVBQVUsQ0FBQyxDQUFELENBQVYsQ0FBY0MsVUFBM0I7TUFDRCxDQUZELE1BRU87UUFDTCxNQUFNLElBQUlKLEtBQUosQ0FBVyx1QkFBc0JOLElBQUssRUFBdEMsQ0FBTjtNQUNEOztNQUVEO01BQ0EsSUFBS1UsVUFBRCxDQUFvQkMsS0FBeEIsRUFBK0I7UUFDN0IsQ0FBRUQsVUFBRCxDQUFvQkMsS0FBcEIsQ0FBMEJDLGFBQTFCLEdBQTBDLEtBQTFDO01BQ0Y7O01BRUQsT0FBT0YsVUFBUDtJQUNELENBaEJEO0lBaUJBLEtBQUtqQixRQUFMLEdBQWdCLENBQUNvQixJQUFELEtBQWtDaEIsTUFBTSxDQUFDaUIsS0FBUCxDQUFhRCxJQUFiLENBQWxEO0lBQ0EsS0FBS25CLFFBQUwsR0FBZ0JOLE9BQU8sQ0FBQ00sUUFBeEI7SUFDQSxLQUFLQyxRQUFMLEdBQWdCLFVBQVVBLFFBQVY7SUFDZGtCLElBRGM7SUFFZEUsSUFGYztJQUdLO01BQ25CLElBQUksQ0FBQ0YsSUFBSSxDQUFDbEIsUUFBVixFQUFvQjtNQUNwQix5QkFBT2tCLElBQUksQ0FBQ2xCLFFBQVosbURBQU8sZUFBZXFCLE1BQWY7TUFDTCxDQUFDQyxPQUFEO01BQ0UsQ0FBQ0YsSUFBRDtNQUNDQSxJQUFJLEtBQUssT0FBVDtNQUNHLENBQUNFLE9BQU8sQ0FBQ0MsT0FBVCxJQUFvQixDQUFDRCxPQUFPLENBQUNFLFFBRGhDO01BRUdGLE9BQU8sQ0FBQ0YsSUFBRCxDQUFQLEtBQWtCLElBSHRCLENBRkcsQ0FBUDs7SUFPRCxDQVpEO0VBYUQsQ0F0RXNEIn0=