UNPKG

astx

Version:

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

114 lines (103 loc) 11.4 kB
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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