@babel/traverse: Fix NodePath.getData (#9415)
* @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
This commit is contained in:
committed by
Daniel Tschinder
parent
60d7e940e2
commit
72161a64b2
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
43
packages/babel-traverse/test/path/index.js
Normal file
43
packages/babel-traverse/test/path/index.js
Normal file
@@ -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");
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user