| 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); | 
| } |