Skip to content

Commit 4748947

Browse files
Disallow rest object destructuring of null/undefined (#14985)
1 parent 593fd9e commit 4748947

29 files changed

Lines changed: 117 additions & 51 deletions

File tree

packages/babel-helpers/src/helpers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ helpers.newArrowCheck = helper("7.0.0-beta.0")`
425425

426426
helpers.objectDestructuringEmpty = helper("7.0.0-beta.0")`
427427
export default function _objectDestructuringEmpty(obj) {
428-
if (obj == null) throw new TypeError("Cannot destructure undefined");
428+
if (obj == null) throw new TypeError("Cannot destructure " + obj);
429429
}
430430
`;
431431

packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/object-rest-and-private-keys/output.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ babelHelpers.defineProperty(C, "c", "c");
1818
var _C;
1919

2020
let x, y, z;
21-
x = babelHelpers.classStaticPrivateFieldSpecGet(C, C, _x), y = babelHelpers.classStaticPrivateFieldSpecGet(C, C, _y), (_C = C, ({} = _C), z = Object.assign({}, _C), _C);
21+
x = babelHelpers.classStaticPrivateFieldSpecGet(C, C, _x), y = babelHelpers.classStaticPrivateFieldSpecGet(C, C, _y), (_C = C, ({} = _C), z = Object.assign({}, (babelHelpers.objectDestructuringEmpty(_C), _C)), _C);
2222
result = {
2323
x,
2424
y,

packages/babel-plugin-proposal-destructuring-private/test/fixtures/variable-declaration--es2015/object-rest-and-private-keys/output.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ babelHelpers.defineProperty(C, "c", "c");
1717
(() => {
1818
var x = babelHelpers.classStaticPrivateFieldSpecGet(C, C, _x),
1919
y = babelHelpers.classStaticPrivateFieldSpecGet(C, C, _y),
20-
z = Object.assign({}, C);
20+
z = Object.assign({}, (babelHelpers.objectDestructuringEmpty(C), C));
2121
result = {
2222
x,
2323
y,

packages/babel-plugin-proposal-object-rest-spread/src/index.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,12 @@ export default declare((api, opts: Options) => {
199199
restElement.argument,
200200
t.callExpression(getExtendsHelper(file), [
201201
t.objectExpression([]),
202-
t.cloneNode(objRef),
202+
t.sequenceExpression([
203+
t.callExpression(file.addHelper("objectDestructuringEmpty"), [
204+
t.cloneNode(objRef),
205+
]),
206+
t.cloneNode(objRef),
207+
]),
203208
]),
204209
];
205210
}

packages/babel-plugin-proposal-object-rest-spread/test/fixtures/assumption-ignoreFunctionLength/parameters-object-rest-used-in-default/output.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
(_ref, a) => {
2-
let R = babelHelpers.extends({}, _ref);
2+
let R = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref), _ref));
33

44
if (a === void 0) {
55
a = R;
66
}
77
};
88

99
(_ref2, e, c = 2, a, f) => {
10-
let R = babelHelpers.extends({}, _ref2);
10+
let R = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref2), _ref2));
1111

1212
if (a === void 0) {
1313
a = R;
@@ -23,7 +23,7 @@
2323
};
2424

2525
(_ref3, a) => {
26-
let R = babelHelpers.extends({}, _ref3);
26+
let R = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref3), _ref3));
2727

2828
if (a === void 0) {
2929
a = f(R);

packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/catch-clause/output.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ const _excluded = ["a1"],
33
_excluded3 = ["c3"];
44

55
try {} catch (_ref) {
6-
let a34 = babelHelpers.extends({}, _ref);
6+
let a34 = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref), _ref));
77
}
88

99
try {} catch (_ref2) {

packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/duplicate-decl-bug/output.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ it("es7.objectRestSpread", () => {
33
a: 1,
44
b: 2
55
};
6-
let copy = babelHelpers.extends({}, original);
6+
let copy = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(original), original));
77
});

packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/nested-computed-key/output.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ var _ref3;
22

33
const {
44
[_ref => {
5-
let rest = babelHelpers.extends({}, _ref);
5+
let rest = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref), _ref));
66
let _ref2 = {},
7-
b = babelHelpers.extends({}, _ref2);
7+
b = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref2), _ref2));
88
}]: a,
9-
[(_ref3 = {}, ({} = _ref3), d = babelHelpers.extends({}, _ref3), _ref3)]: c
9+
[(_ref3 = {}, ({} = _ref3), d = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref3), _ref3)), _ref3)]: c
1010
} = {};

packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/nested-default-value/output.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ var _ref3;
22

33
const {
44
a = _ref => {
5-
let rest = babelHelpers.extends({}, _ref);
5+
let rest = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref), _ref));
66
let _ref2 = {},
7-
b = babelHelpers.extends({}, _ref2);
7+
b = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref2), _ref2));
88
},
9-
c = (_ref3 = {}, ({} = _ref3), d = babelHelpers.extends({}, _ref3), _ref3)
9+
c = (_ref3 = {}, ({} = _ref3), d = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref3), _ref3)), _ref3)
1010
} = {};
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
const bar = babelHelpers.extends({}, obj.a),
2-
baz = babelHelpers.extends({}, obj.b),
3-
foo = babelHelpers.extends({}, obj);
1+
const bar = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(obj.a), obj.a)),
2+
baz = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(obj.b), obj.b)),
3+
foo = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(obj), obj));

0 commit comments

Comments
 (0)