12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- "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
- }
|