summaryrefslogtreecommitdiff
path: root/node_modules/any-promise/loader.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/any-promise/loader.js')
-rw-r--r--node_modules/any-promise/loader.js78
1 files changed, 78 insertions, 0 deletions
diff --git a/node_modules/any-promise/loader.js b/node_modules/any-promise/loader.js
new file mode 100644
index 0000000..e164914
--- /dev/null
+++ b/node_modules/any-promise/loader.js
@@ -0,0 +1,78 @@
+"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
+ }
+}