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