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