diff --git a/packages/babel-traverse/src/path/index.js b/packages/babel-traverse/src/path/index.js index f76ba1ec5ece..a1be4f5d8d00 100644 --- a/packages/babel-traverse/src/path/index.js +++ b/packages/babel-traverse/src/path/index.js @@ -28,7 +28,7 @@ export default class NodePath { this.parent = parent; this.hub = hub; this.contexts = []; - this.data = {}; + this.data = Object.create(null); this.shouldSkip = false; this.shouldStop = false; this.removed = false; @@ -116,7 +116,7 @@ export default class NodePath { getData(key: string, def?: any): any { let val = this.data[key]; - if (!val && def) val = this.data[key] = def; + if (val === undefined && def !== undefined) val = this.data[key] = def; return val; } diff --git a/packages/babel-traverse/test/path/index.js b/packages/babel-traverse/test/path/index.js new file mode 100644 index 000000000000..5758a13cf838 --- /dev/null +++ b/packages/babel-traverse/test/path/index.js @@ -0,0 +1,43 @@ +import { NodePath } from "../../lib"; + +describe("NodePath", () => { + describe("setData/getData", () => { + it("can set default value", () => { + const path = new NodePath({}, {}); + + expect(path.getData("foo", "test")).toBe("test"); + }); + it("can set false", () => { + const path = new NodePath({}, {}); + path.setData("foo", false); + + expect(path.getData("foo", true)).toBe(false); + }); + + it("can set true", () => { + const path = new NodePath({}, {}); + path.setData("foo", true); + + expect(path.getData("foo", false)).toBe(true); + }); + + it("can set null", () => { + const path = new NodePath({}, {}); + path.setData("foo", null); + + expect(path.getData("foo", true)).toBe(null); + }); + + it("can use false as default", () => { + const path = new NodePath({}, {}); + + expect(path.getData("foo", false)).toBe(false); + }); + + it("does not use object base properties", () => { + const path = new NodePath({}, {}); + + expect(path.getData("__proto__", "test")).toBe("test"); + }); + }); +});