forked from zhurui/management
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
|
||
|
}
|
||
|
}
|