// IE 11 CustomEvent polyfill (function () { if ( typeof window.CustomEvent === "function" ) return false; //If not IE function CustomEvent ( event, params ) { params = params || { bubbles: false, cancelable: false, detail: undefined }; var evt = document.createEvent( 'CustomEvent' ); evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail ); return evt; } CustomEvent.prototype = window.Event.prototype; window.CustomEvent = CustomEvent; })(); // IE 11 EventTarget polyfill (function () { if (typeof window.EventTarget === "function") return false; // If EventTarget exists function EventTarget() { this._listeners = {}; } EventTarget.prototype.addEventListener = function(type, callback) { if (!(type in this._listeners)) { this._listeners[type] = []; } this._listeners[type].push(callback); }; EventTarget.prototype.removeEventListener = function(type, callback) { if (!(type in this._listeners)) { return; } var stack = this._listeners[type]; for (var i = 0, l = stack.length; i < l; i++) { if (stack[i] === callback) { stack.splice(i, 1); return; } } }; EventTarget.prototype.dispatchEvent = function(event) { if (!(event.type in this._listeners)) { return true; } var stack = this._listeners[event.type].slice(); for (var i = 0, l = stack.length; i < l; i++) { stack[i].call(this, event); } return !event.defaultPrevented; }; window.EventTarget = EventTarget; })(); // IE 11 Array.isArray polyfill (just in case) if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[object Array]'; }; } /*! Native Promise Only v0.8.1 (c) Kyle Simpson MIT License: http://getify.mit-license.org */ (function UMD(name,context,definition){ // special form of UMD for polyfilling across environments context[name] = context[name] || definition(); if (typeof module != "undefined" && module.exports) { module.exports = context[name]; } else if (typeof define == "function" && define.amd) { define(function $AMD$(){ return context[name]; }); } })("Promise",typeof global != "undefined" ? global : this,function DEF(){ /*jshint validthis:true */ "use strict"; var builtInProp, cycle, scheduling_queue, ToString = Object.prototype.toString, timer = (typeof setImmediate != "undefined") ? function timer(fn) { return setImmediate(fn); } : setTimeout ; // dammit, IE8. try { Object.defineProperty({},"x",{}); builtInProp = function builtInProp(obj,name,val,config) { return Object.defineProperty(obj,name,{ value: val, writable: true, configurable: config !== false }); }; } catch (err) { builtInProp = function builtInProp(obj,name,val) { obj[name] = val; return obj; }; } // Note: using a queue instead of array for efficiency scheduling_queue = (function Queue() { var first, last, item; function Item(fn,self) { this.fn = fn; this.self = self; this.next = void 0; } return { add: function add(fn,self) { item = new Item(fn,self); if (last) { last.next = item; } else { first = item; } last = item; item = void 0; }, drain: function drain() { var f = first; first = last = cycle = void 0; while (f) { f.fn.call(f.self); f = f.next; } } }; })(); function schedule(fn,self) { scheduling_queue.add(fn,self); if (!cycle) { cycle = timer(scheduling_queue.drain); } } // promise duck typing function isThenable(o) { var _then, o_type = typeof o; if (o != null && ( o_type == "object" || o_type == "function" ) ) { _then = o.then; } return typeof _then == "function" ? _then : false; } function notify() { for (var i=0; i 0) { schedule(notify,self); } } } catch (err) { reject.call(new MakeDefWrapper(self),err); } } function reject(msg) { var self = this; // already triggered? if (self.triggered) { return; } self.triggered = true; // unwrap if (self.def) { self = self.def; } self.msg = msg; self.state = 2; if (self.chain.length > 0) { schedule(notify,self); } } function iteratePromises(Constructor,arr,resolver,rejecter) { for (var idx=0; idx= 0 && typeof array2.length === "number" && array2.length >= 0)) return; var length1 = Math.floor(array1.length), length2 = Math.floor(array2.length), i = 0; array1.length = length1 + length2; for (; i)', but in this case // this function returns the symbol's internal name to work properly. Symbol.prototype.toString = function () { return generateSymbolName(this._id); }; // Returns itself but in ES6 It returns 'symbol' typed value. Symbol.prototype.valueOf = function () { return this; }; // Make Iterator like iterable defineProperty(Iterator.prototype, Symbol.iterator.toString(), { value: function () {return this;}, writable: true, configurable: true }); simpleInheritance(ArrayIterator, Iterator); simpleInheritance(StringIterator, Iterator); defineProperty(ArrayIterator.prototype, Symbol.toStringTag.toString(), { value: "Array Iterator", configurable: true }); defineProperty(StringIterator.prototype, Symbol.toStringTag.toString(), { value: "String Iterator", configurable: true }); // This iterator works on any Array or TypedArray or array-like objects ArrayIterator.prototype.next = function next() { if (!(this instanceof ArrayIterator)) throw new TypeError("Method Array Iterator.prototype.next called on incompatible receiver " + String(this)); var self = this, nextValue; if (self._nextIndex === -1) { return { done: true, value: undefined }; } if (!(typeof self._array.length === "number" && self._array.length >= 0)) { self._nextIndex = -1; return { done: true, value: undefined }; } // _flag = 1 for [index, value] // _flag = 2 for [value] // _flag = 3 for [index] if (self._nextIndex < Math.floor(self._array.length)) { if (self._flag === 1) nextValue = [self._nextIndex, self._array[self._nextIndex]]; else if (self._flag === 2) nextValue = self._array[self._nextIndex]; else if (self._flag === 3) nextValue = self._nextIndex; self._nextIndex++; return { done: false, value: nextValue }; } else { self._nextIndex = -1; return { done: true, value: undefined }; } }; StringIterator.prototype.next = function next() { if (!(this instanceof StringIterator)) throw new TypeError("Method String Iterator.prototype.next called on incompatible receiver " + String(this)); var self = this, stringObject = new String(this._string), nextValue; if (self._nextIndex === -1) { return { done: true, value: undefined }; } if (self._nextIndex < stringObject.length) { nextValue = stringObject[self._nextIndex]; self._nextIndex++; return { done: false, value: nextValue }; } else { self._nextIndex = -1; return { done: true, value: undefined }; } }; var es6ArrayPrototypeIteratorSymbol = function values() { if (this === undefined || this === null) throw new TypeError("Cannot convert undefined or null to object"); var self = Object(this); return new ArrayIterator(self, 2); }; var es6StringPrototypeIteratorSymbol = function values() { if (this === undefined || this === null) throw new TypeError("String.prototype[Symbol.iterator] called on null or undefined"); return new StringIterator(String(this), 0); }; var es6ArrayPrototypeEntries = function entries() { if (this === undefined || this === null) throw new TypeError("Cannot convert undefined or null to object"); var self = Object(this); return new ArrayIterator(self, 1); }; var es6ArrayPrototypeKeys = function keys() { if (this === undefined || this === null) throw new TypeError("Cannot convert undefined or null to object"); var self = Object(this); return new ArrayIterator(self, 3); }; var SpreadOperatorImpl = function (target, thisArg) { this._target = target; this._values = []; this._thisArg = thisArg; }; // All the arguments must be iterable SpreadOperatorImpl.prototype.spread = function () { var self = this; slice.call(arguments).forEach(function (iterable) { ES6.forOf(iterable, function (value) { self._values.push(value); }); }); return self; }; SpreadOperatorImpl.prototype.add = function () { var self = this; slice.call(arguments).forEach(function (value) { self._values.push(value); }); return self; }; SpreadOperatorImpl.prototype.call = function (thisArg) { if (typeof this._target !== "function") throw new TypeError("Target is not a function"); thisArg = arguments.length <= 0 ? this._thisArg : thisArg; return this._target.apply(thisArg, this._values); }; SpreadOperatorImpl.prototype.new = function () { if (typeof this._target !== "function") throw new TypeError("Target is not a constructor"); var temp, returnValue; temp = Object.create(this._target.prototype); returnValue = this._target.apply(temp, this._values); return isObject(returnValue) ? returnValue : temp; }; // Affects the target array SpreadOperatorImpl.prototype.array = function () { if (!isArray(this._target)) throw new TypeError("Target is not a array"); push.apply(this._target, this._values); return this._target; }; // Target must be Array or function var es6SpreadOperator = function spreadOperator(target, thisArg) { if (!(typeof target === "function" || isArray(target))) throw new TypeError("Spread operator only supports on array and function objects at this moment"); return new SpreadOperatorImpl(target, thisArg); }; var es6ArrayFrom = function from(arrayLike, mapFn, thisArg) { var constructor, i = 0, length, outputs; // Use the generic constructor constructor = !isConstructor(this) ? Array : this; if (arrayLike === undefined || arrayLike === null) throw new TypeError("Cannot convert undefined or null to object"); arrayLike = Object(arrayLike); if (mapFn === undefined) mapFn = simpleFunction; else if (!isCallable(mapFn)) throw new TypeError(mapFn + " is not a function"); if (typeof arrayLike[Symbol.iterator] === "undefined") { if (!(typeof arrayLike.length === "number" && arrayLike.length >= 0)) { outputs = new constructor(0); outputs.length = 0; return outputs; } length = Math.floor(arrayLike.length); outputs = new constructor(length); outputs.length = length; for(; i < length; ++i) outputs[i] = mapFn.call(thisArg, arrayLike[i]); } else { outputs = new constructor(); outputs.length = 0; ES6.forOf(arrayLike, function (value) { outputs.length++; outputs[outputs.length - 1] = mapFn.call(thisArg, value); }); } return outputs; }; // Export ES6 APIs and add all the patches to support Symbol in ES5 // If the running environment already supports ES6 then no patches will be applied, if (isES6Running()) return ES6; else { // Some ES6 APIs can't be implemented in pure ES5, so this 'ES6' object provides // some equivalent functionality of these features. defineProperties(ES6, { // Checks if a JS value is a symbol // It can be used as equivalent api in ES6: typeof symbol === 'symbol' isSymbol: { value: isSymbol, writable: true, configurable: true }, // Native ES5 'instanceof' operator does not support @@hasInstance symbol, // this method provides same functionality of ES6 'instanceof' operator. instanceOf: { value: es6InstanceOfOperator, writable: true, configurable: true }, // This method behaves exactly same as ES6 for...of loop. forOf: { value: es6ForOfLoop, writable: true, configurable: true }, // This method gives same functionality of the spread operator of ES6 // It works on only functions and arrays. // Limitation: You can't create array like this [...iterable, , , , 33] by this method, // to achieve this you have to do like this [...iterable, undefined, undefined, undefined, 33] spreadOperator: { value: es6SpreadOperator, writable: true, configurable: true } }); defineProperty(global, "Symbol", { value: Symbol, writable: true, configurable: true }); defineProperty(Function.prototype, Symbol.hasInstance.toString(), { value: es6FunctionPrototypeHasInstanceSymbol }); defineProperty(Array.prototype, "concat", { value: es6ArrayPrototypeConcat, writable: true, configurable: true }); defineProperty(Object.prototype, "toString", { value: es6ObjectPrototypeToString, writable: true, configurable: true }); defineProperty(Array.prototype, Symbol.iterator.toString(), { value: es6ArrayPrototypeIteratorSymbol, writable: true, configurable: true }); defineProperty(Array, "from", { value: es6ArrayFrom, writable: true, configurable: true }); defineProperty(Array.prototype, "entries", { value: es6ArrayPrototypeEntries, writable: true, configurable: true }); defineProperty(Array.prototype, "keys", { value: es6ArrayPrototypeKeys, writable: true, configurable: true }); defineProperty(String.prototype, Symbol.iterator.toString(), { value: es6StringPrototypeIteratorSymbol, writable: true, configurable: true }); } return ES6; });