From 7f8902f94b5defcdc1a26f06bd0f0077f2ccd320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Fri, 9 Apr 2021 12:03:21 +0200 Subject: [PATCH 1/5] Support iterating generators in browsers without `Symbol` --- packages/babel-helpers/src/helpers.js | 79 +++++++++---------- .../test/fixtures/regression/T7199/output.js | 2 +- .../fixtures/integration/array-rest/exec.js | 25 ++++++ .../integration/array-rest/options.json | 3 + .../fixtures/integration/array-spread/exec.js | 25 ++++++ .../integration/array-spread/options.json | 3 + .../test/fixtures/integration/for-of/exec.js | 19 +++++ .../fixtures/integration/for-of/options.json | 3 + .../usage-shippedProposals/output.js | 2 +- .../helpers/esm/iterableToArray.js | 4 +- .../helpers/iterableToArray.js | 4 +- .../helpers/esm/iterableToArray.js | 2 +- .../babel-runtime/helpers/iterableToArray.js | 2 +- 13 files changed, 122 insertions(+), 51 deletions(-) create mode 100644 packages/babel-plugin-transform-regenerator/test/fixtures/integration/array-rest/exec.js create mode 100644 packages/babel-plugin-transform-regenerator/test/fixtures/integration/array-rest/options.json create mode 100644 packages/babel-plugin-transform-regenerator/test/fixtures/integration/array-spread/exec.js create mode 100644 packages/babel-plugin-transform-regenerator/test/fixtures/integration/array-spread/options.json create mode 100644 packages/babel-plugin-transform-regenerator/test/fixtures/integration/for-of/exec.js create mode 100644 packages/babel-plugin-transform-regenerator/test/fixtures/integration/for-of/options.json diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index dbf457503cce..4610742547ad 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -83,18 +83,15 @@ helpers.jsx = helper("7.0.0-beta.0")` helpers.asyncIterator = helper("7.0.0-beta.0")` export default function _asyncIterator(iterable) { - var method + var method; if (typeof Symbol !== "undefined") { - if (Symbol.asyncIterator) { - method = iterable[Symbol.asyncIterator] - if (method != null) return method.call(iterable); - } - if (Symbol.iterator) { - method = iterable[Symbol.iterator] - if (method != null) return method.call(iterable); - } + if (Symbol.asyncIterator) method = iterable[Symbol.asyncIterator]; + if (method == null && Symbol.iterator) method = iterable[Symbol.iterator]; } - throw new TypeError("Object is not async iterable"); + if (method == null) method = iterable["@@asyncIterator"]; + if (method == null) method = iterable["@@iterator"] + if (method == null) throw new TypeError("Object is not async iterable"); + return method.call(iterable); } `; @@ -179,9 +176,7 @@ helpers.AsyncGenerator = helper("7.0.0-beta.0")` } } - if (typeof Symbol === "function" && Symbol.asyncIterator) { - AsyncGenerator.prototype[Symbol.asyncIterator] = function () { return this; }; - } + AsyncGenerator.prototype[typeof Symbol === "function" && Symbol.asyncIterator || "@@asyncIterator"] = function () { return this; }; AsyncGenerator.prototype.next = function (arg) { return this._invoke("next", arg); }; AsyncGenerator.prototype.throw = function (arg) { return this._invoke("throw", arg); }; @@ -216,9 +211,7 @@ helpers.asyncGeneratorDelegate = helper("7.0.0-beta.0")` return { done: false, value: awaitWrap(value) }; }; - if (typeof Symbol === "function" && Symbol.iterator) { - iter[Symbol.iterator] = function () { return this; }; - } + iter[typeof Symbol !== "undefined" && Symbol.iterator || "@@iterator"] = function () { return this; }; iter.next = function (value) { if (waiting) { @@ -1003,7 +996,7 @@ helpers.maybeArrayLike = helper("7.9.0")` helpers.iterableToArray = helper("7.0.0-beta.0")` export default function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); + if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } `; @@ -1019,14 +1012,15 @@ helpers.iterableToArrayLimit = helper("7.0.0-beta.0")` // _i = _iterator // _s = _step - if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; + var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]); + if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + for (_i = _i.call(arr), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } @@ -1046,10 +1040,11 @@ helpers.iterableToArrayLimit = helper("7.0.0-beta.0")` helpers.iterableToArrayLimitLoose = helper("7.0.0-beta.0")` export default function _iterableToArrayLimitLoose(arr, i) { - if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; + var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]); + if (_i == null) return; var _arr = []; - for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) { + for (_i = _i.call(arr), _step; !(_step = _i.next()).done;) { _arr.push(_step.value); if (i && _arr.length === i) break; } @@ -1104,8 +1099,9 @@ helpers.createForOfIteratorHelper = helper("7.9.0")` // f: finish (always called at the end) export default function _createForOfIteratorHelper(o, allowArrayLike) { - var it; - if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; + + if (!it) { // Fallback for engines without symbol support if ( Array.isArray(o) || @@ -1133,7 +1129,7 @@ helpers.createForOfIteratorHelper = helper("7.9.0")` return { s: function() { - it = o[Symbol.iterator](); + it = it.call(o); }, n: function() { var step = it.next(); @@ -1159,28 +1155,25 @@ helpers.createForOfIteratorHelperLoose = helper("7.9.0")` import unsupportedIterableToArray from "unsupportedIterableToArray"; export default function _createForOfIteratorHelperLoose(o, allowArrayLike) { - var it; - - if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { - // Fallback for engines without symbol support - if ( - Array.isArray(o) || - (it = unsupportedIterableToArray(o)) || - (allowArrayLike && o && typeof o.length === "number") - ) { - if (it) o = it; - var i = 0; - return function() { - if (i >= o.length) return { done: true }; - return { done: false, value: o[i++] }; - } + var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; + + if (it) return (it = it.call(o)).next.bind(it); + + // Fallback for engines without symbol support + if ( + Array.isArray(o) || + (it = unsupportedIterableToArray(o)) || + (allowArrayLike && o && typeof o.length === "number") + ) { + if (it) o = it; + var i = 0; + return function() { + if (i >= o.length) return { done: true }; + return { done: false, value: o[i++] }; } - - throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - it = o[Symbol.iterator](); - return it.next.bind(it); + throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } `; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/regression/T7199/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/regression/T7199/output.js index c6933130a9d1..0ecd8cb87597 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/regression/T7199/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/regression/T7199/output.js @@ -12,7 +12,7 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o = function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } -function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } +function _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]); if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (_i = _i.call(arr), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } diff --git a/packages/babel-plugin-transform-regenerator/test/fixtures/integration/array-rest/exec.js b/packages/babel-plugin-transform-regenerator/test/fixtures/integration/array-rest/exec.js new file mode 100644 index 000000000000..c316df74adb4 --- /dev/null +++ b/packages/babel-plugin-transform-regenerator/test/fixtures/integration/array-rest/exec.js @@ -0,0 +1,25 @@ +let iterable = function* fn() { + yield 0; + yield 1; + yield 2; +}(); + +let iteratorMethod = iterable[Symbol.iterator]; +iterable[Symbol.iterator] = undefined; + +expect(() => { + let [_, ...res] = iterable; +}).toThrow(/non-iterable/); + +// In older envs, regenerator uses @@iterator. +// In those browser Babel must delegate to Array.from, which +// needs to be polyfilled by the user and support @@iterator. +iterable["@@iterator"] = iteratorMethod; +Array.from = (it) => { + var i = it["@@iterator"](), arr = [], r; + while (!(r = it.next()).done) arr.push(r.value); + return arr; +}; + +let [_, ...res] = iterable; +expect(res).toEqual([1, 2]); diff --git a/packages/babel-plugin-transform-regenerator/test/fixtures/integration/array-rest/options.json b/packages/babel-plugin-transform-regenerator/test/fixtures/integration/array-rest/options.json new file mode 100644 index 000000000000..bbfe52ac4043 --- /dev/null +++ b/packages/babel-plugin-transform-regenerator/test/fixtures/integration/array-rest/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["transform-regenerator", "transform-destructuring"] +} diff --git a/packages/babel-plugin-transform-regenerator/test/fixtures/integration/array-spread/exec.js b/packages/babel-plugin-transform-regenerator/test/fixtures/integration/array-spread/exec.js new file mode 100644 index 000000000000..8d426bb61e83 --- /dev/null +++ b/packages/babel-plugin-transform-regenerator/test/fixtures/integration/array-spread/exec.js @@ -0,0 +1,25 @@ +let iterable = function* fn() { + yield 1; + yield 2; +}(); + +let iteratorMethod = iterable[Symbol.iterator]; +iterable[Symbol.iterator] = undefined; + +expect(() => { + [...iterable]; +}).toThrow(/non-iterable/); + +// In older envs, regenerator uses @@iterator. +// In those browser Babel must delegate to Array.from, which +// needs to be polyfilled by the user and support @@iterator. +iterable["@@iterator"] = iteratorMethod; +Array.from = (it) => { + var i = it["@@iterator"](), arr = [], r; + while (!(r = it.next()).done) arr.push(r.value); + return arr; +}; + +let res = [...iterable]; + +expect(res).toEqual([1, 2]); diff --git a/packages/babel-plugin-transform-regenerator/test/fixtures/integration/array-spread/options.json b/packages/babel-plugin-transform-regenerator/test/fixtures/integration/array-spread/options.json new file mode 100644 index 000000000000..5aa392c06d86 --- /dev/null +++ b/packages/babel-plugin-transform-regenerator/test/fixtures/integration/array-spread/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["transform-regenerator", "transform-spread"] +} diff --git a/packages/babel-plugin-transform-regenerator/test/fixtures/integration/for-of/exec.js b/packages/babel-plugin-transform-regenerator/test/fixtures/integration/for-of/exec.js new file mode 100644 index 000000000000..4df856086418 --- /dev/null +++ b/packages/babel-plugin-transform-regenerator/test/fixtures/integration/for-of/exec.js @@ -0,0 +1,19 @@ +let iterable = function* fn() { + yield 1; + yield 2; +}(); + +let iteratorMethod = iterable[Symbol.iterator]; +iterable[Symbol.iterator] = undefined; + +expect(() => { + for (let x of iterable); +}).toThrow(/non-iterable/); + +// In older envs, regenerator uses @@iterator. +iterable["@@iterator"] = iteratorMethod; + +let res = []; +for (let x of iterable) res.push(x); + +expect(res).toEqual([1, 2]); diff --git a/packages/babel-plugin-transform-regenerator/test/fixtures/integration/for-of/options.json b/packages/babel-plugin-transform-regenerator/test/fixtures/integration/for-of/options.json new file mode 100644 index 000000000000..19f4866a5102 --- /dev/null +++ b/packages/babel-plugin-transform-regenerator/test/fixtures/integration/for-of/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["transform-regenerator", "transform-for-of"] +} diff --git a/packages/babel-preset-env/test/fixtures/corejs2-babel-7/usage-shippedProposals/output.js b/packages/babel-preset-env/test/fixtures/corejs2-babel-7/usage-shippedProposals/output.js index 2387243e2fd6..1b0f5efcb4c2 100644 --- a/packages/babel-preset-env/test/fixtures/corejs2-babel-7/usage-shippedProposals/output.js +++ b/packages/babel-preset-env/test/fixtures/corejs2-babel-7/usage-shippedProposals/output.js @@ -42,7 +42,7 @@ function _wrapAsyncGenerator(fn) { return function () { return new _AsyncGenerat function _AsyncGenerator(gen) { var front, back; function send(key, arg) { return new Promise(function (resolve, reject) { var request = { key: key, arg: arg, resolve: resolve, reject: reject, next: null }; if (back) { back = back.next = request; } else { front = back = request; resume(key, arg); } }); } function resume(key, arg) { try { var result = gen[key](arg); var value = result.value; var wrappedAwait = value instanceof _AwaitValue; Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) { if (wrappedAwait) { resume(key === "return" ? "return" : "next", arg); return; } settle(result.done ? "return" : "normal", arg); }, function (err) { resume("throw", err); }); } catch (err) { settle("throw", err); } } function settle(type, value) { switch (type) { case "return": front.resolve({ value: value, done: true }); break; case "throw": front.reject(value); break; default: front.resolve({ value: value, done: false }); break; } front = front.next; if (front) { resume(front.key, front.arg); } else { back = null; } } this._invoke = send; if (typeof gen["return"] !== "function") { this["return"] = undefined; } } -if (typeof Symbol === "function" && Symbol.asyncIterator) { _AsyncGenerator.prototype[Symbol.asyncIterator] = function () { return this; }; } +_AsyncGenerator.prototype[typeof Symbol === "function" && Symbol.asyncIterator || "@@asyncIterator"] = function () { return this; }; _AsyncGenerator.prototype.next = function (arg) { return this._invoke("next", arg); }; diff --git a/packages/babel-runtime-corejs2/helpers/esm/iterableToArray.js b/packages/babel-runtime-corejs2/helpers/esm/iterableToArray.js index 35665f50c807..3165c0bf475f 100644 --- a/packages/babel-runtime-corejs2/helpers/esm/iterableToArray.js +++ b/packages/babel-runtime-corejs2/helpers/esm/iterableToArray.js @@ -1,6 +1,6 @@ import _Symbol from "@babel/runtime-corejs2/core-js/symbol"; -import _isIterable from "@babel/runtime-corejs2/core-js/is-iterable"; +import _Symbol$iterator from "@babel/runtime-corejs2/core-js/symbol/iterator"; import _Array$from from "@babel/runtime-corejs2/core-js/array/from"; export default function _iterableToArray(iter) { - if (typeof _Symbol !== "undefined" && _isIterable(Object(iter))) return _Array$from(iter); + if (typeof _Symbol !== "undefined" && iter[_Symbol$iterator] != null || iter["@@iterator"] != null) 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 3bd194c64308..76184cd3d85e 100644 --- a/packages/babel-runtime-corejs2/helpers/iterableToArray.js +++ b/packages/babel-runtime-corejs2/helpers/iterableToArray.js @@ -1,11 +1,11 @@ var _Symbol = require("@babel/runtime-corejs2/core-js/symbol"); -var _isIterable = require("@babel/runtime-corejs2/core-js/is-iterable"); +var _Symbol$iterator = require("@babel/runtime-corejs2/core-js/symbol/iterator"); var _Array$from = require("@babel/runtime-corejs2/core-js/array/from"); function _iterableToArray(iter) { - if (typeof _Symbol !== "undefined" && _isIterable(Object(iter))) return _Array$from(iter); + if (typeof _Symbol !== "undefined" && iter[_Symbol$iterator] != null || iter["@@iterator"] != null) return _Array$from(iter); } module.exports = _iterableToArray; diff --git a/packages/babel-runtime/helpers/esm/iterableToArray.js b/packages/babel-runtime/helpers/esm/iterableToArray.js index 6cd6ae353c37..cfe9fbd3bf9e 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 (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); + if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) 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 e5a5d6ba09f8..03f955d68ef8 100644 --- a/packages/babel-runtime/helpers/iterableToArray.js +++ b/packages/babel-runtime/helpers/iterableToArray.js @@ -1,5 +1,5 @@ function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); + if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } module.exports = _iterableToArray; From ac25acaa2ef470c7d30544bc19be553d34556918 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Fri, 9 Apr 2021 12:38:34 +0200 Subject: [PATCH 2/5] Update test --- .../test/fixtures/spread/non-iterable/exec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/non-iterable/exec.js b/packages/babel-plugin-transform-spread/test/fixtures/spread/non-iterable/exec.js index f00f0ae0cfcf..9d7b6e9d626a 100644 --- a/packages/babel-plugin-transform-spread/test/fixtures/spread/non-iterable/exec.js +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/non-iterable/exec.js @@ -1,6 +1,6 @@ var o = {}; -expect(() => [...undefined]).toThrow(/spread non-iterable/); +expect(() => [...undefined]).toThrow(/undefined is not iterable/); expect(() => [...o]).toThrow(/spread non-iterable/); From 46e7748284fc7341ffe1a418a8b72007a4b88b4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Thu, 15 Apr 2021 21:53:54 +0200 Subject: [PATCH 3/5] Different error message on Node.js 10 --- .../test/fixtures/spread/non-iterable/exec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/non-iterable/exec.js b/packages/babel-plugin-transform-spread/test/fixtures/spread/non-iterable/exec.js index 9d7b6e9d626a..52a372fdae6c 100644 --- a/packages/babel-plugin-transform-spread/test/fixtures/spread/non-iterable/exec.js +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/non-iterable/exec.js @@ -1,6 +1,6 @@ var o = {}; -expect(() => [...undefined]).toThrow(/undefined is not iterable/); +expect(() => [...undefined]).toThrow(/undefined is not iterable|property 'Symbol(Symbol.iterator)' of undefined/); expect(() => [...o]).toThrow(/spread non-iterable/); From 16276849005f41c9d53f46564f593d8caa7985b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Thu, 15 Apr 2021 22:04:40 +0200 Subject: [PATCH 4/5] Babel 8 test --- .../test/fixtures/corejs2/usage-shippedProposals/output.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-preset-env/test/fixtures/corejs2/usage-shippedProposals/output.js b/packages/babel-preset-env/test/fixtures/corejs2/usage-shippedProposals/output.js index 2387243e2fd6..1b0f5efcb4c2 100644 --- a/packages/babel-preset-env/test/fixtures/corejs2/usage-shippedProposals/output.js +++ b/packages/babel-preset-env/test/fixtures/corejs2/usage-shippedProposals/output.js @@ -42,7 +42,7 @@ function _wrapAsyncGenerator(fn) { return function () { return new _AsyncGenerat function _AsyncGenerator(gen) { var front, back; function send(key, arg) { return new Promise(function (resolve, reject) { var request = { key: key, arg: arg, resolve: resolve, reject: reject, next: null }; if (back) { back = back.next = request; } else { front = back = request; resume(key, arg); } }); } function resume(key, arg) { try { var result = gen[key](arg); var value = result.value; var wrappedAwait = value instanceof _AwaitValue; Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) { if (wrappedAwait) { resume(key === "return" ? "return" : "next", arg); return; } settle(result.done ? "return" : "normal", arg); }, function (err) { resume("throw", err); }); } catch (err) { settle("throw", err); } } function settle(type, value) { switch (type) { case "return": front.resolve({ value: value, done: true }); break; case "throw": front.reject(value); break; default: front.resolve({ value: value, done: false }); break; } front = front.next; if (front) { resume(front.key, front.arg); } else { back = null; } } this._invoke = send; if (typeof gen["return"] !== "function") { this["return"] = undefined; } } -if (typeof Symbol === "function" && Symbol.asyncIterator) { _AsyncGenerator.prototype[Symbol.asyncIterator] = function () { return this; }; } +_AsyncGenerator.prototype[typeof Symbol === "function" && Symbol.asyncIterator || "@@asyncIterator"] = function () { return this; }; _AsyncGenerator.prototype.next = function (arg) { return this._invoke("next", arg); }; From a664ac356914e52ebf6f382351e688acd3c399e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Thu, 15 Apr 2021 22:27:14 +0200 Subject: [PATCH 5/5] Fix --- .../test/fixtures/spread/non-iterable/exec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-plugin-transform-spread/test/fixtures/spread/non-iterable/exec.js b/packages/babel-plugin-transform-spread/test/fixtures/spread/non-iterable/exec.js index 52a372fdae6c..c46a6e946917 100644 --- a/packages/babel-plugin-transform-spread/test/fixtures/spread/non-iterable/exec.js +++ b/packages/babel-plugin-transform-spread/test/fixtures/spread/non-iterable/exec.js @@ -1,6 +1,6 @@ var o = {}; -expect(() => [...undefined]).toThrow(/undefined is not iterable|property 'Symbol(Symbol.iterator)' of undefined/); +expect(() => [...undefined]).toThrow(/undefined is not iterable|property 'Symbol\(Symbol\.iterator\)' of undefined/); expect(() => [...o]).toThrow(/spread non-iterable/);