From 0ae7e9f4f5107ee37364fa385b040f16182b3f26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Geis?= Date: Sat, 26 Jan 2019 14:56:51 +0100 Subject: [PATCH 1/3] @babel/traverse: Fix NodePath.getData Currently, if the obtained value is `false`, it will be replaced by the given default value, which is invalid. This makes sure that we only set the default value when the value is `undefined`, instead of falsy. --- packages/babel-traverse/src/path/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-traverse/src/path/index.js b/packages/babel-traverse/src/path/index.js index 506a25e95ded..abc268453cf3 100644 --- a/packages/babel-traverse/src/path/index.js +++ b/packages/babel-traverse/src/path/index.js @@ -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) val = this.data[key] = def; return val; } From 196b24d52a554eee3e1368c3ea7e907c3ba93a08 Mon Sep 17 00:00:00 2001 From: Daniel Tschinder Date: Tue, 26 Mar 2019 16:03:39 -0700 Subject: [PATCH 2/3] Add test and fix object protoype --- packages/babel-traverse/src/path/index.js | 2 +- packages/babel-traverse/test/path/index.js | 37 ++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 packages/babel-traverse/test/path/index.js diff --git a/packages/babel-traverse/src/path/index.js b/packages/babel-traverse/src/path/index.js index abc268453cf3..bbb2ebbd7bff 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; diff --git a/packages/babel-traverse/test/path/index.js b/packages/babel-traverse/test/path/index.js new file mode 100644 index 000000000000..400cfe1382a9 --- /dev/null +++ b/packages/babel-traverse/test/path/index.js @@ -0,0 +1,37 @@ +import { NodePath } from "../../lib"; + +describe("NodePath", () => { + describe("setData/getData", () => { + it("can set default value", function() { + const path = new NodePath({}, {}); + + expect(path.getData("foo", "test")).toBe("test"); + }); + it("can set false", function() { + const path = new NodePath({}, {}); + path.setData("foo", false); + + expect(path.getData("foo", true)).toBe(false); + }); + + it("can set true", function() { + const path = new NodePath({}, {}); + path.setData("foo", true); + + expect(path.getData("foo", false)).toBe(true); + }); + + it("can set null", function() { + const path = new NodePath({}, {}); + path.setData("foo", null); + + expect(path.getData("foo", true)).toBe(null); + }); + + it("does not use object base properties", function() { + const path = new NodePath({}, {}); + + expect(path.getData("__proto__", "test")).toBe("test"); + }); + }); +}); From 16909beb110a9e18d44f45a79b33a97e3b5ebc23 Mon Sep 17 00:00:00 2001 From: Daniel Tschinder Date: Tue, 26 Mar 2019 16:06:28 -0700 Subject: [PATCH 3/3] Allow false as default value --- packages/babel-traverse/src/path/index.js | 2 +- packages/babel-traverse/test/path/index.js | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/babel-traverse/src/path/index.js b/packages/babel-traverse/src/path/index.js index bbb2ebbd7bff..1fd58461477b 100644 --- a/packages/babel-traverse/src/path/index.js +++ b/packages/babel-traverse/src/path/index.js @@ -116,7 +116,7 @@ export default class NodePath { getData(key: string, def?: any): any { let val = this.data[key]; - if (val === undefined && 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 index 400cfe1382a9..5758a13cf838 100644 --- a/packages/babel-traverse/test/path/index.js +++ b/packages/babel-traverse/test/path/index.js @@ -2,33 +2,39 @@ import { NodePath } from "../../lib"; describe("NodePath", () => { describe("setData/getData", () => { - it("can set default value", function() { + it("can set default value", () => { const path = new NodePath({}, {}); expect(path.getData("foo", "test")).toBe("test"); }); - it("can set false", function() { + it("can set false", () => { const path = new NodePath({}, {}); path.setData("foo", false); expect(path.getData("foo", true)).toBe(false); }); - it("can set true", function() { + it("can set true", () => { const path = new NodePath({}, {}); path.setData("foo", true); expect(path.getData("foo", false)).toBe(true); }); - it("can set null", function() { + it("can set null", () => { const path = new NodePath({}, {}); path.setData("foo", null); expect(path.getData("foo", true)).toBe(null); }); - it("does not use object base properties", function() { + 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");