From f6fc7252766aafc171a728b2181f485c096192f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Thu, 29 Sep 2022 15:22:01 +0200 Subject: [PATCH] Disallow rest object destructuring of null/undefined --- packages/babel-helpers/src/helpers.ts | 2 +- .../object-rest-and-private-keys/output.js | 2 +- .../object-rest-and-private-keys/output.js | 2 +- .../src/index.ts | 7 +++++- .../output.js | 6 ++--- .../object-rest/catch-clause/output.js | 2 +- .../object-rest/duplicate-decl-bug/output.js | 2 +- .../object-rest/nested-computed-key/output.js | 6 ++--- .../nested-default-value/output.js | 6 ++--- .../object-rest/nested-order/output.js | 6 ++--- .../exec.js | 7 ++++++ .../input.js | 7 ++++++ .../options.json | 6 +++++ .../output.js | 10 ++++++++ .../object-rest/null-destructuring/exec.js | 7 ++++++ .../object-rest/null-destructuring/input.js | 7 ++++++ .../object-rest/null-destructuring/output.js | 12 ++++++++++ .../output.js | 14 +++++------ .../fixtures/object-rest/parameters/output.js | 6 ++--- .../variable-destructuring/output.js | 24 +++++++++---------- .../output.js | 6 ++--- .../test/fixtures/regression/T7178/output.js | 2 +- .../fixtures/regression/gh-5151/output.js | 2 +- .../fixtures/regression/gh-7304/output.js | 2 +- .../src/util.ts | 7 +++++- .../empty-object-pattern/exec.js | 2 +- .../es7-object-rest-builtins/output.js | 2 +- .../es7-object-rest-loose/output.js | 2 +- .../destructuring/es7-object-rest/output.js | 2 +- 29 files changed, 117 insertions(+), 51 deletions(-) create mode 100644 packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring-transform-destructuring/exec.js create mode 100644 packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring-transform-destructuring/input.js create mode 100644 packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring-transform-destructuring/options.json create mode 100644 packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring-transform-destructuring/output.js create mode 100644 packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring/exec.js create mode 100644 packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring/input.js create mode 100644 packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring/output.js diff --git a/packages/babel-helpers/src/helpers.ts b/packages/babel-helpers/src/helpers.ts index 5fb945d2c8c2..6cc25e4e8275 100644 --- a/packages/babel-helpers/src/helpers.ts +++ b/packages/babel-helpers/src/helpers.ts @@ -425,7 +425,7 @@ helpers.newArrowCheck = helper("7.0.0-beta.0")` helpers.objectDestructuringEmpty = helper("7.0.0-beta.0")` export default function _objectDestructuringEmpty(obj) { - if (obj == null) throw new TypeError("Cannot destructure undefined"); + if (obj == null) throw new TypeError("Cannot destructure " + obj); } `; diff --git a/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/object-rest-and-private-keys/output.js b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/object-rest-and-private-keys/output.js index d13cce9b234b..f27c787c0e85 100644 --- a/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/object-rest-and-private-keys/output.js +++ b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/object-rest-and-private-keys/output.js @@ -18,7 +18,7 @@ babelHelpers.defineProperty(C, "c", "c"); var _C; let x, y, z; - x = babelHelpers.classStaticPrivateFieldSpecGet(C, C, _x), y = babelHelpers.classStaticPrivateFieldSpecGet(C, C, _y), (_C = C, ({} = _C), z = Object.assign({}, _C), _C); + x = babelHelpers.classStaticPrivateFieldSpecGet(C, C, _x), y = babelHelpers.classStaticPrivateFieldSpecGet(C, C, _y), (_C = C, ({} = _C), z = Object.assign({}, (babelHelpers.objectDestructuringEmpty(_C), _C)), _C); result = { x, y, diff --git a/packages/babel-plugin-proposal-destructuring-private/test/fixtures/variable-declaration--es2015/object-rest-and-private-keys/output.js b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/variable-declaration--es2015/object-rest-and-private-keys/output.js index a4cb5e90ca77..fe91141c2658 100644 --- a/packages/babel-plugin-proposal-destructuring-private/test/fixtures/variable-declaration--es2015/object-rest-and-private-keys/output.js +++ b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/variable-declaration--es2015/object-rest-and-private-keys/output.js @@ -17,7 +17,7 @@ babelHelpers.defineProperty(C, "c", "c"); (() => { var x = babelHelpers.classStaticPrivateFieldSpecGet(C, C, _x), y = babelHelpers.classStaticPrivateFieldSpecGet(C, C, _y), - z = Object.assign({}, C); + z = Object.assign({}, (babelHelpers.objectDestructuringEmpty(C), C)); result = { x, y, diff --git a/packages/babel-plugin-proposal-object-rest-spread/src/index.ts b/packages/babel-plugin-proposal-object-rest-spread/src/index.ts index 876f93a9a6d2..9b052b8e6c7a 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/src/index.ts +++ b/packages/babel-plugin-proposal-object-rest-spread/src/index.ts @@ -199,7 +199,12 @@ export default declare((api, opts: Options) => { restElement.argument, t.callExpression(getExtendsHelper(file), [ t.objectExpression([]), - t.cloneNode(objRef), + t.sequenceExpression([ + t.callExpression(file.addHelper("objectDestructuringEmpty"), [ + t.cloneNode(objRef), + ]), + t.cloneNode(objRef), + ]), ]), ]; } diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/assumption-ignoreFunctionLength/parameters-object-rest-used-in-default/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/assumption-ignoreFunctionLength/parameters-object-rest-used-in-default/output.js index d0d7cb40e9cc..c8c61814d3ab 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/assumption-ignoreFunctionLength/parameters-object-rest-used-in-default/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/assumption-ignoreFunctionLength/parameters-object-rest-used-in-default/output.js @@ -1,5 +1,5 @@ (_ref, a) => { - let R = babelHelpers.extends({}, _ref); + let R = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref), _ref)); if (a === void 0) { a = R; @@ -7,7 +7,7 @@ }; (_ref2, e, c = 2, a, f) => { - let R = babelHelpers.extends({}, _ref2); + let R = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref2), _ref2)); if (a === void 0) { a = R; @@ -23,7 +23,7 @@ }; (_ref3, a) => { - let R = babelHelpers.extends({}, _ref3); + let R = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref3), _ref3)); if (a === void 0) { a = f(R); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/catch-clause/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/catch-clause/output.js index f05d6aa4ec5f..ca0476539d47 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/catch-clause/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/catch-clause/output.js @@ -3,7 +3,7 @@ const _excluded = ["a1"], _excluded3 = ["c3"]; try {} catch (_ref) { - let a34 = babelHelpers.extends({}, _ref); + let a34 = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref), _ref)); } try {} catch (_ref2) { diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/duplicate-decl-bug/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/duplicate-decl-bug/output.js index 0be57aba8d68..e582a41ae700 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/duplicate-decl-bug/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/duplicate-decl-bug/output.js @@ -3,5 +3,5 @@ it("es7.objectRestSpread", () => { a: 1, b: 2 }; - let copy = babelHelpers.extends({}, original); + let copy = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(original), original)); }); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/nested-computed-key/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/nested-computed-key/output.js index 727ec58a7182..ca43ce9e17f7 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/nested-computed-key/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/nested-computed-key/output.js @@ -2,9 +2,9 @@ var _ref3; const { [_ref => { - let rest = babelHelpers.extends({}, _ref); + let rest = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref), _ref)); let _ref2 = {}, - b = babelHelpers.extends({}, _ref2); + b = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref2), _ref2)); }]: a, - [(_ref3 = {}, ({} = _ref3), d = babelHelpers.extends({}, _ref3), _ref3)]: c + [(_ref3 = {}, ({} = _ref3), d = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref3), _ref3)), _ref3)]: c } = {}; diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/nested-default-value/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/nested-default-value/output.js index c5888fc16256..3e6d0afb1ada 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/nested-default-value/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/nested-default-value/output.js @@ -2,9 +2,9 @@ var _ref3; const { a = _ref => { - let rest = babelHelpers.extends({}, _ref); + let rest = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref), _ref)); let _ref2 = {}, - b = babelHelpers.extends({}, _ref2); + b = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref2), _ref2)); }, - c = (_ref3 = {}, ({} = _ref3), d = babelHelpers.extends({}, _ref3), _ref3) + c = (_ref3 = {}, ({} = _ref3), d = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref3), _ref3)), _ref3) } = {}; diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/nested-order/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/nested-order/output.js index f9973cfc45a5..5b7dd4479015 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/nested-order/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/nested-order/output.js @@ -1,3 +1,3 @@ -const bar = babelHelpers.extends({}, obj.a), - baz = babelHelpers.extends({}, obj.b), - foo = babelHelpers.extends({}, obj); +const bar = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(obj.a), obj.a)), + baz = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(obj.b), obj.b)), + foo = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(obj), obj)); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring-transform-destructuring/exec.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring-transform-destructuring/exec.js new file mode 100644 index 000000000000..26127581856e --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring-transform-destructuring/exec.js @@ -0,0 +1,7 @@ +expect(() => { + var { ...x } = null; +}).toThrow(/null/); + +expect(() => { + var { x, ...y } = null; +}).toThrow(/null/); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring-transform-destructuring/input.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring-transform-destructuring/input.js new file mode 100644 index 000000000000..26127581856e --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring-transform-destructuring/input.js @@ -0,0 +1,7 @@ +expect(() => { + var { ...x } = null; +}).toThrow(/null/); + +expect(() => { + var { x, ...y } = null; +}).toThrow(/null/); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring-transform-destructuring/options.json b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring-transform-destructuring/options.json new file mode 100644 index 000000000000..2a3095c74741 --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring-transform-destructuring/options.json @@ -0,0 +1,6 @@ +{ + "plugins": ["proposal-object-rest-spread", "transform-destructuring"], + "targets": { + "browsers": "ie 6" + } +} diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring-transform-destructuring/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring-transform-destructuring/output.js new file mode 100644 index 000000000000..71099fa48f5d --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring-transform-destructuring/output.js @@ -0,0 +1,10 @@ +const _excluded = ["x"]; +expect(() => { + var _ref = null, + x = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref), _ref)); +}).toThrow(/null/); +expect(() => { + var _ref2 = null, + x = _ref2.x, + y = babelHelpers.objectWithoutProperties(_ref2, _excluded); +}).toThrow(/null/); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring/exec.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring/exec.js new file mode 100644 index 000000000000..26127581856e --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring/exec.js @@ -0,0 +1,7 @@ +expect(() => { + var { ...x } = null; +}).toThrow(/null/); + +expect(() => { + var { x, ...y } = null; +}).toThrow(/null/); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring/input.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring/input.js new file mode 100644 index 000000000000..26127581856e --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring/input.js @@ -0,0 +1,7 @@ +expect(() => { + var { ...x } = null; +}).toThrow(/null/); + +expect(() => { + var { x, ...y } = null; +}).toThrow(/null/); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring/output.js new file mode 100644 index 000000000000..c24ebba81499 --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/null-destructuring/output.js @@ -0,0 +1,12 @@ +const _excluded = ["x"]; +expect(() => { + var _ref = null, + x = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref), _ref)); +}).toThrow(/null/); +expect(() => { + var _ref2 = null, + { + x + } = _ref2, + y = babelHelpers.objectWithoutProperties(_ref2, _excluded); +}).toThrow(/null/); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/parameters-object-rest-used-in-default/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/parameters-object-rest-used-in-default/output.js index ed8f957d811f..bf01828d311d 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/parameters-object-rest-used-in-default/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/parameters-object-rest-used-in-default/output.js @@ -1,7 +1,7 @@ const _excluded = ["X"]; _ref => { - let R = babelHelpers.extends({}, _ref); + let R = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref), _ref)); let a = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : R; }; @@ -22,11 +22,11 @@ _ref => { let _ref4 = arguments.length > 1 ? arguments[1] : undefined; - let R = babelHelpers.extends({}, _ref4); + let R = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref4), _ref4)); }; (_ref5, e, c = 2) => { - let R = babelHelpers.extends({}, _ref5); + let R = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref5), _ref5)); let a = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : R; let f = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : q; return function () { @@ -35,12 +35,12 @@ _ref => { }; _ref6 => { - let R = babelHelpers.extends({}, _ref6); + let R = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref6), _ref6)); let a = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : f(R); }; (_ref7, _ref8) => { - let R = babelHelpers.extends({}, _ref7); + let R = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref7), _ref7)); let { [R.key]: a = 42 } = _ref8; @@ -51,7 +51,7 @@ _ref6 => { R: b } }) => { - let R = babelHelpers.extends({}, _ref9); + let R = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref9), _ref9)); }; (_ref10, { @@ -59,5 +59,5 @@ _ref6 => { } = { b: R => R }) => { - let R = babelHelpers.extends({}, _ref10); + let R = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref10), _ref10)); }; diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/parameters/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/parameters/output.js index dcc89b2d4849..3c642dec202b 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/parameters/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/parameters/output.js @@ -9,7 +9,7 @@ const _excluded = ["a1"], _excluded9 = ["a1"]; function a(_ref) { - let a34 = babelHelpers.extends({}, _ref); + let a34 = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref), _ref)); } function a2(_ref2) { @@ -67,7 +67,7 @@ function a7(_ref8 = {}) { } function a8([_ref9]) { - let a1 = babelHelpers.extends({}, _ref9); + let a1 = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref9), _ref9)); } function a9([_ref10]) { @@ -78,7 +78,7 @@ function a9([_ref10]) { } function a10([a1, _ref11]) { - let a2 = babelHelpers.extends({}, _ref11); + let a2 = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref11), _ref11)); } // Unchanged diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/variable-destructuring/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/variable-destructuring/output.js index 2091186d3028..fe16fc6d2c92 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/variable-destructuring/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/variable-destructuring/output.js @@ -1,6 +1,6 @@ const _z = z(), {} = _z, - y15 = babelHelpers.extends({}, _z.x15); + y15 = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_z.x15), _z.x15)); let { x: { @@ -9,12 +9,12 @@ let { } } = complex, asdf = babelHelpers.objectWithoutProperties(complex.x, ["a", d].map(babelHelpers.toPropertyKey)), - d = babelHelpers.extends({}, complex.y), + d = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(complex.y), complex.y)), g = babelHelpers.objectWithoutProperties(complex, ["x"]); let _z2 = z(), {} = _z2, - y4 = babelHelpers.extends({}, _z2.x4); + y4 = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_z2.x4), _z2.x4)); let _z3 = z(), { @@ -105,14 +105,14 @@ const _z11 = z(), const _z12 = z(), {} = _z12, - y16 = babelHelpers.extends({}, _z12.x15); + y16 = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_z12.x15), _z12.x15)); const { x16: [] } = z(); const [...[...y17]] = z(); const [..._ref] = z(); -const y18 = babelHelpers.extends({}, _ref); +const y18 = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref), _ref)); const [..._ref2] = z(); const { a19 @@ -121,7 +121,7 @@ const { const _z13 = z(), {} = _z13, - y20 = babelHelpers.extends({}, _z13.x20); + y20 = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_z13.x20), _z13.x20)); const _z14 = z(), { @@ -133,7 +133,7 @@ const _z14 = z(), const [[...y23] = []] = z(); const [_ref3 = []] = z(); -const y24 = babelHelpers.extends({}, _ref3); +const y24 = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref3), _ref3)); const { x25: [...y25] = [] } = z(); @@ -145,7 +145,7 @@ const [,, x27] = z(); const _z15 = z(), {} = _z15, - y28 = babelHelpers.extends({}, _z15.x28); + y28 = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_z15.x28), _z15.x28)); const _z16 = z(), { @@ -161,16 +161,16 @@ const { } = _ref4, x30 = babelHelpers.objectWithoutProperties(_ref4, ["y30"]); const [,, _ref5] = z(); -const x31 = babelHelpers.extends({}, _ref5); +const x31 = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref5), _ref5)); const _z17 = z(), { x32: {} } = _z17, - y32 = babelHelpers.extends({}, _z17.w32); + y32 = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_z17.w32), _z17.w32)); const [,, {}, _ref6] = z(); -const q32 = babelHelpers.extends({}, _ref6); +const q32 = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref6), _ref6)); const _z18 = z(), - y33 = babelHelpers.extends({}, _z18); + y33 = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_z18), _z18)); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread-loose/parameters-object-rest-used-in-default/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread-loose/parameters-object-rest-used-in-default/output.js index d0d7cb40e9cc..c8c61814d3ab 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread-loose/parameters-object-rest-used-in-default/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread-loose/parameters-object-rest-used-in-default/output.js @@ -1,5 +1,5 @@ (_ref, a) => { - let R = babelHelpers.extends({}, _ref); + let R = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref), _ref)); if (a === void 0) { a = R; @@ -7,7 +7,7 @@ }; (_ref2, e, c = 2, a, f) => { - let R = babelHelpers.extends({}, _ref2); + let R = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref2), _ref2)); if (a === void 0) { a = R; @@ -23,7 +23,7 @@ }; (_ref3, a) => { - let R = babelHelpers.extends({}, _ref3); + let R = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref3), _ref3)); if (a === void 0) { a = f(R); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/T7178/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/T7178/output.js index 356e9f948f37..7576a64939f7 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/T7178/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/T7178/output.js @@ -5,6 +5,6 @@ var _props = babelHelpers.interopRequireDefault(require("props")); console.log(_props.default); (function () { - const props = babelHelpers.extends({}, this.props); + const props = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(this.props), this.props)); console.log(props); })(); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-5151/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-5151/output.js index 23255c44a789..6a4c2c7aea04 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-5151/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-5151/output.js @@ -3,7 +3,7 @@ const { } = a, y = babelHelpers.objectWithoutProperties(a, ["x"]), z = foo(y); -const s = babelHelpers.extends({}, r), +const s = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(r), r)), t = foo(s); // ordering is preserved var l = foo(), diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-7304/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-7304/output.js index 9c283086cedc..6c5283a68dd8 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-7304/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/regression/gh-7304/output.js @@ -7,7 +7,7 @@ exports.default = void 0; class _default { method(_ref) { - let object = babelHelpers.extends({}, _ref); + let object = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_ref), _ref)); } } diff --git a/packages/babel-plugin-transform-destructuring/src/util.ts b/packages/babel-plugin-transform-destructuring/src/util.ts index 9fde09a6897d..4a126505594d 100644 --- a/packages/babel-plugin-transform-destructuring/src/util.ts +++ b/packages/babel-plugin-transform-destructuring/src/util.ts @@ -533,7 +533,12 @@ export function buildObjectExcludingKeys( : addHelper("extends"); value = t.callExpression(extendsHelper, [ t.objectExpression([]), - t.cloneNode(objRef), + t.sequenceExpression([ + t.callExpression(addHelper("objectDestructuringEmpty"), [ + t.cloneNode(objRef), + ]), + t.cloneNode(objRef), + ]), ]); } else { let keyExpression: t.Expression = t.arrayExpression(keys); diff --git a/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/empty-object-pattern/exec.js b/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/empty-object-pattern/exec.js index 8fba8c01890f..abafb78f4d40 100644 --- a/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/empty-object-pattern/exec.js +++ b/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/empty-object-pattern/exec.js @@ -1,3 +1,3 @@ expect(function () { var {} = null; -}).toThrow("Cannot destructure undefined"); +}).toThrow("Cannot destructure null"); diff --git a/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/es7-object-rest-builtins/output.js b/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/es7-object-rest-builtins/output.js index db952d04e321..5f68d5fe9f3e 100644 --- a/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/es7-object-rest-builtins/output.js +++ b/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/es7-object-rest-builtins/output.js @@ -1,7 +1,7 @@ var _excluded = ["x"]; var z = {}; var _z = z, - x = Object.assign({}, _z); + x = Object.assign({}, (babelHelpers.objectDestructuringEmpty(_z), _z)); var _z2 = z, x = _z2.x, y = babelHelpers.objectWithoutProperties(_z2, ["x"]); diff --git a/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/es7-object-rest-loose/output.js b/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/es7-object-rest-loose/output.js index 9a7d04c58d0b..aba0ea708684 100644 --- a/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/es7-object-rest-loose/output.js +++ b/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/es7-object-rest-loose/output.js @@ -1,7 +1,7 @@ const _excluded = ["x"]; var z = {}; var _z = z, - x = babelHelpers.extends({}, _z); + x = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_z), _z)); var _z2 = z, x = _z2.x, y = babelHelpers.objectWithoutPropertiesLoose(_z2, ["x"]); diff --git a/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/es7-object-rest/output.js b/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/es7-object-rest/output.js index ffe905ba66c2..2edcee896173 100644 --- a/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/es7-object-rest/output.js +++ b/packages/babel-plugin-transform-destructuring/test/fixtures/destructuring/es7-object-rest/output.js @@ -1,7 +1,7 @@ var _excluded = ["x"]; var z = {}; var _z = z, - x = babelHelpers.extends({}, _z); + x = babelHelpers.extends({}, (babelHelpers.objectDestructuringEmpty(_z), _z)); var _z2 = z, x = _z2.x, y = babelHelpers.objectWithoutProperties(_z2, ["x"]);