This failing test case demonstrates a regression between 7.0.0-beta.38 and
7.0.0-beta.39 in the @babel/plugin-proposal-object-rest-spread package.
I distilled this test case from a larger configuration of plugins in my
application, one of which calls api.traverse.cache.clearScope(). Although
calling clearScope() is an uncommon thing for a plugin to do, it was a
reliable way to reproduce the problem. If I can find other reliable
reproductions, I'll push some additional failing tests to this PR.
Regardless of how common it is, clearing the scope cache should be a safe
operation that only slows down the transform (because scopes have to be
recreated and re-crawled). Crashing due to a spurious duplicate
declaration seems like a bug worth fixing.
My hunch is that [these two lines](eb38ea2b10/packages/babel-plugin-proposal-object-rest-spread/src/index.js (L75-L76))
(which were changed in `7.0.0-beta.39`) are not actually removing the
original rest element as a binding from the enclosing `Scope`, in certain
circumstances, so the new variable declaration ends up colliding with the
old (removed) binding.
Possibly related: #7304 (reported by @julien-f)
@babel/plugin-proposal-object-rest-spread
This plugin allows Babel to transform rest properties for object destructuring assignment and spread properties for object literals.
Example
Rest Properties
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
console.log(x); // 1
console.log(y); // 2
console.log(z); // { a: 3, b: 4 }
Spread Properties
let n = { x, y, ...z };
console.log(n); // { x: 1, y: 2, a: 3, b: 4 }
Installation
npm install --save-dev @babel/plugin-proposal-object-rest-spread
Usage
Via .babelrc (Recommended)
.babelrc
{
"plugins": ["@babel/plugin-proposal-object-rest-spread"]
}
Via CLI
babel --plugins @babel/plugin-proposal-object-rest-spread script.js
Via Node API
require("@babel/core").transform("code", {
plugins: ["@babel/plugin-proposal-object-rest-spread"]
});
Options
useBuiltIns
boolean, defaults to false.
By default, this plugin uses Babel's extends helper which polyfills Object.assign. Enabling this option will use Object.assign directly.
.babelrc
{
"plugins": [
["@babel/plugin-proposal-object-rest-spread", { "useBuiltIns": true }]
]
}
In
z = { x, ...y };
Out
z = Object.assign({ x }, y);