cli icon indicating copy to clipboard operation
cli copied to clipboard

Babel loose config option causes issues with spread transform

Open AshleyGrant opened this issue 6 years ago • 1 comments

I'm submitting a bug report I'm submitting a feature request

  • Library Version: 1.0.0-beta7

Please tell us about your environment:

  • Operating System: all

  • Node Version: 6.2.0

  • NPM Version: 8.11.3
  • Browser: all

  • Language: ESNext

  • Loader/bundler: all

Current behavior: Babel config specifies loose: true. This causes issues when using the spread (...) operator with a Set object. Specifically, the code:

this.foo = [...new Set([1, 2, 3])];

is transpiled to

this.foo = new Set([1, 2, 3]).concat();

This is a problem, as Set objects do not have a concat method. This transpilation is a consequence of having loose: true in .babelrc.js, per this issue: https://github.com/babel/babel/issues/7958 . As mentioned in the linked issue, this is the expected behavior when using loose: true, and is not a bug in Babel or the spread transformer.

Simply setting loose: false will fix this issue.

This issue was originally reported on StackOverflow here: https://stackoverflow.com/questions/53696962/aurelia-not-transpiling-set-and-spread-operator-correctly

  • What is the expected behavior? Spread operator to be transpiled correctly with Set objects.

  • What is the motivation / use case for changing the behavior? Make transpilation work correctly.

AshleyGrant avatar Dec 10 '18 02:12 AshleyGrant

I questioned loose mode before in #866 but didn't have any interesting code that broke with loose mode.

Alternatively this.foo = Array.from(new Set([1,2,3])); (still compact and readable) can avoid the loose mode issue.

I would side with changing user code than pay the price (performance and size) of strict mode.

3cp avatar Dec 10 '18 03:12 3cp