UNPKG

polyfill-service

Version:
302 lines (273 loc) 7.11 kB
// Wrapped in IIFE to prevent leaking to global scope. (function () { 'use strict'; function toInteger(value) { var number = Number(value); return sign(number) * Math.floor(Math.abs(Math.min(Math.max(number || 0, 0), 9007199254740991))); } var has = Object.prototype.hasOwnProperty; var strValue = String.prototype.valueOf; var tryStringObject = function tryStringObject(value) { try { strValue.call(value); return true; } catch (e) { return false; } }; function sign(number) { return number >= 0 ? 1 : -1; } var toStr = Object.prototype.toString; var strClass = '[object String]'; var hasSymbols = typeof Symbol === 'function'; var hasToStringTag = hasSymbols && 'toStringTag' in Symbol; function isString(value) { if (typeof value === 'string') { return true; } if (typeof value !== 'object') { return false; } return hasToStringTag ? tryStringObject(value) : toStr.call(value) === strClass; } var fnToStr = Function.prototype.toString; var constructorRegex = /^\s*class /; var isES6ClassFn = function isES6ClassFn(value) { try { var fnStr = fnToStr.call(value); var singleStripped = fnStr.replace(/\/\/.*\n/g, ''); var multiStripped = singleStripped.replace(/\/\*[.\s\S]*\*\//g, ''); var spaceStripped = multiStripped.replace(/\n/mg, ' ').replace(/ {2}/g, ' '); return constructorRegex.test(spaceStripped); } catch (e) { return false; // not a function } }; var tryFunctionObject = function tryFunctionObject(value) { try { if (isES6ClassFn(value)) { return false; } fnToStr.call(value); return true; } catch (e) { return false; } }; var fnClass = '[object Function]'; var genClass = '[object GeneratorFunction]'; function isCallable(value) { if (!value) { return false; } if (typeof value !== 'function' && typeof value !== 'object') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } if (isES6ClassFn(value)) { return false; } var strClass = toStr.call(value); return strClass === fnClass || strClass === genClass; }; var isArray = Array.isArray; var parseIterable = function (iterator) { var done = false; var iterableResponse; var tempArray = []; if (iterator && typeof iterator.next === 'function') { while (!done) { iterableResponse = iterator.next(); if ( has.call(iterableResponse, 'value') && has.call(iterableResponse, 'done') ) { if (iterableResponse.done === true) { done = true; break; // eslint-disable-line no-restricted-syntax } else if (iterableResponse.done !== false) { break; // eslint-disable-line no-restricted-syntax } tempArray.push(iterableResponse.value); } else if (iterableResponse.done === true) { done = true; break; // eslint-disable-line no-restricted-syntax } else { break; // eslint-disable-line no-restricted-syntax } } } return done ? tempArray : false; }; var iteratorSymbol; var forOf; var hasSet = typeof Set === 'function'; var hasMap = typeof Map === 'function'; if (hasSymbols) { iteratorSymbol = Symbol.iterator; } else { var iterate; try { iterate = Function('iterable', 'var arr = []; for (var value of iterable) arr.push(value); return arr;'); // eslint-disable-line no-new-func } catch (e) {} var supportsStrIterator = (function () { try { var supported = false; var obj = { // eslint-disable-line no-unused-vars '@@iterator': function () { return { 'next': function () { supported = true; return { 'done': true, 'value': undefined }; } }; } }; iterate(obj); return supported; } catch (e) { return false; } }()); if (supportsStrIterator) { iteratorSymbol = '@@iterator'; } else if (typeof Set === 'function') { var s = new Set(); s.add(0); try { if (iterate(s).length === 1) { forOf = iterate; } } catch (e) {} } } var isSet; if (hasSet) { var setSize = Object.getOwnPropertyDescriptor(Set.prototype, 'size').get; isSet = function (set) { try { setSize.call(set); return true; } catch (e) { return false; } }; } var isMap; if (hasMap) { var mapSize = Object.getOwnPropertyDescriptor(Map.prototype, 'size').get; isMap = function (m) { try { mapSize.call(m); return true; } catch (e) { return false; } }; } var setForEach = hasSet && Set.prototype.forEach; var mapForEach = hasMap && Map.prototype.forEach; var usingIterator = function (items) { var tempArray = []; if (has.call(items, iteratorSymbol)) { return items[iteratorSymbol](); } else if (setForEach && isSet(items)) { setForEach.call(items, function (val) { tempArray.push(val); }); return { next: function () { return tempArray.length === 0 ? { done: true } : { value: tempArray.splice(0, 1)[0], done: false }; } }; } else if (mapForEach && isMap(items)) { mapForEach.call(items, function (val, key) { tempArray.push([key, val]); }); return { next: function () { return tempArray.length === 0 ? { done: true } : { value: tempArray.splice(0, 1)[0], done: false }; } }; } return items; }; var strMatch = String.prototype.match; var parseIterableLike = function (items) { var arr = parseIterable(usingIterator(items)); if (!arr) { if (isString(items)) { arr = strMatch.call(items, /[\uD800-\uDBFF][\uDC00-\uDFFF]?|[^\uD800-\uDFFF]|./g) || []; } else if (forOf && !isArray(items)) { // Safari 8's native Map or Set can't be iterated except with for..of try { arr = forOf(items); } catch (e) {} } } return arr || items; }; /*! https://mths.be/array-from v0.2.0 by @mathias */ Object.defineProperty(Array, 'from', { configurable: true, value: function from(items) { var C = this; if (items === null || typeof items === 'undefined') { throw new TypeError('`Array.from` requires an array-like object, not `null` or `undefined`'); } var mapFn, T; if (typeof arguments[1] !== 'undefined') { mapFn = arguments[1]; if (!isCallable(mapFn)) { throw new TypeError('When provided, the second argument to `Array.from` must be a function'); } if (arguments.length > 2) { T = arguments[2]; } } var arrayLike = Object(parseIterableLike(items)); var len = toInteger(arrayLike.length); var A = isCallable(C) ? Object(new C(len)) : new Array(len); var k = 0; var kValue, mappedValue; while (k < len) { kValue = arrayLike[k]; if (mapFn) { mappedValue = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.apply(T, [kValue, k]); } else { mappedValue = kValue; } Object.defineProperty(A, k, { 'configurable': true, 'enumerable': true, 'value': mappedValue, 'writable': true }); k += 1; } A.length = len; return A; }, writable: true }); }());