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.
123 lines
3.6 KiB
123 lines
3.6 KiB
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
|
|
*/
|
|
|