"use strict" module.exports = require('./loader')(global, loadImplementation); /** * Node.js version of loadImplementation. * * Requires the given implementation and returns the registration * containing {Promise, implementation} * * If implementation is undefined or global.Promise, loads it * Otherwise uses require */ function loadImplementation(implementation){ var impl = null if(shouldPreferGlobalPromise(implementation)){ // if no implementation or env specified use global.Promise impl = { Promise: global.Promise, implementation: 'global.Promise' } } else if(implementation){ // if implementation specified, require it var lib = require(implementation) impl = { Promise: lib.Promise || lib, implementation: implementation } } else { // try to auto detect implementation. This is non-deterministic // and should prefer other branches, but this is our last chance // to load something without throwing error impl = tryAutoDetect() } if(impl === null){ throw new Error('Cannot find any-promise implementation nor'+ ' global.Promise. You must install polyfill or call'+ ' require("any-promise/register") with your preferred'+ ' implementation, e.g. require("any-promise/register/bluebird")'+ ' on application load prior to any require("any-promise").') } return impl } /** * Determines if the global.Promise should be preferred if an implementation * has not been registered. */ function shouldPreferGlobalPromise(implementation){ if(implementation){ return implementation === 'global.Promise' } else if(typeof global.Promise !== 'undefined'){ // Load global promise if implementation not specified // Versions < 0.11 did not have global Promise // Do not use for version < 0.12 as version 0.11 contained buggy versions var version = (/v(\d+)\.(\d+)\.(\d+)/).exec(process.version) return !(version && +version[1] == 0 && +version[2] < 12) } // do not have global.Promise or another implementation was specified return false } /** * Look for common libs as last resort there is no guarantee that * this will return a desired implementation or even be deterministic. * The priority is also nearly arbitrary. We are only doing this * for older versions of Node.js <0.12 that do not have a reasonable * global.Promise implementation and we the user has not registered * the preference. This preserves the behavior of any-promise <= 0.1 * and may be deprecated or removed in the future */ function tryAutoDetect(){ var libs = [ "es6-promise", "promise", "native-promise-only", "bluebird", "rsvp", "when", "q", "pinkie", "lie", "vow"] var i = 0, len = libs.length for(; i < len; i++){ try { return loadImplementation(libs[i]) } catch(e){} } return null }