Spaces:
Running
Running
// 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 | |
} | |
} | |