astx
Version:
super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring
72 lines (52 loc) • 1.53 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = cloneNode;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _symbols = require("./symbols");
var commentClones = new Map();
function isComment(node) {
return node.type === 'CommentLine' || node.type === 'CommentBlock';
}
function cloneNode(node) {
var _result;
if (isComment(node)) {
var clone = commentClones.get(node);
if (clone && node.value === clone.value) return clone;
}
var result = (_result = {}, (0, _defineProperty2["default"])(_result, _symbols.original, node[_symbols.original]), (0, _defineProperty2["default"])(_result, _symbols.source, node[_symbols.source]), _result);
for (var field in node) {
switch (field) {
case 'start':
case 'end':
case 'loc':
case 'range':
continue;
}
var value = node[field];
result[field] = cloneValue(value);
}
if (isComment(node)) {
commentClones.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;
}