Support iterating generators in browsers without Symbol (#13129)

This commit is contained in:
Nicolò Ribaudo 2021-04-15 23:47:53 +02:00 committed by GitHub
parent 5d55055537
commit 808d437cf4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 123 additions and 52 deletions

View File

@ -83,18 +83,15 @@ helpers.jsx = helper("7.0.0-beta.0")`
helpers.asyncIterator = helper("7.0.0-beta.0")` helpers.asyncIterator = helper("7.0.0-beta.0")`
export default function _asyncIterator(iterable) { export default function _asyncIterator(iterable) {
var method var method;
if (typeof Symbol !== "undefined") { if (typeof Symbol !== "undefined") {
if (Symbol.asyncIterator) { if (Symbol.asyncIterator) method = iterable[Symbol.asyncIterator];
method = iterable[Symbol.asyncIterator] if (method == null && Symbol.iterator) method = iterable[Symbol.iterator];
if (method != null) return method.call(iterable);
} }
if (Symbol.iterator) { if (method == null) method = iterable["@@asyncIterator"];
method = iterable[Symbol.iterator] if (method == null) method = iterable["@@iterator"]
if (method != null) return method.call(iterable); if (method == null) throw new TypeError("Object is not async iterable");
} return method.call(iterable);
}
throw new TypeError("Object is not async iterable");
} }
`; `;
@ -179,9 +176,7 @@ helpers.AsyncGenerator = helper("7.0.0-beta.0")`
} }
} }
if (typeof Symbol === "function" && Symbol.asyncIterator) { AsyncGenerator.prototype[typeof Symbol === "function" && Symbol.asyncIterator || "@@asyncIterator"] = function () { return this; };
AsyncGenerator.prototype[Symbol.asyncIterator] = function () { return this; };
}
AsyncGenerator.prototype.next = function (arg) { return this._invoke("next", arg); }; AsyncGenerator.prototype.next = function (arg) { return this._invoke("next", arg); };
AsyncGenerator.prototype.throw = function (arg) { return this._invoke("throw", 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) }; return { done: false, value: awaitWrap(value) };
}; };
if (typeof Symbol === "function" && Symbol.iterator) { iter[typeof Symbol !== "undefined" && Symbol.iterator || "@@iterator"] = function () { return this; };
iter[Symbol.iterator] = function () { return this; };
}
iter.next = function (value) { iter.next = function (value) {
if (waiting) { if (waiting) {
@ -1003,7 +996,7 @@ helpers.maybeArrayLike = helper("7.9.0")`
helpers.iterableToArray = helper("7.0.0-beta.0")` helpers.iterableToArray = helper("7.0.0-beta.0")`
export default function _iterableToArray(iter) { 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 // _i = _iterator
// _s = _step // _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 _arr = [];
var _n = true; var _n = true;
var _d = false; var _d = false;
var _e = undefined; var _e = undefined;
try { 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); _arr.push(_s.value);
if (i && _arr.length === i) break; 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")` helpers.iterableToArrayLimitLoose = helper("7.0.0-beta.0")`
export default function _iterableToArrayLimitLoose(arr, i) { 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 = []; 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); _arr.push(_step.value);
if (i && _arr.length === i) break; if (i && _arr.length === i) break;
} }
@ -1104,8 +1099,9 @@ helpers.createForOfIteratorHelper = helper("7.9.0")`
// f: finish (always called at the end) // f: finish (always called at the end)
export default function _createForOfIteratorHelper(o, allowArrayLike) { export default function _createForOfIteratorHelper(o, allowArrayLike) {
var it; var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
if (!it) {
// Fallback for engines without symbol support // Fallback for engines without symbol support
if ( if (
Array.isArray(o) || Array.isArray(o) ||
@ -1133,7 +1129,7 @@ helpers.createForOfIteratorHelper = helper("7.9.0")`
return { return {
s: function() { s: function() {
it = o[Symbol.iterator](); it = it.call(o);
}, },
n: function() { n: function() {
var step = it.next(); var step = it.next();
@ -1159,9 +1155,10 @@ helpers.createForOfIteratorHelperLoose = helper("7.9.0")`
import unsupportedIterableToArray from "unsupportedIterableToArray"; import unsupportedIterableToArray from "unsupportedIterableToArray";
export default function _createForOfIteratorHelperLoose(o, allowArrayLike) { export default function _createForOfIteratorHelperLoose(o, allowArrayLike) {
var it; var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
if (it) return (it = it.call(o)).next.bind(it);
if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
// Fallback for engines without symbol support // Fallback for engines without symbol support
if ( if (
Array.isArray(o) || Array.isArray(o) ||
@ -1178,10 +1175,6 @@ helpers.createForOfIteratorHelperLoose = helper("7.9.0")`
throw new TypeError("Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); 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);
}
`; `;
helpers.skipFirstGeneratorNext = helper("7.0.0-beta.0")` helpers.skipFirstGeneratorNext = helper("7.0.0-beta.0")`

View File

@ -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 _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; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }

View File

@ -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]);

View File

@ -0,0 +1,3 @@
{
"plugins": ["transform-regenerator", "transform-destructuring"]
}

View File

@ -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]);

View File

@ -0,0 +1,3 @@
{
"plugins": ["transform-regenerator", "transform-spread"]
}

View File

@ -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]);

View File

@ -0,0 +1,3 @@
{
"plugins": ["transform-regenerator", "transform-for-of"]
}

View File

@ -1,6 +1,6 @@
var o = {}; var o = {};
expect(() => [...undefined]).toThrow(/spread non-iterable/); expect(() => [...undefined]).toThrow(/undefined is not iterable|property 'Symbol\(Symbol\.iterator\)' of undefined/);
expect(() => [...o]).toThrow(/spread non-iterable/); expect(() => [...o]).toThrow(/spread non-iterable/);

View File

@ -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; } } 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); }; _AsyncGenerator.prototype.next = function (arg) { return this._invoke("next", arg); };

View File

@ -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; } } 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); }; _AsyncGenerator.prototype.next = function (arg) { return this._invoke("next", arg); };

View File

@ -1,6 +1,6 @@
import _Symbol from "@babel/runtime-corejs2/core-js/symbol"; 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"; import _Array$from from "@babel/runtime-corejs2/core-js/array/from";
export default function _iterableToArray(iter) { 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);
} }

View File

@ -1,11 +1,11 @@
var _Symbol = require("@babel/runtime-corejs2/core-js/symbol"); 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"); var _Array$from = require("@babel/runtime-corejs2/core-js/array/from");
function _iterableToArray(iter) { 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; module.exports = _iterableToArray;

View File

@ -1,3 +1,3 @@
export default function _iterableToArray(iter) { 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);
} }

View File

@ -1,5 +1,5 @@
function _iterableToArray(iter) { 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; module.exports = _iterableToArray;