From cb8403c4dff7ab5bb2791c5b25e92185887b79f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Greg=20Berg=C3=A9?= Date: Thu, 8 Nov 2018 14:52:54 +0100 Subject: [PATCH] Fix cloneNode with typeAnnotation. Fixes #8996 --- packages/babel-types/src/clone/cloneNode.js | 6 ++++++ packages/babel-types/test/cloning.js | 13 +++++++++++++ 2 files changed, 19 insertions(+) diff --git a/packages/babel-types/src/clone/cloneNode.js b/packages/babel-types/src/clone/cloneNode.js index 6e43d191aa66..1da6c930e040 100644 --- a/packages/babel-types/src/clone/cloneNode.js +++ b/packages/babel-types/src/clone/cloneNode.js @@ -37,6 +37,12 @@ export default function cloneNode(node: T, deep: boolean = true): T { // Special-case identifiers since they are the most cloned nodes. if (type === "Identifier") { newNode.name = node.name; + + if (has(node, "typeAnnotation")) { + newNode.typeAnnotation = deep + ? cloneIfNodeOrArray(node.typeAnnotation, true) + : node.typeAnnotation; + } } else if (!has(NODE_FIELDS, type)) { throw new Error(`Unknown node type: "${type}"`); } else { diff --git a/packages/babel-types/test/cloning.js b/packages/babel-types/test/cloning.js index 0ad43fbfd781..36c8cd842467 100644 --- a/packages/babel-types/test/cloning.js +++ b/packages/babel-types/test/cloning.js @@ -56,4 +56,17 @@ describe("cloneNode", function() { expect(node.object).toBe(cloned.object); expect(node.property).toBe(cloned.property); }); + + it("should preserve type annotations", function() { + const node = t.variableDeclaration("let", [ + t.variableDeclarator({ + ...t.identifier("value"), + typeAnnotation: t.anyTypeAnnotation(), + }), + ]); + const cloned = t.cloneNode(node, /* deep */ true); + expect(cloned.declarations[0].id.typeAnnotation).toEqual( + node.declarations[0].id.typeAnnotation, + ); + }); });