| import { argsert } from './argsert.js'; |
| import { isPromise } from './utils/is-promise.js'; |
| export function globalMiddlewareFactory(globalMiddleware, context) { |
| return function (callback, applyBeforeValidation = false) { |
| argsert('<array|function> [boolean]', [callback, applyBeforeValidation], arguments.length); |
| if (Array.isArray(callback)) { |
| for (let i = 0; i < callback.length; i++) { |
| if (typeof callback[i] !== 'function') { |
| throw Error('middleware must be a function'); |
| } |
| callback[i].applyBeforeValidation = applyBeforeValidation; |
| } |
| Array.prototype.push.apply(globalMiddleware, callback); |
| } |
| else if (typeof callback === 'function') { |
| callback.applyBeforeValidation = applyBeforeValidation; |
| globalMiddleware.push(callback); |
| } |
| return context; |
| }; |
| } |
| export function commandMiddlewareFactory(commandMiddleware) { |
| if (!commandMiddleware) |
| return []; |
| return commandMiddleware.map(middleware => { |
| middleware.applyBeforeValidation = false; |
| return middleware; |
| }); |
| } |
| export function applyMiddleware(argv, yargs, middlewares, beforeValidation) { |
| const beforeValidationError = new Error('middleware cannot return a promise when applyBeforeValidation is true'); |
| return middlewares.reduce((acc, middleware) => { |
| if (middleware.applyBeforeValidation !== beforeValidation) { |
| return acc; |
| } |
| if (isPromise(acc)) { |
| return acc |
| .then(initialObj => Promise.all([ |
| initialObj, |
| middleware(initialObj, yargs), |
| ])) |
| .then(([initialObj, middlewareObj]) => Object.assign(initialObj, middlewareObj)); |
| } |
| else { |
| const result = middleware(acc, yargs); |
| if (beforeValidation && isPromise(result)) |
| throw beforeValidationError; |
| return isPromise(result) |
| ? result.then(middlewareObj => Object.assign(acc, middlewareObj)) |
| : Object.assign(acc, result); |
| } |
| }, argv); |
| } |