Skip to content

Commit

Permalink
@babel/traverse: Fix NodePath.getData (#9415)
Browse files Browse the repository at this point in the history
* @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.

* Add test and fix object protoype

* Allow false as default value
  • Loading branch information
71 authored and danez committed Mar 26, 2019
1 parent 60d7e94 commit 72161a6
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 2 deletions.
4 changes: 2 additions & 2 deletions packages/babel-traverse/src/path/index.js
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}

Expand Down
43 changes: 43 additions & 0 deletions 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");
});
});
});

0 comments on commit 72161a6

Please sign in to comment.