| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 | 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 */
 |