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]"
This commit is contained in:
committed by
Henry Zhu
parent
e6901792a1
commit
efefe828f9
@@ -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) {
|
||||
|
||||
69
packages/babel-types/test/cloning.js
Normal file
69
packages/babel-types/test/cloning.js
Normal file
@@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user