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.
53 lines
2.1 KiB
53 lines
2.1 KiB
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); |
|
}
|
|
|