astx
Version:
super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring
114 lines (103 loc) • 11.4 kB
JavaScript
import { Backend } from '../backend/Backend.mjs'
import * as defaultParser from '@babel/parser'
import * as defaultTypes from '@babel/types'
import * as defaultGenerator from '@babel/generator'
import babelAstTypes from './babelAstTypes.mjs'
import reprint from './reprint.mjs'
import detectChangedNodes from '../util/detectChangedNodes.mjs'
import { cloneAstWithOriginals } from '../util/cloneAstWithOriginals.mjs'
export default class BabelBackend extends Backend {
t
parse
parseExpression
parseStatements
generator
generate
location
comments
constructor({
parser = defaultParser,
parserOptions,
generator = defaultGenerator,
types = defaultTypes,
preserveFormat,
} = {}) {
super()
const t = babelAstTypes(types)
this.t = t
this.parse = (code) =>
cloneAstWithOriginals(parser.parse(code, parserOptions), code)
this.parseExpression = (code) => parser.parseExpression(code, parserOptions)
this.parseStatements = (code) => {
const ast = this.parse(code)
if (ast.type !== 'File') {
throw new Error(`failed to get File node`)
}
return ast.program.body
}
this.generator = generator
this.generate =
preserveFormat === 'generatorHack'
? (node) => {
detectChangedNodes(this.t, new t.NodePath(node))
return reprint(this.generator, node)
}
: generator.default
this.location = (node) => {
var _node$loc,
_node$loc$start,
_node$loc2,
_node$loc2$start,
_node$loc3,
_node$loc3$end,
_node$loc4,
_node$loc4$end
return {
start: node.start,
end: node.end,
startLine:
(_node$loc = node.loc) === null || _node$loc === void 0
? void 0
: (_node$loc$start = _node$loc.start) === null ||
_node$loc$start === void 0
? void 0
: _node$loc$start.line,
startColumn:
(_node$loc2 = node.loc) === null || _node$loc2 === void 0
? void 0
: (_node$loc2$start = _node$loc2.start) === null ||
_node$loc2$start === void 0
? void 0
: _node$loc2$start.column,
endLine:
(_node$loc3 = node.loc) === null || _node$loc3 === void 0
? void 0
: (_node$loc3$end = _node$loc3.end) === null ||
_node$loc3$end === void 0
? void 0
: _node$loc3$end.line,
endColumn:
(_node$loc4 = node.loc) === null || _node$loc4 === void 0
? void 0
: (_node$loc4$end = _node$loc4.end) === null ||
_node$loc4$end === void 0
? void 0
: _node$loc4$end.column,
}
}
this.comments = function* comments(node, kind) {
if (!kind || kind === 'leading') {
const { leadingComments } = node
if (leadingComments) yield* leadingComments
}
if (!kind || kind === 'inner') {
const { innerComments } = node
if (innerComments) yield* innerComments
}
if (!kind || kind === 'trailing') {
const { trailingComments } = node
if (trailingComments) yield* trailingComments
}
}
}
} //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJCYWNrZW5kIiwiZGVmYXVsdFBhcnNlciIsImRlZmF1bHRUeXBlcyIsImRlZmF1bHRHZW5lcmF0b3IiLCJiYWJlbEFzdFR5cGVzIiwicmVwcmludCIsImRldGVjdENoYW5nZWROb2RlcyIsImNsb25lQXN0V2l0aE9yaWdpbmFscyIsIkJhYmVsQmFja2VuZCIsInQiLCJwYXJzZSIsInBhcnNlRXhwcmVzc2lvbiIsInBhcnNlU3RhdGVtZW50cyIsImdlbmVyYXRvciIsImdlbmVyYXRlIiwibG9jYXRpb24iLCJjb21tZW50cyIsImNvbnN0cnVjdG9yIiwicGFyc2VyIiwicGFyc2VyT3B0aW9ucyIsInR5cGVzIiwicHJlc2VydmVGb3JtYXQiLCJjb2RlIiwiYXN0IiwidHlwZSIsIkVycm9yIiwicHJvZ3JhbSIsImJvZHkiLCJub2RlIiwiTm9kZVBhdGgiLCJkZWZhdWx0Iiwic3RhcnQiLCJlbmQiLCJzdGFydExpbmUiLCJsb2MiLCJsaW5lIiwic3RhcnRDb2x1bW4iLCJjb2x1bW4iLCJlbmRMaW5lIiwiZW5kQ29sdW1uIiwia2luZCIsImxlYWRpbmdDb21tZW50cyIsImlubmVyQ29tbWVudHMiLCJ0cmFpbGluZ0NvbW1lbnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2JhYmVsL0JhYmVsQmFja2VuZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOb2RlLCBGaWxlLCBTdGF0ZW1lbnQsIEV4cHJlc3Npb24gfSBmcm9tICdAYmFiZWwvdHlwZXMnXG5pbXBvcnQgeyBCYWNrZW5kIH0gZnJvbSAnLi4vYmFja2VuZC9CYWNrZW5kJ1xuaW1wb3J0ICogYXMgZGVmYXVsdFBhcnNlciBmcm9tICdAYmFiZWwvcGFyc2VyJ1xuaW1wb3J0IHsgUGFyc2VyT3B0aW9ucyB9IGZyb20gJ0BiYWJlbC9wYXJzZXInXG5pbXBvcnQgKiBhcyBkZWZhdWx0VHlwZXMgZnJvbSAnQGJhYmVsL3R5cGVzJ1xuaW1wb3J0ICogYXMgZGVmYXVsdEdlbmVyYXRvciBmcm9tICdAYmFiZWwvZ2VuZXJhdG9yJ1xuaW1wb3J0ICogYXMgQXN0VHlwZXMgZnJvbSAnYXN0LXR5cGVzJ1xuaW1wb3J0IGJhYmVsQXN0VHlwZXMgZnJvbSAnLi9iYWJlbEFzdFR5cGVzJ1xuaW1wb3J0IHsgQ29tbWVudCwgTG9jYXRpb24gfSBmcm9tICcuLi90eXBlcydcbmltcG9ydCByZXByaW50IGZyb20gJy4vcmVwcmludCdcbmltcG9ydCBkZXRlY3RDaGFuZ2VkTm9kZXMgZnJvbSAnLi4vdXRpbC9kZXRlY3RDaGFuZ2VkTm9kZXMnXG5pbXBvcnQgeyBjbG9uZUFzdFdpdGhPcmlnaW5hbHMgfSBmcm9tICcuLi91dGlsL2Nsb25lQXN0V2l0aE9yaWdpbmFscydcblxuaW50ZXJmYWNlIFBhcnNlciB7XG4gIHBhcnNlKGNvZGU6IHN0cmluZywgcGFyc2VyT3B0cz86IFBhcnNlck9wdGlvbnMpOiBGaWxlXG4gIHBhcnNlRXhwcmVzc2lvbihjb2RlOiBzdHJpbmcsIHBhcnNlck9wdHM/OiBQYXJzZXJPcHRpb25zKTogRXhwcmVzc2lvblxufVxuXG50eXBlIEdlbmVyYXRlID0gKG5vZGU6IE5vZGUpID0+IHsgY29kZTogc3RyaW5nIH1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFiZWxCYWNrZW5kIGV4dGVuZHMgQmFja2VuZDxOb2RlPiB7XG4gIHJlYWRvbmx5IHQ6IHR5cGVvZiBBc3RUeXBlc1xuICByZWFkb25seSBwYXJzZTogKGNvZGU6IHN0cmluZykgPT4gTm9kZVxuICByZWFkb25seSBwYXJzZUV4cHJlc3Npb246IChjb2RlOiBzdHJpbmcpID0+IEV4cHJlc3Npb25cbiAgcmVhZG9ubHkgcGFyc2VTdGF0ZW1lbnRzOiAoY29kZTogc3RyaW5nKSA9PiBTdGF0ZW1lbnRbXVxuICByZWFkb25seSBnZW5lcmF0b3I6IHR5cGVvZiBkZWZhdWx0R2VuZXJhdG9yXG4gIHJlYWRvbmx5IGdlbmVyYXRlOiBHZW5lcmF0ZVxuICByZWFkb25seSBsb2NhdGlvbjogKG5vZGU6IE5vZGUpID0+IExvY2F0aW9uXG4gIHJlYWRvbmx5IGNvbW1lbnRzOiAoXG4gICAgbm9kZTogTm9kZSxcbiAgICBraW5kPzogJ2xlYWRpbmcnIHwgJ2lubmVyJyB8ICd0cmFpbGluZydcbiAgKSA9PiBJdGVyYWJsZTxDb21tZW50PlxuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBwYXJzZXIgPSBkZWZhdWx0UGFyc2VyLFxuICAgIHBhcnNlck9wdGlvbnMsXG4gICAgZ2VuZXJhdG9yID0gZGVmYXVsdEdlbmVyYXRvcixcbiAgICB0eXBlcyA9IGRlZmF1bHRUeXBlcyxcbiAgICBwcmVzZXJ2ZUZvcm1hdCxcbiAgfToge1xuICAgIHBhcnNlcj86IFBhcnNlclxuICAgIHBhcnNlck9wdGlvbnM/OiBQYXJzZXJPcHRpb25zXG4gICAgZ2VuZXJhdG9yPzogdHlwZW9mIGRlZmF1bHRHZW5lcmF0b3JcbiAgICB0eXBlcz86IHR5cGVvZiBkZWZhdWx0VHlwZXNcbiAgICBwcmVzZXJ2ZUZvcm1hdD86ICdnZW5lcmF0b3JIYWNrJ1xuICB9ID0ge30pIHtcbiAgICBzdXBlcigpXG5cbiAgICBjb25zdCB0ID0gYmFiZWxBc3RUeXBlcyh0eXBlcylcblxuICAgIHRoaXMudCA9IHRcbiAgICB0aGlzLnBhcnNlID0gKGNvZGU6IHN0cmluZykgPT5cbiAgICAgIGNsb25lQXN0V2l0aE9yaWdpbmFscyhwYXJzZXIucGFyc2UoY29kZSwgcGFyc2VyT3B0aW9ucyksIGNvZGUpXG4gICAgdGhpcy5wYXJzZUV4cHJlc3Npb24gPSAoY29kZTogc3RyaW5nKSA9PlxuICAgICAgcGFyc2VyLnBhcnNlRXhwcmVzc2lvbihjb2RlLCBwYXJzZXJPcHRpb25zKVxuICAgIHRoaXMucGFyc2VTdGF0ZW1lbnRzID0gKGNvZGU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgYXN0ID0gdGhpcy5wYXJzZShjb2RlKVxuICAgICAgaWYgKGFzdC50eXBlICE9PSAnRmlsZScpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmYWlsZWQgdG8gZ2V0IEZpbGUgbm9kZWApXG4gICAgICB9XG4gICAgICByZXR1cm4gYXN0LnByb2dyYW0uYm9keVxuICAgIH1cbiAgICB0aGlzLmdlbmVyYXRvciA9IGdlbmVyYXRvclxuICAgIHRoaXMuZ2VuZXJhdGUgPVxuICAgICAgcHJlc2VydmVGb3JtYXQgPT09ICdnZW5lcmF0b3JIYWNrJ1xuICAgICAgICA/IChub2RlOiBOb2RlKSA9PiB7XG4gICAgICAgICAgICBkZXRlY3RDaGFuZ2VkTm9kZXModGhpcy50LCBuZXcgdC5Ob2RlUGF0aChub2RlKSlcbiAgICAgICAgICAgIHJldHVybiByZXByaW50KHRoaXMuZ2VuZXJhdG9yLCBub2RlKVxuICAgICAgICAgIH1cbiAgICAgICAgOiBnZW5lcmF0b3IuZGVmYXVsdFxuICAgIHRoaXMubG9jYXRpb24gPSAobm9kZTogTm9kZSkgPT4gKHtcbiAgICAgIHN0YXJ0OiBub2RlLnN0YXJ0LFxuICAgICAgZW5kOiBub2RlLmVuZCxcbiAgICAgIHN0YXJ0TGluZTogbm9kZS5sb2M/LnN0YXJ0Py5saW5lLFxuICAgICAgc3RhcnRDb2x1bW46IG5vZGUubG9jPy5zdGFydD8uY29sdW1uLFxuICAgICAgZW5kTGluZTogbm9kZS5sb2M/LmVuZD8ubGluZSxcbiAgICAgIGVuZENvbHVtbjogbm9kZS5sb2M/LmVuZD8uY29sdW1uLFxuICAgIH0pXG4gICAgdGhpcy5jb21tZW50cyA9IGZ1bmN0aW9uKiBjb21tZW50cyhcbiAgICAgIG5vZGU6IE5vZGUsXG4gICAgICBraW5kPzogJ2xlYWRpbmcnIHwgJ2lubmVyJyB8ICd0cmFpbGluZydcbiAgICApOiBJdGVyYWJsZTxDb21tZW50PiB7XG4gICAgICBpZiAoIWtpbmQgfHwga2luZCA9PT0gJ2xlYWRpbmcnKSB7XG4gICAgICAgIGNvbnN0IHsgbGVhZGluZ0NvbW1lbnRzIH0gPSBub2RlXG4gICAgICAgIGlmIChsZWFkaW5nQ29tbWVudHMpIHlpZWxkKiBsZWFkaW5nQ29tbWVudHNcbiAgICAgIH1cbiAgICAgIGlmICgha2luZCB8fCBraW5kID09PSAnaW5uZXInKSB7XG4gICAgICAgIGNvbnN0IHsgaW5uZXJDb21tZW50cyB9ID0gbm9kZVxuICAgICAgICBpZiAoaW5uZXJDb21tZW50cykgeWllbGQqIGlubmVyQ29tbWVudHNcbiAgICAgIH1cbiAgICAgIGlmICgha2luZCB8fCBraW5kID09PSAndHJhaWxpbmcnKSB7XG4gICAgICAgIGNvbnN0IHsgdHJhaWxpbmdDb21tZW50cyB9ID0gbm9kZVxuICAgICAgICBpZiAodHJhaWxpbmdDb21tZW50cykgeWllbGQqIHRyYWlsaW5nQ29tbWVudHNcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUNBLFNBQVNBLE9BQVQsUUFBd0Isb0JBQXhCO0FBQ0EsT0FBTyxLQUFLQyxhQUFaLE1BQStCLGVBQS9COztBQUVBLE9BQU8sS0FBS0MsWUFBWixNQUE4QixjQUE5QjtBQUNBLE9BQU8sS0FBS0MsZ0JBQVosTUFBa0Msa0JBQWxDOztBQUVBLE9BQU9DLGFBQVAsTUFBMEIsaUJBQTFCOztBQUVBLE9BQU9DLE9BQVAsTUFBb0IsV0FBcEI7QUFDQSxPQUFPQyxrQkFBUCxNQUErQiw0QkFBL0I7QUFDQSxTQUFTQyxxQkFBVCxRQUFzQywrQkFBdEM7Ozs7Ozs7OztBQVNBLGVBQWUsTUFBTUMsWUFBTixTQUEyQlIsT0FBM0IsQ0FBeUM7RUFDN0NTLENBQUM7RUFDREMsS0FBSztFQUNMQyxlQUFlO0VBQ2ZDLGVBQWU7RUFDZkMsU0FBUztFQUNUQyxRQUFRO0VBQ1JDLFFBQVE7RUFDUkMsUUFBUTs7Ozs7RUFLakJDLFdBQVcsQ0FBQztJQUNWQyxNQUFNLEdBQUdqQixhQURDO0lBRVZrQixhQUZVO0lBR1ZOLFNBQVMsR0FBR1YsZ0JBSEY7SUFJVmlCLEtBQUssR0FBR2xCLFlBSkU7SUFLVm1CLGNBTFU7Ozs7Ozs7RUFZUixFQVpPLEVBWUg7SUFDTjs7SUFFQSxNQUFNWixDQUFDLEdBQUdMLGFBQWEsQ0FBQ2dCLEtBQUQsQ0FBdkI7O0lBRUEsS0FBS1gsQ0FBTCxHQUFTQSxDQUFUO0lBQ0EsS0FBS0MsS0FBTCxHQUFhLENBQUNZ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