Spaces:
Sleeping
Sleeping
| 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 | |
| } | |