From efefe828f9d6066b75133ded3c940ec8387c8aaa Mon Sep 17 00:00:00 2001 From: Nikolai Tillmann Date: Thu, 17 Nov 2016 05:52:04 -0800 Subject: [PATCH] Preserve null in babel-types' clone and deepClone. (#4853) * Preserve null in babel-types' clone and deepClone. * Also respect undefined when cloning. * Updating last test to reflect original test case "[,0]" --- packages/babel-types/src/index.js | 2 + packages/babel-types/test/cloning.js | 69 ++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 packages/babel-types/test/cloning.js diff --git a/packages/babel-types/src/index.js b/packages/babel-types/src/index.js index 1cc4b02bec..a5ae2c9325 100644 --- a/packages/babel-types/src/index.js +++ b/packages/babel-types/src/index.js @@ -259,6 +259,7 @@ export function ensureBlock(node: Object, key: string = "body"): Object { */ export function clone(node: Object): Object { + if (!node) return node; let newNode = {}; for (let key in node) { if (key[0] === "_") continue; @@ -283,6 +284,7 @@ export function cloneWithoutLoc(node: Object): Object { */ export function cloneDeep(node: Object): Object { + if (!node) return node; let newNode = {}; for (let key in node) { diff --git a/packages/babel-types/test/cloning.js b/packages/babel-types/test/cloning.js new file mode 100644 index 0000000000..817a4e1ec4 --- /dev/null +++ b/packages/babel-types/test/cloning.js @@ -0,0 +1,69 @@ +let t = require("../lib"); +let assert = require("assert"); +let parse = require("babylon").parse; + +suite("cloning", function () { + suite("clone", function () { + it("should handle undefined", function () { + let node = undefined; + let cloned = t.clone(node); + assert(cloned === undefined); + }); + + it("should handle null", function () { + let node = null; + let cloned = t.clone(node); + assert(cloned === null); + }); + + it("should handle simple cases", function () { + let node = t.arrayExpression([null, t.identifier("a")]); + let cloned = t.clone(node); + assert(node !== cloned); + assert(t.isNodesEquivalent(node, cloned) === true); + }); + }); + + suite("cloneDeep", function () { + it("should handle undefined", function () { + let node = undefined; + let cloned = t.cloneDeep(node); + assert(cloned === undefined); + }); + + it("should handle null", function () { + let node = null; + let cloned = t.cloneDeep(node); + assert(cloned === null); + }); + + it("should handle simple cases", function () { + let node = t.arrayExpression([null, t.identifier("a")]); + let cloned = t.cloneDeep(node); + assert(node !== cloned); + assert(t.isNodesEquivalent(node, cloned) === true); + }); + + it("should handle full programs", function () { + let node = parse("1 + 1"); + let cloned = t.cloneDeep(node); + assert(node !== cloned); + assert(t.isNodesEquivalent(node, cloned) === true); + }); + + it("should handle complex programs", function () { + let program = "'use strict'; function lol() { wow();return 1; }"; + let node = parse(program); + let cloned = t.cloneDeep(node); + assert(node !== cloned); + assert(t.isNodesEquivalent(node, cloned) === true); + }); + + it("should handle missing array element", function () { + let node = parse("[,0]"); + let cloned = t.cloneDeep(node); + assert(node !== cloned); + assert(t.isNodesEquivalent(node, cloned) === true); + }); + }); +});