UNPKG

astx

Version:

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

45 lines (35 loc) 4.12 kB
import { original, source } from './symbols.mjs' export function cloneAstWithOriginals(ast, src) { const clones = new Map() function cloneNode(node) { const clone = clones.get(node) if (clone) return clone const result = { [original]: node, [source]: src, } for (const field in node) { result[field] = cloneValue(node[field]) } clones.set(node, result) return result } function cloneValue(value) { if (Array.isArray(value)) { return value.map(cloneValue) } if (value instanceof Object) { const obj = value if (typeof obj.type === 'string') { return cloneNode(value) } const result = {} for (const key in obj) { result[key] = cloneValue(obj[key]) } return result } return value } return cloneNode(ast) } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJvcmlnaW5hbCIsInNvdXJjZSIsImNsb25lQXN0V2l0aE9yaWdpbmFscyIsImFzdCIsInNyYyIsImNsb25lcyIsIk1hcCIsImNsb25lTm9kZSIsIm5vZGUiLCJjbG9uZSIsImdldCIsInJlc3VsdCIsImZpZWxkIiwiY2xvbmVWYWx1ZSIsInNldCIsInZhbHVlIiwiQXJyYXkiLCJpc0FycmF5IiwibWFwIiwiT2JqZWN0Iiwib2JqIiwidHlwZSIsImtleSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2Nsb25lQXN0V2l0aE9yaWdpbmFscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOb2RlIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgeyBvcmlnaW5hbCwgc291cmNlIH0gZnJvbSAnLi9zeW1ib2xzJ1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVBc3RXaXRoT3JpZ2luYWxzPFQgZXh0ZW5kcyBOb2RlPihhc3Q6IFQsIHNyYzogc3RyaW5nKTogVCB7XG4gIGNvbnN0IGNsb25lczogTWFwPE5vZGUsIE5vZGU+ID0gbmV3IE1hcCgpXG5cbiAgZnVuY3Rpb24gY2xvbmVOb2RlPFQgZXh0ZW5kcyBOb2RlPihub2RlOiBUKTogVCB7XG4gICAgY29uc3QgY2xvbmUgPSBjbG9uZXMuZ2V0KG5vZGUpXG4gICAgaWYgKGNsb25lKSByZXR1cm4gY2xvbmUgYXMgYW55XG5cbiAgICBjb25zdCByZXN1bHQ6IGFueSA9IHsgW29yaWdpbmFsXTogbm9kZSwgW3NvdXJjZV06IHNyYyB9XG4gICAgZm9yIChjb25zdCBmaWVsZCBpbiBub2RlKSB7XG4gICAgICByZXN1bHRbZmllbGRdID0gY2xvbmVWYWx1ZSgobm9kZSBhcyBhbnkpW2ZpZWxkXSlcbiAgICB9XG4gICAgY2xvbmVzLnNldChub2RlLCByZXN1bHQpXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgZnVuY3Rpb24gY2xvbmVWYWx1ZTxUPih2YWx1ZTogVCk6IFQge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuICh2YWx1ZSBhcyBhbnkpLm1hcChjbG9uZVZhbHVlKVxuICAgIH1cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IHZhbHVlXG4gICAgICBpZiAodHlwZW9mIG9iai50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gY2xvbmVOb2RlKHZhbHVlIGFzIGFueSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge31cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICByZXN1bHRba2V5XSA9IGNsb25lVmFsdWUob2JqW2tleV0pXG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgcmV0dXJuIGNsb25lTm9kZShhc3QpXG59XG4iXSwibWFwcGluZ3MiOiI7QUFDQSxTQUFTQSxRQUFULEVBQW1CQyxNQUFuQixRQUFpQyxXQUFqQzs7QUFFQSxPQUFPLFNBQVNDLHFCQUFULENBQStDQyxHQUEvQyxFQUF1REMsR0FBdkQsRUFBdUU7RUFDNUUsTUFBTUMsTUFBdUIsR0FBRyxJQUFJQyxHQUFKLEVBQWhDOztFQUVBLFNBQVNDLFNBQVQsQ0FBbUNDLElBQW5DLEVBQStDO0lBQzdDLE1BQU1DLEtBQUssR0FBR0osTUFBTSxDQUFDSyxHQUFQLENBQVdGLElBQVgsQ0FBZDtJQUNBLElBQUlDLEtBQUosRUFBVyxPQUFPQSxLQUFQOztJQUVYLE1BQU1FLE1BQVcsR0FBRyxFQUFFLENBQUNYLFFBQUQsR0FBWVEsSUFBZCxFQUFvQixDQUFDUCxNQUFELEdBQVVHLEdBQTlCLEVBQXBCO0lBQ0EsS0FBSyxNQUFNUSxLQUFYLElBQW9CSixJQUFwQixFQUEwQjtNQUN4QkcsTUFBTSxDQUFDQyxLQUFELENBQU4sR0FBZ0JDLFVBQVUsQ0FBRUwsSUFBRCxDQUFjSSxLQUFkLENBQUQsQ0FBMUI7SUFDRDtJQUNEUCxNQUFNLENBQUNTLEdBQVAsQ0FBV04sSUFBWCxFQUFpQkcsTUFBakI7SUFDQSxPQUFPQSxNQUFQO0VBQ0Q7O0VBRUQsU0FBU0UsVUFBVCxDQUF1QkUsS0FBdkIsRUFBb0M7SUFDbEMsSUFBSUMsS0FBSyxDQUFDQyxPQUFOLENBQWNGLEtBQWQsQ0FBSixFQUEwQjtNQUN4QixPQUFRQSxLQUFELENBQWVHLEdBQWYsQ0FBbUJMLFVBQW5CLENBQVA7SUFDRDtJQUNELElBQUlFLEtBQUssWUFBWUksTUFBckIsRUFBNkI7TUFDM0IsTUFBTUMsR0FBd0IsR0FBR0wsS0FBakM7TUFDQSxJQUFJLE9BQU9LLEdBQUcsQ0FBQ0MsSUFBWCxLQUFvQixRQUF4QixFQUFrQztRQUNoQyxPQUFPZCxTQUFTLENBQUNRLEtBQUQsQ0FBaEI7TUFDRDtNQUNELE1BQU1KLE1BQVcsR0FBRyxFQUFwQjtNQUNBLEtBQUssTUFBTVcsR0FBWCxJQUFrQkYsR0FBbEIsRUFBdUI7UUFDckJULE1BQU0sQ0FBQ1csR0FBRCxDQUFOLEdBQWNULFVBQVUsQ0FBQ08sR0FBRyxDQUFDRSxHQUFELENBQUosQ0FBeEI7TUFDRDtNQUNELE9BQU9YLE1BQVA7SUFDRDtJQUNELE9BQU9JLEtBQVA7RUFDRDs7RUFFRCxPQUFPUixTQUFTLENBQUNKLEdBQUQsQ0FBaEI7QUFDRCJ9