polyfill-service
Version:
A polyfill combinator
302 lines (273 loc) • 7.11 kB
JavaScript
// 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
});
}());