* Add failing test case for object rest after array rest. Discovered while upgrading https://github.com/meteor/babel to Babel 7. The error is: 1) babel-plugin-transform-object-rest-spread/object rest with array rest: TypeError: /Users/ben/dev/babel/packages/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/with-array-rest/actual.js: Property id of VariableDeclarator expected node to be of a type ["LVal"] but instead got null at Object.validate (packages/babel-types/lib/definitions/index.js:73:13) at validate (packages/babel-types/lib/index.js:460:9) at Object.builder (packages/babel-types/lib/index.js:428:7) at Object.RestElement (packages/babel-plugin-transform-object-rest-spread/lib/index.js:157:41) at NodePath._call (packages/babel-traverse/lib/path/context.js:53:20) at NodePath.call (packages/babel-traverse/lib/path/context.js:40:17) at NodePath.visit (packages/babel-traverse/lib/path/context.js:84:12) ... * Fix object rest following array rest. (#6213) * Avoid treating array ...rest elements as object ...rest properties. * Also avoid treating ...rest parameters as object ...rest properties. Returning early if the parent was an ArrayPattern was not quite enough, since a RestElement can appear as a parameter in a Function as well. * Move RestElement parent check earlier in visitor method.
babel-plugin-transform-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-transform-object-rest-spread
Usage
Via .babelrc (Recommended)
.babelrc
{
"plugins": ["transform-object-rest-spread"]
}
Via CLI
babel --plugins transform-object-rest-spread script.js
Via Node API
require("babel-core").transform("code", {
plugins: ["transform-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": [
["transform-object-rest-spread", { "useBuiltIns": true }]
]
}
In
z = { x, ...y };
Out
z = Object.assign({ x }, y);