78 lines
No EOL
1.8 KiB
JavaScript
78 lines
No EOL
1.8 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = cloneNode;
|
|
|
|
var _definitions = require("../definitions");
|
|
|
|
const has = Function.call.bind(Object.prototype.hasOwnProperty);
|
|
|
|
function cloneIfNode(obj, deep) {
|
|
if (obj && typeof obj.type === "string" && obj.type !== "CommentLine" && obj.type !== "CommentBlock") {
|
|
return cloneNode(obj, deep);
|
|
}
|
|
|
|
return obj;
|
|
}
|
|
|
|
function cloneIfNodeOrArray(obj, deep) {
|
|
if (Array.isArray(obj)) {
|
|
return obj.map(node => cloneIfNode(node, deep));
|
|
}
|
|
|
|
return cloneIfNode(obj, deep);
|
|
}
|
|
|
|
function cloneNode(node, deep = true) {
|
|
if (!node) return node;
|
|
const {
|
|
type
|
|
} = node;
|
|
const newNode = {
|
|
type
|
|
};
|
|
|
|
if (type === "Identifier") {
|
|
newNode.name = node.name;
|
|
|
|
if (has(node, "optional") && typeof node.optional === "boolean") {
|
|
newNode.optional = node.optional;
|
|
}
|
|
|
|
if (has(node, "typeAnnotation")) {
|
|
newNode.typeAnnotation = deep ? cloneIfNodeOrArray(node.typeAnnotation, true) : node.typeAnnotation;
|
|
}
|
|
} else if (!has(_definitions.NODE_FIELDS, type)) {
|
|
throw new Error(`Unknown node type: "${type}"`);
|
|
} else {
|
|
for (const field of Object.keys(_definitions.NODE_FIELDS[type])) {
|
|
if (has(node, field)) {
|
|
newNode[field] = deep ? cloneIfNodeOrArray(node[field], true) : node[field];
|
|
}
|
|
}
|
|
}
|
|
|
|
if (has(node, "loc")) {
|
|
newNode.loc = node.loc;
|
|
}
|
|
|
|
if (has(node, "leadingComments")) {
|
|
newNode.leadingComments = node.leadingComments;
|
|
}
|
|
|
|
if (has(node, "innerComments")) {
|
|
newNode.innerComments = node.innerComments;
|
|
}
|
|
|
|
if (has(node, "trailingComments")) {
|
|
newNode.trailingComments = node.trailingComments;
|
|
}
|
|
|
|
if (has(node, "extra")) {
|
|
newNode.extra = Object.assign({}, node.extra);
|
|
}
|
|
|
|
return newNode;
|
|
} |