diff --git a/packages/babel-helpers/src/helpers.js b/packages/babel-helpers/src/helpers.js index 3290407184d0..68c88b906c30 100644 --- a/packages/babel-helpers/src/helpers.js +++ b/packages/babel-helpers/src/helpers.js @@ -879,40 +879,64 @@ helpers.temporalRef = helper("7.0.0-beta.0")` helpers.slicedToArray = helper("7.0.0-beta.0")` import arrayWithHoles from "arrayWithHoles"; import iterableToArrayLimit from "iterableToArrayLimit"; + import unsupportedIterableToArray from "unsupportedIterableToArray"; import nonIterableRest from "nonIterableRest"; export default function _slicedToArray(arr, i) { - return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest(); + return ( + arrayWithHoles(arr) || + iterableToArrayLimit(arr, i) || + unsupportedIterableToArray(arr) || + nonIterableRest() + ); } `; helpers.slicedToArrayLoose = helper("7.0.0-beta.0")` import arrayWithHoles from "arrayWithHoles"; import iterableToArrayLimitLoose from "iterableToArrayLimitLoose"; + import unsupportedIterableToArray from "unsupportedIterableToArray"; import nonIterableRest from "nonIterableRest"; export default function _slicedToArrayLoose(arr, i) { - return arrayWithHoles(arr) || iterableToArrayLimitLoose(arr, i) || nonIterableRest(); + return ( + arrayWithHoles(arr) || + iterableToArrayLimitLoose(arr, i) || + unsupportedIterableToArray(arr) || + nonIterableRest() + ); } `; helpers.toArray = helper("7.0.0-beta.0")` import arrayWithHoles from "arrayWithHoles"; import iterableToArray from "iterableToArray"; + import unsupportedIterableToArray from "unsupportedIterableToArray"; import nonIterableRest from "nonIterableRest"; export default function _toArray(arr) { - return arrayWithHoles(arr) || iterableToArray(arr) || nonIterableRest(); + return ( + arrayWithHoles(arr) || + iterableToArray(arr) || + unsupportedIterableToArray(arr) || + nonIterableRest() + ); } `; helpers.toConsumableArray = helper("7.0.0-beta.0")` import arrayWithoutHoles from "arrayWithoutHoles"; import iterableToArray from "iterableToArray"; + import unsupportedIterableToArray from "unsupportedIterableToArray"; import nonIterableSpread from "nonIterableSpread"; export default function _toConsumableArray(arr) { - return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread(); + return ( + arrayWithoutHoles(arr) || + iterableToArray(arr) || + unsupportedIterableToArray(arr) || + nonIterableSpread() + ); } `; @@ -933,11 +957,7 @@ helpers.arrayWithHoles = helper("7.0.0-beta.0")` helpers.iterableToArray = helper("7.0.0-beta.0")` export default function _iterableToArray(iter) { - if ( - typeof iter === 'string' - || Object.prototype.toString.call(iter) === "[object Arguments]" - || (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) - ) return Array.from(iter); + if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } `; @@ -953,10 +973,7 @@ helpers.iterableToArrayLimit = helper("7.0.0-beta.0")` // _i = _iterator // _s = _step - if ( - (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) && - Object.prototype.toString.call(arr) !== "[object Arguments]" - ) return; + if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; @@ -983,10 +1000,7 @@ 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))) && - Object.prototype.toString.call(arr) !== "[object Arguments]" - ) return; + if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) { @@ -997,6 +1011,21 @@ helpers.iterableToArrayLimitLoose = helper("7.0.0-beta.0")` } `; +helpers.unsupportedIterableToArray = helper("7.9.0")` + export default function _unsupportedIterableToArray(o) { + if (!o) return; + if (typeof o === "string") return Array.from(o); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if ( + n === "Arguments" || + n === "Map" || + n === "Set" || + /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) + ) return Array.from(o); + } +`; + helpers.nonIterableSpread = helper("7.0.0-beta.0")` export default function _nonIterableSpread() { throw new TypeError( 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 c41719ea46e4..82d9aa3f3d5b 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 @@ -4,11 +4,13 @@ var _foo = _interopRequireDefault(require("foo")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _iterableToArrayLimit(arr, i) { if ((typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) && Object.prototype.toString.call(arr) !== "[object Arguments]") 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 _unsupportedIterableToArray(o) { if (!o) return; if (typeof o === "string") return Array.from(o); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Arguments" || n === "Map" || n === "Set" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return Array.from(o); } + +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 _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } diff --git a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-not-ie/output.js b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-not-ie/output.js index a013b75063ca..e27409200d71 100644 --- a/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-not-ie/output.js +++ b/packages/babel-preset-env/test/fixtures/preset-options/browserslist-defaults-not-ie/output.js @@ -1,10 +1,12 @@ "use strict"; -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _iterableToArrayLimit(arr, i) { if ((typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) && Object.prototype.toString.call(arr) !== "[object Arguments]") 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 _unsupportedIterableToArray(o) { if (!o) return; if (typeof o === "string") return Array.from(o); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Arguments" || n === "Map" || n === "Set" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return Array.from(o); } + +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 _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } diff --git a/packages/babel-preset-env/test/fixtures/sanity/block-scoping-for-of/output.js b/packages/babel-preset-env/test/fixtures/sanity/block-scoping-for-of/output.js index 4e061ab31db5..e672410b1f00 100644 --- a/packages/babel-preset-env/test/fixtures/sanity/block-scoping-for-of/output.js +++ b/packages/babel-preset-env/test/fixtures/sanity/block-scoping-for-of/output.js @@ -1,8 +1,10 @@ -function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } +function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -function _iterableToArrayLimit(arr, i) { if ((typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) && Object.prototype.toString.call(arr) !== "[object Arguments]") 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 _unsupportedIterableToArray(o) { if (!o) return; if (typeof o === "string") return Array.from(o); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Arguments" || n === "Map" || n === "Set" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return Array.from(o); } + +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 _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } diff --git a/packages/babel-runtime-corejs2/helpers/esm/iterableToArray.js b/packages/babel-runtime-corejs2/helpers/esm/iterableToArray.js index 502a84d50ffb..a42a3a260c11 100644 --- a/packages/babel-runtime-corejs2/helpers/esm/iterableToArray.js +++ b/packages/babel-runtime-corejs2/helpers/esm/iterableToArray.js @@ -2,5 +2,5 @@ import _Array$from from "../../core-js/array/from"; import _isIterable from "../../core-js/is-iterable"; import _Symbol from "../../core-js/symbol"; export default function _iterableToArray(iter) { - if (typeof iter === 'string' || Object.prototype.toString.call(iter) === "[object Arguments]" || typeof _Symbol !== "undefined" && _isIterable(Object(iter))) return _Array$from(iter); + if (typeof _Symbol !== "undefined" && _isIterable(Object(iter))) return _Array$from(iter); } \ No newline at end of file diff --git a/packages/babel-runtime-corejs2/helpers/esm/toArray.js b/packages/babel-runtime-corejs2/helpers/esm/toArray.js index 5acb22b388ad..7d4a65d192d6 100644 --- a/packages/babel-runtime-corejs2/helpers/esm/toArray.js +++ b/packages/babel-runtime-corejs2/helpers/esm/toArray.js @@ -1,6 +1,7 @@ import arrayWithHoles from "./arrayWithHoles"; import iterableToArray from "./iterableToArray"; +import unsupportedIterableToArray from "./unsupportedIterableToArray"; import nonIterableRest from "./nonIterableRest"; export default function _toArray(arr) { - return arrayWithHoles(arr) || iterableToArray(arr) || nonIterableRest(); + return arrayWithHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableRest(); } \ 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 1dd709656c23..3a3579554e88 100644 --- a/packages/babel-runtime-corejs2/helpers/iterableToArray.js +++ b/packages/babel-runtime-corejs2/helpers/iterableToArray.js @@ -5,7 +5,7 @@ var _isIterable = require("../core-js/is-iterable"); var _Symbol = require("../core-js/symbol"); function _iterableToArray(iter) { - if (typeof iter === 'string' || Object.prototype.toString.call(iter) === "[object Arguments]" || typeof _Symbol !== "undefined" && _isIterable(Object(iter))) return _Array$from(iter); + if (typeof _Symbol !== "undefined" && _isIterable(Object(iter))) return _Array$from(iter); } module.exports = _iterableToArray; \ No newline at end of file diff --git a/packages/babel-runtime-corejs2/helpers/toArray.js b/packages/babel-runtime-corejs2/helpers/toArray.js index c28fd9e46ef9..f113822988de 100644 --- a/packages/babel-runtime-corejs2/helpers/toArray.js +++ b/packages/babel-runtime-corejs2/helpers/toArray.js @@ -2,10 +2,12 @@ var arrayWithHoles = require("./arrayWithHoles"); var iterableToArray = require("./iterableToArray"); +var unsupportedIterableToArray = require("./unsupportedIterableToArray"); + var nonIterableRest = require("./nonIterableRest"); function _toArray(arr) { - return arrayWithHoles(arr) || iterableToArray(arr) || nonIterableRest(); + return arrayWithHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableRest(); } module.exports = _toArray; \ 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 a680535864bd..6cd6ae353c37 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 iter === 'string' || Object.prototype.toString.call(iter) === "[object Arguments]" || typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); + if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } \ No newline at end of file diff --git a/packages/babel-runtime/helpers/esm/toArray.js b/packages/babel-runtime/helpers/esm/toArray.js index 5acb22b388ad..7d4a65d192d6 100644 --- a/packages/babel-runtime/helpers/esm/toArray.js +++ b/packages/babel-runtime/helpers/esm/toArray.js @@ -1,6 +1,7 @@ import arrayWithHoles from "./arrayWithHoles"; import iterableToArray from "./iterableToArray"; +import unsupportedIterableToArray from "./unsupportedIterableToArray"; import nonIterableRest from "./nonIterableRest"; export default function _toArray(arr) { - return arrayWithHoles(arr) || iterableToArray(arr) || nonIterableRest(); + return arrayWithHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableRest(); } \ No newline at end of file diff --git a/packages/babel-runtime/helpers/iterableToArray.js b/packages/babel-runtime/helpers/iterableToArray.js index bd49473c9977..954244b9fee4 100644 --- a/packages/babel-runtime/helpers/iterableToArray.js +++ b/packages/babel-runtime/helpers/iterableToArray.js @@ -1,5 +1,5 @@ function _iterableToArray(iter) { - if (typeof iter === 'string' || Object.prototype.toString.call(iter) === "[object Arguments]" || typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); + if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } module.exports = _iterableToArray; \ No newline at end of file diff --git a/packages/babel-runtime/helpers/toArray.js b/packages/babel-runtime/helpers/toArray.js index c28fd9e46ef9..f113822988de 100644 --- a/packages/babel-runtime/helpers/toArray.js +++ b/packages/babel-runtime/helpers/toArray.js @@ -2,10 +2,12 @@ var arrayWithHoles = require("./arrayWithHoles"); var iterableToArray = require("./iterableToArray"); +var unsupportedIterableToArray = require("./unsupportedIterableToArray"); + var nonIterableRest = require("./nonIterableRest"); function _toArray(arr) { - return arrayWithHoles(arr) || iterableToArray(arr) || nonIterableRest(); + return arrayWithHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableRest(); } module.exports = _toArray; \ No newline at end of file