1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- 'use strict'
- // hoisted due to circular dependency on command.
- module.exports = {
- applyMiddleware,
- commandMiddlewareFactory,
- globalMiddlewareFactory
- }
- const isPromise = require('./is-promise')
- const argsert = require('./argsert')
- 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
- }
- }
- function commandMiddlewareFactory (commandMiddleware) {
- if (!commandMiddleware) return []
- return commandMiddleware.map(middleware => {
- middleware.applyBeforeValidation = false
- return middleware
- })
- }
- function applyMiddleware (argv, yargs, middlewares, beforeValidation) {
- const beforeValidationError = new Error('middleware cannot return a promise when applyBeforeValidation is true')
- return middlewares
- .reduce((accumulation, middleware) => {
- if (middleware.applyBeforeValidation !== beforeValidation &&
- !isPromise(accumulation)) {
- return accumulation
- }
- if (isPromise(accumulation)) {
- return accumulation
- .then(initialObj =>
- Promise.all([initialObj, middleware(initialObj, yargs)])
- )
- .then(([initialObj, middlewareObj]) =>
- Object.assign(initialObj, middlewareObj)
- )
- } else {
- const result = middleware(argv, yargs)
- if (beforeValidation && isPromise(result)) throw beforeValidationError
- return isPromise(result)
- ? result.then(middlewareObj => Object.assign(accumulation, middlewareObj))
- : Object.assign(accumulation, result)
- }
- }, argv)
- }
|