From 34ab8e4aacf0ab3525dfd91c28a7d043609bfb99 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 21 Mar 2016 16:29:57 -0400 Subject: [PATCH] feature(bower) promise-polyfill v4.0.1 --- bower.json | 4 +- lib/client/cloudcmd.js | 2 +- modules/promise-polyfill/.bower.json | 10 +- modules/promise-polyfill/Gruntfile.js | 23 --- modules/promise-polyfill/Promise.js | 194 -------------------- modules/promise-polyfill/Promise.min.js | 2 - modules/promise-polyfill/README.md | 21 ++- modules/promise-polyfill/jasmine.json | 7 - modules/promise-polyfill/karma.conf.js | 75 ++++++++ modules/promise-polyfill/package.json | 18 +- modules/promise-polyfill/promise.js | 230 ++++++++++++++++++++++++ modules/promise-polyfill/promise.min.js | 1 + 12 files changed, 345 insertions(+), 242 deletions(-) delete mode 100644 modules/promise-polyfill/Gruntfile.js delete mode 100644 modules/promise-polyfill/Promise.js delete mode 100644 modules/promise-polyfill/Promise.min.js delete mode 100644 modules/promise-polyfill/jasmine.json create mode 100644 modules/promise-polyfill/karma.conf.js create mode 100644 modules/promise-polyfill/promise.js create mode 100644 modules/promise-polyfill/promise.min.js diff --git a/bower.json b/bower.json index 5af087a0..69c88524 100644 --- a/bower.json +++ b/bower.json @@ -38,8 +38,8 @@ "emitify": "~2.0.0", "findit": "~1.1.4", "philip": "~1.3.2", - "promise-polyfill": "~3.1.0", "menu": "~1.0.2", - "smalltalk": "~1.6.7" + "smalltalk": "~1.6.7", + "promise-polyfill": "~4.0.1" } } diff --git a/lib/client/cloudcmd.js b/lib/client/cloudcmd.js index 2b0732e0..35beef5f 100644 --- a/lib/client/cloudcmd.js +++ b/lib/client/cloudcmd.js @@ -31,7 +31,7 @@ var CloudCmd; }), moduleFiles = [ - window.Promise ? '' : 'promise-polyfill/Promise.min', + window.Promise ? '' : 'promise-polyfill/promise.min', libDir('format', 'format-io'), libDir('rendy'), libDir('emitify', '', 'dist'), diff --git a/modules/promise-polyfill/.bower.json b/modules/promise-polyfill/.bower.json index 2df0a0fd..1f69934a 100644 --- a/modules/promise-polyfill/.bower.json +++ b/modules/promise-polyfill/.bower.json @@ -1,6 +1,6 @@ { "name": "promise-polyfill", - "version": "3.1.0", + "version": "4.0.1", "homepage": "https://github.com/taylorhakes/promise-polyfill", "authors": [ "Taylor Hakes" @@ -25,14 +25,14 @@ "test", "tests" ], - "_release": "3.1.0", + "_release": "4.0.1", "_resolution": { "type": "version", - "tag": "3.1.0", - "commit": "3be107ebf982fc087f2ddadb2c440d4b15b9d0b8" + "tag": "4.0.1", + "commit": "c381e1fd30a9a6ae3e1055aaef58859e45fa8270" }, "_source": "git://github.com/taylorhakes/promise-polyfill.git", - "_target": "~3.1.0", + "_target": "~4.0.1", "_originalSource": "promise-polyfill", "_direct": true } \ No newline at end of file diff --git a/modules/promise-polyfill/Gruntfile.js b/modules/promise-polyfill/Gruntfile.js deleted file mode 100644 index ef1cbfaa..00000000 --- a/modules/promise-polyfill/Gruntfile.js +++ /dev/null @@ -1,23 +0,0 @@ -module.exports = function(grunt) { - - grunt.initConfig({ - pkg: grunt.file.readJSON('package.json'), - - uglify: { - options: { - banner: '/*! <%= pkg.name %> <%= pkg.version %> */\n' - }, - dist: { - files: { - 'Promise.min.js': ['Promise.js'] - } - } - } - - }); - - grunt.loadNpmTasks('grunt-contrib-uglify'); - - grunt.registerTask('build', ['uglify']); - -}; diff --git a/modules/promise-polyfill/Promise.js b/modules/promise-polyfill/Promise.js deleted file mode 100644 index 3a95fe8d..00000000 --- a/modules/promise-polyfill/Promise.js +++ /dev/null @@ -1,194 +0,0 @@ -(function(root) { - - // Store setTimeout reference so promise-polyfill will be unaffected by - // other code modifying setTimeout (like sinon.useFakeTimers()) - var setTimeoutFunc = setTimeout; - - // Use polyfill for setImmediate for performance gains - var asap = (typeof setImmediate === 'function' && setImmediate) || - function(fn) { setTimeoutFunc(fn, 1); }; - - // Polyfill for Function.prototype.bind - function bind(fn, thisArg) { - return function() { - fn.apply(thisArg, arguments); - } - } - - var isArray = Array.isArray || function(value) { return Object.prototype.toString.call(value) === "[object Array]" }; - - function Promise(fn) { - if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new'); - if (typeof fn !== 'function') throw new TypeError('not a function'); - this._state = null; - this._value = null; - this._deferreds = [] - - doResolve(fn, bind(resolve, this), bind(reject, this)) - } - - function handle(deferred) { - var me = this; - if (this._state === null) { - this._deferreds.push(deferred); - return - } - asap(function() { - var cb = me._state ? deferred.onFulfilled : deferred.onRejected - if (cb === null) { - (me._state ? deferred.resolve : deferred.reject)(me._value); - return; - } - var ret; - try { - ret = cb(me._value); - } - catch (e) { - deferred.reject(e); - return; - } - deferred.resolve(ret); - }) - } - - function resolve(newValue) { - try { //Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure - if (newValue === this) throw new TypeError('A promise cannot be resolved with itself.'); - if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) { - var then = newValue.then; - if (typeof then === 'function') { - doResolve(bind(then, newValue), bind(resolve, this), bind(reject, this)); - return; - } - } - this._state = true; - this._value = newValue; - finale.call(this); - } catch (e) { reject.call(this, e); } - } - - function reject(newValue) { - this._state = false; - this._value = newValue; - finale.call(this); - } - - function finale() { - for (var i = 0, len = this._deferreds.length; i < len; i++) { - handle.call(this, this._deferreds[i]); - } - this._deferreds = null; - } - - function Handler(onFulfilled, onRejected, resolve, reject){ - this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; - this.onRejected = typeof onRejected === 'function' ? onRejected : null; - this.resolve = resolve; - this.reject = reject; - } - - /** - * Take a potentially misbehaving resolver function and make sure - * onFulfilled and onRejected are only called once. - * - * Makes no guarantees about asynchrony. - */ - function doResolve(fn, onFulfilled, onRejected) { - var done = false; - try { - fn(function (value) { - if (done) return; - done = true; - onFulfilled(value); - }, function (reason) { - if (done) return; - done = true; - onRejected(reason); - }) - } catch (ex) { - if (done) return; - done = true; - onRejected(ex); - } - } - - Promise.prototype['catch'] = function (onRejected) { - return this.then(null, onRejected); - }; - - Promise.prototype.then = function(onFulfilled, onRejected) { - var me = this; - return new Promise(function(resolve, reject) { - handle.call(me, new Handler(onFulfilled, onRejected, resolve, reject)); - }) - }; - - Promise.all = function () { - var args = Array.prototype.slice.call(arguments.length === 1 && isArray(arguments[0]) ? arguments[0] : arguments); - - return new Promise(function (resolve, reject) { - if (args.length === 0) return resolve([]); - var remaining = args.length; - function res(i, val) { - try { - if (val && (typeof val === 'object' || typeof val === 'function')) { - var then = val.then; - if (typeof then === 'function') { - then.call(val, function (val) { res(i, val) }, reject); - return; - } - } - args[i] = val; - if (--remaining === 0) { - resolve(args); - } - } catch (ex) { - reject(ex); - } - } - for (var i = 0; i < args.length; i++) { - res(i, args[i]); - } - }); - }; - - Promise.resolve = function (value) { - if (value && typeof value === 'object' && value.constructor === Promise) { - return value; - } - - return new Promise(function (resolve) { - resolve(value); - }); - }; - - Promise.reject = function (value) { - return new Promise(function (resolve, reject) { - reject(value); - }); - }; - - Promise.race = function (values) { - return new Promise(function (resolve, reject) { - for(var i = 0, len = values.length; i < len; i++) { - values[i].then(resolve, reject); - } - }); - }; - - /** - * Set the immediate function to execute callbacks - * @param fn {function} Function to execute - * @private - */ - Promise._setImmediateFn = function _setImmediateFn(fn) { - asap = fn; - }; - - if (typeof module !== 'undefined' && module.exports) { - module.exports = Promise; - } else if (!root.Promise) { - root.Promise = Promise; - } - -})(this); diff --git a/modules/promise-polyfill/Promise.min.js b/modules/promise-polyfill/Promise.min.js deleted file mode 100644 index 74c42508..00000000 --- a/modules/promise-polyfill/Promise.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! promise-polyfill 3.1.0 */ -!function(a){function b(a,b){return function(){a.apply(b,arguments)}}function c(a){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof a)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],i(a,b(e,this),b(f,this))}function d(a){var b=this;return null===this._state?void this._deferreds.push(a):void k(function(){var c=b._state?a.onFulfilled:a.onRejected;if(null===c)return void(b._state?a.resolve:a.reject)(b._value);var d;try{d=c(b._value)}catch(e){return void a.reject(e)}a.resolve(d)})}function e(a){try{if(a===this)throw new TypeError("A promise cannot be resolved with itself.");if(a&&("object"==typeof a||"function"==typeof a)){var c=a.then;if("function"==typeof c)return void i(b(c,a),b(e,this),b(f,this))}this._state=!0,this._value=a,g.call(this)}catch(d){f.call(this,d)}}function f(a){this._state=!1,this._value=a,g.call(this)}function g(){for(var a=0,b=this._deferreds.length;b>a;a++)d.call(this,this._deferreds[a]);this._deferreds=null}function h(a,b,c,d){this.onFulfilled="function"==typeof a?a:null,this.onRejected="function"==typeof b?b:null,this.resolve=c,this.reject=d}function i(a,b,c){var d=!1;try{a(function(a){d||(d=!0,b(a))},function(a){d||(d=!0,c(a))})}catch(e){if(d)return;d=!0,c(e)}}var j=setTimeout,k="function"==typeof setImmediate&&setImmediate||function(a){j(a,1)},l=Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)};c.prototype["catch"]=function(a){return this.then(null,a)},c.prototype.then=function(a,b){var e=this;return new c(function(c,f){d.call(e,new h(a,b,c,f))})},c.all=function(){var a=Array.prototype.slice.call(1===arguments.length&&l(arguments[0])?arguments[0]:arguments);return new c(function(b,c){function d(f,g){try{if(g&&("object"==typeof g||"function"==typeof g)){var h=g.then;if("function"==typeof h)return void h.call(g,function(a){d(f,a)},c)}a[f]=g,0===--e&&b(a)}catch(i){c(i)}}if(0===a.length)return b([]);for(var e=a.length,f=0;fd;d++)a[d].then(b,c)})},c._setImmediateFn=function(a){k=a},"undefined"!=typeof module&&module.exports?module.exports=c:a.Promise||(a.Promise=c)}(this); \ No newline at end of file diff --git a/modules/promise-polyfill/README.md b/modules/promise-polyfill/README.md index a450d282..50d7f22b 100644 --- a/modules/promise-polyfill/README.md +++ b/modules/promise-polyfill/README.md @@ -2,7 +2,7 @@ Promises/A+ logo -# Promise +# Promise [![travis][travis-image]][travis-url] [travis-image]: https://img.shields.io/travis/taylorhakes/promise-polyfill.svg?style=flat @@ -51,11 +51,28 @@ prom.then(function() { ... }); ``` + ## Performance -By default promise-polyfill uses `setImmediate`, but falls back to `setTimeout` for executing asynchronously. If a browser does not support `setImmediate`, you may see performance issues. +By default promise-polyfill uses `setImmediate`, but falls back to `setTimeout` for executing asynchronously. If a browser does not support `setImmediate` (IE/Edge are the only browsers with setImmediate), you may see performance issues. Use a `setImmediate` polyfill to fix this issue. [setAsap](https://github.com/taylorhakes/setAsap) or [setImmediate](https://github.com/YuzuJS/setImmediate) work well. If you polyfill `window.setImmediate` or use `Promise._setImmediateFn(immedateFn)` it will be used instead of `window.setTimeout` +``` +npm install setasap --save +``` +```js +var Promise = require('promise-polyfill'); +var setAsap = require('setasap'); +Promise._setImmedateFn(setAsap); +``` + +## Unhandled Rejections +promise-polyfill will warn you about possibly unhandled rejections. It will show a console warning if a Promise is rejected, but no `.catch` is used. You can turn off this behavior by setting `Promise._setUnhandledRejectionFn()`. +If you would like to disable unhandled rejections. Use a noop like below. +```js +Promise._setUnhandledRejectionFn(function(rejectError) {}); +``` + ## Testing ``` diff --git a/modules/promise-polyfill/jasmine.json b/modules/promise-polyfill/jasmine.json deleted file mode 100644 index 9f4542e6..00000000 --- a/modules/promise-polyfill/jasmine.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "spec_dir": "tests", - "spec_files": [ - "**/*.spec.js" - ], - "helpers": [] -} \ No newline at end of file diff --git a/modules/promise-polyfill/karma.conf.js b/modules/promise-polyfill/karma.conf.js new file mode 100644 index 00000000..5f4a85b2 --- /dev/null +++ b/modules/promise-polyfill/karma.conf.js @@ -0,0 +1,75 @@ +// Karma configuration +// Generated on Tue Jan 12 2016 07:56:12 GMT-0500 (EST) + +module.exports = function (config) { + config.set({ + + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: '', + + + // frameworks to use + // available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ['mocha', 'browserify'], + + + // list of files / patterns to load in the browser + files: [ + 'test/Promise.js' + ], + + + // list of files to exclude + exclude: [], + + + // preprocess matching files before serving them to the browser + // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + preprocessors: { + 'test/Promise.js': ['browserify'] + }, + + + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://npmjs.org/browse/keyword/karma-reporter + reporters: ['progress'], + + + // web server port + port: 9876, + + + // enable / disable colors in the output (reporters and logs) + colors: true, + + + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_INFO, + + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: true, + + + // start these browsers + // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: ['Chrome'], + + + // Continuous Integration mode + // if true, Karma captures browsers, runs the tests and exits + singleRun: false, + + // Concurrency level + // how many browser should be started simultaneous + concurrency: Infinity, + + plugins: [ + 'karma-browserify', + 'karma-mocha', + 'karma-chrome-launcher' + ] + }) +} diff --git a/modules/promise-polyfill/package.json b/modules/promise-polyfill/package.json index 02f5dac8..e94fe34f 100644 --- a/modules/promise-polyfill/package.json +++ b/modules/promise-polyfill/package.json @@ -1,10 +1,11 @@ { "name": "promise-polyfill", - "version": "3.1.0", + "version": "4.0.1", "description": "Lightweight promise polyfill. A+ compliant", "main": "Promise.js", "scripts": { - "test": "./node_modules/.bin/promises-aplus-tests tests/adapter.js && JASMINE_CONFIG_PATH=jasmine.json ./node_modules/jasmine/bin/jasmine.js;" + "test": "eslint promise.js && mocha && karma start --single-run", + "build": "uglifyjs --compress --mangle -o promise.min.js -- promise.js " }, "repository": { "type": "git", @@ -17,10 +18,15 @@ }, "homepage": "https://github.com/taylorhakes/promise-polyfill", "devDependencies": { - "grunt": "^0.4.4", - "grunt-contrib-uglify": "^0.4.0", - "jasmine": "^2.3.1", - "promises-aplus-tests": "*" + "eslint": "^2.4.0", + "karma": "^0.13.19", + "karma-browserify": "^4.4.2", + "karma-chrome-launcher": "^0.2.2", + "karma-mocha": "^0.2.1", + "mocha": "^2.3.4", + "promises-aplus-tests": "*", + "sinon": "^1.17.2", + "uglify-js": "^2.6.2" }, "keywords": [ "promise", diff --git a/modules/promise-polyfill/promise.js b/modules/promise-polyfill/promise.js new file mode 100644 index 00000000..f54a1e17 --- /dev/null +++ b/modules/promise-polyfill/promise.js @@ -0,0 +1,230 @@ +(function (root) { + + // Store setTimeout reference so promise-polyfill will be unaffected by + // other code modifying setTimeout (like sinon.useFakeTimers()) + var setTimeoutFunc = setTimeout; + + function noop() { + } + + // Use polyfill for setImmediate for performance gains + var asap = (typeof setImmediate === 'function' && setImmediate) || + function (fn) { + setTimeoutFunc(fn, 1); + }; + + var onUnhandledRejection = function onUnhandledRejection(err) { + console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console + }; + + // Polyfill for Function.prototype.bind + function bind(fn, thisArg) { + return function () { + fn.apply(thisArg, arguments); + }; + } + + var isArray = Array.isArray || function (value) { + return Object.prototype.toString.call(value) === '[object Array]'; + }; + + function Promise(fn) { + if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new'); + if (typeof fn !== 'function') throw new TypeError('not a function'); + this._state = 0; + this._handled = false; + this._value = undefined; + this._deferreds = []; + + doResolve(fn, this); + } + + function handle(self, deferred) { + while (self._state === 3) { + self = self._value; + } + if (self._state === 0) { + self._deferreds.push(deferred); + return; + } + self._handled = true; + asap(function () { + var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; + if (cb === null) { + (self._state === 1 ? resolve : reject)(deferred.promise, self._value); + return; + } + var ret; + try { + ret = cb(self._value); + } catch (e) { + reject(deferred.promise, e); + return; + } + resolve(deferred.promise, ret); + }); + } + + function resolve(self, newValue) { + try { + // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure + if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.'); + if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) { + var then = newValue.then; + if (newValue instanceof Promise) { + self._state = 3; + self._value = newValue; + finale(self); + return; + } else if (typeof then === 'function') { + doResolve(bind(then, newValue), self); + return; + } + } + self._state = 1; + self._value = newValue; + finale(self); + } catch (e) { + reject(self, e); + } + } + + function reject(self, newValue) { + self._state = 2; + self._value = newValue; + finale(self); + } + + function finale(self) { + if (self._state === 2 && self._deferreds.length === 0) { + setTimeout(function() { + if (!self._handled) { + onUnhandledRejection(self._value); + } + }, 1); + } + + for (var i = 0, len = self._deferreds.length; i < len; i++) { + handle(self, self._deferreds[i]); + } + self._deferreds = null; + } + + function Handler(onFulfilled, onRejected, promise) { + this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; + this.onRejected = typeof onRejected === 'function' ? onRejected : null; + this.promise = promise; + } + + /** + * Take a potentially misbehaving resolver function and make sure + * onFulfilled and onRejected are only called once. + * + * Makes no guarantees about asynchrony. + */ + function doResolve(fn, self) { + var done = false; + try { + fn(function (value) { + if (done) return; + done = true; + resolve(self, value); + }, function (reason) { + if (done) return; + done = true; + reject(self, reason); + }); + } catch (ex) { + if (done) return; + done = true; + reject(self, ex); + } + } + + Promise.prototype['catch'] = function (onRejected) { + return this.then(null, onRejected); + }; + + Promise.prototype.then = function (onFulfilled, onRejected) { + var prom = new Promise(noop); + handle(this, new Handler(onFulfilled, onRejected, prom)); + return prom; + }; + + Promise.all = function () { + var args = Array.prototype.slice.call(arguments.length === 1 && isArray(arguments[0]) ? arguments[0] : arguments); + + return new Promise(function (resolve, reject) { + if (args.length === 0) return resolve([]); + var remaining = args.length; + + function res(i, val) { + try { + if (val && (typeof val === 'object' || typeof val === 'function')) { + var then = val.then; + if (typeof then === 'function') { + then.call(val, function (val) { + res(i, val); + }, reject); + return; + } + } + args[i] = val; + if (--remaining === 0) { + resolve(args); + } + } catch (ex) { + reject(ex); + } + } + + for (var i = 0; i < args.length; i++) { + res(i, args[i]); + } + }); + }; + + Promise.resolve = function (value) { + if (value && typeof value === 'object' && value.constructor === Promise) { + return value; + } + + return new Promise(function (resolve) { + resolve(value); + }); + }; + + Promise.reject = function (value) { + return new Promise(function (resolve, reject) { + reject(value); + }); + }; + + Promise.race = function (values) { + return new Promise(function (resolve, reject) { + for (var i = 0, len = values.length; i < len; i++) { + values[i].then(resolve, reject); + } + }); + }; + + /** + * Set the immediate function to execute callbacks + * @param fn {function} Function to execute + * @private + */ + Promise._setImmediateFn = function _setImmediateFn(fn) { + asap = fn; + }; + + Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) { + onUnhandledRejection = fn; + }; + + if (typeof module !== 'undefined' && module.exports) { + module.exports = Promise; + } else if (!root.Promise) { + root.Promise = Promise; + } + +})(this); diff --git a/modules/promise-polyfill/promise.min.js b/modules/promise-polyfill/promise.min.js new file mode 100644 index 00000000..b4be4c68 --- /dev/null +++ b/modules/promise-polyfill/promise.min.js @@ -0,0 +1 @@ +!function(t){function e(){}function n(t,e){return function(){t.apply(e,arguments)}}function o(t){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],a(t,this)}function r(t,e){for(;3===t._state;)t=t._value;return 0===t._state?void t._deferreds.push(e):(t._handled=!0,void l(function(){var n=1===t._state?e.onFulfilled:e.onRejected;if(null===n)return void(1===t._state?i:u)(e.promise,t._value);var o;try{o=n(t._value)}catch(r){return void u(e.promise,r)}i(e.promise,o)}))}function i(t,e){try{if(e===t)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"==typeof e||"function"==typeof e)){var r=e.then;if(e instanceof o)return t._state=3,t._value=e,void f(t);if("function"==typeof r)return void a(n(r,e),t)}t._state=1,t._value=e,f(t)}catch(i){u(t,i)}}function u(t,e){t._state=2,t._value=e,f(t)}function f(t){2===t._state&&0===t._deferreds.length&&setTimeout(function(){t._handled||o._onUnhandledRejection(t._value)},1);for(var e=0,n=t._deferreds.length;n>e;e++)r(t,t._deferreds[e]);t._deferreds=null}function c(t,e,n){this.onFulfilled="function"==typeof t?t:null,this.onRejected="function"==typeof e?e:null,this.promise=n}function a(t,e){var n=!1;try{t(function(t){n||(n=!0,i(e,t))},function(t){n||(n=!0,u(e,t))})}catch(o){if(n)return;n=!0,u(e,o)}}var s=setTimeout,l="function"==typeof setImmediate&&setImmediate||function(t){s(t,1)},d=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)};o.prototype["catch"]=function(t){return this.then(null,t)},o.prototype.then=function(t,n){var i=new o(e);return r(this,new c(t,n,i)),i},o.all=function(){var t=Array.prototype.slice.call(1===arguments.length&&d(arguments[0])?arguments[0]:arguments);return new o(function(e,n){function o(i,u){try{if(u&&("object"==typeof u||"function"==typeof u)){var f=u.then;if("function"==typeof f)return void f.call(u,function(t){o(i,t)},n)}t[i]=u,0===--r&&e(t)}catch(c){n(c)}}if(0===t.length)return e([]);for(var r=t.length,i=0;io;o++)t[o].then(e,n)})},o._setImmediateFn=function(t){l=t},o._onUnhandledRejection=function(t){console.warn("Possible Unhandled Promise Rejection:",t)},"undefined"!=typeof module&&module.exports?module.exports=o:t.Promise||(t.Promise=o)}(this); \ No newline at end of file