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.
78 lines
2.5 KiB
78 lines
2.5 KiB
"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 |
|
} |
|
}
|
|
|