You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					79 lines
				
				2.5 KiB
			
		
		
			
		
	
	
					79 lines
				
				2.5 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"use strict"
							 | 
						||
| 
								 | 
							
								    // global key for user preferred registration
							 | 
						||
| 
								 | 
							
								var REGISTRATION_KEY = '@@any-promise/REGISTRATION',
							 | 
						||
| 
								 | 
							
								    // Prior registration (preferred or detected)
							 | 
						||
| 
								 | 
							
								    registered = null
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Registers the given implementation.  An implementation must
							 | 
						||
| 
								 | 
							
								 * be registered prior to any call to `require("any-promise")`,
							 | 
						||
| 
								 | 
							
								 * typically on application load.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * If called with no arguments, will return registration in
							 | 
						||
| 
								 | 
							
								 * following priority:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * For Node.js:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * 1. Previous registration
							 | 
						||
| 
								 | 
							
								 * 2. global.Promise if node.js version >= 0.12
							 | 
						||
| 
								 | 
							
								 * 3. Auto detected promise based on first sucessful require of
							 | 
						||
| 
								 | 
							
								 *    known promise libraries. Note this is a last resort, as the
							 | 
						||
| 
								 | 
							
								 *    loaded library is non-deterministic. node.js >= 0.12 will
							 | 
						||
| 
								 | 
							
								 *    always use global.Promise over this priority list.
							 | 
						||
| 
								 | 
							
								 * 4. Throws error.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * For Browser:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * 1. Previous registration
							 | 
						||
| 
								 | 
							
								 * 2. window.Promise
							 | 
						||
| 
								 | 
							
								 * 3. Throws error.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Options:
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Promise: Desired Promise constructor
							 | 
						||
| 
								 | 
							
								 * global: Boolean - Should the registration be cached in a global variable to
							 | 
						||
| 
								 | 
							
								 * allow cross dependency/bundle registration?  (default true)
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								module.exports = function(root, loadImplementation){
							 | 
						||
| 
								 | 
							
								  return function register(implementation, opts){
							 | 
						||
| 
								 | 
							
								    implementation = implementation || null
							 | 
						||
| 
								 | 
							
								    opts = opts || {}
							 | 
						||
| 
								 | 
							
								    // global registration unless explicitly  {global: false} in options (default true)
							 | 
						||
| 
								 | 
							
								    var registerGlobal = opts.global !== false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // load any previous global registration
							 | 
						||
| 
								 | 
							
								    if(registered === null && registerGlobal){
							 | 
						||
| 
								 | 
							
								      registered = root[REGISTRATION_KEY] || null
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if(registered !== null
							 | 
						||
| 
								 | 
							
								        && implementation !== null
							 | 
						||
| 
								 | 
							
								        && registered.implementation !== implementation){
							 | 
						||
| 
								 | 
							
								      // Throw error if attempting to redefine implementation
							 | 
						||
| 
								 | 
							
								      throw new Error('any-promise already defined as "'+registered.implementation+
							 | 
						||
| 
								 | 
							
								        '".  You can only register an implementation before the first '+
							 | 
						||
| 
								 | 
							
								        ' call to require("any-promise") and an implementation cannot be changed')
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if(registered === null){
							 | 
						||
| 
								 | 
							
								      // use provided implementation
							 | 
						||
| 
								 | 
							
								      if(implementation !== null && typeof opts.Promise !== 'undefined'){
							 | 
						||
| 
								 | 
							
								        registered = {
							 | 
						||
| 
								 | 
							
								          Promise: opts.Promise,
							 | 
						||
| 
								 | 
							
								          implementation: implementation
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        // require implementation if implementation is specified but not provided
							 | 
						||
| 
								 | 
							
								        registered = loadImplementation(implementation)
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if(registerGlobal){
							 | 
						||
| 
								 | 
							
								        // register preference globally in case multiple installations
							 | 
						||
| 
								 | 
							
								        root[REGISTRATION_KEY] = registered
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return registered
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |