| "use strict"; |
| |
| /* global self, window, module, global, require */ |
| module.exports = function () { |
| |
| "use strict"; |
| |
| var globalObject = void 0; |
| |
| function isFunction(x) { |
| return typeof x === "function"; |
| } |
| |
| // Seek the global object |
| if (global !== undefined) { |
| globalObject = global; |
| } else if (window !== undefined && window.document) { |
| globalObject = window; |
| } else { |
| globalObject = self; |
| } |
| |
| // Test for any native promise implementation, and if that |
| // implementation appears to conform to the specificaton. |
| // This code mostly nicked from the es6-promise module polyfill |
| // and then fooled with. |
| var hasPromiseSupport = function () { |
| |
| // No promise object at all, and it's a non-starter |
| if (!globalObject.hasOwnProperty("Promise")) { |
| return false; |
| } |
| |
| // There is a Promise object. Does it conform to the spec? |
| var P = globalObject.Promise; |
| |
| // Some of these methods are missing from |
| // Firefox/Chrome experimental implementations |
| if (!P.hasOwnProperty("resolve") || !P.hasOwnProperty("reject")) { |
| return false; |
| } |
| |
| if (!P.hasOwnProperty("all") || !P.hasOwnProperty("race")) { |
| return false; |
| } |
| |
| // Older version of the spec had a resolver object |
| // as the arg rather than a function |
| return function () { |
| |
| var resolve = void 0; |
| |
| var p = new globalObject.Promise(function (r) { |
| resolve = r; |
| }); |
| |
| if (p) { |
| return isFunction(resolve); |
| } |
| |
| return false; |
| }(); |
| }(); |
| |
| // Export the native Promise implementation if it |
| // looks like it matches the spec |
| if (hasPromiseSupport) { |
| return globalObject.Promise; |
| } |
| |
| // Otherwise, return the es6-promise polyfill by @jaffathecake. |
| return require("es6-promise").Promise; |
| }(); |