astx
Version:
super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring
45 lines (35 loc) • 4.12 kB
JavaScript
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