79 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"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
 | 
						|
  }
 | 
						|
}
 |