astx
Version:
super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring
57 lines (40 loc) • 1.28 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.cloneAstWithOriginals = cloneAstWithOriginals;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _symbols = require("./symbols");
function cloneAstWithOriginals(ast, src) {
var clones = new Map();
function cloneNode(node) {
var _result;
var clone = clones.get(node);
if (clone) return clone;
var result = (_result = {}, (0, _defineProperty2["default"])(_result, _symbols.original, node), (0, _defineProperty2["default"])(_result, _symbols.source, src), _result);
for (var 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) {
var obj = value;
if (typeof obj.type === 'string') {
return cloneNode(value);
}
var result = {};
for (var key in obj) {
result[key] = cloneValue(obj[key]);
}
return result;
}
return value;
}
return cloneNode(ast);
}