const npm = {
utils: require('./utils'),
batch: require('./ext/batch'),
page: require('./ext/page'),
sequence: require('./ext/sequence'),
stream: require('./ext/stream'),
errors: require('./errors')
};
/**
* @module spex
* @summary Specialized Promise Extensions
* @author Vitaly Tomilov
*
* @description
* Attaches to an external promise library and provides additional methods built solely
* on the basic promise operations:
* - construct a new promise with a callback function
* - resolve a promise with some result data
* - reject a promise with a reason
*
* ### usage
* For any third-party promise library:
* ```js
* const promise = require('bluebird');
* const spex = require('spex')(promise);
* ```
* For ES6 promises:
* ```js
* const spex = require('spex')(Promise);
* ```
*
* @param {Object|Function} promiseLib
* Instance of a promise library to be used by this module.
*
* Some implementations use `Promise` constructor to create a new promise, while
* others use the module's function for it. Both types are supported the same.
*
* Alternatively, an object of type {@link PromiseAdapter} can be passed in, which provides
* compatibility with any promise library outside of the standard.
*
* Passing in a promise library that cannot be recognized will throw
* `Invalid promise library specified.`
*
* @returns {Object}
* Namespace with all supported methods.
*
* @see {@link PromiseAdapter}, {@link batch}, {@link page}, {@link sequence}, {@link stream}
*/
function main(promiseLib) {
const spex = {}, // library instance;
promise = parsePromiseLib(promiseLib); // promise library parsing;
const config = {
spex: spex,
promise: promise,
utils: npm.utils(promise)
};
spex.errors = npm.errors;
spex.batch = npm.batch(config);
spex.page = npm.page(config);
spex.sequence = npm.sequence(config);
spex.stream = npm.stream(config);
config.utils.extend(spex, '$p', promise);
Object.freeze(spex);
return spex;
}
//////////////////////////////////////////
// Parses and validates a promise library;
function parsePromiseLib(lib) {
if (lib) {
let promise;
if (lib instanceof main.PromiseAdapter) {
promise = function (func) {
return lib.create(func);
};
promise.resolve = lib.resolve;
promise.reject = lib.reject;
return promise;
}
const t = typeof lib;
if (t === 'function' || t === 'object') {
const Root = typeof lib.Promise === 'function' ? lib.Promise : lib;
promise = function (func) {
return new Root(func);
};
promise.resolve = Root.resolve;
promise.reject = Root.reject;
if (typeof promise.resolve === 'function' && typeof promise.reject === 'function') {
return promise;
}
}
}
throw new TypeError('Invalid promise library specified.');
}
main.PromiseAdapter = require('./adapter');
main.errors = npm.errors;
Object.freeze(main);
module.exports = main;
/**
* @external Error
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error
*/
/**
* @external TypeError
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError
*/
/**
* @external Promise
* @see https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise
*/