From 7b9bc7c28bbd2aaa8bed5cdbe59c1cef53ce8fa4 Mon Sep 17 00:00:00 2001 From: Carlos Lopez Date: Sun, 15 Mar 2020 09:54:44 -0400 Subject: [PATCH] fix(rest-spread): Do not require `Symbol.iterator` for strings (#9794) --- packages/babel-helpers/src/helpers.js | 5 +++-- .../test/fixtures/object-rest/parameters-exec/exec.js | 9 +++++++++ .../fixtures/object-rest/parameters-exec/options.json | 3 +++ .../test/fixtures/object-spread/string-exec/exec.js | 3 +++ .../babel-runtime-corejs2/helpers/esm/iterableToArray.js | 2 +- .../babel-runtime-corejs2/helpers/iterableToArray.js | 2 +- packages/babel-runtime/helpers/esm/iterableToArray.js | 2 +- packages/babel-runtime/helpers/iterableToArray.js | 2 +- 8 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/parameters-exec/exec.js create mode 100644 packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/parameters-exec/options.json create mode 100644 packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/string-exec/exec.js diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index 90a0bca64a..f8ad7731c3 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -934,8 +934,9 @@ helpers.arrayWithHoles = helper("7.0.0-beta.0")` helpers.iterableToArray = helper("7.0.0-beta.0")` export default function _iterableToArray(iter) { if ( - Symbol.iterator in Object(iter) || - Object.prototype.toString.call(iter) === "[object Arguments]" + typeof iter === 'string' + || Object.prototype.toString.call(iter) === "[object Arguments]" + || Symbol.iterator in Object(iter) ) return Array.from(iter); } `; diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/parameters-exec/exec.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/parameters-exec/exec.js new file mode 100644 index 0000000000..4ba66da90c --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/parameters-exec/exec.js @@ -0,0 +1,9 @@ +function sum(x, y, z) { + return x + y + z; +} +function test() { + var args = arguments; + return sum(...args); +} + +expect(test(1, 2, 3)).toBe(6); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/parameters-exec/options.json b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/parameters-exec/options.json new file mode 100644 index 0000000000..5f1948cd56 --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/parameters-exec/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["proposal-object-rest-spread"] +} diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/string-exec/exec.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/string-exec/exec.js new file mode 100644 index 0000000000..bff6fc0797 --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/string-exec/exec.js @@ -0,0 +1,3 @@ +expect([...'']).toHaveLength(0); +expect([...'abc']).toHaveLength(3); +expect([...'def']).toMatchObject(['d','e','f']); diff --git a/packages/babel-runtime-corejs2/helpers/esm/iterableToArray.js b/packages/babel-runtime-corejs2/helpers/esm/iterableToArray.js index 9f20ecdbd9..a3df2576ad 100644 --- a/packages/babel-runtime-corejs2/helpers/esm/iterableToArray.js +++ b/packages/babel-runtime-corejs2/helpers/esm/iterableToArray.js @@ -1,5 +1,5 @@ import _Array$from from "../../core-js/array/from"; import _isIterable from "../../core-js/is-iterable"; export default function _iterableToArray(iter) { - if (_isIterable(Object(iter)) || Object.prototype.toString.call(iter) === "[object Arguments]") return _Array$from(iter); + if (typeof iter === 'string' || Object.prototype.toString.call(iter) === "[object Arguments]" || _isIterable(Object(iter))) return _Array$from(iter); } \ No newline at end of file diff --git a/packages/babel-runtime-corejs2/helpers/iterableToArray.js b/packages/babel-runtime-corejs2/helpers/iterableToArray.js index c7834a3122..0e07f27b13 100644 --- a/packages/babel-runtime-corejs2/helpers/iterableToArray.js +++ b/packages/babel-runtime-corejs2/helpers/iterableToArray.js @@ -3,7 +3,7 @@ var _Array$from = require("../core-js/array/from"); var _isIterable = require("../core-js/is-iterable"); function _iterableToArray(iter) { - if (_isIterable(Object(iter)) || Object.prototype.toString.call(iter) === "[object Arguments]") return _Array$from(iter); + if (typeof iter === 'string' || Object.prototype.toString.call(iter) === "[object Arguments]" || _isIterable(Object(iter))) return _Array$from(iter); } module.exports = _iterableToArray; \ No newline at end of file diff --git a/packages/babel-runtime/helpers/esm/iterableToArray.js b/packages/babel-runtime/helpers/esm/iterableToArray.js index 671e400d91..c4c5414154 100644 --- a/packages/babel-runtime/helpers/esm/iterableToArray.js +++ b/packages/babel-runtime/helpers/esm/iterableToArray.js @@ -1,3 +1,3 @@ export default function _iterableToArray(iter) { - if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); + if (typeof iter === 'string' || Object.prototype.toString.call(iter) === "[object Arguments]" || Symbol.iterator in Object(iter)) return Array.from(iter); } \ No newline at end of file diff --git a/packages/babel-runtime/helpers/iterableToArray.js b/packages/babel-runtime/helpers/iterableToArray.js index e917e57937..1670d4c8e1 100644 --- a/packages/babel-runtime/helpers/iterableToArray.js +++ b/packages/babel-runtime/helpers/iterableToArray.js @@ -1,5 +1,5 @@ function _iterableToArray(iter) { - if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); + if (typeof iter === 'string' || Object.prototype.toString.call(iter) === "[object Arguments]" || Symbol.iterator in Object(iter)) return Array.from(iter); } module.exports = _iterableToArray; \ No newline at end of file