3843 lines
134 KiB
JavaScript
3843 lines
134 KiB
JavaScript
|
/*!
|
|||
|
* https://github.com/paulmillr/es6-shim
|
|||
|
* @license es6-shim Copyright 2013-2016 by Paul Miller (http://paulmillr.com)
|
|||
|
* and contributors, MIT License
|
|||
|
* es6-shim: v0.35.1
|
|||
|
* see https://github.com/paulmillr/es6-shim/blob/0.35.1/LICENSE
|
|||
|
* Details and documentation:
|
|||
|
* https://github.com/paulmillr/es6-shim/
|
|||
|
*/
|
|||
|
|
|||
|
// UMD (Universal Module Definition)
|
|||
|
// see https://github.com/umdjs/umd/blob/master/returnExports.js
|
|||
|
(function (root, factory) {
|
|||
|
/*global define, module, exports */
|
|||
|
if (typeof define === 'function' && define.amd) {
|
|||
|
// AMD. Register as an anonymous module.
|
|||
|
define(factory);
|
|||
|
} else if (typeof exports === 'object') {
|
|||
|
// Node. Does not work with strict CommonJS, but
|
|||
|
// only CommonJS-like environments that support module.exports,
|
|||
|
// like Node.
|
|||
|
module.exports = factory();
|
|||
|
} else {
|
|||
|
// Browser globals (root is window)
|
|||
|
root.returnExports = factory();
|
|||
|
}
|
|||
|
}(this, function () {
|
|||
|
'use strict';
|
|||
|
|
|||
|
var _apply = Function.call.bind(Function.apply);
|
|||
|
var _call = Function.call.bind(Function.call);
|
|||
|
var isArray = Array.isArray;
|
|||
|
var keys = Object.keys;
|
|||
|
|
|||
|
var not = function notThunker(func) {
|
|||
|
return function notThunk() {
|
|||
|
return !_apply(func, this, arguments);
|
|||
|
};
|
|||
|
};
|
|||
|
var throwsError = function (func) {
|
|||
|
try {
|
|||
|
func();
|
|||
|
return false;
|
|||
|
} catch (e) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
};
|
|||
|
var valueOrFalseIfThrows = function valueOrFalseIfThrows(func) {
|
|||
|
try {
|
|||
|
return func();
|
|||
|
} catch (e) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
var isCallableWithoutNew = not(throwsError);
|
|||
|
var arePropertyDescriptorsSupported = function () {
|
|||
|
// if Object.defineProperty exists but throws, it's IE 8
|
|||
|
return !throwsError(function () {
|
|||
|
Object.defineProperty({}, 'x', { get: function () {} });
|
|||
|
});
|
|||
|
};
|
|||
|
var supportsDescriptors = !!Object.defineProperty && arePropertyDescriptorsSupported();
|
|||
|
var functionsHaveNames = (function foo() {}).name === 'foo'; // eslint-disable-line no-extra-parens
|
|||
|
|
|||
|
var _forEach = Function.call.bind(Array.prototype.forEach);
|
|||
|
var _reduce = Function.call.bind(Array.prototype.reduce);
|
|||
|
var _filter = Function.call.bind(Array.prototype.filter);
|
|||
|
var _some = Function.call.bind(Array.prototype.some);
|
|||
|
|
|||
|
var defineProperty = function (object, name, value, force) {
|
|||
|
if (!force && name in object) { return; }
|
|||
|
if (supportsDescriptors) {
|
|||
|
Object.defineProperty(object, name, {
|
|||
|
configurable: true,
|
|||
|
enumerable: false,
|
|||
|
writable: true,
|
|||
|
value: value
|
|||
|
});
|
|||
|
} else {
|
|||
|
object[name] = value;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
// Define configurable, writable and non-enumerable props
|
|||
|
// if they don’t exist.
|
|||
|
var defineProperties = function (object, map, forceOverride) {
|
|||
|
_forEach(keys(map), function (name) {
|
|||
|
var method = map[name];
|
|||
|
defineProperty(object, name, method, !!forceOverride);
|
|||
|
});
|
|||
|
};
|
|||
|
|
|||
|
var _toString = Function.call.bind(Object.prototype.toString);
|
|||
|
var isCallable = typeof /abc/ === 'function' ? function IsCallableSlow(x) {
|
|||
|
// Some old browsers (IE, FF) say that typeof /abc/ === 'function'
|
|||
|
return typeof x === 'function' && _toString(x) === '[object Function]';
|
|||
|
} : function IsCallableFast(x) { return typeof x === 'function'; };
|
|||
|
|
|||
|
var Value = {
|
|||
|
getter: function (object, name, getter) {
|
|||
|
if (!supportsDescriptors) {
|
|||
|
throw new TypeError('getters require true ES5 support');
|
|||
|
}
|
|||
|
Object.defineProperty(object, name, {
|
|||
|
configurable: true,
|
|||
|
enumerable: false,
|
|||
|
get: getter
|
|||
|
});
|
|||
|
},
|
|||
|
proxy: function (originalObject, key, targetObject) {
|
|||
|
if (!supportsDescriptors) {
|
|||
|
throw new TypeError('getters require true ES5 support');
|
|||
|
}
|
|||
|
var originalDescriptor = Object.getOwnPropertyDescriptor(originalObject, key);
|
|||
|
Object.defineProperty(targetObject, key, {
|
|||
|
configurable: originalDescriptor.configurable,
|
|||
|
enumerable: originalDescriptor.enumerable,
|
|||
|
get: function getKey() { return originalObject[key]; },
|
|||
|
set: function setKey(value) { originalObject[key] = value; }
|
|||
|
});
|
|||
|
},
|
|||
|
redefine: function (object, property, newValue) {
|
|||
|
if (supportsDescriptors) {
|
|||
|
var descriptor = Object.getOwnPropertyDescriptor(object, property);
|
|||
|
descriptor.value = newValue;
|
|||
|
Object.defineProperty(object, property, descriptor);
|
|||
|
} else {
|
|||
|
object[property] = newValue;
|
|||
|
}
|
|||
|
},
|
|||
|
defineByDescriptor: function (object, property, descriptor) {
|
|||
|
if (supportsDescriptors) {
|
|||
|
Object.defineProperty(object, property, descriptor);
|
|||
|
} else if ('value' in descriptor) {
|
|||
|
object[property] = descriptor.value;
|
|||
|
}
|
|||
|
},
|
|||
|
preserveToString: function (target, source) {
|
|||
|
if (source && isCallable(source.toString)) {
|
|||
|
defineProperty(target, 'toString', source.toString.bind(source), true);
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
// Simple shim for Object.create on ES3 browsers
|
|||
|
// (unlike real shim, no attempt to support `prototype === null`)
|
|||
|
var create = Object.create || function (prototype, properties) {
|
|||
|
var Prototype = function Prototype() {};
|
|||
|
Prototype.prototype = prototype;
|
|||
|
var object = new Prototype();
|
|||
|
if (typeof properties !== 'undefined') {
|
|||
|
keys(properties).forEach(function (key) {
|
|||
|
Value.defineByDescriptor(object, key, properties[key]);
|
|||
|
});
|
|||
|
}
|
|||
|
return object;
|
|||
|
};
|
|||
|
|
|||
|
var supportsSubclassing = function (C, f) {
|
|||
|
if (!Object.setPrototypeOf) { return false; /* skip test on IE < 11 */ }
|
|||
|
return valueOrFalseIfThrows(function () {
|
|||
|
var Sub = function Subclass(arg) {
|
|||
|
var o = new C(arg);
|
|||
|
Object.setPrototypeOf(o, Subclass.prototype);
|
|||
|
return o;
|
|||
|
};
|
|||
|
Object.setPrototypeOf(Sub, C);
|
|||
|
Sub.prototype = create(C.prototype, {
|
|||
|
constructor: { value: Sub }
|
|||
|
});
|
|||
|
return f(Sub);
|
|||
|
});
|
|||
|
};
|
|||
|
|
|||
|
var getGlobal = function () {
|
|||
|
/* global self, window, global */
|
|||
|
// the only reliable means to get the global object is
|
|||
|
// `Function('return this')()`
|
|||
|
// However, this causes CSP violations in Chrome apps.
|
|||
|
if (typeof self !== 'undefined') { return self; }
|
|||
|
if (typeof window !== 'undefined') { return window; }
|
|||
|
if (typeof global !== 'undefined') { return global; }
|
|||
|
throw new Error('unable to locate global object');
|
|||
|
};
|
|||
|
|
|||
|
var globals = getGlobal();
|
|||
|
var globalIsFinite = globals.isFinite;
|
|||
|
var _indexOf = Function.call.bind(String.prototype.indexOf);
|
|||
|
var _arrayIndexOfApply = Function.apply.bind(Array.prototype.indexOf);
|
|||
|
var _concat = Function.call.bind(Array.prototype.concat);
|
|||
|
// var _sort = Function.call.bind(Array.prototype.sort);
|
|||
|
var _strSlice = Function.call.bind(String.prototype.slice);
|
|||
|
var _push = Function.call.bind(Array.prototype.push);
|
|||
|
var _pushApply = Function.apply.bind(Array.prototype.push);
|
|||
|
var _shift = Function.call.bind(Array.prototype.shift);
|
|||
|
var _max = Math.max;
|
|||
|
var _min = Math.min;
|
|||
|
var _floor = Math.floor;
|
|||
|
var _abs = Math.abs;
|
|||
|
var _exp = Math.exp;
|
|||
|
var _log = Math.log;
|
|||
|
var _sqrt = Math.sqrt;
|
|||
|
var _hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);
|
|||
|
var ArrayIterator; // make our implementation private
|
|||
|
var noop = function () {};
|
|||
|
|
|||
|
var OrigMap = globals.Map;
|
|||
|
var origMapDelete = OrigMap && OrigMap.prototype['delete'];
|
|||
|
var origMapGet = OrigMap && OrigMap.prototype.get;
|
|||
|
var origMapHas = OrigMap && OrigMap.prototype.has;
|
|||
|
var origMapSet = OrigMap && OrigMap.prototype.set;
|
|||
|
|
|||
|
var Symbol = globals.Symbol || {};
|
|||
|
var symbolSpecies = Symbol.species || '@@species';
|
|||
|
|
|||
|
var numberIsNaN = Number.isNaN || function isNaN(value) {
|
|||
|
// NaN !== NaN, but they are identical.
|
|||
|
// NaNs are the only non-reflexive value, i.e., if x !== x,
|
|||
|
// then x is NaN.
|
|||
|
// isNaN is broken: it converts its argument to number, so
|
|||
|
// isNaN('foo') => true
|
|||
|
return value !== value;
|
|||
|
};
|
|||
|
var numberIsFinite = Number.isFinite || function isFinite(value) {
|
|||
|
return typeof value === 'number' && globalIsFinite(value);
|
|||
|
};
|
|||
|
var _sign = isCallable(Math.sign) ? Math.sign : function sign(value) {
|
|||
|
var number = Number(value);
|
|||
|
if (number === 0) { return number; }
|
|||
|
if (numberIsNaN(number)) { return number; }
|
|||
|
return number < 0 ? -1 : 1;
|
|||
|
};
|
|||
|
|
|||
|
// taken directly from https://github.com/ljharb/is-arguments/blob/master/index.js
|
|||
|
// can be replaced with require('is-arguments') if we ever use a build process instead
|
|||
|
var isStandardArguments = function isArguments(value) {
|
|||
|
return _toString(value) === '[object Arguments]';
|
|||
|
};
|
|||
|
var isLegacyArguments = function isArguments(value) {
|
|||
|
return value !== null &&
|
|||
|
typeof value === 'object' &&
|
|||
|
typeof value.length === 'number' &&
|
|||
|
value.length >= 0 &&
|
|||
|
_toString(value) !== '[object Array]' &&
|
|||
|
_toString(value.callee) === '[object Function]';
|
|||
|
};
|
|||
|
var isArguments = isStandardArguments(arguments) ? isStandardArguments : isLegacyArguments;
|
|||
|
|
|||
|
var Type = {
|
|||
|
primitive: function (x) { return x === null || (typeof x !== 'function' && typeof x !== 'object'); },
|
|||
|
string: function (x) { return _toString(x) === '[object String]'; },
|
|||
|
regex: function (x) { return _toString(x) === '[object RegExp]'; },
|
|||
|
symbol: function (x) {
|
|||
|
return typeof globals.Symbol === 'function' && typeof x === 'symbol';
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
var overrideNative = function overrideNative(object, property, replacement) {
|
|||
|
var original = object[property];
|
|||
|
defineProperty(object, property, replacement, true);
|
|||
|
Value.preserveToString(object[property], original);
|
|||
|
};
|
|||
|
|
|||
|
// eslint-disable-next-line no-restricted-properties
|
|||
|
var hasSymbols = typeof Symbol === 'function' && typeof Symbol['for'] === 'function' && Type.symbol(Symbol());
|
|||
|
|
|||
|
// This is a private name in the es6 spec, equal to '[Symbol.iterator]'
|
|||
|
// we're going to use an arbitrary _-prefixed name to make our shims
|
|||
|
// work properly with each other, even though we don't have full Iterator
|
|||
|
// support. That is, `Array.from(map.keys())` will work, but we don't
|
|||
|
// pretend to export a "real" Iterator interface.
|
|||
|
var $iterator$ = Type.symbol(Symbol.iterator) ? Symbol.iterator : '_es6-shim iterator_';
|
|||
|
// Firefox ships a partial implementation using the name @@iterator.
|
|||
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=907077#c14
|
|||
|
// So use that name if we detect it.
|
|||
|
if (globals.Set && typeof new globals.Set()['@@iterator'] === 'function') {
|
|||
|
$iterator$ = '@@iterator';
|
|||
|
}
|
|||
|
|
|||
|
// Reflect
|
|||
|
if (!globals.Reflect) {
|
|||
|
defineProperty(globals, 'Reflect', {}, true);
|
|||
|
}
|
|||
|
var Reflect = globals.Reflect;
|
|||
|
|
|||
|
var $String = String;
|
|||
|
|
|||
|
/* global document */
|
|||
|
var domAll = (typeof document === 'undefined' || !document) ? null : document.all;
|
|||
|
/* jshint eqnull:true */
|
|||
|
var isNullOrUndefined = domAll == null ? function isNullOrUndefined(x) {
|
|||
|
/* jshint eqnull:true */
|
|||
|
return x == null;
|
|||
|
} : function isNullOrUndefinedAndNotDocumentAll(x) {
|
|||
|
/* jshint eqnull:true */
|
|||
|
return x == null && x !== domAll;
|
|||
|
};
|
|||
|
|
|||
|
var ES = {
|
|||
|
// http://www.ecma-international.org/ecma-262/6.0/#sec-call
|
|||
|
Call: function Call(F, V) {
|
|||
|
var args = arguments.length > 2 ? arguments[2] : [];
|
|||
|
if (!ES.IsCallable(F)) {
|
|||
|
throw new TypeError(F + ' is not a function');
|
|||
|
}
|
|||
|
return _apply(F, V, args);
|
|||
|
},
|
|||
|
|
|||
|
RequireObjectCoercible: function (x, optMessage) {
|
|||
|
if (isNullOrUndefined(x)) {
|
|||
|
throw new TypeError(optMessage || 'Cannot call method on ' + x);
|
|||
|
}
|
|||
|
return x;
|
|||
|
},
|
|||
|
|
|||
|
// This might miss the "(non-standard exotic and does not implement
|
|||
|
// [[Call]])" case from
|
|||
|
// http://www.ecma-international.org/ecma-262/6.0/#sec-typeof-operator-runtime-semantics-evaluation
|
|||
|
// but we can't find any evidence these objects exist in practice.
|
|||
|
// If we find some in the future, you could test `Object(x) === x`,
|
|||
|
// which is reliable according to
|
|||
|
// http://www.ecma-international.org/ecma-262/6.0/#sec-toobject
|
|||
|
// but is not well optimized by runtimes and creates an object
|
|||
|
// whenever it returns false, and thus is very slow.
|
|||
|
TypeIsObject: function (x) {
|
|||
|
if (x === void 0 || x === null || x === true || x === false) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
return typeof x === 'function' || typeof x === 'object' || x === domAll;
|
|||
|
},
|
|||
|
|
|||
|
ToObject: function (o, optMessage) {
|
|||
|
return Object(ES.RequireObjectCoercible(o, optMessage));
|
|||
|
},
|
|||
|
|
|||
|
IsCallable: isCallable,
|
|||
|
|
|||
|
IsConstructor: function (x) {
|
|||
|
// We can't tell callables from constructors in ES5
|
|||
|
return ES.IsCallable(x);
|
|||
|
},
|
|||
|
|
|||
|
ToInt32: function (x) {
|
|||
|
return ES.ToNumber(x) >> 0;
|
|||
|
},
|
|||
|
|
|||
|
ToUint32: function (x) {
|
|||
|
return ES.ToNumber(x) >>> 0;
|
|||
|
},
|
|||
|
|
|||
|
ToNumber: function (value) {
|
|||
|
if (_toString(value) === '[object Symbol]') {
|
|||
|
throw new TypeError('Cannot convert a Symbol value to a number');
|
|||
|
}
|
|||
|
return +value;
|
|||
|
},
|
|||
|
|
|||
|
ToInteger: function (value) {
|
|||
|
var number = ES.ToNumber(value);
|
|||
|
if (numberIsNaN(number)) { return 0; }
|
|||
|
if (number === 0 || !numberIsFinite(number)) { return number; }
|
|||
|
return (number > 0 ? 1 : -1) * _floor(_abs(number));
|
|||
|
},
|
|||
|
|
|||
|
ToLength: function (value) {
|
|||
|
var len = ES.ToInteger(value);
|
|||
|
if (len <= 0) { return 0; } // includes converting -0 to +0
|
|||
|
if (len > Number.MAX_SAFE_INTEGER) { return Number.MAX_SAFE_INTEGER; }
|
|||
|
return len;
|
|||
|
},
|
|||
|
|
|||
|
SameValue: function (a, b) {
|
|||
|
if (a === b) {
|
|||
|
// 0 === -0, but they are not identical.
|
|||
|
if (a === 0) { return 1 / a === 1 / b; }
|
|||
|
return true;
|
|||
|
}
|
|||
|
return numberIsNaN(a) && numberIsNaN(b);
|
|||
|
},
|
|||
|
|
|||
|
SameValueZero: function (a, b) {
|
|||
|
// same as SameValue except for SameValueZero(+0, -0) == true
|
|||
|
return (a === b) || (numberIsNaN(a) && numberIsNaN(b));
|
|||
|
},
|
|||
|
|
|||
|
IsIterable: function (o) {
|
|||
|
return ES.TypeIsObject(o) && (typeof o[$iterator$] !== 'undefined' || isArguments(o));
|
|||
|
},
|
|||
|
|
|||
|
GetIterator: function (o) {
|
|||
|
if (isArguments(o)) {
|
|||
|
// special case support for `arguments`
|
|||
|
return new ArrayIterator(o, 'value');
|
|||
|
}
|
|||
|
var itFn = ES.GetMethod(o, $iterator$);
|
|||
|
if (!ES.IsCallable(itFn)) {
|
|||
|
// Better diagnostics if itFn is null or undefined
|
|||
|
throw new TypeError('value is not an iterable');
|
|||
|
}
|
|||
|
var it = ES.Call(itFn, o);
|
|||
|
if (!ES.TypeIsObject(it)) {
|
|||
|
throw new TypeError('bad iterator');
|
|||
|
}
|
|||
|
return it;
|
|||
|
},
|
|||
|
|
|||
|
GetMethod: function (o, p) {
|
|||
|
var func = ES.ToObject(o)[p];
|
|||
|
if (isNullOrUndefined(func)) {
|
|||
|
return void 0;
|
|||
|
}
|
|||
|
if (!ES.IsCallable(func)) {
|
|||
|
throw new TypeError('Method not callable: ' + p);
|
|||
|
}
|
|||
|
return func;
|
|||
|
},
|
|||
|
|
|||
|
IteratorComplete: function (iterResult) {
|
|||
|
return !!iterResult.done;
|
|||
|
},
|
|||
|
|
|||
|
IteratorClose: function (iterator, completionIsThrow) {
|
|||
|
var returnMethod = ES.GetMethod(iterator, 'return');
|
|||
|
if (returnMethod === void 0) {
|
|||
|
return;
|
|||
|
}
|
|||
|
var innerResult, innerException;
|
|||
|
try {
|
|||
|
innerResult = ES.Call(returnMethod, iterator);
|
|||
|
} catch (e) {
|
|||
|
innerException = e;
|
|||
|
}
|
|||
|
if (completionIsThrow) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (innerException) {
|
|||
|
throw innerException;
|
|||
|
}
|
|||
|
if (!ES.TypeIsObject(innerResult)) {
|
|||
|
throw new TypeError("Iterator's return method returned a non-object.");
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
IteratorNext: function (it) {
|
|||
|
var result = arguments.length > 1 ? it.next(arguments[1]) : it.next();
|
|||
|
if (!ES.TypeIsObject(result)) {
|
|||
|
throw new TypeError('bad iterator');
|
|||
|
}
|
|||
|
return result;
|
|||
|
},
|
|||
|
|
|||
|
IteratorStep: function (it) {
|
|||
|
var result = ES.IteratorNext(it);
|
|||
|
var done = ES.IteratorComplete(result);
|
|||
|
return done ? false : result;
|
|||
|
},
|
|||
|
|
|||
|
Construct: function (C, args, newTarget, isES6internal) {
|
|||
|
var target = typeof newTarget === 'undefined' ? C : newTarget;
|
|||
|
|
|||
|
if (!isES6internal && Reflect.construct) {
|
|||
|
// Try to use Reflect.construct if available
|
|||
|
return Reflect.construct(C, args, target);
|
|||
|
}
|
|||
|
// OK, we have to fake it. This will only work if the
|
|||
|
// C.[[ConstructorKind]] == "base" -- but that's the only
|
|||
|
// kind we can make in ES5 code anyway.
|
|||
|
|
|||
|
// OrdinaryCreateFromConstructor(target, "%ObjectPrototype%")
|
|||
|
var proto = target.prototype;
|
|||
|
if (!ES.TypeIsObject(proto)) {
|
|||
|
proto = Object.prototype;
|
|||
|
}
|
|||
|
var obj = create(proto);
|
|||
|
// Call the constructor.
|
|||
|
var result = ES.Call(C, obj, args);
|
|||
|
return ES.TypeIsObject(result) ? result : obj;
|
|||
|
},
|
|||
|
|
|||
|
SpeciesConstructor: function (O, defaultConstructor) {
|
|||
|
var C = O.constructor;
|
|||
|
if (C === void 0) {
|
|||
|
return defaultConstructor;
|
|||
|
}
|
|||
|
if (!ES.TypeIsObject(C)) {
|
|||
|
throw new TypeError('Bad constructor');
|
|||
|
}
|
|||
|
var S = C[symbolSpecies];
|
|||
|
if (isNullOrUndefined(S)) {
|
|||
|
return defaultConstructor;
|
|||
|
}
|
|||
|
if (!ES.IsConstructor(S)) {
|
|||
|
throw new TypeError('Bad @@species');
|
|||
|
}
|
|||
|
return S;
|
|||
|
},
|
|||
|
|
|||
|
CreateHTML: function (string, tag, attribute, value) {
|
|||
|
var S = ES.ToString(string);
|
|||
|
var p1 = '<' + tag;
|
|||
|
if (attribute !== '') {
|
|||
|
var V = ES.ToString(value);
|
|||
|
var escapedV = V.replace(/"/g, '"');
|
|||
|
p1 += ' ' + attribute + '="' + escapedV + '"';
|
|||
|
}
|
|||
|
var p2 = p1 + '>';
|
|||
|
var p3 = p2 + S;
|
|||
|
return p3 + '</' + tag + '>';
|
|||
|
},
|
|||
|
|
|||
|
IsRegExp: function IsRegExp(argument) {
|
|||
|
if (!ES.TypeIsObject(argument)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
var isRegExp = argument[Symbol.match];
|
|||
|
if (typeof isRegExp !== 'undefined') {
|
|||
|
return !!isRegExp;
|
|||
|
}
|
|||
|
return Type.regex(argument);
|
|||
|
},
|
|||
|
|
|||
|
ToString: function ToString(string) {
|
|||
|
return $String(string);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
// Well-known Symbol shims
|
|||
|
if (supportsDescriptors && hasSymbols) {
|
|||
|
var defineWellKnownSymbol = function defineWellKnownSymbol(name) {
|
|||
|
if (Type.symbol(Symbol[name])) {
|
|||
|
return Symbol[name];
|
|||
|
}
|
|||
|
// eslint-disable-next-line no-restricted-properties
|
|||
|
var sym = Symbol['for']('Symbol.' + name);
|
|||
|
Object.defineProperty(Symbol, name, {
|
|||
|
configurable: false,
|
|||
|
enumerable: false,
|
|||
|
writable: false,
|
|||
|
value: sym
|
|||
|
});
|
|||
|
return sym;
|
|||
|
};
|
|||
|
if (!Type.symbol(Symbol.search)) {
|
|||
|
var symbolSearch = defineWellKnownSymbol('search');
|
|||
|
var originalSearch = String.prototype.search;
|
|||
|
defineProperty(RegExp.prototype, symbolSearch, function search(string) {
|
|||
|
return ES.Call(originalSearch, string, [this]);
|
|||
|
});
|
|||
|
var searchShim = function search(regexp) {
|
|||
|
var O = ES.RequireObjectCoercible(this);
|
|||
|
if (!isNullOrUndefined(regexp)) {
|
|||
|
var searcher = ES.GetMethod(regexp, symbolSearch);
|
|||
|
if (typeof searcher !== 'undefined') {
|
|||
|
return ES.Call(searcher, regexp, [O]);
|
|||
|
}
|
|||
|
}
|
|||
|
return ES.Call(originalSearch, O, [ES.ToString(regexp)]);
|
|||
|
};
|
|||
|
overrideNative(String.prototype, 'search', searchShim);
|
|||
|
}
|
|||
|
if (!Type.symbol(Symbol.replace)) {
|
|||
|
var symbolReplace = defineWellKnownSymbol('replace');
|
|||
|
var originalReplace = String.prototype.replace;
|
|||
|
defineProperty(RegExp.prototype, symbolReplace, function replace(string, replaceValue) {
|
|||
|
return ES.Call(originalReplace, string, [this, replaceValue]);
|
|||
|
});
|
|||
|
var replaceShim = function replace(searchValue, replaceValue) {
|
|||
|
var O = ES.RequireObjectCoercible(this);
|
|||
|
if (!isNullOrUndefined(searchValue)) {
|
|||
|
var replacer = ES.GetMethod(searchValue, symbolReplace);
|
|||
|
if (typeof replacer !== 'undefined') {
|
|||
|
return ES.Call(replacer, searchValue, [O, replaceValue]);
|
|||
|
}
|
|||
|
}
|
|||
|
return ES.Call(originalReplace, O, [ES.ToString(searchValue), replaceValue]);
|
|||
|
};
|
|||
|
overrideNative(String.prototype, 'replace', replaceShim);
|
|||
|
}
|
|||
|
if (!Type.symbol(Symbol.split)) {
|
|||
|
var symbolSplit = defineWellKnownSymbol('split');
|
|||
|
var originalSplit = String.prototype.split;
|
|||
|
defineProperty(RegExp.prototype, symbolSplit, function split(string, limit) {
|
|||
|
return ES.Call(originalSplit, string, [this, limit]);
|
|||
|
});
|
|||
|
var splitShim = function split(separator, limit) {
|
|||
|
var O = ES.RequireObjectCoercible(this);
|
|||
|
if (!isNullOrUndefined(separator)) {
|
|||
|
var splitter = ES.GetMethod(separator, symbolSplit);
|
|||
|
if (typeof splitter !== 'undefined') {
|
|||
|
return ES.Call(splitter, separator, [O, limit]);
|
|||
|
}
|
|||
|
}
|
|||
|
return ES.Call(originalSplit, O, [ES.ToString(separator), limit]);
|
|||
|
};
|
|||
|
overrideNative(String.prototype, 'split', splitShim);
|
|||
|
}
|
|||
|
var symbolMatchExists = Type.symbol(Symbol.match);
|
|||
|
var stringMatchIgnoresSymbolMatch = symbolMatchExists && (function () {
|
|||
|
// Firefox 41, through Nightly 45 has Symbol.match, but String#match ignores it.
|
|||
|
// Firefox 40 and below have Symbol.match but String#match works fine.
|
|||
|
var o = {};
|
|||
|
o[Symbol.match] = function () { return 42; };
|
|||
|
return 'a'.match(o) !== 42;
|
|||
|
}());
|
|||
|
if (!symbolMatchExists || stringMatchIgnoresSymbolMatch) {
|
|||
|
var symbolMatch = defineWellKnownSymbol('match');
|
|||
|
|
|||
|
var originalMatch = String.prototype.match;
|
|||
|
defineProperty(RegExp.prototype, symbolMatch, function match(string) {
|
|||
|
return ES.Call(originalMatch, string, [this]);
|
|||
|
});
|
|||
|
|
|||
|
var matchShim = function match(regexp) {
|
|||
|
var O = ES.RequireObjectCoercible(this);
|
|||
|
if (!isNullOrUndefined(regexp)) {
|
|||
|
var matcher = ES.GetMethod(regexp, symbolMatch);
|
|||
|
if (typeof matcher !== 'undefined') {
|
|||
|
return ES.Call(matcher, regexp, [O]);
|
|||
|
}
|
|||
|
}
|
|||
|
return ES.Call(originalMatch, O, [ES.ToString(regexp)]);
|
|||
|
};
|
|||
|
overrideNative(String.prototype, 'match', matchShim);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var wrapConstructor = function wrapConstructor(original, replacement, keysToSkip) {
|
|||
|
Value.preserveToString(replacement, original);
|
|||
|
if (Object.setPrototypeOf) {
|
|||
|
// sets up proper prototype chain where possible
|
|||
|
Object.setPrototypeOf(original, replacement);
|
|||
|
}
|
|||
|
if (supportsDescriptors) {
|
|||
|
_forEach(Object.getOwnPropertyNames(original), function (key) {
|
|||
|
if (key in noop || keysToSkip[key]) { return; }
|
|||
|
Value.proxy(original, key, replacement);
|
|||
|
});
|
|||
|
} else {
|
|||
|
_forEach(Object.keys(original), function (key) {
|
|||
|
if (key in noop || keysToSkip[key]) { return; }
|
|||
|
replacement[key] = original[key];
|
|||
|
});
|
|||
|
}
|
|||
|
replacement.prototype = original.prototype;
|
|||
|
Value.redefine(original.prototype, 'constructor', replacement);
|
|||
|
};
|
|||
|
|
|||
|
var defaultSpeciesGetter = function () { return this; };
|
|||
|
var addDefaultSpecies = function (C) {
|
|||
|
if (supportsDescriptors && !_hasOwnProperty(C, symbolSpecies)) {
|
|||
|
Value.getter(C, symbolSpecies, defaultSpeciesGetter);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
var addIterator = function (prototype, impl) {
|
|||
|
var implementation = impl || function iterator() { return this; };
|
|||
|
defineProperty(prototype, $iterator$, implementation);
|
|||
|
if (!prototype[$iterator$] && Type.symbol($iterator$)) {
|
|||
|
// implementations are buggy when $iterator$ is a Symbol
|
|||
|
prototype[$iterator$] = implementation;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
var createDataProperty = function createDataProperty(object, name, value) {
|
|||
|
if (supportsDescriptors) {
|
|||
|
Object.defineProperty(object, name, {
|
|||
|
configurable: true,
|
|||
|
enumerable: true,
|
|||
|
writable: true,
|
|||
|
value: value
|
|||
|
});
|
|||
|
} else {
|
|||
|
object[name] = value;
|
|||
|
}
|
|||
|
};
|
|||
|
var createDataPropertyOrThrow = function createDataPropertyOrThrow(object, name, value) {
|
|||
|
createDataProperty(object, name, value);
|
|||
|
if (!ES.SameValue(object[name], value)) {
|
|||
|
throw new TypeError('property is nonconfigurable');
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
var emulateES6construct = function (o, defaultNewTarget, defaultProto, slots) {
|
|||
|
// This is an es5 approximation to es6 construct semantics. in es6,
|
|||
|
// 'new Foo' invokes Foo.[[Construct]] which (for almost all objects)
|
|||
|
// just sets the internal variable NewTarget (in es6 syntax `new.target`)
|
|||
|
// to Foo and then returns Foo().
|
|||
|
|
|||
|
// Many ES6 object then have constructors of the form:
|
|||
|
// 1. If NewTarget is undefined, throw a TypeError exception
|
|||
|
// 2. Let xxx by OrdinaryCreateFromConstructor(NewTarget, yyy, zzz)
|
|||
|
|
|||
|
// So we're going to emulate those first two steps.
|
|||
|
if (!ES.TypeIsObject(o)) {
|
|||
|
throw new TypeError('Constructor requires `new`: ' + defaultNewTarget.name);
|
|||
|
}
|
|||
|
var proto = defaultNewTarget.prototype;
|
|||
|
if (!ES.TypeIsObject(proto)) {
|
|||
|
proto = defaultProto;
|
|||
|
}
|
|||
|
var obj = create(proto);
|
|||
|
for (var name in slots) {
|
|||
|
if (_hasOwnProperty(slots, name)) {
|
|||
|
var value = slots[name];
|
|||
|
defineProperty(obj, name, value, true);
|
|||
|
}
|
|||
|
}
|
|||
|
return obj;
|
|||
|
};
|
|||
|
|
|||
|
// Firefox 31 reports this function's length as 0
|
|||
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=1062484
|
|||
|
if (String.fromCodePoint && String.fromCodePoint.length !== 1) {
|
|||
|
var originalFromCodePoint = String.fromCodePoint;
|
|||
|
overrideNative(String, 'fromCodePoint', function fromCodePoint(codePoints) {
|
|||
|
return ES.Call(originalFromCodePoint, this, arguments);
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
var StringShims = {
|
|||
|
fromCodePoint: function fromCodePoint(codePoints) {
|
|||
|
var result = [];
|
|||
|
var next;
|
|||
|
for (var i = 0, length = arguments.length; i < length; i++) {
|
|||
|
next = Number(arguments[i]);
|
|||
|
if (!ES.SameValue(next, ES.ToInteger(next)) || next < 0 || next > 0x10FFFF) {
|
|||
|
throw new RangeError('Invalid code point ' + next);
|
|||
|
}
|
|||
|
|
|||
|
if (next < 0x10000) {
|
|||
|
_push(result, String.fromCharCode(next));
|
|||
|
} else {
|
|||
|
next -= 0x10000;
|
|||
|
_push(result, String.fromCharCode((next >> 10) + 0xD800));
|
|||
|
_push(result, String.fromCharCode((next % 0x400) + 0xDC00));
|
|||
|
}
|
|||
|
}
|
|||
|
return result.join('');
|
|||
|
},
|
|||
|
|
|||
|
raw: function raw(callSite) {
|
|||
|
var cooked = ES.ToObject(callSite, 'bad callSite');
|
|||
|
var rawString = ES.ToObject(cooked.raw, 'bad raw value');
|
|||
|
var len = rawString.length;
|
|||
|
var literalsegments = ES.ToLength(len);
|
|||
|
if (literalsegments <= 0) {
|
|||
|
return '';
|
|||
|
}
|
|||
|
|
|||
|
var stringElements = [];
|
|||
|
var nextIndex = 0;
|
|||
|
var nextKey, next, nextSeg, nextSub;
|
|||
|
while (nextIndex < literalsegments) {
|
|||
|
nextKey = ES.ToString(nextIndex);
|
|||
|
nextSeg = ES.ToString(rawString[nextKey]);
|
|||
|
_push(stringElements, nextSeg);
|
|||
|
if (nextIndex + 1 >= literalsegments) {
|
|||
|
break;
|
|||
|
}
|
|||
|
next = nextIndex + 1 < arguments.length ? arguments[nextIndex + 1] : '';
|
|||
|
nextSub = ES.ToString(next);
|
|||
|
_push(stringElements, nextSub);
|
|||
|
nextIndex += 1;
|
|||
|
}
|
|||
|
return stringElements.join('');
|
|||
|
}
|
|||
|
};
|
|||
|
if (String.raw && String.raw({ raw: { 0: 'x', 1: 'y', length: 2 } }) !== 'xy') {
|
|||
|
// IE 11 TP has a broken String.raw implementation
|
|||
|
overrideNative(String, 'raw', StringShims.raw);
|
|||
|
}
|
|||
|
defineProperties(String, StringShims);
|
|||
|
|
|||
|
// Fast repeat, uses the `Exponentiation by squaring` algorithm.
|
|||
|
// Perf: http://jsperf.com/string-repeat2/2
|
|||
|
var stringRepeat = function repeat(s, times) {
|
|||
|
if (times < 1) { return ''; }
|
|||
|
if (times % 2) { return repeat(s, times - 1) + s; }
|
|||
|
var half = repeat(s, times / 2);
|
|||
|
return half + half;
|
|||
|
};
|
|||
|
var stringMaxLength = Infinity;
|
|||
|
|
|||
|
var StringPrototypeShims = {
|
|||
|
repeat: function repeat(times) {
|
|||
|
var thisStr = ES.ToString(ES.RequireObjectCoercible(this));
|
|||
|
var numTimes = ES.ToInteger(times);
|
|||
|
if (numTimes < 0 || numTimes >= stringMaxLength) {
|
|||
|
throw new RangeError('repeat count must be less than infinity and not overflow maximum string size');
|
|||
|
}
|
|||
|
return stringRepeat(thisStr, numTimes);
|
|||
|
},
|
|||
|
|
|||
|
startsWith: function startsWith(searchString) {
|
|||
|
var S = ES.ToString(ES.RequireObjectCoercible(this));
|
|||
|
if (ES.IsRegExp(searchString)) {
|
|||
|
throw new TypeError('Cannot call method "startsWith" with a regex');
|
|||
|
}
|
|||
|
var searchStr = ES.ToString(searchString);
|
|||
|
var position;
|
|||
|
if (arguments.length > 1) {
|
|||
|
position = arguments[1];
|
|||
|
}
|
|||
|
var start = _max(ES.ToInteger(position), 0);
|
|||
|
return _strSlice(S, start, start + searchStr.length) === searchStr;
|
|||
|
},
|
|||
|
|
|||
|
endsWith: function endsWith(searchString) {
|
|||
|
var S = ES.ToString(ES.RequireObjectCoercible(this));
|
|||
|
if (ES.IsRegExp(searchString)) {
|
|||
|
throw new TypeError('Cannot call method "endsWith" with a regex');
|
|||
|
}
|
|||
|
var searchStr = ES.ToString(searchString);
|
|||
|
var len = S.length;
|
|||
|
var endPosition;
|
|||
|
if (arguments.length > 1) {
|
|||
|
endPosition = arguments[1];
|
|||
|
}
|
|||
|
var pos = typeof endPosition === 'undefined' ? len : ES.ToInteger(endPosition);
|
|||
|
var end = _min(_max(pos, 0), len);
|
|||
|
return _strSlice(S, end - searchStr.length, end) === searchStr;
|
|||
|
},
|
|||
|
|
|||
|
includes: function includes(searchString) {
|
|||
|
if (ES.IsRegExp(searchString)) {
|
|||
|
throw new TypeError('"includes" does not accept a RegExp');
|
|||
|
}
|
|||
|
var searchStr = ES.ToString(searchString);
|
|||
|
var position;
|
|||
|
if (arguments.length > 1) {
|
|||
|
position = arguments[1];
|
|||
|
}
|
|||
|
// Somehow this trick makes method 100% compat with the spec.
|
|||
|
return _indexOf(this, searchStr, position) !== -1;
|
|||
|
},
|
|||
|
|
|||
|
codePointAt: function codePointAt(pos) {
|
|||
|
var thisStr = ES.ToString(ES.RequireObjectCoercible(this));
|
|||
|
var position = ES.ToInteger(pos);
|
|||
|
var length = thisStr.length;
|
|||
|
if (position >= 0 && position < length) {
|
|||
|
var first = thisStr.charCodeAt(position);
|
|||
|
var isEnd = position + 1 === length;
|
|||
|
if (first < 0xD800 || first > 0xDBFF || isEnd) { return first; }
|
|||
|
var second = thisStr.charCodeAt(position + 1);
|
|||
|
if (second < 0xDC00 || second > 0xDFFF) { return first; }
|
|||
|
return ((first - 0xD800) * 1024) + (second - 0xDC00) + 0x10000;
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
if (String.prototype.includes && 'a'.includes('a', Infinity) !== false) {
|
|||
|
overrideNative(String.prototype, 'includes', StringPrototypeShims.includes);
|
|||
|
}
|
|||
|
|
|||
|
if (String.prototype.startsWith && String.prototype.endsWith) {
|
|||
|
var startsWithRejectsRegex = throwsError(function () {
|
|||
|
/* throws if spec-compliant */
|
|||
|
'/a/'.startsWith(/a/);
|
|||
|
});
|
|||
|
var startsWithHandlesInfinity = valueOrFalseIfThrows(function () {
|
|||
|
return 'abc'.startsWith('a', Infinity) === false;
|
|||
|
});
|
|||
|
if (!startsWithRejectsRegex || !startsWithHandlesInfinity) {
|
|||
|
// Firefox (< 37?) and IE 11 TP have a noncompliant startsWith implementation
|
|||
|
overrideNative(String.prototype, 'startsWith', StringPrototypeShims.startsWith);
|
|||
|
overrideNative(String.prototype, 'endsWith', StringPrototypeShims.endsWith);
|
|||
|
}
|
|||
|
}
|
|||
|
if (hasSymbols) {
|
|||
|
var startsWithSupportsSymbolMatch = valueOrFalseIfThrows(function () {
|
|||
|
var re = /a/;
|
|||
|
re[Symbol.match] = false;
|
|||
|
return '/a/'.startsWith(re);
|
|||
|
});
|
|||
|
if (!startsWithSupportsSymbolMatch) {
|
|||
|
overrideNative(String.prototype, 'startsWith', StringPrototypeShims.startsWith);
|
|||
|
}
|
|||
|
var endsWithSupportsSymbolMatch = valueOrFalseIfThrows(function () {
|
|||
|
var re = /a/;
|
|||
|
re[Symbol.match] = false;
|
|||
|
return '/a/'.endsWith(re);
|
|||
|
});
|
|||
|
if (!endsWithSupportsSymbolMatch) {
|
|||
|
overrideNative(String.prototype, 'endsWith', StringPrototypeShims.endsWith);
|
|||
|
}
|
|||
|
var includesSupportsSymbolMatch = valueOrFalseIfThrows(function () {
|
|||
|
var re = /a/;
|
|||
|
re[Symbol.match] = false;
|
|||
|
return '/a/'.includes(re);
|
|||
|
});
|
|||
|
if (!includesSupportsSymbolMatch) {
|
|||
|
overrideNative(String.prototype, 'includes', StringPrototypeShims.includes);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
defineProperties(String.prototype, StringPrototypeShims);
|
|||
|
|
|||
|
// whitespace from: http://es5.github.io/#x15.5.4.20
|
|||
|
// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
|
|||
|
var ws = [
|
|||
|
'\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
|
|||
|
'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
|
|||
|
'\u2029\uFEFF'
|
|||
|
].join('');
|
|||
|
var trimRegexp = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
|
|||
|
var trimShim = function trim() {
|
|||
|
return ES.ToString(ES.RequireObjectCoercible(this)).replace(trimRegexp, '');
|
|||
|
};
|
|||
|
var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
|
|||
|
var nonWSregex = new RegExp('[' + nonWS + ']', 'g');
|
|||
|
var isBadHexRegex = /^[-+]0x[0-9a-f]+$/i;
|
|||
|
var hasStringTrimBug = nonWS.trim().length !== nonWS.length;
|
|||
|
defineProperty(String.prototype, 'trim', trimShim, hasStringTrimBug);
|
|||
|
|
|||
|
// Given an argument x, it will return an IteratorResult object,
|
|||
|
// with value set to x and done to false.
|
|||
|
// Given no arguments, it will return an iterator completion object.
|
|||
|
var iteratorResult = function (x) {
|
|||
|
return { value: x, done: arguments.length === 0 };
|
|||
|
};
|
|||
|
|
|||
|
// see http://www.ecma-international.org/ecma-262/6.0/#sec-string.prototype-@@iterator
|
|||
|
var StringIterator = function (s) {
|
|||
|
ES.RequireObjectCoercible(s);
|
|||
|
this._s = ES.ToString(s);
|
|||
|
this._i = 0;
|
|||
|
};
|
|||
|
StringIterator.prototype.next = function () {
|
|||
|
var s = this._s;
|
|||
|
var i = this._i;
|
|||
|
if (typeof s === 'undefined' || i >= s.length) {
|
|||
|
this._s = void 0;
|
|||
|
return iteratorResult();
|
|||
|
}
|
|||
|
var first = s.charCodeAt(i);
|
|||
|
var second, len;
|
|||
|
if (first < 0xD800 || first > 0xDBFF || (i + 1) === s.length) {
|
|||
|
len = 1;
|
|||
|
} else {
|
|||
|
second = s.charCodeAt(i + 1);
|
|||
|
len = (second < 0xDC00 || second > 0xDFFF) ? 1 : 2;
|
|||
|
}
|
|||
|
this._i = i + len;
|
|||
|
return iteratorResult(s.substr(i, len));
|
|||
|
};
|
|||
|
addIterator(StringIterator.prototype);
|
|||
|
addIterator(String.prototype, function () {
|
|||
|
return new StringIterator(this);
|
|||
|
});
|
|||
|
|
|||
|
var ArrayShims = {
|
|||
|
from: function from(items) {
|
|||
|
var C = this;
|
|||
|
var mapFn;
|
|||
|
if (arguments.length > 1) {
|
|||
|
mapFn = arguments[1];
|
|||
|
}
|
|||
|
var mapping, T;
|
|||
|
if (typeof mapFn === 'undefined') {
|
|||
|
mapping = false;
|
|||
|
} else {
|
|||
|
if (!ES.IsCallable(mapFn)) {
|
|||
|
throw new TypeError('Array.from: when provided, the second argument must be a function');
|
|||
|
}
|
|||
|
if (arguments.length > 2) {
|
|||
|
T = arguments[2];
|
|||
|
}
|
|||
|
mapping = true;
|
|||
|
}
|
|||
|
|
|||
|
// Note that that Arrays will use ArrayIterator:
|
|||
|
// https://bugs.ecmascript.org/show_bug.cgi?id=2416
|
|||
|
var usingIterator = typeof (isArguments(items) || ES.GetMethod(items, $iterator$)) !== 'undefined';
|
|||
|
|
|||
|
var length, result, i;
|
|||
|
if (usingIterator) {
|
|||
|
result = ES.IsConstructor(C) ? Object(new C()) : [];
|
|||
|
var iterator = ES.GetIterator(items);
|
|||
|
var next, nextValue;
|
|||
|
|
|||
|
i = 0;
|
|||
|
while (true) {
|
|||
|
next = ES.IteratorStep(iterator);
|
|||
|
if (next === false) {
|
|||
|
break;
|
|||
|
}
|
|||
|
nextValue = next.value;
|
|||
|
try {
|
|||
|
if (mapping) {
|
|||
|
nextValue = typeof T === 'undefined' ? mapFn(nextValue, i) : _call(mapFn, T, nextValue, i);
|
|||
|
}
|
|||
|
result[i] = nextValue;
|
|||
|
} catch (e) {
|
|||
|
ES.IteratorClose(iterator, true);
|
|||
|
throw e;
|
|||
|
}
|
|||
|
i += 1;
|
|||
|
}
|
|||
|
length = i;
|
|||
|
} else {
|
|||
|
var arrayLike = ES.ToObject(items);
|
|||
|
length = ES.ToLength(arrayLike.length);
|
|||
|
result = ES.IsConstructor(C) ? Object(new C(length)) : new Array(length);
|
|||
|
var value;
|
|||
|
for (i = 0; i < length; ++i) {
|
|||
|
value = arrayLike[i];
|
|||
|
if (mapping) {
|
|||
|
value = typeof T === 'undefined' ? mapFn(value, i) : _call(mapFn, T, value, i);
|
|||
|
}
|
|||
|
createDataPropertyOrThrow(result, i, value);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
result.length = length;
|
|||
|
return result;
|
|||
|
},
|
|||
|
|
|||
|
of: function of() {
|
|||
|
var len = arguments.length;
|
|||
|
var C = this;
|
|||
|
var A = isArray(C) || !ES.IsCallable(C) ? new Array(len) : ES.Construct(C, [len]);
|
|||
|
for (var k = 0; k < len; ++k) {
|
|||
|
createDataPropertyOrThrow(A, k, arguments[k]);
|
|||
|
}
|
|||
|
A.length = len;
|
|||
|
return A;
|
|||
|
}
|
|||
|
};
|
|||
|
defineProperties(Array, ArrayShims);
|
|||
|
addDefaultSpecies(Array);
|
|||
|
|
|||
|
// Our ArrayIterator is private; see
|
|||
|
// https://github.com/paulmillr/es6-shim/issues/252
|
|||
|
ArrayIterator = function (array, kind) {
|
|||
|
this.i = 0;
|
|||
|
this.array = array;
|
|||
|
this.kind = kind;
|
|||
|
};
|
|||
|
|
|||
|
defineProperties(ArrayIterator.prototype, {
|
|||
|
next: function () {
|
|||
|
var i = this.i;
|
|||
|
var array = this.array;
|
|||
|
if (!(this instanceof ArrayIterator)) {
|
|||
|
throw new TypeError('Not an ArrayIterator');
|
|||
|
}
|
|||
|
if (typeof array !== 'undefined') {
|
|||
|
var len = ES.ToLength(array.length);
|
|||
|
for (; i < len; i++) {
|
|||
|
var kind = this.kind;
|
|||
|
var retval;
|
|||
|
if (kind === 'key') {
|
|||
|
retval = i;
|
|||
|
} else if (kind === 'value') {
|
|||
|
retval = array[i];
|
|||
|
} else if (kind === 'entry') {
|
|||
|
retval = [i, array[i]];
|
|||
|
}
|
|||
|
this.i = i + 1;
|
|||
|
return iteratorResult(retval);
|
|||
|
}
|
|||
|
}
|
|||
|
this.array = void 0;
|
|||
|
return iteratorResult();
|
|||
|
}
|
|||
|
});
|
|||
|
addIterator(ArrayIterator.prototype);
|
|||
|
|
|||
|
/*
|
|||
|
var orderKeys = function orderKeys(a, b) {
|
|||
|
var aNumeric = String(ES.ToInteger(a)) === a;
|
|||
|
var bNumeric = String(ES.ToInteger(b)) === b;
|
|||
|
if (aNumeric && bNumeric) {
|
|||
|
return b - a;
|
|||
|
} else if (aNumeric && !bNumeric) {
|
|||
|
return -1;
|
|||
|
} else if (!aNumeric && bNumeric) {
|
|||
|
return 1;
|
|||
|
} else {
|
|||
|
return a.localeCompare(b);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
var getAllKeys = function getAllKeys(object) {
|
|||
|
var ownKeys = [];
|
|||
|
var keys = [];
|
|||
|
|
|||
|
for (var key in object) {
|
|||
|
_push(_hasOwnProperty(object, key) ? ownKeys : keys, key);
|
|||
|
}
|
|||
|
_sort(ownKeys, orderKeys);
|
|||
|
_sort(keys, orderKeys);
|
|||
|
|
|||
|
return _concat(ownKeys, keys);
|
|||
|
};
|
|||
|
*/
|
|||
|
|
|||
|
// note: this is positioned here because it depends on ArrayIterator
|
|||
|
var arrayOfSupportsSubclassing = Array.of === ArrayShims.of || (function () {
|
|||
|
// Detects a bug in Webkit nightly r181886
|
|||
|
var Foo = function Foo(len) { this.length = len; };
|
|||
|
Foo.prototype = [];
|
|||
|
var fooArr = Array.of.apply(Foo, [1, 2]);
|
|||
|
return fooArr instanceof Foo && fooArr.length === 2;
|
|||
|
}());
|
|||
|
if (!arrayOfSupportsSubclassing) {
|
|||
|
overrideNative(Array, 'of', ArrayShims.of);
|
|||
|
}
|
|||
|
|
|||
|
var ArrayPrototypeShims = {
|
|||
|
copyWithin: function copyWithin(target, start) {
|
|||
|
var o = ES.ToObject(this);
|
|||
|
var len = ES.ToLength(o.length);
|
|||
|
var relativeTarget = ES.ToInteger(target);
|
|||
|
var relativeStart = ES.ToInteger(start);
|
|||
|
var to = relativeTarget < 0 ? _max(len + relativeTarget, 0) : _min(relativeTarget, len);
|
|||
|
var from = relativeStart < 0 ? _max(len + relativeStart, 0) : _min(relativeStart, len);
|
|||
|
var end;
|
|||
|
if (arguments.length > 2) {
|
|||
|
end = arguments[2];
|
|||
|
}
|
|||
|
var relativeEnd = typeof end === 'undefined' ? len : ES.ToInteger(end);
|
|||
|
var finalItem = relativeEnd < 0 ? _max(len + relativeEnd, 0) : _min(relativeEnd, len);
|
|||
|
var count = _min(finalItem - from, len - to);
|
|||
|
var direction = 1;
|
|||
|
if (from < to && to < (from + count)) {
|
|||
|
direction = -1;
|
|||
|
from += count - 1;
|
|||
|
to += count - 1;
|
|||
|
}
|
|||
|
while (count > 0) {
|
|||
|
if (from in o) {
|
|||
|
o[to] = o[from];
|
|||
|
} else {
|
|||
|
delete o[to];
|
|||
|
}
|
|||
|
from += direction;
|
|||
|
to += direction;
|
|||
|
count -= 1;
|
|||
|
}
|
|||
|
return o;
|
|||
|
},
|
|||
|
|
|||
|
fill: function fill(value) {
|
|||
|
var start;
|
|||
|
if (arguments.length > 1) {
|
|||
|
start = arguments[1];
|
|||
|
}
|
|||
|
var end;
|
|||
|
if (arguments.length > 2) {
|
|||
|
end = arguments[2];
|
|||
|
}
|
|||
|
var O = ES.ToObject(this);
|
|||
|
var len = ES.ToLength(O.length);
|
|||
|
start = ES.ToInteger(typeof start === 'undefined' ? 0 : start);
|
|||
|
end = ES.ToInteger(typeof end === 'undefined' ? len : end);
|
|||
|
|
|||
|
var relativeStart = start < 0 ? _max(len + start, 0) : _min(start, len);
|
|||
|
var relativeEnd = end < 0 ? len + end : end;
|
|||
|
|
|||
|
for (var i = relativeStart; i < len && i < relativeEnd; ++i) {
|
|||
|
O[i] = value;
|
|||
|
}
|
|||
|
return O;
|
|||
|
},
|
|||
|
|
|||
|
find: function find(predicate) {
|
|||
|
var list = ES.ToObject(this);
|
|||
|
var length = ES.ToLength(list.length);
|
|||
|
if (!ES.IsCallable(predicate)) {
|
|||
|
throw new TypeError('Array#find: predicate must be a function');
|
|||
|
}
|
|||
|
var thisArg = arguments.length > 1 ? arguments[1] : null;
|
|||
|
for (var i = 0, value; i < length; i++) {
|
|||
|
value = list[i];
|
|||
|
if (thisArg) {
|
|||
|
if (_call(predicate, thisArg, value, i, list)) {
|
|||
|
return value;
|
|||
|
}
|
|||
|
} else if (predicate(value, i, list)) {
|
|||
|
return value;
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
findIndex: function findIndex(predicate) {
|
|||
|
var list = ES.ToObject(this);
|
|||
|
var length = ES.ToLength(list.length);
|
|||
|
if (!ES.IsCallable(predicate)) {
|
|||
|
throw new TypeError('Array#findIndex: predicate must be a function');
|
|||
|
}
|
|||
|
var thisArg = arguments.length > 1 ? arguments[1] : null;
|
|||
|
for (var i = 0; i < length; i++) {
|
|||
|
if (thisArg) {
|
|||
|
if (_call(predicate, thisArg, list[i], i, list)) {
|
|||
|
return i;
|
|||
|
}
|
|||
|
} else if (predicate(list[i], i, list)) {
|
|||
|
return i;
|
|||
|
}
|
|||
|
}
|
|||
|
return -1;
|
|||
|
},
|
|||
|
|
|||
|
keys: function keys() {
|
|||
|
return new ArrayIterator(this, 'key');
|
|||
|
},
|
|||
|
|
|||
|
values: function values() {
|
|||
|
return new ArrayIterator(this, 'value');
|
|||
|
},
|
|||
|
|
|||
|
entries: function entries() {
|
|||
|
return new ArrayIterator(this, 'entry');
|
|||
|
}
|
|||
|
};
|
|||
|
// Safari 7.1 defines Array#keys and Array#entries natively,
|
|||
|
// but the resulting ArrayIterator objects don't have a "next" method.
|
|||
|
if (Array.prototype.keys && !ES.IsCallable([1].keys().next)) {
|
|||
|
delete Array.prototype.keys;
|
|||
|
}
|
|||
|
if (Array.prototype.entries && !ES.IsCallable([1].entries().next)) {
|
|||
|
delete Array.prototype.entries;
|
|||
|
}
|
|||
|
|
|||
|
// Chrome 38 defines Array#keys and Array#entries, and Array#@@iterator, but not Array#values
|
|||
|
if (Array.prototype.keys && Array.prototype.entries && !Array.prototype.values && Array.prototype[$iterator$]) {
|
|||
|
defineProperties(Array.prototype, {
|
|||
|
values: Array.prototype[$iterator$]
|
|||
|
});
|
|||
|
if (Type.symbol(Symbol.unscopables)) {
|
|||
|
Array.prototype[Symbol.unscopables].values = true;
|
|||
|
}
|
|||
|
}
|
|||
|
// Chrome 40 defines Array#values with the incorrect name, although Array#{keys,entries} have the correct name
|
|||
|
if (functionsHaveNames && Array.prototype.values && Array.prototype.values.name !== 'values') {
|
|||
|
var originalArrayPrototypeValues = Array.prototype.values;
|
|||
|
overrideNative(Array.prototype, 'values', function values() { return ES.Call(originalArrayPrototypeValues, this, arguments); });
|
|||
|
defineProperty(Array.prototype, $iterator$, Array.prototype.values, true);
|
|||
|
}
|
|||
|
defineProperties(Array.prototype, ArrayPrototypeShims);
|
|||
|
|
|||
|
if (1 / [true].indexOf(true, -0) < 0) {
|
|||
|
// indexOf when given a position arg of -0 should return +0.
|
|||
|
// https://github.com/tc39/ecma262/pull/316
|
|||
|
defineProperty(Array.prototype, 'indexOf', function indexOf(searchElement) {
|
|||
|
var value = _arrayIndexOfApply(this, arguments);
|
|||
|
if (value === 0 && (1 / value) < 0) {
|
|||
|
return 0;
|
|||
|
}
|
|||
|
return value;
|
|||
|
}, true);
|
|||
|
}
|
|||
|
|
|||
|
addIterator(Array.prototype, function () { return this.values(); });
|
|||
|
// Chrome defines keys/values/entries on Array, but doesn't give us
|
|||
|
// any way to identify its iterator. So add our own shimmed field.
|
|||
|
if (Object.getPrototypeOf) {
|
|||
|
addIterator(Object.getPrototypeOf([].values()));
|
|||
|
}
|
|||
|
|
|||
|
// note: this is positioned here because it relies on Array#entries
|
|||
|
var arrayFromSwallowsNegativeLengths = (function () {
|
|||
|
// Detects a Firefox bug in v32
|
|||
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=1063993
|
|||
|
return valueOrFalseIfThrows(function () {
|
|||
|
return Array.from({ length: -1 }).length === 0;
|
|||
|
});
|
|||
|
}());
|
|||
|
var arrayFromHandlesIterables = (function () {
|
|||
|
// Detects a bug in Webkit nightly r181886
|
|||
|
var arr = Array.from([0].entries());
|
|||
|
return arr.length === 1 && isArray(arr[0]) && arr[0][0] === 0 && arr[0][1] === 0;
|
|||
|
}());
|
|||
|
if (!arrayFromSwallowsNegativeLengths || !arrayFromHandlesIterables) {
|
|||
|
overrideNative(Array, 'from', ArrayShims.from);
|
|||
|
}
|
|||
|
var arrayFromHandlesUndefinedMapFunction = (function () {
|
|||
|
// Microsoft Edge v0.11 throws if the mapFn argument is *provided* but undefined,
|
|||
|
// but the spec doesn't care if it's provided or not - undefined doesn't throw.
|
|||
|
return valueOrFalseIfThrows(function () {
|
|||
|
return Array.from([0], void 0);
|
|||
|
});
|
|||
|
}());
|
|||
|
if (!arrayFromHandlesUndefinedMapFunction) {
|
|||
|
var origArrayFrom = Array.from;
|
|||
|
overrideNative(Array, 'from', function from(items) {
|
|||
|
if (arguments.length > 1 && typeof arguments[1] !== 'undefined') {
|
|||
|
return ES.Call(origArrayFrom, this, arguments);
|
|||
|
} else {
|
|||
|
return _call(origArrayFrom, this, items);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
var int32sAsOne = -(Math.pow(2, 32) - 1);
|
|||
|
var toLengthsCorrectly = function (method, reversed) {
|
|||
|
var obj = { length: int32sAsOne };
|
|||
|
obj[reversed ? (obj.length >>> 0) - 1 : 0] = true;
|
|||
|
return valueOrFalseIfThrows(function () {
|
|||
|
_call(method, obj, function () {
|
|||
|
// note: in nonconforming browsers, this will be called
|
|||
|
// -1 >>> 0 times, which is 4294967295, so the throw matters.
|
|||
|
throw new RangeError('should not reach here');
|
|||
|
}, []);
|
|||
|
return true;
|
|||
|
});
|
|||
|
};
|
|||
|
if (!toLengthsCorrectly(Array.prototype.forEach)) {
|
|||
|
var originalForEach = Array.prototype.forEach;
|
|||
|
overrideNative(Array.prototype, 'forEach', function forEach(callbackFn) {
|
|||
|
return ES.Call(originalForEach, this.length >= 0 ? this : [], arguments);
|
|||
|
}, true);
|
|||
|
}
|
|||
|
if (!toLengthsCorrectly(Array.prototype.map)) {
|
|||
|
var originalMap = Array.prototype.map;
|
|||
|
overrideNative(Array.prototype, 'map', function map(callbackFn) {
|
|||
|
return ES.Call(originalMap, this.length >= 0 ? this : [], arguments);
|
|||
|
}, true);
|
|||
|
}
|
|||
|
if (!toLengthsCorrectly(Array.prototype.filter)) {
|
|||
|
var originalFilter = Array.prototype.filter;
|
|||
|
overrideNative(Array.prototype, 'filter', function filter(callbackFn) {
|
|||
|
return ES.Call(originalFilter, this.length >= 0 ? this : [], arguments);
|
|||
|
}, true);
|
|||
|
}
|
|||
|
if (!toLengthsCorrectly(Array.prototype.some)) {
|
|||
|
var originalSome = Array.prototype.some;
|
|||
|
overrideNative(Array.prototype, 'some', function some(callbackFn) {
|
|||
|
return ES.Call(originalSome, this.length >= 0 ? this : [], arguments);
|
|||
|
}, true);
|
|||
|
}
|
|||
|
if (!toLengthsCorrectly(Array.prototype.every)) {
|
|||
|
var originalEvery = Array.prototype.every;
|
|||
|
overrideNative(Array.prototype, 'every', function every(callbackFn) {
|
|||
|
return ES.Call(originalEvery, this.length >= 0 ? this : [], arguments);
|
|||
|
}, true);
|
|||
|
}
|
|||
|
if (!toLengthsCorrectly(Array.prototype.reduce)) {
|
|||
|
var originalReduce = Array.prototype.reduce;
|
|||
|
overrideNative(Array.prototype, 'reduce', function reduce(callbackFn) {
|
|||
|
return ES.Call(originalReduce, this.length >= 0 ? this : [], arguments);
|
|||
|
}, true);
|
|||
|
}
|
|||
|
if (!toLengthsCorrectly(Array.prototype.reduceRight, true)) {
|
|||
|
var originalReduceRight = Array.prototype.reduceRight;
|
|||
|
overrideNative(Array.prototype, 'reduceRight', function reduceRight(callbackFn) {
|
|||
|
return ES.Call(originalReduceRight, this.length >= 0 ? this : [], arguments);
|
|||
|
}, true);
|
|||
|
}
|
|||
|
|
|||
|
var lacksOctalSupport = Number('0o10') !== 8;
|
|||
|
var lacksBinarySupport = Number('0b10') !== 2;
|
|||
|
var trimsNonWhitespace = _some(nonWS, function (c) {
|
|||
|
return Number(c + 0 + c) === 0;
|
|||
|
});
|
|||
|
if (lacksOctalSupport || lacksBinarySupport || trimsNonWhitespace) {
|
|||
|
var OrigNumber = Number;
|
|||
|
var binaryRegex = /^0b[01]+$/i;
|
|||
|
var octalRegex = /^0o[0-7]+$/i;
|
|||
|
// Note that in IE 8, RegExp.prototype.test doesn't seem to exist: ie, "test" is an own property of regexes. wtf.
|
|||
|
var isBinary = binaryRegex.test.bind(binaryRegex);
|
|||
|
var isOctal = octalRegex.test.bind(octalRegex);
|
|||
|
var toPrimitive = function (O) { // need to replace this with `es-to-primitive/es6`
|
|||
|
var result;
|
|||
|
if (typeof O.valueOf === 'function') {
|
|||
|
result = O.valueOf();
|
|||
|
if (Type.primitive(result)) {
|
|||
|
return result;
|
|||
|
}
|
|||
|
}
|
|||
|
if (typeof O.toString === 'function') {
|
|||
|
result = O.toString();
|
|||
|
if (Type.primitive(result)) {
|
|||
|
return result;
|
|||
|
}
|
|||
|
}
|
|||
|
throw new TypeError('No default value');
|
|||
|
};
|
|||
|
var hasNonWS = nonWSregex.test.bind(nonWSregex);
|
|||
|
var isBadHex = isBadHexRegex.test.bind(isBadHexRegex);
|
|||
|
var NumberShim = (function () {
|
|||
|
// this is wrapped in an IIFE because of IE 6-8's wacky scoping issues with named function expressions.
|
|||
|
var NumberShim = function Number(value) {
|
|||
|
var primValue;
|
|||
|
if (arguments.length > 0) {
|
|||
|
primValue = Type.primitive(value) ? value : toPrimitive(value, 'number');
|
|||
|
} else {
|
|||
|
primValue = 0;
|
|||
|
}
|
|||
|
if (typeof primValue === 'string') {
|
|||
|
primValue = ES.Call(trimShim, primValue);
|
|||
|
if (isBinary(primValue)) {
|
|||
|
primValue = parseInt(_strSlice(primValue, 2), 2);
|
|||
|
} else if (isOctal(primValue)) {
|
|||
|
primValue = parseInt(_strSlice(primValue, 2), 8);
|
|||
|
} else if (hasNonWS(primValue) || isBadHex(primValue)) {
|
|||
|
primValue = NaN;
|
|||
|
}
|
|||
|
}
|
|||
|
var receiver = this;
|
|||
|
var valueOfSucceeds = valueOrFalseIfThrows(function () {
|
|||
|
OrigNumber.prototype.valueOf.call(receiver);
|
|||
|
return true;
|
|||
|
});
|
|||
|
if (receiver instanceof NumberShim && !valueOfSucceeds) {
|
|||
|
return new OrigNumber(primValue);
|
|||
|
}
|
|||
|
/* jshint newcap: false */
|
|||
|
return OrigNumber(primValue);
|
|||
|
/* jshint newcap: true */
|
|||
|
};
|
|||
|
return NumberShim;
|
|||
|
}());
|
|||
|
wrapConstructor(OrigNumber, NumberShim, {});
|
|||
|
// this is necessary for ES3 browsers, where these properties are non-enumerable.
|
|||
|
defineProperties(NumberShim, {
|
|||
|
NaN: OrigNumber.NaN,
|
|||
|
MAX_VALUE: OrigNumber.MAX_VALUE,
|
|||
|
MIN_VALUE: OrigNumber.MIN_VALUE,
|
|||
|
NEGATIVE_INFINITY: OrigNumber.NEGATIVE_INFINITY,
|
|||
|
POSITIVE_INFINITY: OrigNumber.POSITIVE_INFINITY
|
|||
|
});
|
|||
|
/* globals Number: true */
|
|||
|
/* eslint-disable no-undef, no-global-assign */
|
|||
|
/* jshint -W020 */
|
|||
|
Number = NumberShim;
|
|||
|
Value.redefine(globals, 'Number', NumberShim);
|
|||
|
/* jshint +W020 */
|
|||
|
/* eslint-enable no-undef, no-global-assign */
|
|||
|
/* globals Number: false */
|
|||
|
}
|
|||
|
|
|||
|
var maxSafeInteger = Math.pow(2, 53) - 1;
|
|||
|
defineProperties(Number, {
|
|||
|
MAX_SAFE_INTEGER: maxSafeInteger,
|
|||
|
MIN_SAFE_INTEGER: -maxSafeInteger,
|
|||
|
EPSILON: 2.220446049250313e-16,
|
|||
|
|
|||
|
parseInt: globals.parseInt,
|
|||
|
parseFloat: globals.parseFloat,
|
|||
|
|
|||
|
isFinite: numberIsFinite,
|
|||
|
|
|||
|
isInteger: function isInteger(value) {
|
|||
|
return numberIsFinite(value) && ES.ToInteger(value) === value;
|
|||
|
},
|
|||
|
|
|||
|
isSafeInteger: function isSafeInteger(value) {
|
|||
|
return Number.isInteger(value) && _abs(value) <= Number.MAX_SAFE_INTEGER;
|
|||
|
},
|
|||
|
|
|||
|
isNaN: numberIsNaN
|
|||
|
});
|
|||
|
// Firefox 37 has a conforming Number.parseInt, but it's not === to the global parseInt (fixed in v40)
|
|||
|
defineProperty(Number, 'parseInt', globals.parseInt, Number.parseInt !== globals.parseInt);
|
|||
|
|
|||
|
// Work around bugs in Array#find and Array#findIndex -- early
|
|||
|
// implementations skipped holes in sparse arrays. (Note that the
|
|||
|
// implementations of find/findIndex indirectly use shimmed
|
|||
|
// methods of Number, so this test has to happen down here.)
|
|||
|
/*jshint elision: true */
|
|||
|
/* eslint-disable no-sparse-arrays */
|
|||
|
if ([, 1].find(function () { return true; }) === 1) {
|
|||
|
overrideNative(Array.prototype, 'find', ArrayPrototypeShims.find);
|
|||
|
}
|
|||
|
if ([, 1].findIndex(function () { return true; }) !== 0) {
|
|||
|
overrideNative(Array.prototype, 'findIndex', ArrayPrototypeShims.findIndex);
|
|||
|
}
|
|||
|
/* eslint-enable no-sparse-arrays */
|
|||
|
/*jshint elision: false */
|
|||
|
|
|||
|
var isEnumerableOn = Function.bind.call(Function.bind, Object.prototype.propertyIsEnumerable);
|
|||
|
var ensureEnumerable = function ensureEnumerable(obj, prop) {
|
|||
|
if (supportsDescriptors && isEnumerableOn(obj, prop)) {
|
|||
|
Object.defineProperty(obj, prop, { enumerable: false });
|
|||
|
}
|
|||
|
};
|
|||
|
var sliceArgs = function sliceArgs() {
|
|||
|
// per https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments
|
|||
|
// and https://gist.github.com/WebReflection/4327762cb87a8c634a29
|
|||
|
var initial = Number(this);
|
|||
|
var len = arguments.length;
|
|||
|
var desiredArgCount = len - initial;
|
|||
|
var args = new Array(desiredArgCount < 0 ? 0 : desiredArgCount);
|
|||
|
for (var i = initial; i < len; ++i) {
|
|||
|
args[i - initial] = arguments[i];
|
|||
|
}
|
|||
|
return args;
|
|||
|
};
|
|||
|
var assignTo = function assignTo(source) {
|
|||
|
return function assignToSource(target, key) {
|
|||
|
target[key] = source[key];
|
|||
|
return target;
|
|||
|
};
|
|||
|
};
|
|||
|
var assignReducer = function (target, source) {
|
|||
|
var sourceKeys = keys(Object(source));
|
|||
|
var symbols;
|
|||
|
if (ES.IsCallable(Object.getOwnPropertySymbols)) {
|
|||
|
symbols = _filter(Object.getOwnPropertySymbols(Object(source)), isEnumerableOn(source));
|
|||
|
}
|
|||
|
return _reduce(_concat(sourceKeys, symbols || []), assignTo(source), target);
|
|||
|
};
|
|||
|
|
|||
|
var ObjectShims = {
|
|||
|
// 19.1.3.1
|
|||
|
assign: function (target, source) {
|
|||
|
var to = ES.ToObject(target, 'Cannot convert undefined or null to object');
|
|||
|
return _reduce(ES.Call(sliceArgs, 1, arguments), assignReducer, to);
|
|||
|
},
|
|||
|
|
|||
|
// Added in WebKit in https://bugs.webkit.org/show_bug.cgi?id=143865
|
|||
|
is: function is(a, b) {
|
|||
|
return ES.SameValue(a, b);
|
|||
|
}
|
|||
|
};
|
|||
|
var assignHasPendingExceptions = Object.assign && Object.preventExtensions && (function () {
|
|||
|
// Firefox 37 still has "pending exception" logic in its Object.assign implementation,
|
|||
|
// which is 72% slower than our shim, and Firefox 40's native implementation.
|
|||
|
var thrower = Object.preventExtensions({ 1: 2 });
|
|||
|
try {
|
|||
|
Object.assign(thrower, 'xy');
|
|||
|
} catch (e) {
|
|||
|
return thrower[1] === 'y';
|
|||
|
}
|
|||
|
}());
|
|||
|
if (assignHasPendingExceptions) {
|
|||
|
overrideNative(Object, 'assign', ObjectShims.assign);
|
|||
|
}
|
|||
|
defineProperties(Object, ObjectShims);
|
|||
|
|
|||
|
if (supportsDescriptors) {
|
|||
|
var ES5ObjectShims = {
|
|||
|
// 19.1.3.9
|
|||
|
// shim from https://gist.github.com/WebReflection/5593554
|
|||
|
setPrototypeOf: (function (Object, magic) {
|
|||
|
var set;
|
|||
|
|
|||
|
var checkArgs = function (O, proto) {
|
|||
|
if (!ES.TypeIsObject(O)) {
|
|||
|
throw new TypeError('cannot set prototype on a non-object');
|
|||
|
}
|
|||
|
if (!(proto === null || ES.TypeIsObject(proto))) {
|
|||
|
throw new TypeError('can only set prototype to an object or null' + proto);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
var setPrototypeOf = function (O, proto) {
|
|||
|
checkArgs(O, proto);
|
|||
|
_call(set, O, proto);
|
|||
|
return O;
|
|||
|
};
|
|||
|
|
|||
|
try {
|
|||
|
// this works already in Firefox and Safari
|
|||
|
set = Object.getOwnPropertyDescriptor(Object.prototype, magic).set;
|
|||
|
_call(set, {}, null);
|
|||
|
} catch (e) {
|
|||
|
if (Object.prototype !== {}[magic]) {
|
|||
|
// IE < 11 cannot be shimmed
|
|||
|
return;
|
|||
|
}
|
|||
|
// probably Chrome or some old Mobile stock browser
|
|||
|
set = function (proto) {
|
|||
|
this[magic] = proto;
|
|||
|
};
|
|||
|
// please note that this will **not** work
|
|||
|
// in those browsers that do not inherit
|
|||
|
// __proto__ by mistake from Object.prototype
|
|||
|
// in these cases we should probably throw an error
|
|||
|
// or at least be informed about the issue
|
|||
|
setPrototypeOf.polyfill = setPrototypeOf(
|
|||
|
setPrototypeOf({}, null),
|
|||
|
Object.prototype
|
|||
|
) instanceof Object;
|
|||
|
// setPrototypeOf.polyfill === true means it works as meant
|
|||
|
// setPrototypeOf.polyfill === false means it's not 100% reliable
|
|||
|
// setPrototypeOf.polyfill === undefined
|
|||
|
// or
|
|||
|
// setPrototypeOf.polyfill == null means it's not a polyfill
|
|||
|
// which means it works as expected
|
|||
|
// we can even delete Object.prototype.__proto__;
|
|||
|
}
|
|||
|
return setPrototypeOf;
|
|||
|
}(Object, '__proto__'))
|
|||
|
};
|
|||
|
|
|||
|
defineProperties(Object, ES5ObjectShims);
|
|||
|
}
|
|||
|
|
|||
|
// Workaround bug in Opera 12 where setPrototypeOf(x, null) doesn't work,
|
|||
|
// but Object.create(null) does.
|
|||
|
if (Object.setPrototypeOf && Object.getPrototypeOf &&
|
|||
|
Object.getPrototypeOf(Object.setPrototypeOf({}, null)) !== null &&
|
|||
|
Object.getPrototypeOf(Object.create(null)) === null) {
|
|||
|
(function () {
|
|||
|
var FAKENULL = Object.create(null);
|
|||
|
var gpo = Object.getPrototypeOf;
|
|||
|
var spo = Object.setPrototypeOf;
|
|||
|
Object.getPrototypeOf = function (o) {
|
|||
|
var result = gpo(o);
|
|||
|
return result === FAKENULL ? null : result;
|
|||
|
};
|
|||
|
Object.setPrototypeOf = function (o, p) {
|
|||
|
var proto = p === null ? FAKENULL : p;
|
|||
|
return spo(o, proto);
|
|||
|
};
|
|||
|
Object.setPrototypeOf.polyfill = false;
|
|||
|
}());
|
|||
|
}
|
|||
|
|
|||
|
var objectKeysAcceptsPrimitives = !throwsError(function () { Object.keys('foo'); });
|
|||
|
if (!objectKeysAcceptsPrimitives) {
|
|||
|
var originalObjectKeys = Object.keys;
|
|||
|
overrideNative(Object, 'keys', function keys(value) {
|
|||
|
return originalObjectKeys(ES.ToObject(value));
|
|||
|
});
|
|||
|
keys = Object.keys;
|
|||
|
}
|
|||
|
var objectKeysRejectsRegex = throwsError(function () { Object.keys(/a/g); });
|
|||
|
if (objectKeysRejectsRegex) {
|
|||
|
var regexRejectingObjectKeys = Object.keys;
|
|||
|
overrideNative(Object, 'keys', function keys(value) {
|
|||
|
if (Type.regex(value)) {
|
|||
|
var regexKeys = [];
|
|||
|
for (var k in value) {
|
|||
|
if (_hasOwnProperty(value, k)) {
|
|||
|
_push(regexKeys, k);
|
|||
|
}
|
|||
|
}
|
|||
|
return regexKeys;
|
|||
|
}
|
|||
|
return regexRejectingObjectKeys(value);
|
|||
|
});
|
|||
|
keys = Object.keys;
|
|||
|
}
|
|||
|
|
|||
|
if (Object.getOwnPropertyNames) {
|
|||
|
var objectGOPNAcceptsPrimitives = !throwsError(function () { Object.getOwnPropertyNames('foo'); });
|
|||
|
if (!objectGOPNAcceptsPrimitives) {
|
|||
|
var cachedWindowNames = typeof window === 'object' ? Object.getOwnPropertyNames(window) : [];
|
|||
|
var originalObjectGetOwnPropertyNames = Object.getOwnPropertyNames;
|
|||
|
overrideNative(Object, 'getOwnPropertyNames', function getOwnPropertyNames(value) {
|
|||
|
var val = ES.ToObject(value);
|
|||
|
if (_toString(val) === '[object Window]') {
|
|||
|
try {
|
|||
|
return originalObjectGetOwnPropertyNames(val);
|
|||
|
} catch (e) {
|
|||
|
// IE bug where layout engine calls userland gOPN for cross-domain `window` objects
|
|||
|
return _concat([], cachedWindowNames);
|
|||
|
}
|
|||
|
}
|
|||
|
return originalObjectGetOwnPropertyNames(val);
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
if (Object.getOwnPropertyDescriptor) {
|
|||
|
var objectGOPDAcceptsPrimitives = !throwsError(function () { Object.getOwnPropertyDescriptor('foo', 'bar'); });
|
|||
|
if (!objectGOPDAcceptsPrimitives) {
|
|||
|
var originalObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
|
|||
|
overrideNative(Object, 'getOwnPropertyDescriptor', function getOwnPropertyDescriptor(value, property) {
|
|||
|
return originalObjectGetOwnPropertyDescriptor(ES.ToObject(value), property);
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
if (Object.seal) {
|
|||
|
var objectSealAcceptsPrimitives = !throwsError(function () { Object.seal('foo'); });
|
|||
|
if (!objectSealAcceptsPrimitives) {
|
|||
|
var originalObjectSeal = Object.seal;
|
|||
|
overrideNative(Object, 'seal', function seal(value) {
|
|||
|
if (!ES.TypeIsObject(value)) { return value; }
|
|||
|
return originalObjectSeal(value);
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
if (Object.isSealed) {
|
|||
|
var objectIsSealedAcceptsPrimitives = !throwsError(function () { Object.isSealed('foo'); });
|
|||
|
if (!objectIsSealedAcceptsPrimitives) {
|
|||
|
var originalObjectIsSealed = Object.isSealed;
|
|||
|
overrideNative(Object, 'isSealed', function isSealed(value) {
|
|||
|
if (!ES.TypeIsObject(value)) { return true; }
|
|||
|
return originalObjectIsSealed(value);
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
if (Object.freeze) {
|
|||
|
var objectFreezeAcceptsPrimitives = !throwsError(function () { Object.freeze('foo'); });
|
|||
|
if (!objectFreezeAcceptsPrimitives) {
|
|||
|
var originalObjectFreeze = Object.freeze;
|
|||
|
overrideNative(Object, 'freeze', function freeze(value) {
|
|||
|
if (!ES.TypeIsObject(value)) { return value; }
|
|||
|
return originalObjectFreeze(value);
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
if (Object.isFrozen) {
|
|||
|
var objectIsFrozenAcceptsPrimitives = !throwsError(function () { Object.isFrozen('foo'); });
|
|||
|
if (!objectIsFrozenAcceptsPrimitives) {
|
|||
|
var originalObjectIsFrozen = Object.isFrozen;
|
|||
|
overrideNative(Object, 'isFrozen', function isFrozen(value) {
|
|||
|
if (!ES.TypeIsObject(value)) { return true; }
|
|||
|
return originalObjectIsFrozen(value);
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
if (Object.preventExtensions) {
|
|||
|
var objectPreventExtensionsAcceptsPrimitives = !throwsError(function () { Object.preventExtensions('foo'); });
|
|||
|
if (!objectPreventExtensionsAcceptsPrimitives) {
|
|||
|
var originalObjectPreventExtensions = Object.preventExtensions;
|
|||
|
overrideNative(Object, 'preventExtensions', function preventExtensions(value) {
|
|||
|
if (!ES.TypeIsObject(value)) { return value; }
|
|||
|
return originalObjectPreventExtensions(value);
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
if (Object.isExtensible) {
|
|||
|
var objectIsExtensibleAcceptsPrimitives = !throwsError(function () { Object.isExtensible('foo'); });
|
|||
|
if (!objectIsExtensibleAcceptsPrimitives) {
|
|||
|
var originalObjectIsExtensible = Object.isExtensible;
|
|||
|
overrideNative(Object, 'isExtensible', function isExtensible(value) {
|
|||
|
if (!ES.TypeIsObject(value)) { return false; }
|
|||
|
return originalObjectIsExtensible(value);
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
if (Object.getPrototypeOf) {
|
|||
|
var objectGetProtoAcceptsPrimitives = !throwsError(function () { Object.getPrototypeOf('foo'); });
|
|||
|
if (!objectGetProtoAcceptsPrimitives) {
|
|||
|
var originalGetProto = Object.getPrototypeOf;
|
|||
|
overrideNative(Object, 'getPrototypeOf', function getPrototypeOf(value) {
|
|||
|
return originalGetProto(ES.ToObject(value));
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
var hasFlags = supportsDescriptors && (function () {
|
|||
|
var desc = Object.getOwnPropertyDescriptor(RegExp.prototype, 'flags');
|
|||
|
return desc && ES.IsCallable(desc.get);
|
|||
|
}());
|
|||
|
if (supportsDescriptors && !hasFlags) {
|
|||
|
var regExpFlagsGetter = function flags() {
|
|||
|
if (!ES.TypeIsObject(this)) {
|
|||
|
throw new TypeError('Method called on incompatible type: must be an object.');
|
|||
|
}
|
|||
|
var result = '';
|
|||
|
if (this.global) {
|
|||
|
result += 'g';
|
|||
|
}
|
|||
|
if (this.ignoreCase) {
|
|||
|
result += 'i';
|
|||
|
}
|
|||
|
if (this.multiline) {
|
|||
|
result += 'm';
|
|||
|
}
|
|||
|
if (this.unicode) {
|
|||
|
result += 'u';
|
|||
|
}
|
|||
|
if (this.sticky) {
|
|||
|
result += 'y';
|
|||
|
}
|
|||
|
return result;
|
|||
|
};
|
|||
|
|
|||
|
Value.getter(RegExp.prototype, 'flags', regExpFlagsGetter);
|
|||
|
}
|
|||
|
|
|||
|
var regExpSupportsFlagsWithRegex = supportsDescriptors && valueOrFalseIfThrows(function () {
|
|||
|
return String(new RegExp(/a/g, 'i')) === '/a/i';
|
|||
|
});
|
|||
|
var regExpNeedsToSupportSymbolMatch = hasSymbols && supportsDescriptors && (function () {
|
|||
|
// Edge 0.12 supports flags fully, but does not support Symbol.match
|
|||
|
var regex = /./;
|
|||
|
regex[Symbol.match] = false;
|
|||
|
return RegExp(regex) === regex;
|
|||
|
}());
|
|||
|
|
|||
|
var regexToStringIsGeneric = valueOrFalseIfThrows(function () {
|
|||
|
return RegExp.prototype.toString.call({ source: 'abc' }) === '/abc/';
|
|||
|
});
|
|||
|
var regexToStringSupportsGenericFlags = regexToStringIsGeneric && valueOrFalseIfThrows(function () {
|
|||
|
return RegExp.prototype.toString.call({ source: 'a', flags: 'b' }) === '/a/b';
|
|||
|
});
|
|||
|
if (!regexToStringIsGeneric || !regexToStringSupportsGenericFlags) {
|
|||
|
var origRegExpToString = RegExp.prototype.toString;
|
|||
|
defineProperty(RegExp.prototype, 'toString', function toString() {
|
|||
|
var R = ES.RequireObjectCoercible(this);
|
|||
|
if (Type.regex(R)) {
|
|||
|
return _call(origRegExpToString, R);
|
|||
|
}
|
|||
|
var pattern = $String(R.source);
|
|||
|
var flags = $String(R.flags);
|
|||
|
return '/' + pattern + '/' + flags;
|
|||
|
}, true);
|
|||
|
Value.preserveToString(RegExp.prototype.toString, origRegExpToString);
|
|||
|
}
|
|||
|
|
|||
|
if (supportsDescriptors && (!regExpSupportsFlagsWithRegex || regExpNeedsToSupportSymbolMatch)) {
|
|||
|
var flagsGetter = Object.getOwnPropertyDescriptor(RegExp.prototype, 'flags').get;
|
|||
|
var sourceDesc = Object.getOwnPropertyDescriptor(RegExp.prototype, 'source') || {};
|
|||
|
var legacySourceGetter = function () {
|
|||
|
// prior to it being a getter, it's own + nonconfigurable
|
|||
|
return this.source;
|
|||
|
};
|
|||
|
var sourceGetter = ES.IsCallable(sourceDesc.get) ? sourceDesc.get : legacySourceGetter;
|
|||
|
|
|||
|
var OrigRegExp = RegExp;
|
|||
|
var RegExpShim = (function () {
|
|||
|
return function RegExp(pattern, flags) {
|
|||
|
var patternIsRegExp = ES.IsRegExp(pattern);
|
|||
|
var calledWithNew = this instanceof RegExp;
|
|||
|
if (!calledWithNew && patternIsRegExp && typeof flags === 'undefined' && pattern.constructor === RegExp) {
|
|||
|
return pattern;
|
|||
|
}
|
|||
|
|
|||
|
var P = pattern;
|
|||
|
var F = flags;
|
|||
|
if (Type.regex(pattern)) {
|
|||
|
P = ES.Call(sourceGetter, pattern);
|
|||
|
F = typeof flags === 'undefined' ? ES.Call(flagsGetter, pattern) : flags;
|
|||
|
return new RegExp(P, F);
|
|||
|
} else if (patternIsRegExp) {
|
|||
|
P = pattern.source;
|
|||
|
F = typeof flags === 'undefined' ? pattern.flags : flags;
|
|||
|
}
|
|||
|
return new OrigRegExp(pattern, flags);
|
|||
|
};
|
|||
|
}());
|
|||
|
wrapConstructor(OrigRegExp, RegExpShim, {
|
|||
|
$input: true // Chrome < v39 & Opera < 26 have a nonstandard "$input" property
|
|||
|
});
|
|||
|
/* globals RegExp: true */
|
|||
|
/* eslint-disable no-undef, no-global-assign */
|
|||
|
/* jshint -W020 */
|
|||
|
RegExp = RegExpShim;
|
|||
|
Value.redefine(globals, 'RegExp', RegExpShim);
|
|||
|
/* jshint +W020 */
|
|||
|
/* eslint-enable no-undef, no-global-assign */
|
|||
|
/* globals RegExp: false */
|
|||
|
}
|
|||
|
|
|||
|
if (supportsDescriptors) {
|
|||
|
var regexGlobals = {
|
|||
|
input: '$_',
|
|||
|
lastMatch: '$&',
|
|||
|
lastParen: '$+',
|
|||
|
leftContext: '$`',
|
|||
|
rightContext: '$\''
|
|||
|
};
|
|||
|
_forEach(keys(regexGlobals), function (prop) {
|
|||
|
if (prop in RegExp && !(regexGlobals[prop] in RegExp)) {
|
|||
|
Value.getter(RegExp, regexGlobals[prop], function get() {
|
|||
|
return RegExp[prop];
|
|||
|
});
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
addDefaultSpecies(RegExp);
|
|||
|
|
|||
|
var inverseEpsilon = 1 / Number.EPSILON;
|
|||
|
var roundTiesToEven = function roundTiesToEven(n) {
|
|||
|
// Even though this reduces down to `return n`, it takes advantage of built-in rounding.
|
|||
|
return (n + inverseEpsilon) - inverseEpsilon;
|
|||
|
};
|
|||
|
var BINARY_32_EPSILON = Math.pow(2, -23);
|
|||
|
var BINARY_32_MAX_VALUE = Math.pow(2, 127) * (2 - BINARY_32_EPSILON);
|
|||
|
var BINARY_32_MIN_VALUE = Math.pow(2, -126);
|
|||
|
var E = Math.E;
|
|||
|
var LOG2E = Math.LOG2E;
|
|||
|
var LOG10E = Math.LOG10E;
|
|||
|
var numberCLZ = Number.prototype.clz;
|
|||
|
delete Number.prototype.clz; // Safari 8 has Number#clz
|
|||
|
|
|||
|
var MathShims = {
|
|||
|
acosh: function acosh(value) {
|
|||
|
var x = Number(value);
|
|||
|
if (numberIsNaN(x) || value < 1) { return NaN; }
|
|||
|
if (x === 1) { return 0; }
|
|||
|
if (x === Infinity) { return x; }
|
|||
|
return _log((x / E) + (_sqrt(x + 1) * _sqrt(x - 1) / E)) + 1;
|
|||
|
},
|
|||
|
|
|||
|
asinh: function asinh(value) {
|
|||
|
var x = Number(value);
|
|||
|
if (x === 0 || !globalIsFinite(x)) {
|
|||
|
return x;
|
|||
|
}
|
|||
|
return x < 0 ? -asinh(-x) : _log(x + _sqrt((x * x) + 1));
|
|||
|
},
|
|||
|
|
|||
|
atanh: function atanh(value) {
|
|||
|
var x = Number(value);
|
|||
|
if (numberIsNaN(x) || x < -1 || x > 1) {
|
|||
|
return NaN;
|
|||
|
}
|
|||
|
if (x === -1) { return -Infinity; }
|
|||
|
if (x === 1) { return Infinity; }
|
|||
|
if (x === 0) { return x; }
|
|||
|
return 0.5 * _log((1 + x) / (1 - x));
|
|||
|
},
|
|||
|
|
|||
|
cbrt: function cbrt(value) {
|
|||
|
var x = Number(value);
|
|||
|
if (x === 0) { return x; }
|
|||
|
var negate = x < 0;
|
|||
|
var result;
|
|||
|
if (negate) { x = -x; }
|
|||
|
if (x === Infinity) {
|
|||
|
result = Infinity;
|
|||
|
} else {
|
|||
|
result = _exp(_log(x) / 3);
|
|||
|
// from http://en.wikipedia.org/wiki/Cube_root#Numerical_methods
|
|||
|
result = ((x / (result * result)) + (2 * result)) / 3;
|
|||
|
}
|
|||
|
return negate ? -result : result;
|
|||
|
},
|
|||
|
|
|||
|
clz32: function clz32(value) {
|
|||
|
// See https://bugs.ecmascript.org/show_bug.cgi?id=2465
|
|||
|
var x = Number(value);
|
|||
|
var number = ES.ToUint32(x);
|
|||
|
if (number === 0) {
|
|||
|
return 32;
|
|||
|
}
|
|||
|
return numberCLZ ? ES.Call(numberCLZ, number) : 31 - _floor(_log(number + 0.5) * LOG2E);
|
|||
|
},
|
|||
|
|
|||
|
cosh: function cosh(value) {
|
|||
|
var x = Number(value);
|
|||
|
if (x === 0) { return 1; } // +0 or -0
|
|||
|
if (numberIsNaN(x)) { return NaN; }
|
|||
|
if (!globalIsFinite(x)) { return Infinity; }
|
|||
|
if (x < 0) { x = -x; }
|
|||
|
if (x > 21) { return _exp(x) / 2; }
|
|||
|
return (_exp(x) + _exp(-x)) / 2;
|
|||
|
},
|
|||
|
|
|||
|
expm1: function expm1(value) {
|
|||
|
var x = Number(value);
|
|||
|
if (x === -Infinity) { return -1; }
|
|||
|
if (!globalIsFinite(x) || x === 0) { return x; }
|
|||
|
if (_abs(x) > 0.5) {
|
|||
|
return _exp(x) - 1;
|
|||
|
}
|
|||
|
// A more precise approximation using Taylor series expansion
|
|||
|
// from https://github.com/paulmillr/es6-shim/issues/314#issuecomment-70293986
|
|||
|
var t = x;
|
|||
|
var sum = 0;
|
|||
|
var n = 1;
|
|||
|
while (sum + t !== sum) {
|
|||
|
sum += t;
|
|||
|
n += 1;
|
|||
|
t *= x / n;
|
|||
|
}
|
|||
|
return sum;
|
|||
|
},
|
|||
|
|
|||
|
hypot: function hypot(x, y) {
|
|||
|
var result = 0;
|
|||
|
var largest = 0;
|
|||
|
for (var i = 0; i < arguments.length; ++i) {
|
|||
|
var value = _abs(Number(arguments[i]));
|
|||
|
if (largest < value) {
|
|||
|
result *= (largest / value) * (largest / value);
|
|||
|
result += 1;
|
|||
|
largest = value;
|
|||
|
} else {
|
|||
|
result += value > 0 ? (value / largest) * (value / largest) : value;
|
|||
|
}
|
|||
|
}
|
|||
|
return largest === Infinity ? Infinity : largest * _sqrt(result);
|
|||
|
},
|
|||
|
|
|||
|
log2: function log2(value) {
|
|||
|
return _log(value) * LOG2E;
|
|||
|
},
|
|||
|
|
|||
|
log10: function log10(value) {
|
|||
|
return _log(value) * LOG10E;
|
|||
|
},
|
|||
|
|
|||
|
log1p: function log1p(value) {
|
|||
|
var x = Number(value);
|
|||
|
if (x < -1 || numberIsNaN(x)) { return NaN; }
|
|||
|
if (x === 0 || x === Infinity) { return x; }
|
|||
|
if (x === -1) { return -Infinity; }
|
|||
|
|
|||
|
return (1 + x) - 1 === 0 ? x : x * (_log(1 + x) / ((1 + x) - 1));
|
|||
|
},
|
|||
|
|
|||
|
sign: _sign,
|
|||
|
|
|||
|
sinh: function sinh(value) {
|
|||
|
var x = Number(value);
|
|||
|
if (!globalIsFinite(x) || x === 0) { return x; }
|
|||
|
|
|||
|
if (_abs(x) < 1) {
|
|||
|
return (Math.expm1(x) - Math.expm1(-x)) / 2;
|
|||
|
}
|
|||
|
return (_exp(x - 1) - _exp(-x - 1)) * E / 2;
|
|||
|
},
|
|||
|
|
|||
|
tanh: function tanh(value) {
|
|||
|
var x = Number(value);
|
|||
|
if (numberIsNaN(x) || x === 0) { return x; }
|
|||
|
// can exit early at +-20 as JS loses precision for true value at this integer
|
|||
|
if (x >= 20) { return 1; }
|
|||
|
if (x <= -20) { return -1; }
|
|||
|
|
|||
|
return (Math.expm1(x) - Math.expm1(-x)) / (_exp(x) + _exp(-x));
|
|||
|
},
|
|||
|
|
|||
|
trunc: function trunc(value) {
|
|||
|
var x = Number(value);
|
|||
|
return x < 0 ? -_floor(-x) : _floor(x);
|
|||
|
},
|
|||
|
|
|||
|
imul: function imul(x, y) {
|
|||
|
// taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul
|
|||
|
var a = ES.ToUint32(x);
|
|||
|
var b = ES.ToUint32(y);
|
|||
|
var ah = (a >>> 16) & 0xffff;
|
|||
|
var al = a & 0xffff;
|
|||
|
var bh = (b >>> 16) & 0xffff;
|
|||
|
var bl = b & 0xffff;
|
|||
|
// the shift by 0 fixes the sign on the high part
|
|||
|
// the final |0 converts the unsigned value into a signed value
|
|||
|
return (al * bl) + ((((ah * bl) + (al * bh)) << 16) >>> 0) | 0;
|
|||
|
},
|
|||
|
|
|||
|
fround: function fround(x) {
|
|||
|
var v = Number(x);
|
|||
|
if (v === 0 || v === Infinity || v === -Infinity || numberIsNaN(v)) {
|
|||
|
return v;
|
|||
|
}
|
|||
|
var sign = _sign(v);
|
|||
|
var abs = _abs(v);
|
|||
|
if (abs < BINARY_32_MIN_VALUE) {
|
|||
|
return sign * roundTiesToEven(
|
|||
|
abs / BINARY_32_MIN_VALUE / BINARY_32_EPSILON
|
|||
|
) * BINARY_32_MIN_VALUE * BINARY_32_EPSILON;
|
|||
|
}
|
|||
|
// Veltkamp's splitting (?)
|
|||
|
var a = (1 + (BINARY_32_EPSILON / Number.EPSILON)) * abs;
|
|||
|
var result = a - (a - abs);
|
|||
|
if (result > BINARY_32_MAX_VALUE || numberIsNaN(result)) {
|
|||
|
return sign * Infinity;
|
|||
|
}
|
|||
|
return sign * result;
|
|||
|
}
|
|||
|
};
|
|||
|
defineProperties(Math, MathShims);
|
|||
|
// IE 11 TP has an imprecise log1p: reports Math.log1p(-1e-17) as 0
|
|||
|
defineProperty(Math, 'log1p', MathShims.log1p, Math.log1p(-1e-17) !== -1e-17);
|
|||
|
// IE 11 TP has an imprecise asinh: reports Math.asinh(-1e7) as not exactly equal to -Math.asinh(1e7)
|
|||
|
defineProperty(Math, 'asinh', MathShims.asinh, Math.asinh(-1e7) !== -Math.asinh(1e7));
|
|||
|
// Chrome 40 has an imprecise Math.tanh with very small numbers
|
|||
|
defineProperty(Math, 'tanh', MathShims.tanh, Math.tanh(-2e-17) !== -2e-17);
|
|||
|
// Chrome 40 loses Math.acosh precision with high numbers
|
|||
|
defineProperty(Math, 'acosh', MathShims.acosh, Math.acosh(Number.MAX_VALUE) === Infinity);
|
|||
|
// Firefox 38 on Windows
|
|||
|
defineProperty(Math, 'cbrt', MathShims.cbrt, Math.abs(1 - (Math.cbrt(1e-300) / 1e-100)) / Number.EPSILON > 8);
|
|||
|
// node 0.11 has an imprecise Math.sinh with very small numbers
|
|||
|
defineProperty(Math, 'sinh', MathShims.sinh, Math.sinh(-2e-17) !== -2e-17);
|
|||
|
// FF 35 on Linux reports 22025.465794806725 for Math.expm1(10)
|
|||
|
var expm1OfTen = Math.expm1(10);
|
|||
|
defineProperty(Math, 'expm1', MathShims.expm1, expm1OfTen > 22025.465794806719 || expm1OfTen < 22025.4657948067165168);
|
|||
|
|
|||
|
var origMathRound = Math.round;
|
|||
|
// breaks in e.g. Safari 8, Internet Explorer 11, Opera 12
|
|||
|
var roundHandlesBoundaryConditions = Math.round(0.5 - (Number.EPSILON / 4)) === 0 &&
|
|||
|
Math.round(-0.5 + (Number.EPSILON / 3.99)) === 1;
|
|||
|
|
|||
|
// When engines use Math.floor(x + 0.5) internally, Math.round can be buggy for large integers.
|
|||
|
// This behavior should be governed by "round to nearest, ties to even mode"
|
|||
|
// see http://www.ecma-international.org/ecma-262/6.0/#sec-terms-and-definitions-number-type
|
|||
|
// These are the boundary cases where it breaks.
|
|||
|
var smallestPositiveNumberWhereRoundBreaks = inverseEpsilon + 1;
|
|||
|
var largestPositiveNumberWhereRoundBreaks = (2 * inverseEpsilon) - 1;
|
|||
|
var roundDoesNotIncreaseIntegers = [
|
|||
|
smallestPositiveNumberWhereRoundBreaks,
|
|||
|
largestPositiveNumberWhereRoundBreaks
|
|||
|
].every(function (num) {
|
|||
|
return Math.round(num) === num;
|
|||
|
});
|
|||
|
defineProperty(Math, 'round', function round(x) {
|
|||
|
var floor = _floor(x);
|
|||
|
var ceil = floor === -1 ? -0 : floor + 1;
|
|||
|
return x - floor < 0.5 ? floor : ceil;
|
|||
|
}, !roundHandlesBoundaryConditions || !roundDoesNotIncreaseIntegers);
|
|||
|
Value.preserveToString(Math.round, origMathRound);
|
|||
|
|
|||
|
var origImul = Math.imul;
|
|||
|
if (Math.imul(0xffffffff, 5) !== -5) {
|
|||
|
// Safari 6.1, at least, reports "0" for this value
|
|||
|
Math.imul = MathShims.imul;
|
|||
|
Value.preserveToString(Math.imul, origImul);
|
|||
|
}
|
|||
|
if (Math.imul.length !== 2) {
|
|||
|
// Safari 8.0.4 has a length of 1
|
|||
|
// fixed in https://bugs.webkit.org/show_bug.cgi?id=143658
|
|||
|
overrideNative(Math, 'imul', function imul(x, y) {
|
|||
|
return ES.Call(origImul, Math, arguments);
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
// Promises
|
|||
|
// Simplest possible implementation; use a 3rd-party library if you
|
|||
|
// want the best possible speed and/or long stack traces.
|
|||
|
var PromiseShim = (function () {
|
|||
|
var setTimeout = globals.setTimeout;
|
|||
|
// some environments don't have setTimeout - no way to shim here.
|
|||
|
if (typeof setTimeout !== 'function' && typeof setTimeout !== 'object') { return; }
|
|||
|
|
|||
|
ES.IsPromise = function (promise) {
|
|||
|
if (!ES.TypeIsObject(promise)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
if (typeof promise._promise === 'undefined') {
|
|||
|
return false; // uninitialized, or missing our hidden field.
|
|||
|
}
|
|||
|
return true;
|
|||
|
};
|
|||
|
|
|||
|
// "PromiseCapability" in the spec is what most promise implementations
|
|||
|
// call a "deferred".
|
|||
|
var PromiseCapability = function (C) {
|
|||
|
if (!ES.IsConstructor(C)) {
|
|||
|
throw new TypeError('Bad promise constructor');
|
|||
|
}
|
|||
|
var capability = this;
|
|||
|
var resolver = function (resolve, reject) {
|
|||
|
if (capability.resolve !== void 0 || capability.reject !== void 0) {
|
|||
|
throw new TypeError('Bad Promise implementation!');
|
|||
|
}
|
|||
|
capability.resolve = resolve;
|
|||
|
capability.reject = reject;
|
|||
|
};
|
|||
|
// Initialize fields to inform optimizers about the object shape.
|
|||
|
capability.resolve = void 0;
|
|||
|
capability.reject = void 0;
|
|||
|
capability.promise = new C(resolver);
|
|||
|
if (!(ES.IsCallable(capability.resolve) && ES.IsCallable(capability.reject))) {
|
|||
|
throw new TypeError('Bad promise constructor');
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
// find an appropriate setImmediate-alike
|
|||
|
var makeZeroTimeout;
|
|||
|
/*global window */
|
|||
|
if (typeof window !== 'undefined' && ES.IsCallable(window.postMessage)) {
|
|||
|
makeZeroTimeout = function () {
|
|||
|
// from http://dbaron.org/log/20100309-faster-timeouts
|
|||
|
var timeouts = [];
|
|||
|
var messageName = 'zero-timeout-message';
|
|||
|
var setZeroTimeout = function (fn) {
|
|||
|
_push(timeouts, fn);
|
|||
|
window.postMessage(messageName, '*');
|
|||
|
};
|
|||
|
var handleMessage = function (event) {
|
|||
|
if (event.source === window && event.data === messageName) {
|
|||
|
event.stopPropagation();
|
|||
|
if (timeouts.length === 0) { return; }
|
|||
|
var fn = _shift(timeouts);
|
|||
|
fn();
|
|||
|
}
|
|||
|
};
|
|||
|
window.addEventListener('message', handleMessage, true);
|
|||
|
return setZeroTimeout;
|
|||
|
};
|
|||
|
}
|
|||
|
var makePromiseAsap = function () {
|
|||
|
// An efficient task-scheduler based on a pre-existing Promise
|
|||
|
// implementation, which we can use even if we override the
|
|||
|
// global Promise below (in order to workaround bugs)
|
|||
|
// https://github.com/Raynos/observ-hash/issues/2#issuecomment-35857671
|
|||
|
var P = globals.Promise;
|
|||
|
var pr = P && P.resolve && P.resolve();
|
|||
|
return pr && function (task) {
|
|||
|
return pr.then(task);
|
|||
|
};
|
|||
|
};
|
|||
|
/*global process */
|
|||
|
/* jscs:disable disallowMultiLineTernary */
|
|||
|
var enqueue = ES.IsCallable(globals.setImmediate) ?
|
|||
|
globals.setImmediate :
|
|||
|
typeof process === 'object' && process.nextTick ? process.nextTick :
|
|||
|
makePromiseAsap() ||
|
|||
|
(ES.IsCallable(makeZeroTimeout) ? makeZeroTimeout() :
|
|||
|
function (task) { setTimeout(task, 0); }); // fallback
|
|||
|
/* jscs:enable disallowMultiLineTernary */
|
|||
|
|
|||
|
// Constants for Promise implementation
|
|||
|
var PROMISE_IDENTITY = function (x) { return x; };
|
|||
|
var PROMISE_THROWER = function (e) { throw e; };
|
|||
|
var PROMISE_PENDING = 0;
|
|||
|
var PROMISE_FULFILLED = 1;
|
|||
|
var PROMISE_REJECTED = 2;
|
|||
|
// We store fulfill/reject handlers and capabilities in a single array.
|
|||
|
var PROMISE_FULFILL_OFFSET = 0;
|
|||
|
var PROMISE_REJECT_OFFSET = 1;
|
|||
|
var PROMISE_CAPABILITY_OFFSET = 2;
|
|||
|
// This is used in an optimization for chaining promises via then.
|
|||
|
var PROMISE_FAKE_CAPABILITY = {};
|
|||
|
|
|||
|
var enqueuePromiseReactionJob = function (handler, capability, argument) {
|
|||
|
enqueue(function () {
|
|||
|
promiseReactionJob(handler, capability, argument);
|
|||
|
});
|
|||
|
};
|
|||
|
|
|||
|
var promiseReactionJob = function (handler, promiseCapability, argument) {
|
|||
|
var handlerResult, f;
|
|||
|
if (promiseCapability === PROMISE_FAKE_CAPABILITY) {
|
|||
|
// Fast case, when we don't actually need to chain through to a
|
|||
|
// (real) promiseCapability.
|
|||
|
return handler(argument);
|
|||
|
}
|
|||
|
try {
|
|||
|
handlerResult = handler(argument);
|
|||
|
f = promiseCapability.resolve;
|
|||
|
} catch (e) {
|
|||
|
handlerResult = e;
|
|||
|
f = promiseCapability.reject;
|
|||
|
}
|
|||
|
f(handlerResult);
|
|||
|
};
|
|||
|
|
|||
|
var fulfillPromise = function (promise, value) {
|
|||
|
var _promise = promise._promise;
|
|||
|
var length = _promise.reactionLength;
|
|||
|
if (length > 0) {
|
|||
|
enqueuePromiseReactionJob(
|
|||
|
_promise.fulfillReactionHandler0,
|
|||
|
_promise.reactionCapability0,
|
|||
|
value
|
|||
|
);
|
|||
|
_promise.fulfillReactionHandler0 = void 0;
|
|||
|
_promise.rejectReactions0 = void 0;
|
|||
|
_promise.reactionCapability0 = void 0;
|
|||
|
if (length > 1) {
|
|||
|
for (var i = 1, idx = 0; i < length; i++, idx += 3) {
|
|||
|
enqueuePromiseReactionJob(
|
|||
|
_promise[idx + PROMISE_FULFILL_OFFSET],
|
|||
|
_promise[idx + PROMISE_CAPABILITY_OFFSET],
|
|||
|
value
|
|||
|
);
|
|||
|
promise[idx + PROMISE_FULFILL_OFFSET] = void 0;
|
|||
|
promise[idx + PROMISE_REJECT_OFFSET] = void 0;
|
|||
|
promise[idx + PROMISE_CAPABILITY_OFFSET] = void 0;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
_promise.result = value;
|
|||
|
_promise.state = PROMISE_FULFILLED;
|
|||
|
_promise.reactionLength = 0;
|
|||
|
};
|
|||
|
|
|||
|
var rejectPromise = function (promise, reason) {
|
|||
|
var _promise = promise._promise;
|
|||
|
var length = _promise.reactionLength;
|
|||
|
if (length > 0) {
|
|||
|
enqueuePromiseReactionJob(
|
|||
|
_promise.rejectReactionHandler0,
|
|||
|
_promise.reactionCapability0,
|
|||
|
reason
|
|||
|
);
|
|||
|
_promise.fulfillReactionHandler0 = void 0;
|
|||
|
_promise.rejectReactions0 = void 0;
|
|||
|
_promise.reactionCapability0 = void 0;
|
|||
|
if (length > 1) {
|
|||
|
for (var i = 1, idx = 0; i < length; i++, idx += 3) {
|
|||
|
enqueuePromiseReactionJob(
|
|||
|
_promise[idx + PROMISE_REJECT_OFFSET],
|
|||
|
_promise[idx + PROMISE_CAPABILITY_OFFSET],
|
|||
|
reason
|
|||
|
);
|
|||
|
promise[idx + PROMISE_FULFILL_OFFSET] = void 0;
|
|||
|
promise[idx + PROMISE_REJECT_OFFSET] = void 0;
|
|||
|
promise[idx + PROMISE_CAPABILITY_OFFSET] = void 0;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
_promise.result = reason;
|
|||
|
_promise.state = PROMISE_REJECTED;
|
|||
|
_promise.reactionLength = 0;
|
|||
|
};
|
|||
|
|
|||
|
var createResolvingFunctions = function (promise) {
|
|||
|
var alreadyResolved = false;
|
|||
|
var resolve = function (resolution) {
|
|||
|
var then;
|
|||
|
if (alreadyResolved) { return; }
|
|||
|
alreadyResolved = true;
|
|||
|
if (resolution === promise) {
|
|||
|
return rejectPromise(promise, new TypeError('Self resolution'));
|
|||
|
}
|
|||
|
if (!ES.TypeIsObject(resolution)) {
|
|||
|
return fulfillPromise(promise, resolution);
|
|||
|
}
|
|||
|
try {
|
|||
|
then = resolution.then;
|
|||
|
} catch (e) {
|
|||
|
return rejectPromise(promise, e);
|
|||
|
}
|
|||
|
if (!ES.IsCallable(then)) {
|
|||
|
return fulfillPromise(promise, resolution);
|
|||
|
}
|
|||
|
enqueue(function () {
|
|||
|
promiseResolveThenableJob(promise, resolution, then);
|
|||
|
});
|
|||
|
};
|
|||
|
var reject = function (reason) {
|
|||
|
if (alreadyResolved) { return; }
|
|||
|
alreadyResolved = true;
|
|||
|
return rejectPromise(promise, reason);
|
|||
|
};
|
|||
|
return { resolve: resolve, reject: reject };
|
|||
|
};
|
|||
|
|
|||
|
var optimizedThen = function (then, thenable, resolve, reject) {
|
|||
|
// Optimization: since we discard the result, we can pass our
|
|||
|
// own then implementation a special hint to let it know it
|
|||
|
// doesn't have to create it. (The PROMISE_FAKE_CAPABILITY
|
|||
|
// object is local to this implementation and unforgeable outside.)
|
|||
|
if (then === Promise$prototype$then) {
|
|||
|
_call(then, thenable, resolve, reject, PROMISE_FAKE_CAPABILITY);
|
|||
|
} else {
|
|||
|
_call(then, thenable, resolve, reject);
|
|||
|
}
|
|||
|
};
|
|||
|
var promiseResolveThenableJob = function (promise, thenable, then) {
|
|||
|
var resolvingFunctions = createResolvingFunctions(promise);
|
|||
|
var resolve = resolvingFunctions.resolve;
|
|||
|
var reject = resolvingFunctions.reject;
|
|||
|
try {
|
|||
|
optimizedThen(then, thenable, resolve, reject);
|
|||
|
} catch (e) {
|
|||
|
reject(e);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
var Promise$prototype, Promise$prototype$then;
|
|||
|
var Promise = (function () {
|
|||
|
var PromiseShim = function Promise(resolver) {
|
|||
|
if (!(this instanceof PromiseShim)) {
|
|||
|
throw new TypeError('Constructor Promise requires "new"');
|
|||
|
}
|
|||
|
if (this && this._promise) {
|
|||
|
throw new TypeError('Bad construction');
|
|||
|
}
|
|||
|
// see https://bugs.ecmascript.org/show_bug.cgi?id=2482
|
|||
|
if (!ES.IsCallable(resolver)) {
|
|||
|
throw new TypeError('not a valid resolver');
|
|||
|
}
|
|||
|
var promise = emulateES6construct(this, PromiseShim, Promise$prototype, {
|
|||
|
_promise: {
|
|||
|
result: void 0,
|
|||
|
state: PROMISE_PENDING,
|
|||
|
// The first member of the "reactions" array is inlined here,
|
|||
|
// since most promises only have one reaction.
|
|||
|
// We've also exploded the 'reaction' object to inline the
|
|||
|
// "handler" and "capability" fields, since both fulfill and
|
|||
|
// reject reactions share the same capability.
|
|||
|
reactionLength: 0,
|
|||
|
fulfillReactionHandler0: void 0,
|
|||
|
rejectReactionHandler0: void 0,
|
|||
|
reactionCapability0: void 0
|
|||
|
}
|
|||
|
});
|
|||
|
var resolvingFunctions = createResolvingFunctions(promise);
|
|||
|
var reject = resolvingFunctions.reject;
|
|||
|
try {
|
|||
|
resolver(resolvingFunctions.resolve, reject);
|
|||
|
} catch (e) {
|
|||
|
reject(e);
|
|||
|
}
|
|||
|
return promise;
|
|||
|
};
|
|||
|
return PromiseShim;
|
|||
|
}());
|
|||
|
Promise$prototype = Promise.prototype;
|
|||
|
|
|||
|
var _promiseAllResolver = function (index, values, capability, remaining) {
|
|||
|
var alreadyCalled = false;
|
|||
|
return function (x) {
|
|||
|
if (alreadyCalled) { return; }
|
|||
|
alreadyCalled = true;
|
|||
|
values[index] = x;
|
|||
|
if ((--remaining.count) === 0) {
|
|||
|
var resolve = capability.resolve;
|
|||
|
resolve(values); // call w/ this===undefined
|
|||
|
}
|
|||
|
};
|
|||
|
};
|
|||
|
|
|||
|
var performPromiseAll = function (iteratorRecord, C, resultCapability) {
|
|||
|
var it = iteratorRecord.iterator;
|
|||
|
var values = [];
|
|||
|
var remaining = { count: 1 };
|
|||
|
var next, nextValue;
|
|||
|
var index = 0;
|
|||
|
while (true) {
|
|||
|
try {
|
|||
|
next = ES.IteratorStep(it);
|
|||
|
if (next === false) {
|
|||
|
iteratorRecord.done = true;
|
|||
|
break;
|
|||
|
}
|
|||
|
nextValue = next.value;
|
|||
|
} catch (e) {
|
|||
|
iteratorRecord.done = true;
|
|||
|
throw e;
|
|||
|
}
|
|||
|
values[index] = void 0;
|
|||
|
var nextPromise = C.resolve(nextValue);
|
|||
|
var resolveElement = _promiseAllResolver(
|
|||
|
index, values, resultCapability, remaining
|
|||
|
);
|
|||
|
remaining.count += 1;
|
|||
|
optimizedThen(nextPromise.then, nextPromise, resolveElement, resultCapability.reject);
|
|||
|
index += 1;
|
|||
|
}
|
|||
|
if ((--remaining.count) === 0) {
|
|||
|
var resolve = resultCapability.resolve;
|
|||
|
resolve(values); // call w/ this===undefined
|
|||
|
}
|
|||
|
return resultCapability.promise;
|
|||
|
};
|
|||
|
|
|||
|
var performPromiseRace = function (iteratorRecord, C, resultCapability) {
|
|||
|
var it = iteratorRecord.iterator;
|
|||
|
var next, nextValue, nextPromise;
|
|||
|
while (true) {
|
|||
|
try {
|
|||
|
next = ES.IteratorStep(it);
|
|||
|
if (next === false) {
|
|||
|
// NOTE: If iterable has no items, resulting promise will never
|
|||
|
// resolve; see:
|
|||
|
// https://github.com/domenic/promises-unwrapping/issues/75
|
|||
|
// https://bugs.ecmascript.org/show_bug.cgi?id=2515
|
|||
|
iteratorRecord.done = true;
|
|||
|
break;
|
|||
|
}
|
|||
|
nextValue = next.value;
|
|||
|
} catch (e) {
|
|||
|
iteratorRecord.done = true;
|
|||
|
throw e;
|
|||
|
}
|
|||
|
nextPromise = C.resolve(nextValue);
|
|||
|
optimizedThen(nextPromise.then, nextPromise, resultCapability.resolve, resultCapability.reject);
|
|||
|
}
|
|||
|
return resultCapability.promise;
|
|||
|
};
|
|||
|
|
|||
|
defineProperties(Promise, {
|
|||
|
all: function all(iterable) {
|
|||
|
var C = this;
|
|||
|
if (!ES.TypeIsObject(C)) {
|
|||
|
throw new TypeError('Promise is not object');
|
|||
|
}
|
|||
|
var capability = new PromiseCapability(C);
|
|||
|
var iterator, iteratorRecord;
|
|||
|
try {
|
|||
|
iterator = ES.GetIterator(iterable);
|
|||
|
iteratorRecord = { iterator: iterator, done: false };
|
|||
|
return performPromiseAll(iteratorRecord, C, capability);
|
|||
|
} catch (e) {
|
|||
|
var exception = e;
|
|||
|
if (iteratorRecord && !iteratorRecord.done) {
|
|||
|
try {
|
|||
|
ES.IteratorClose(iterator, true);
|
|||
|
} catch (ee) {
|
|||
|
exception = ee;
|
|||
|
}
|
|||
|
}
|
|||
|
var reject = capability.reject;
|
|||
|
reject(exception);
|
|||
|
return capability.promise;
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
race: function race(iterable) {
|
|||
|
var C = this;
|
|||
|
if (!ES.TypeIsObject(C)) {
|
|||
|
throw new TypeError('Promise is not object');
|
|||
|
}
|
|||
|
var capability = new PromiseCapability(C);
|
|||
|
var iterator, iteratorRecord;
|
|||
|
try {
|
|||
|
iterator = ES.GetIterator(iterable);
|
|||
|
iteratorRecord = { iterator: iterator, done: false };
|
|||
|
return performPromiseRace(iteratorRecord, C, capability);
|
|||
|
} catch (e) {
|
|||
|
var exception = e;
|
|||
|
if (iteratorRecord && !iteratorRecord.done) {
|
|||
|
try {
|
|||
|
ES.IteratorClose(iterator, true);
|
|||
|
} catch (ee) {
|
|||
|
exception = ee;
|
|||
|
}
|
|||
|
}
|
|||
|
var reject = capability.reject;
|
|||
|
reject(exception);
|
|||
|
return capability.promise;
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
reject: function reject(reason) {
|
|||
|
var C = this;
|
|||
|
if (!ES.TypeIsObject(C)) {
|
|||
|
throw new TypeError('Bad promise constructor');
|
|||
|
}
|
|||
|
var capability = new PromiseCapability(C);
|
|||
|
var rejectFunc = capability.reject;
|
|||
|
rejectFunc(reason); // call with this===undefined
|
|||
|
return capability.promise;
|
|||
|
},
|
|||
|
|
|||
|
resolve: function resolve(v) {
|
|||
|
// See https://esdiscuss.org/topic/fixing-promise-resolve for spec
|
|||
|
var C = this;
|
|||
|
if (!ES.TypeIsObject(C)) {
|
|||
|
throw new TypeError('Bad promise constructor');
|
|||
|
}
|
|||
|
if (ES.IsPromise(v)) {
|
|||
|
var constructor = v.constructor;
|
|||
|
if (constructor === C) {
|
|||
|
return v;
|
|||
|
}
|
|||
|
}
|
|||
|
var capability = new PromiseCapability(C);
|
|||
|
var resolveFunc = capability.resolve;
|
|||
|
resolveFunc(v); // call with this===undefined
|
|||
|
return capability.promise;
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
defineProperties(Promise$prototype, {
|
|||
|
'catch': function (onRejected) {
|
|||
|
return this.then(null, onRejected);
|
|||
|
},
|
|||
|
|
|||
|
then: function then(onFulfilled, onRejected) {
|
|||
|
var promise = this;
|
|||
|
if (!ES.IsPromise(promise)) { throw new TypeError('not a promise'); }
|
|||
|
var C = ES.SpeciesConstructor(promise, Promise);
|
|||
|
var resultCapability;
|
|||
|
var returnValueIsIgnored = arguments.length > 2 && arguments[2] === PROMISE_FAKE_CAPABILITY;
|
|||
|
if (returnValueIsIgnored && C === Promise) {
|
|||
|
resultCapability = PROMISE_FAKE_CAPABILITY;
|
|||
|
} else {
|
|||
|
resultCapability = new PromiseCapability(C);
|
|||
|
}
|
|||
|
// PerformPromiseThen(promise, onFulfilled, onRejected, resultCapability)
|
|||
|
// Note that we've split the 'reaction' object into its two
|
|||
|
// components, "capabilities" and "handler"
|
|||
|
// "capabilities" is always equal to `resultCapability`
|
|||
|
var fulfillReactionHandler = ES.IsCallable(onFulfilled) ? onFulfilled : PROMISE_IDENTITY;
|
|||
|
var rejectReactionHandler = ES.IsCallable(onRejected) ? onRejected : PROMISE_THROWER;
|
|||
|
var _promise = promise._promise;
|
|||
|
var value;
|
|||
|
if (_promise.state === PROMISE_PENDING) {
|
|||
|
if (_promise.reactionLength === 0) {
|
|||
|
_promise.fulfillReactionHandler0 = fulfillReactionHandler;
|
|||
|
_promise.rejectReactionHandler0 = rejectReactionHandler;
|
|||
|
_promise.reactionCapability0 = resultCapability;
|
|||
|
} else {
|
|||
|
var idx = 3 * (_promise.reactionLength - 1);
|
|||
|
_promise[idx + PROMISE_FULFILL_OFFSET] = fulfillReactionHandler;
|
|||
|
_promise[idx + PROMISE_REJECT_OFFSET] = rejectReactionHandler;
|
|||
|
_promise[idx + PROMISE_CAPABILITY_OFFSET] = resultCapability;
|
|||
|
}
|
|||
|
_promise.reactionLength += 1;
|
|||
|
} else if (_promise.state === PROMISE_FULFILLED) {
|
|||
|
value = _promise.result;
|
|||
|
enqueuePromiseReactionJob(
|
|||
|
fulfillReactionHandler, resultCapability, value
|
|||
|
);
|
|||
|
} else if (_promise.state === PROMISE_REJECTED) {
|
|||
|
value = _promise.result;
|
|||
|
enqueuePromiseReactionJob(
|
|||
|
rejectReactionHandler, resultCapability, value
|
|||
|
);
|
|||
|
} else {
|
|||
|
throw new TypeError('unexpected Promise state');
|
|||
|
}
|
|||
|
return resultCapability.promise;
|
|||
|
}
|
|||
|
});
|
|||
|
// This helps the optimizer by ensuring that methods which take
|
|||
|
// capabilities aren't polymorphic.
|
|||
|
PROMISE_FAKE_CAPABILITY = new PromiseCapability(Promise);
|
|||
|
Promise$prototype$then = Promise$prototype.then;
|
|||
|
|
|||
|
return Promise;
|
|||
|
}());
|
|||
|
|
|||
|
// Chrome's native Promise has extra methods that it shouldn't have. Let's remove them.
|
|||
|
if (globals.Promise) {
|
|||
|
delete globals.Promise.accept;
|
|||
|
delete globals.Promise.defer;
|
|||
|
delete globals.Promise.prototype.chain;
|
|||
|
}
|
|||
|
|
|||
|
if (typeof PromiseShim === 'function') {
|
|||
|
// export the Promise constructor.
|
|||
|
defineProperties(globals, { Promise: PromiseShim });
|
|||
|
// In Chrome 33 (and thereabouts) Promise is defined, but the
|
|||
|
// implementation is buggy in a number of ways. Let's check subclassing
|
|||
|
// support to see if we have a buggy implementation.
|
|||
|
var promiseSupportsSubclassing = supportsSubclassing(globals.Promise, function (S) {
|
|||
|
return S.resolve(42).then(function () {}) instanceof S;
|
|||
|
});
|
|||
|
var promiseIgnoresNonFunctionThenCallbacks = !throwsError(function () {
|
|||
|
globals.Promise.reject(42).then(null, 5).then(null, noop);
|
|||
|
});
|
|||
|
var promiseRequiresObjectContext = throwsError(function () { globals.Promise.call(3, noop); });
|
|||
|
// Promise.resolve() was errata'ed late in the ES6 process.
|
|||
|
// See: https://bugzilla.mozilla.org/show_bug.cgi?id=1170742
|
|||
|
// https://code.google.com/p/v8/issues/detail?id=4161
|
|||
|
// It serves as a proxy for a number of other bugs in early Promise
|
|||
|
// implementations.
|
|||
|
var promiseResolveBroken = (function (Promise) {
|
|||
|
var p = Promise.resolve(5);
|
|||
|
p.constructor = {};
|
|||
|
var p2 = Promise.resolve(p);
|
|||
|
try {
|
|||
|
p2.then(null, noop).then(null, noop); // avoid "uncaught rejection" warnings in console
|
|||
|
} catch (e) {
|
|||
|
return true; // v8 native Promises break here https://code.google.com/p/chromium/issues/detail?id=575314
|
|||
|
}
|
|||
|
return p === p2; // This *should* be false!
|
|||
|
}(globals.Promise));
|
|||
|
|
|||
|
// Chrome 46 (probably older too) does not retrieve a thenable's .then synchronously
|
|||
|
var getsThenSynchronously = supportsDescriptors && (function () {
|
|||
|
var count = 0;
|
|||
|
var thenable = Object.defineProperty({}, 'then', { get: function () { count += 1; } });
|
|||
|
Promise.resolve(thenable);
|
|||
|
return count === 1;
|
|||
|
}());
|
|||
|
|
|||
|
var BadResolverPromise = function BadResolverPromise(executor) {
|
|||
|
var p = new Promise(executor);
|
|||
|
executor(3, function () {});
|
|||
|
this.then = p.then;
|
|||
|
this.constructor = BadResolverPromise;
|
|||
|
};
|
|||
|
BadResolverPromise.prototype = Promise.prototype;
|
|||
|
BadResolverPromise.all = Promise.all;
|
|||
|
// Chrome Canary 49 (probably older too) has some implementation bugs
|
|||
|
var hasBadResolverPromise = valueOrFalseIfThrows(function () {
|
|||
|
return !!BadResolverPromise.all([1, 2]);
|
|||
|
});
|
|||
|
|
|||
|
if (!promiseSupportsSubclassing || !promiseIgnoresNonFunctionThenCallbacks ||
|
|||
|
!promiseRequiresObjectContext || promiseResolveBroken ||
|
|||
|
!getsThenSynchronously || hasBadResolverPromise) {
|
|||
|
/* globals Promise: true */
|
|||
|
/* eslint-disable no-undef, no-global-assign */
|
|||
|
/* jshint -W020 */
|
|||
|
Promise = PromiseShim;
|
|||
|
/* jshint +W020 */
|
|||
|
/* eslint-enable no-undef, no-global-assign */
|
|||
|
/* globals Promise: false */
|
|||
|
overrideNative(globals, 'Promise', PromiseShim);
|
|||
|
}
|
|||
|
if (Promise.all.length !== 1) {
|
|||
|
var origAll = Promise.all;
|
|||
|
overrideNative(Promise, 'all', function all(iterable) {
|
|||
|
return ES.Call(origAll, this, arguments);
|
|||
|
});
|
|||
|
}
|
|||
|
if (Promise.race.length !== 1) {
|
|||
|
var origRace = Promise.race;
|
|||
|
overrideNative(Promise, 'race', function race(iterable) {
|
|||
|
return ES.Call(origRace, this, arguments);
|
|||
|
});
|
|||
|
}
|
|||
|
if (Promise.resolve.length !== 1) {
|
|||
|
var origResolve = Promise.resolve;
|
|||
|
overrideNative(Promise, 'resolve', function resolve(x) {
|
|||
|
return ES.Call(origResolve, this, arguments);
|
|||
|
});
|
|||
|
}
|
|||
|
if (Promise.reject.length !== 1) {
|
|||
|
var origReject = Promise.reject;
|
|||
|
overrideNative(Promise, 'reject', function reject(r) {
|
|||
|
return ES.Call(origReject, this, arguments);
|
|||
|
});
|
|||
|
}
|
|||
|
ensureEnumerable(Promise, 'all');
|
|||
|
ensureEnumerable(Promise, 'race');
|
|||
|
ensureEnumerable(Promise, 'resolve');
|
|||
|
ensureEnumerable(Promise, 'reject');
|
|||
|
addDefaultSpecies(Promise);
|
|||
|
}
|
|||
|
|
|||
|
// Map and Set require a true ES5 environment
|
|||
|
// Their fast path also requires that the environment preserve
|
|||
|
// property insertion order, which is not guaranteed by the spec.
|
|||
|
var testOrder = function (a) {
|
|||
|
var b = keys(_reduce(a, function (o, k) {
|
|||
|
o[k] = true;
|
|||
|
return o;
|
|||
|
}, {}));
|
|||
|
return a.join(':') === b.join(':');
|
|||
|
};
|
|||
|
var preservesInsertionOrder = testOrder(['z', 'a', 'bb']);
|
|||
|
// some engines (eg, Chrome) only preserve insertion order for string keys
|
|||
|
var preservesNumericInsertionOrder = testOrder(['z', 1, 'a', '3', 2]);
|
|||
|
|
|||
|
if (supportsDescriptors) {
|
|||
|
|
|||
|
var fastkey = function fastkey(key, skipInsertionOrderCheck) {
|
|||
|
if (!skipInsertionOrderCheck && !preservesInsertionOrder) {
|
|||
|
return null;
|
|||
|
}
|
|||
|
if (isNullOrUndefined(key)) {
|
|||
|
return '^' + ES.ToString(key);
|
|||
|
} else if (typeof key === 'string') {
|
|||
|
return '$' + key;
|
|||
|
} else if (typeof key === 'number') {
|
|||
|
// note that -0 will get coerced to "0" when used as a property key
|
|||
|
if (!preservesNumericInsertionOrder) {
|
|||
|
return 'n' + key;
|
|||
|
}
|
|||
|
return key;
|
|||
|
} else if (typeof key === 'boolean') {
|
|||
|
return 'b' + key;
|
|||
|
}
|
|||
|
return null;
|
|||
|
};
|
|||
|
|
|||
|
var emptyObject = function emptyObject() {
|
|||
|
// accomodate some older not-quite-ES5 browsers
|
|||
|
return Object.create ? Object.create(null) : {};
|
|||
|
};
|
|||
|
|
|||
|
var addIterableToMap = function addIterableToMap(MapConstructor, map, iterable) {
|
|||
|
if (isArray(iterable) || Type.string(iterable)) {
|
|||
|
_forEach(iterable, function (entry) {
|
|||
|
if (!ES.TypeIsObject(entry)) {
|
|||
|
throw new TypeError('Iterator value ' + entry + ' is not an entry object');
|
|||
|
}
|
|||
|
map.set(entry[0], entry[1]);
|
|||
|
});
|
|||
|
} else if (iterable instanceof MapConstructor) {
|
|||
|
_call(MapConstructor.prototype.forEach, iterable, function (value, key) {
|
|||
|
map.set(key, value);
|
|||
|
});
|
|||
|
} else {
|
|||
|
var iter, adder;
|
|||
|
if (!isNullOrUndefined(iterable)) {
|
|||
|
adder = map.set;
|
|||
|
if (!ES.IsCallable(adder)) { throw new TypeError('bad map'); }
|
|||
|
iter = ES.GetIterator(iterable);
|
|||
|
}
|
|||
|
if (typeof iter !== 'undefined') {
|
|||
|
while (true) {
|
|||
|
var next = ES.IteratorStep(iter);
|
|||
|
if (next === false) { break; }
|
|||
|
var nextItem = next.value;
|
|||
|
try {
|
|||
|
if (!ES.TypeIsObject(nextItem)) {
|
|||
|
throw new TypeError('Iterator value ' + nextItem + ' is not an entry object');
|
|||
|
}
|
|||
|
_call(adder, map, nextItem[0], nextItem[1]);
|
|||
|
} catch (e) {
|
|||
|
ES.IteratorClose(iter, true);
|
|||
|
throw e;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
var addIterableToSet = function addIterableToSet(SetConstructor, set, iterable) {
|
|||
|
if (isArray(iterable) || Type.string(iterable)) {
|
|||
|
_forEach(iterable, function (value) {
|
|||
|
set.add(value);
|
|||
|
});
|
|||
|
} else if (iterable instanceof SetConstructor) {
|
|||
|
_call(SetConstructor.prototype.forEach, iterable, function (value) {
|
|||
|
set.add(value);
|
|||
|
});
|
|||
|
} else {
|
|||
|
var iter, adder;
|
|||
|
if (!isNullOrUndefined(iterable)) {
|
|||
|
adder = set.add;
|
|||
|
if (!ES.IsCallable(adder)) { throw new TypeError('bad set'); }
|
|||
|
iter = ES.GetIterator(iterable);
|
|||
|
}
|
|||
|
if (typeof iter !== 'undefined') {
|
|||
|
while (true) {
|
|||
|
var next = ES.IteratorStep(iter);
|
|||
|
if (next === false) { break; }
|
|||
|
var nextValue = next.value;
|
|||
|
try {
|
|||
|
_call(adder, set, nextValue);
|
|||
|
} catch (e) {
|
|||
|
ES.IteratorClose(iter, true);
|
|||
|
throw e;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
var collectionShims = {
|
|||
|
Map: (function () {
|
|||
|
|
|||
|
var empty = {};
|
|||
|
|
|||
|
var MapEntry = function MapEntry(key, value) {
|
|||
|
this.key = key;
|
|||
|
this.value = value;
|
|||
|
this.next = null;
|
|||
|
this.prev = null;
|
|||
|
};
|
|||
|
|
|||
|
MapEntry.prototype.isRemoved = function isRemoved() {
|
|||
|
return this.key === empty;
|
|||
|
};
|
|||
|
|
|||
|
var isMap = function isMap(map) {
|
|||
|
return !!map._es6map;
|
|||
|
};
|
|||
|
|
|||
|
var requireMapSlot = function requireMapSlot(map, method) {
|
|||
|
if (!ES.TypeIsObject(map) || !isMap(map)) {
|
|||
|
throw new TypeError('Method Map.prototype.' + method + ' called on incompatible receiver ' + ES.ToString(map));
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
var MapIterator = function MapIterator(map, kind) {
|
|||
|
requireMapSlot(map, '[[MapIterator]]');
|
|||
|
this.head = map._head;
|
|||
|
this.i = this.head;
|
|||
|
this.kind = kind;
|
|||
|
};
|
|||
|
|
|||
|
MapIterator.prototype = {
|
|||
|
next: function next() {
|
|||
|
var i = this.i;
|
|||
|
var kind = this.kind;
|
|||
|
var head = this.head;
|
|||
|
if (typeof this.i === 'undefined') {
|
|||
|
return iteratorResult();
|
|||
|
}
|
|||
|
while (i.isRemoved() && i !== head) {
|
|||
|
// back up off of removed entries
|
|||
|
i = i.prev;
|
|||
|
}
|
|||
|
// advance to next unreturned element.
|
|||
|
var result;
|
|||
|
while (i.next !== head) {
|
|||
|
i = i.next;
|
|||
|
if (!i.isRemoved()) {
|
|||
|
if (kind === 'key') {
|
|||
|
result = i.key;
|
|||
|
} else if (kind === 'value') {
|
|||
|
result = i.value;
|
|||
|
} else {
|
|||
|
result = [i.key, i.value];
|
|||
|
}
|
|||
|
this.i = i;
|
|||
|
return iteratorResult(result);
|
|||
|
}
|
|||
|
}
|
|||
|
// once the iterator is done, it is done forever.
|
|||
|
this.i = void 0;
|
|||
|
return iteratorResult();
|
|||
|
}
|
|||
|
};
|
|||
|
addIterator(MapIterator.prototype);
|
|||
|
|
|||
|
var Map$prototype;
|
|||
|
var MapShim = function Map() {
|
|||
|
if (!(this instanceof Map)) {
|
|||
|
throw new TypeError('Constructor Map requires "new"');
|
|||
|
}
|
|||
|
if (this && this._es6map) {
|
|||
|
throw new TypeError('Bad construction');
|
|||
|
}
|
|||
|
var map = emulateES6construct(this, Map, Map$prototype, {
|
|||
|
_es6map: true,
|
|||
|
_head: null,
|
|||
|
_map: OrigMap ? new OrigMap() : null,
|
|||
|
_size: 0,
|
|||
|
_storage: emptyObject()
|
|||
|
});
|
|||
|
|
|||
|
var head = new MapEntry(null, null);
|
|||
|
// circular doubly-linked list.
|
|||
|
/* eslint no-multi-assign: 1 */
|
|||
|
head.next = head.prev = head;
|
|||
|
map._head = head;
|
|||
|
|
|||
|
// Optionally initialize map from iterable
|
|||
|
if (arguments.length > 0) {
|
|||
|
addIterableToMap(Map, map, arguments[0]);
|
|||
|
}
|
|||
|
return map;
|
|||
|
};
|
|||
|
Map$prototype = MapShim.prototype;
|
|||
|
|
|||
|
Value.getter(Map$prototype, 'size', function () {
|
|||
|
if (typeof this._size === 'undefined') {
|
|||
|
throw new TypeError('size method called on incompatible Map');
|
|||
|
}
|
|||
|
return this._size;
|
|||
|
});
|
|||
|
|
|||
|
defineProperties(Map$prototype, {
|
|||
|
get: function get(key) {
|
|||
|
requireMapSlot(this, 'get');
|
|||
|
var entry;
|
|||
|
var fkey = fastkey(key, true);
|
|||
|
if (fkey !== null) {
|
|||
|
// fast O(1) path
|
|||
|
entry = this._storage[fkey];
|
|||
|
if (entry) {
|
|||
|
return entry.value;
|
|||
|
} else {
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
if (this._map) {
|
|||
|
// fast object key path
|
|||
|
entry = origMapGet.call(this._map, key);
|
|||
|
if (entry) {
|
|||
|
return entry.value;
|
|||
|
} else {
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
var head = this._head;
|
|||
|
var i = head;
|
|||
|
while ((i = i.next) !== head) {
|
|||
|
if (ES.SameValueZero(i.key, key)) {
|
|||
|
return i.value;
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
has: function has(key) {
|
|||
|
requireMapSlot(this, 'has');
|
|||
|
var fkey = fastkey(key, true);
|
|||
|
if (fkey !== null) {
|
|||
|
// fast O(1) path
|
|||
|
return typeof this._storage[fkey] !== 'undefined';
|
|||
|
}
|
|||
|
if (this._map) {
|
|||
|
// fast object key path
|
|||
|
return origMapHas.call(this._map, key);
|
|||
|
}
|
|||
|
var head = this._head;
|
|||
|
var i = head;
|
|||
|
while ((i = i.next) !== head) {
|
|||
|
if (ES.SameValueZero(i.key, key)) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
return false;
|
|||
|
},
|
|||
|
|
|||
|
set: function set(key, value) {
|
|||
|
requireMapSlot(this, 'set');
|
|||
|
var head = this._head;
|
|||
|
var i = head;
|
|||
|
var entry;
|
|||
|
var fkey = fastkey(key, true);
|
|||
|
if (fkey !== null) {
|
|||
|
// fast O(1) path
|
|||
|
if (typeof this._storage[fkey] !== 'undefined') {
|
|||
|
this._storage[fkey].value = value;
|
|||
|
return this;
|
|||
|
} else {
|
|||
|
entry = this._storage[fkey] = new MapEntry(key, value); /* eslint no-multi-assign: 1 */
|
|||
|
i = head.prev;
|
|||
|
// fall through
|
|||
|
}
|
|||
|
} else if (this._map) {
|
|||
|
// fast object key path
|
|||
|
if (origMapHas.call(this._map, key)) {
|
|||
|
origMapGet.call(this._map, key).value = value;
|
|||
|
} else {
|
|||
|
entry = new MapEntry(key, value);
|
|||
|
origMapSet.call(this._map, key, entry);
|
|||
|
i = head.prev;
|
|||
|
// fall through
|
|||
|
}
|
|||
|
}
|
|||
|
while ((i = i.next) !== head) {
|
|||
|
if (ES.SameValueZero(i.key, key)) {
|
|||
|
i.value = value;
|
|||
|
return this;
|
|||
|
}
|
|||
|
}
|
|||
|
entry = entry || new MapEntry(key, value);
|
|||
|
if (ES.SameValue(-0, key)) {
|
|||
|
entry.key = +0; // coerce -0 to +0 in entry
|
|||
|
}
|
|||
|
entry.next = this._head;
|
|||
|
entry.prev = this._head.prev;
|
|||
|
entry.prev.next = entry;
|
|||
|
entry.next.prev = entry;
|
|||
|
this._size += 1;
|
|||
|
return this;
|
|||
|
},
|
|||
|
|
|||
|
'delete': function (key) {
|
|||
|
requireMapSlot(this, 'delete');
|
|||
|
var head = this._head;
|
|||
|
var i = head;
|
|||
|
var fkey = fastkey(key, true);
|
|||
|
if (fkey !== null) {
|
|||
|
// fast O(1) path
|
|||
|
if (typeof this._storage[fkey] === 'undefined') {
|
|||
|
return false;
|
|||
|
}
|
|||
|
i = this._storage[fkey].prev;
|
|||
|
delete this._storage[fkey];
|
|||
|
// fall through
|
|||
|
} else if (this._map) {
|
|||
|
// fast object key path
|
|||
|
if (!origMapHas.call(this._map, key)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
i = origMapGet.call(this._map, key).prev;
|
|||
|
origMapDelete.call(this._map, key);
|
|||
|
// fall through
|
|||
|
}
|
|||
|
while ((i = i.next) !== head) {
|
|||
|
if (ES.SameValueZero(i.key, key)) {
|
|||
|
i.key = empty;
|
|||
|
i.value = empty;
|
|||
|
i.prev.next = i.next;
|
|||
|
i.next.prev = i.prev;
|
|||
|
this._size -= 1;
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
return false;
|
|||
|
},
|
|||
|
|
|||
|
clear: function clear() {
|
|||
|
/* eslint no-multi-assign: 1 */
|
|||
|
requireMapSlot(this, 'clear');
|
|||
|
this._map = OrigMap ? new OrigMap() : null;
|
|||
|
this._size = 0;
|
|||
|
this._storage = emptyObject();
|
|||
|
var head = this._head;
|
|||
|
var i = head;
|
|||
|
var p = i.next;
|
|||
|
while ((i = p) !== head) {
|
|||
|
i.key = empty;
|
|||
|
i.value = empty;
|
|||
|
p = i.next;
|
|||
|
i.next = i.prev = head;
|
|||
|
}
|
|||
|
head.next = head.prev = head;
|
|||
|
},
|
|||
|
|
|||
|
keys: function keys() {
|
|||
|
requireMapSlot(this, 'keys');
|
|||
|
return new MapIterator(this, 'key');
|
|||
|
},
|
|||
|
|
|||
|
values: function values() {
|
|||
|
requireMapSlot(this, 'values');
|
|||
|
return new MapIterator(this, 'value');
|
|||
|
},
|
|||
|
|
|||
|
entries: function entries() {
|
|||
|
requireMapSlot(this, 'entries');
|
|||
|
return new MapIterator(this, 'key+value');
|
|||
|
},
|
|||
|
|
|||
|
forEach: function forEach(callback) {
|
|||
|
requireMapSlot(this, 'forEach');
|
|||
|
var context = arguments.length > 1 ? arguments[1] : null;
|
|||
|
var it = this.entries();
|
|||
|
for (var entry = it.next(); !entry.done; entry = it.next()) {
|
|||
|
if (context) {
|
|||
|
_call(callback, context, entry.value[1], entry.value[0], this);
|
|||
|
} else {
|
|||
|
callback(entry.value[1], entry.value[0], this);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
addIterator(Map$prototype, Map$prototype.entries);
|
|||
|
|
|||
|
return MapShim;
|
|||
|
}()),
|
|||
|
|
|||
|
Set: (function () {
|
|||
|
var isSet = function isSet(set) {
|
|||
|
return set._es6set && typeof set._storage !== 'undefined';
|
|||
|
};
|
|||
|
var requireSetSlot = function requireSetSlot(set, method) {
|
|||
|
if (!ES.TypeIsObject(set) || !isSet(set)) {
|
|||
|
// https://github.com/paulmillr/es6-shim/issues/176
|
|||
|
throw new TypeError('Set.prototype.' + method + ' called on incompatible receiver ' + ES.ToString(set));
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
// Creating a Map is expensive. To speed up the common case of
|
|||
|
// Sets containing only string or numeric keys, we use an object
|
|||
|
// as backing storage and lazily create a full Map only when
|
|||
|
// required.
|
|||
|
var Set$prototype;
|
|||
|
var SetShim = function Set() {
|
|||
|
if (!(this instanceof Set)) {
|
|||
|
throw new TypeError('Constructor Set requires "new"');
|
|||
|
}
|
|||
|
if (this && this._es6set) {
|
|||
|
throw new TypeError('Bad construction');
|
|||
|
}
|
|||
|
var set = emulateES6construct(this, Set, Set$prototype, {
|
|||
|
_es6set: true,
|
|||
|
'[[SetData]]': null,
|
|||
|
_storage: emptyObject()
|
|||
|
});
|
|||
|
if (!set._es6set) {
|
|||
|
throw new TypeError('bad set');
|
|||
|
}
|
|||
|
|
|||
|
// Optionally initialize Set from iterable
|
|||
|
if (arguments.length > 0) {
|
|||
|
addIterableToSet(Set, set, arguments[0]);
|
|||
|
}
|
|||
|
return set;
|
|||
|
};
|
|||
|
Set$prototype = SetShim.prototype;
|
|||
|
|
|||
|
var decodeKey = function (key) {
|
|||
|
var k = key;
|
|||
|
if (k === '^null') {
|
|||
|
return null;
|
|||
|
} else if (k === '^undefined') {
|
|||
|
return void 0;
|
|||
|
} else {
|
|||
|
var first = k.charAt(0);
|
|||
|
if (first === '$') {
|
|||
|
return _strSlice(k, 1);
|
|||
|
} else if (first === 'n') {
|
|||
|
return +_strSlice(k, 1);
|
|||
|
} else if (first === 'b') {
|
|||
|
return k === 'btrue';
|
|||
|
}
|
|||
|
}
|
|||
|
return +k;
|
|||
|
};
|
|||
|
// Switch from the object backing storage to a full Map.
|
|||
|
var ensureMap = function ensureMap(set) {
|
|||
|
if (!set['[[SetData]]']) {
|
|||
|
var m = new collectionShims.Map();
|
|||
|
set['[[SetData]]'] = m;
|
|||
|
_forEach(keys(set._storage), function (key) {
|
|||
|
var k = decodeKey(key);
|
|||
|
m.set(k, k);
|
|||
|
});
|
|||
|
set['[[SetData]]'] = m;
|
|||
|
}
|
|||
|
set._storage = null; // free old backing storage
|
|||
|
};
|
|||
|
|
|||
|
Value.getter(SetShim.prototype, 'size', function () {
|
|||
|
requireSetSlot(this, 'size');
|
|||
|
if (this._storage) {
|
|||
|
return keys(this._storage).length;
|
|||
|
}
|
|||
|
ensureMap(this);
|
|||
|
return this['[[SetData]]'].size;
|
|||
|
});
|
|||
|
|
|||
|
defineProperties(SetShim.prototype, {
|
|||
|
has: function has(key) {
|
|||
|
requireSetSlot(this, 'has');
|
|||
|
var fkey;
|
|||
|
if (this._storage && (fkey = fastkey(key)) !== null) {
|
|||
|
return !!this._storage[fkey];
|
|||
|
}
|
|||
|
ensureMap(this);
|
|||
|
return this['[[SetData]]'].has(key);
|
|||
|
},
|
|||
|
|
|||
|
add: function add(key) {
|
|||
|
requireSetSlot(this, 'add');
|
|||
|
var fkey;
|
|||
|
if (this._storage && (fkey = fastkey(key)) !== null) {
|
|||
|
this._storage[fkey] = true;
|
|||
|
return this;
|
|||
|
}
|
|||
|
ensureMap(this);
|
|||
|
this['[[SetData]]'].set(key, key);
|
|||
|
return this;
|
|||
|
},
|
|||
|
|
|||
|
'delete': function (key) {
|
|||
|
requireSetSlot(this, 'delete');
|
|||
|
var fkey;
|
|||
|
if (this._storage && (fkey = fastkey(key)) !== null) {
|
|||
|
var hasFKey = _hasOwnProperty(this._storage, fkey);
|
|||
|
return (delete this._storage[fkey]) && hasFKey;
|
|||
|
}
|
|||
|
ensureMap(this);
|
|||
|
return this['[[SetData]]']['delete'](key);
|
|||
|
},
|
|||
|
|
|||
|
clear: function clear() {
|
|||
|
requireSetSlot(this, 'clear');
|
|||
|
if (this._storage) {
|
|||
|
this._storage = emptyObject();
|
|||
|
}
|
|||
|
if (this['[[SetData]]']) {
|
|||
|
this['[[SetData]]'].clear();
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
values: function values() {
|
|||
|
requireSetSlot(this, 'values');
|
|||
|
ensureMap(this);
|
|||
|
return this['[[SetData]]'].values();
|
|||
|
},
|
|||
|
|
|||
|
entries: function entries() {
|
|||
|
requireSetSlot(this, 'entries');
|
|||
|
ensureMap(this);
|
|||
|
return this['[[SetData]]'].entries();
|
|||
|
},
|
|||
|
|
|||
|
forEach: function forEach(callback) {
|
|||
|
requireSetSlot(this, 'forEach');
|
|||
|
var context = arguments.length > 1 ? arguments[1] : null;
|
|||
|
var entireSet = this;
|
|||
|
ensureMap(entireSet);
|
|||
|
this['[[SetData]]'].forEach(function (value, key) {
|
|||
|
if (context) {
|
|||
|
_call(callback, context, key, key, entireSet);
|
|||
|
} else {
|
|||
|
callback(key, key, entireSet);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
});
|
|||
|
defineProperty(SetShim.prototype, 'keys', SetShim.prototype.values, true);
|
|||
|
addIterator(SetShim.prototype, SetShim.prototype.values);
|
|||
|
|
|||
|
return SetShim;
|
|||
|
}())
|
|||
|
};
|
|||
|
|
|||
|
if (globals.Map || globals.Set) {
|
|||
|
// Safari 8, for example, doesn't accept an iterable.
|
|||
|
var mapAcceptsArguments = valueOrFalseIfThrows(function () { return new Map([[1, 2]]).get(1) === 2; });
|
|||
|
if (!mapAcceptsArguments) {
|
|||
|
globals.Map = function Map() {
|
|||
|
if (!(this instanceof Map)) {
|
|||
|
throw new TypeError('Constructor Map requires "new"');
|
|||
|
}
|
|||
|
var m = new OrigMap();
|
|||
|
if (arguments.length > 0) {
|
|||
|
addIterableToMap(Map, m, arguments[0]);
|
|||
|
}
|
|||
|
delete m.constructor;
|
|||
|
Object.setPrototypeOf(m, globals.Map.prototype);
|
|||
|
return m;
|
|||
|
};
|
|||
|
globals.Map.prototype = create(OrigMap.prototype);
|
|||
|
defineProperty(globals.Map.prototype, 'constructor', globals.Map, true);
|
|||
|
Value.preserveToString(globals.Map, OrigMap);
|
|||
|
}
|
|||
|
var testMap = new Map();
|
|||
|
var mapUsesSameValueZero = (function () {
|
|||
|
// Chrome 38-42, node 0.11/0.12, iojs 1/2 also have a bug when the Map has a size > 4
|
|||
|
var m = new Map([[1, 0], [2, 0], [3, 0], [4, 0]]);
|
|||
|
m.set(-0, m);
|
|||
|
return m.get(0) === m && m.get(-0) === m && m.has(0) && m.has(-0);
|
|||
|
}());
|
|||
|
var mapSupportsChaining = testMap.set(1, 2) === testMap;
|
|||
|
if (!mapUsesSameValueZero || !mapSupportsChaining) {
|
|||
|
overrideNative(Map.prototype, 'set', function set(k, v) {
|
|||
|
_call(origMapSet, this, k === 0 ? 0 : k, v);
|
|||
|
return this;
|
|||
|
});
|
|||
|
}
|
|||
|
if (!mapUsesSameValueZero) {
|
|||
|
defineProperties(Map.prototype, {
|
|||
|
get: function get(k) {
|
|||
|
return _call(origMapGet, this, k === 0 ? 0 : k);
|
|||
|
},
|
|||
|
has: function has(k) {
|
|||
|
return _call(origMapHas, this, k === 0 ? 0 : k);
|
|||
|
}
|
|||
|
}, true);
|
|||
|
Value.preserveToString(Map.prototype.get, origMapGet);
|
|||
|
Value.preserveToString(Map.prototype.has, origMapHas);
|
|||
|
}
|
|||
|
var testSet = new Set();
|
|||
|
var setUsesSameValueZero = (function (s) {
|
|||
|
s['delete'](0);
|
|||
|
s.add(-0);
|
|||
|
return !s.has(0);
|
|||
|
}(testSet));
|
|||
|
var setSupportsChaining = testSet.add(1) === testSet;
|
|||
|
if (!setUsesSameValueZero || !setSupportsChaining) {
|
|||
|
var origSetAdd = Set.prototype.add;
|
|||
|
Set.prototype.add = function add(v) {
|
|||
|
_call(origSetAdd, this, v === 0 ? 0 : v);
|
|||
|
return this;
|
|||
|
};
|
|||
|
Value.preserveToString(Set.prototype.add, origSetAdd);
|
|||
|
}
|
|||
|
if (!setUsesSameValueZero) {
|
|||
|
var origSetHas = Set.prototype.has;
|
|||
|
Set.prototype.has = function has(v) {
|
|||
|
return _call(origSetHas, this, v === 0 ? 0 : v);
|
|||
|
};
|
|||
|
Value.preserveToString(Set.prototype.has, origSetHas);
|
|||
|
var origSetDel = Set.prototype['delete'];
|
|||
|
Set.prototype['delete'] = function SetDelete(v) {
|
|||
|
return _call(origSetDel, this, v === 0 ? 0 : v);
|
|||
|
};
|
|||
|
Value.preserveToString(Set.prototype['delete'], origSetDel);
|
|||
|
}
|
|||
|
var mapSupportsSubclassing = supportsSubclassing(globals.Map, function (M) {
|
|||
|
var m = new M([]);
|
|||
|
// Firefox 32 is ok with the instantiating the subclass but will
|
|||
|
// throw when the map is used.
|
|||
|
m.set(42, 42);
|
|||
|
return m instanceof M;
|
|||
|
});
|
|||
|
// without Object.setPrototypeOf, subclassing is not possible
|
|||
|
var mapFailsToSupportSubclassing = Object.setPrototypeOf && !mapSupportsSubclassing;
|
|||
|
var mapRequiresNew = (function () {
|
|||
|
try {
|
|||
|
return !(globals.Map() instanceof globals.Map);
|
|||
|
} catch (e) {
|
|||
|
return e instanceof TypeError;
|
|||
|
}
|
|||
|
}());
|
|||
|
if (globals.Map.length !== 0 || mapFailsToSupportSubclassing || !mapRequiresNew) {
|
|||
|
globals.Map = function Map() {
|
|||
|
if (!(this instanceof Map)) {
|
|||
|
throw new TypeError('Constructor Map requires "new"');
|
|||
|
}
|
|||
|
var m = new OrigMap();
|
|||
|
if (arguments.length > 0) {
|
|||
|
addIterableToMap(Map, m, arguments[0]);
|
|||
|
}
|
|||
|
delete m.constructor;
|
|||
|
Object.setPrototypeOf(m, Map.prototype);
|
|||
|
return m;
|
|||
|
};
|
|||
|
globals.Map.prototype = OrigMap.prototype;
|
|||
|
defineProperty(globals.Map.prototype, 'constructor', globals.Map, true);
|
|||
|
Value.preserveToString(globals.Map, OrigMap);
|
|||
|
}
|
|||
|
var setSupportsSubclassing = supportsSubclassing(globals.Set, function (S) {
|
|||
|
var s = new S([]);
|
|||
|
s.add(42, 42);
|
|||
|
return s instanceof S;
|
|||
|
});
|
|||
|
// without Object.setPrototypeOf, subclassing is not possible
|
|||
|
var setFailsToSupportSubclassing = Object.setPrototypeOf && !setSupportsSubclassing;
|
|||
|
var setRequiresNew = (function () {
|
|||
|
try {
|
|||
|
return !(globals.Set() instanceof globals.Set);
|
|||
|
} catch (e) {
|
|||
|
return e instanceof TypeError;
|
|||
|
}
|
|||
|
}());
|
|||
|
if (globals.Set.length !== 0 || setFailsToSupportSubclassing || !setRequiresNew) {
|
|||
|
var OrigSet = globals.Set;
|
|||
|
globals.Set = function Set() {
|
|||
|
if (!(this instanceof Set)) {
|
|||
|
throw new TypeError('Constructor Set requires "new"');
|
|||
|
}
|
|||
|
var s = new OrigSet();
|
|||
|
if (arguments.length > 0) {
|
|||
|
addIterableToSet(Set, s, arguments[0]);
|
|||
|
}
|
|||
|
delete s.constructor;
|
|||
|
Object.setPrototypeOf(s, Set.prototype);
|
|||
|
return s;
|
|||
|
};
|
|||
|
globals.Set.prototype = OrigSet.prototype;
|
|||
|
defineProperty(globals.Set.prototype, 'constructor', globals.Set, true);
|
|||
|
Value.preserveToString(globals.Set, OrigSet);
|
|||
|
}
|
|||
|
var newMap = new globals.Map();
|
|||
|
var mapIterationThrowsStopIterator = !valueOrFalseIfThrows(function () {
|
|||
|
return newMap.keys().next().done;
|
|||
|
});
|
|||
|
/*
|
|||
|
- In Firefox < 23, Map#size is a function.
|
|||
|
- In all current Firefox, Set#entries/keys/values & Map#clear do not exist
|
|||
|
- https://bugzilla.mozilla.org/show_bug.cgi?id=869996
|
|||
|
- In Firefox 24, Map and Set do not implement forEach
|
|||
|
- In Firefox 25 at least, Map and Set are callable without "new"
|
|||
|
*/
|
|||
|
if (
|
|||
|
typeof globals.Map.prototype.clear !== 'function' ||
|
|||
|
new globals.Set().size !== 0 ||
|
|||
|
newMap.size !== 0 ||
|
|||
|
typeof globals.Map.prototype.keys !== 'function' ||
|
|||
|
typeof globals.Set.prototype.keys !== 'function' ||
|
|||
|
typeof globals.Map.prototype.forEach !== 'function' ||
|
|||
|
typeof globals.Set.prototype.forEach !== 'function' ||
|
|||
|
isCallableWithoutNew(globals.Map) ||
|
|||
|
isCallableWithoutNew(globals.Set) ||
|
|||
|
typeof newMap.keys().next !== 'function' || // Safari 8
|
|||
|
mapIterationThrowsStopIterator || // Firefox 25
|
|||
|
!mapSupportsSubclassing
|
|||
|
) {
|
|||
|
defineProperties(globals, {
|
|||
|
Map: collectionShims.Map,
|
|||
|
Set: collectionShims.Set
|
|||
|
}, true);
|
|||
|
}
|
|||
|
|
|||
|
if (globals.Set.prototype.keys !== globals.Set.prototype.values) {
|
|||
|
// Fixed in WebKit with https://bugs.webkit.org/show_bug.cgi?id=144190
|
|||
|
defineProperty(globals.Set.prototype, 'keys', globals.Set.prototype.values, true);
|
|||
|
}
|
|||
|
|
|||
|
// Shim incomplete iterator implementations.
|
|||
|
addIterator(Object.getPrototypeOf((new globals.Map()).keys()));
|
|||
|
addIterator(Object.getPrototypeOf((new globals.Set()).keys()));
|
|||
|
|
|||
|
if (functionsHaveNames && globals.Set.prototype.has.name !== 'has') {
|
|||
|
// Microsoft Edge v0.11.10074.0 is missing a name on Set#has
|
|||
|
var anonymousSetHas = globals.Set.prototype.has;
|
|||
|
overrideNative(globals.Set.prototype, 'has', function has(key) {
|
|||
|
return _call(anonymousSetHas, this, key);
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
defineProperties(globals, collectionShims);
|
|||
|
addDefaultSpecies(globals.Map);
|
|||
|
addDefaultSpecies(globals.Set);
|
|||
|
}
|
|||
|
|
|||
|
var throwUnlessTargetIsObject = function throwUnlessTargetIsObject(target) {
|
|||
|
if (!ES.TypeIsObject(target)) {
|
|||
|
throw new TypeError('target must be an object');
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
// Some Reflect methods are basically the same as
|
|||
|
// those on the Object global, except that a TypeError is thrown if
|
|||
|
// target isn't an object. As well as returning a boolean indicating
|
|||
|
// the success of the operation.
|
|||
|
var ReflectShims = {
|
|||
|
// Apply method in a functional form.
|
|||
|
apply: function apply() {
|
|||
|
return ES.Call(ES.Call, null, arguments);
|
|||
|
},
|
|||
|
|
|||
|
// New operator in a functional form.
|
|||
|
construct: function construct(constructor, args) {
|
|||
|
if (!ES.IsConstructor(constructor)) {
|
|||
|
throw new TypeError('First argument must be a constructor.');
|
|||
|
}
|
|||
|
var newTarget = arguments.length > 2 ? arguments[2] : constructor;
|
|||
|
if (!ES.IsConstructor(newTarget)) {
|
|||
|
throw new TypeError('new.target must be a constructor.');
|
|||
|
}
|
|||
|
return ES.Construct(constructor, args, newTarget, 'internal');
|
|||
|
},
|
|||
|
|
|||
|
// When deleting a non-existent or configurable property,
|
|||
|
// true is returned.
|
|||
|
// When attempting to delete a non-configurable property,
|
|||
|
// it will return false.
|
|||
|
deleteProperty: function deleteProperty(target, key) {
|
|||
|
throwUnlessTargetIsObject(target);
|
|||
|
if (supportsDescriptors) {
|
|||
|
var desc = Object.getOwnPropertyDescriptor(target, key);
|
|||
|
|
|||
|
if (desc && !desc.configurable) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Will return true.
|
|||
|
return delete target[key];
|
|||
|
},
|
|||
|
|
|||
|
has: function has(target, key) {
|
|||
|
throwUnlessTargetIsObject(target);
|
|||
|
return key in target;
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
if (Object.getOwnPropertyNames) {
|
|||
|
Object.assign(ReflectShims, {
|
|||
|
// Basically the result of calling the internal [[OwnPropertyKeys]].
|
|||
|
// Concatenating propertyNames and propertySymbols should do the trick.
|
|||
|
// This should continue to work together with a Symbol shim
|
|||
|
// which overrides Object.getOwnPropertyNames and implements
|
|||
|
// Object.getOwnPropertySymbols.
|
|||
|
ownKeys: function ownKeys(target) {
|
|||
|
throwUnlessTargetIsObject(target);
|
|||
|
var keys = Object.getOwnPropertyNames(target);
|
|||
|
|
|||
|
if (ES.IsCallable(Object.getOwnPropertySymbols)) {
|
|||
|
_pushApply(keys, Object.getOwnPropertySymbols(target));
|
|||
|
}
|
|||
|
|
|||
|
return keys;
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
var callAndCatchException = function ConvertExceptionToBoolean(func) {
|
|||
|
return !throwsError(func);
|
|||
|
};
|
|||
|
|
|||
|
if (Object.preventExtensions) {
|
|||
|
Object.assign(ReflectShims, {
|
|||
|
isExtensible: function isExtensible(target) {
|
|||
|
throwUnlessTargetIsObject(target);
|
|||
|
return Object.isExtensible(target);
|
|||
|
},
|
|||
|
preventExtensions: function preventExtensions(target) {
|
|||
|
throwUnlessTargetIsObject(target);
|
|||
|
return callAndCatchException(function () {
|
|||
|
Object.preventExtensions(target);
|
|||
|
});
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
if (supportsDescriptors) {
|
|||
|
var internalGet = function get(target, key, receiver) {
|
|||
|
var desc = Object.getOwnPropertyDescriptor(target, key);
|
|||
|
|
|||
|
if (!desc) {
|
|||
|
var parent = Object.getPrototypeOf(target);
|
|||
|
|
|||
|
if (parent === null) {
|
|||
|
return void 0;
|
|||
|
}
|
|||
|
|
|||
|
return internalGet(parent, key, receiver);
|
|||
|
}
|
|||
|
|
|||
|
if ('value' in desc) {
|
|||
|
return desc.value;
|
|||
|
}
|
|||
|
|
|||
|
if (desc.get) {
|
|||
|
return ES.Call(desc.get, receiver);
|
|||
|
}
|
|||
|
|
|||
|
return void 0;
|
|||
|
};
|
|||
|
|
|||
|
var internalSet = function set(target, key, value, receiver) {
|
|||
|
var desc = Object.getOwnPropertyDescriptor(target, key);
|
|||
|
|
|||
|
if (!desc) {
|
|||
|
var parent = Object.getPrototypeOf(target);
|
|||
|
|
|||
|
if (parent !== null) {
|
|||
|
return internalSet(parent, key, value, receiver);
|
|||
|
}
|
|||
|
|
|||
|
desc = {
|
|||
|
value: void 0,
|
|||
|
writable: true,
|
|||
|
enumerable: true,
|
|||
|
configurable: true
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
if ('value' in desc) {
|
|||
|
if (!desc.writable) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
if (!ES.TypeIsObject(receiver)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
var existingDesc = Object.getOwnPropertyDescriptor(receiver, key);
|
|||
|
|
|||
|
if (existingDesc) {
|
|||
|
return Reflect.defineProperty(receiver, key, {
|
|||
|
value: value
|
|||
|
});
|
|||
|
} else {
|
|||
|
return Reflect.defineProperty(receiver, key, {
|
|||
|
value: value,
|
|||
|
writable: true,
|
|||
|
enumerable: true,
|
|||
|
configurable: true
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (desc.set) {
|
|||
|
_call(desc.set, receiver, value);
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
};
|
|||
|
|
|||
|
Object.assign(ReflectShims, {
|
|||
|
defineProperty: function defineProperty(target, propertyKey, attributes) {
|
|||
|
throwUnlessTargetIsObject(target);
|
|||
|
return callAndCatchException(function () {
|
|||
|
Object.defineProperty(target, propertyKey, attributes);
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {
|
|||
|
throwUnlessTargetIsObject(target);
|
|||
|
return Object.getOwnPropertyDescriptor(target, propertyKey);
|
|||
|
},
|
|||
|
|
|||
|
// Syntax in a functional form.
|
|||
|
get: function get(target, key) {
|
|||
|
throwUnlessTargetIsObject(target);
|
|||
|
var receiver = arguments.length > 2 ? arguments[2] : target;
|
|||
|
|
|||
|
return internalGet(target, key, receiver);
|
|||
|
},
|
|||
|
|
|||
|
set: function set(target, key, value) {
|
|||
|
throwUnlessTargetIsObject(target);
|
|||
|
var receiver = arguments.length > 3 ? arguments[3] : target;
|
|||
|
|
|||
|
return internalSet(target, key, value, receiver);
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
if (Object.getPrototypeOf) {
|
|||
|
var objectDotGetPrototypeOf = Object.getPrototypeOf;
|
|||
|
ReflectShims.getPrototypeOf = function getPrototypeOf(target) {
|
|||
|
throwUnlessTargetIsObject(target);
|
|||
|
return objectDotGetPrototypeOf(target);
|
|||
|
};
|
|||
|
}
|
|||
|
|
|||
|
if (Object.setPrototypeOf && ReflectShims.getPrototypeOf) {
|
|||
|
var willCreateCircularPrototype = function (object, lastProto) {
|
|||
|
var proto = lastProto;
|
|||
|
while (proto) {
|
|||
|
if (object === proto) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
proto = ReflectShims.getPrototypeOf(proto);
|
|||
|
}
|
|||
|
return false;
|
|||
|
};
|
|||
|
|
|||
|
Object.assign(ReflectShims, {
|
|||
|
// Sets the prototype of the given object.
|
|||
|
// Returns true on success, otherwise false.
|
|||
|
setPrototypeOf: function setPrototypeOf(object, proto) {
|
|||
|
throwUnlessTargetIsObject(object);
|
|||
|
if (proto !== null && !ES.TypeIsObject(proto)) {
|
|||
|
throw new TypeError('proto must be an object or null');
|
|||
|
}
|
|||
|
|
|||
|
// If they already are the same, we're done.
|
|||
|
if (proto === Reflect.getPrototypeOf(object)) {
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
// Cannot alter prototype if object not extensible.
|
|||
|
if (Reflect.isExtensible && !Reflect.isExtensible(object)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
// Ensure that we do not create a circular prototype chain.
|
|||
|
if (willCreateCircularPrototype(object, proto)) {
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
Object.setPrototypeOf(object, proto);
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
var defineOrOverrideReflectProperty = function (key, shim) {
|
|||
|
if (!ES.IsCallable(globals.Reflect[key])) {
|
|||
|
defineProperty(globals.Reflect, key, shim);
|
|||
|
} else {
|
|||
|
var acceptsPrimitives = valueOrFalseIfThrows(function () {
|
|||
|
globals.Reflect[key](1);
|
|||
|
globals.Reflect[key](NaN);
|
|||
|
globals.Reflect[key](true);
|
|||
|
return true;
|
|||
|
});
|
|||
|
if (acceptsPrimitives) {
|
|||
|
overrideNative(globals.Reflect, key, shim);
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
Object.keys(ReflectShims).forEach(function (key) {
|
|||
|
defineOrOverrideReflectProperty(key, ReflectShims[key]);
|
|||
|
});
|
|||
|
var originalReflectGetProto = globals.Reflect.getPrototypeOf;
|
|||
|
if (functionsHaveNames && originalReflectGetProto && originalReflectGetProto.name !== 'getPrototypeOf') {
|
|||
|
overrideNative(globals.Reflect, 'getPrototypeOf', function getPrototypeOf(target) {
|
|||
|
return _call(originalReflectGetProto, globals.Reflect, target);
|
|||
|
});
|
|||
|
}
|
|||
|
if (globals.Reflect.setPrototypeOf) {
|
|||
|
if (valueOrFalseIfThrows(function () {
|
|||
|
globals.Reflect.setPrototypeOf(1, {});
|
|||
|
return true;
|
|||
|
})) {
|
|||
|
overrideNative(globals.Reflect, 'setPrototypeOf', ReflectShims.setPrototypeOf);
|
|||
|
}
|
|||
|
}
|
|||
|
if (globals.Reflect.defineProperty) {
|
|||
|
if (!valueOrFalseIfThrows(function () {
|
|||
|
var basic = !globals.Reflect.defineProperty(1, 'test', { value: 1 });
|
|||
|
// "extensible" fails on Edge 0.12
|
|||
|
var extensible = typeof Object.preventExtensions !== 'function' || !globals.Reflect.defineProperty(Object.preventExtensions({}), 'test', {});
|
|||
|
return basic && extensible;
|
|||
|
})) {
|
|||
|
overrideNative(globals.Reflect, 'defineProperty', ReflectShims.defineProperty);
|
|||
|
}
|
|||
|
}
|
|||
|
if (globals.Reflect.construct) {
|
|||
|
if (!valueOrFalseIfThrows(function () {
|
|||
|
var F = function F() {};
|
|||
|
return globals.Reflect.construct(function () {}, [], F) instanceof F;
|
|||
|
})) {
|
|||
|
overrideNative(globals.Reflect, 'construct', ReflectShims.construct);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (String(new Date(NaN)) !== 'Invalid Date') {
|
|||
|
var dateToString = Date.prototype.toString;
|
|||
|
var shimmedDateToString = function toString() {
|
|||
|
var valueOf = +this;
|
|||
|
if (valueOf !== valueOf) {
|
|||
|
return 'Invalid Date';
|
|||
|
}
|
|||
|
return ES.Call(dateToString, this);
|
|||
|
};
|
|||
|
overrideNative(Date.prototype, 'toString', shimmedDateToString);
|
|||
|
}
|
|||
|
|
|||
|
// Annex B HTML methods
|
|||
|
// http://www.ecma-international.org/ecma-262/6.0/#sec-additional-properties-of-the-string.prototype-object
|
|||
|
var stringHTMLshims = {
|
|||
|
anchor: function anchor(name) { return ES.CreateHTML(this, 'a', 'name', name); },
|
|||
|
big: function big() { return ES.CreateHTML(this, 'big', '', ''); },
|
|||
|
blink: function blink() { return ES.CreateHTML(this, 'blink', '', ''); },
|
|||
|
bold: function bold() { return ES.CreateHTML(this, 'b', '', ''); },
|
|||
|
fixed: function fixed() { return ES.CreateHTML(this, 'tt', '', ''); },
|
|||
|
fontcolor: function fontcolor(color) { return ES.CreateHTML(this, 'font', 'color', color); },
|
|||
|
fontsize: function fontsize(size) { return ES.CreateHTML(this, 'font', 'size', size); },
|
|||
|
italics: function italics() { return ES.CreateHTML(this, 'i', '', ''); },
|
|||
|
link: function link(url) { return ES.CreateHTML(this, 'a', 'href', url); },
|
|||
|
small: function small() { return ES.CreateHTML(this, 'small', '', ''); },
|
|||
|
strike: function strike() { return ES.CreateHTML(this, 'strike', '', ''); },
|
|||
|
sub: function sub() { return ES.CreateHTML(this, 'sub', '', ''); },
|
|||
|
sup: function sub() { return ES.CreateHTML(this, 'sup', '', ''); }
|
|||
|
};
|
|||
|
_forEach(Object.keys(stringHTMLshims), function (key) {
|
|||
|
var method = String.prototype[key];
|
|||
|
var shouldOverwrite = false;
|
|||
|
if (ES.IsCallable(method)) {
|
|||
|
var output = _call(method, '', ' " ');
|
|||
|
var quotesCount = _concat([], output.match(/"/g)).length;
|
|||
|
shouldOverwrite = output !== output.toLowerCase() || quotesCount > 2;
|
|||
|
} else {
|
|||
|
shouldOverwrite = true;
|
|||
|
}
|
|||
|
if (shouldOverwrite) {
|
|||
|
overrideNative(String.prototype, key, stringHTMLshims[key]);
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
var JSONstringifiesSymbols = (function () {
|
|||
|
// Microsoft Edge v0.12 stringifies Symbols incorrectly
|
|||
|
if (!hasSymbols) { return false; } // Symbols are not supported
|
|||
|
var stringify = typeof JSON === 'object' && typeof JSON.stringify === 'function' ? JSON.stringify : null;
|
|||
|
if (!stringify) { return false; } // JSON.stringify is not supported
|
|||
|
if (typeof stringify(Symbol()) !== 'undefined') { return true; } // Symbols should become `undefined`
|
|||
|
if (stringify([Symbol()]) !== '[null]') { return true; } // Symbols in arrays should become `null`
|
|||
|
var obj = { a: Symbol() };
|
|||
|
obj[Symbol()] = true;
|
|||
|
if (stringify(obj) !== '{}') { return true; } // Symbol-valued keys *and* Symbol-valued properties should be omitted
|
|||
|
return false;
|
|||
|
}());
|
|||
|
var JSONstringifyAcceptsObjectSymbol = valueOrFalseIfThrows(function () {
|
|||
|
// Chrome 45 throws on stringifying object symbols
|
|||
|
if (!hasSymbols) { return true; } // Symbols are not supported
|
|||
|
return JSON.stringify(Object(Symbol())) === '{}' && JSON.stringify([Object(Symbol())]) === '[{}]';
|
|||
|
});
|
|||
|
if (JSONstringifiesSymbols || !JSONstringifyAcceptsObjectSymbol) {
|
|||
|
var origStringify = JSON.stringify;
|
|||
|
overrideNative(JSON, 'stringify', function stringify(value) {
|
|||
|
if (typeof value === 'symbol') { return; }
|
|||
|
var replacer;
|
|||
|
if (arguments.length > 1) {
|
|||
|
replacer = arguments[1];
|
|||
|
}
|
|||
|
var args = [value];
|
|||
|
if (!isArray(replacer)) {
|
|||
|
var replaceFn = ES.IsCallable(replacer) ? replacer : null;
|
|||
|
var wrappedReplacer = function (key, val) {
|
|||
|
var parsedValue = replaceFn ? _call(replaceFn, this, key, val) : val;
|
|||
|
if (typeof parsedValue !== 'symbol') {
|
|||
|
if (Type.symbol(parsedValue)) {
|
|||
|
return assignTo({})(parsedValue);
|
|||
|
} else {
|
|||
|
return parsedValue;
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
args.push(wrappedReplacer);
|
|||
|
} else {
|
|||
|
// create wrapped replacer that handles an array replacer?
|
|||
|
args.push(replacer);
|
|||
|
}
|
|||
|
if (arguments.length > 2) {
|
|||
|
args.push(arguments[2]);
|
|||
|
}
|
|||
|
return origStringify.apply(this, args);
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
return globals;
|
|||
|
}));
|