[6a3a178] | 1 | 'use strict'
|
---|
| 2 |
|
---|
| 3 | // hoisted due to circular dependency on command.
|
---|
| 4 | module.exports = {
|
---|
| 5 | applyMiddleware,
|
---|
| 6 | commandMiddlewareFactory,
|
---|
| 7 | globalMiddlewareFactory
|
---|
| 8 | }
|
---|
| 9 | const isPromise = require('./is-promise')
|
---|
| 10 | const argsert = require('./argsert')
|
---|
| 11 |
|
---|
| 12 | function globalMiddlewareFactory (globalMiddleware, context) {
|
---|
| 13 | return function (callback, applyBeforeValidation = false) {
|
---|
| 14 | argsert('<array|function> [boolean]', [callback, applyBeforeValidation], arguments.length)
|
---|
| 15 | if (Array.isArray(callback)) {
|
---|
| 16 | for (let i = 0; i < callback.length; i++) {
|
---|
| 17 | if (typeof callback[i] !== 'function') {
|
---|
| 18 | throw Error('middleware must be a function')
|
---|
| 19 | }
|
---|
| 20 | callback[i].applyBeforeValidation = applyBeforeValidation
|
---|
| 21 | }
|
---|
| 22 | Array.prototype.push.apply(globalMiddleware, callback)
|
---|
| 23 | } else if (typeof callback === 'function') {
|
---|
| 24 | callback.applyBeforeValidation = applyBeforeValidation
|
---|
| 25 | globalMiddleware.push(callback)
|
---|
| 26 | }
|
---|
| 27 | return context
|
---|
| 28 | }
|
---|
| 29 | }
|
---|
| 30 |
|
---|
| 31 | function commandMiddlewareFactory (commandMiddleware) {
|
---|
| 32 | if (!commandMiddleware) return []
|
---|
| 33 | return commandMiddleware.map(middleware => {
|
---|
| 34 | middleware.applyBeforeValidation = false
|
---|
| 35 | return middleware
|
---|
| 36 | })
|
---|
| 37 | }
|
---|
| 38 |
|
---|
| 39 | function applyMiddleware (argv, yargs, middlewares, beforeValidation) {
|
---|
| 40 | const beforeValidationError = new Error('middleware cannot return a promise when applyBeforeValidation is true')
|
---|
| 41 | return middlewares
|
---|
| 42 | .reduce((accumulation, middleware) => {
|
---|
| 43 | if (middleware.applyBeforeValidation !== beforeValidation &&
|
---|
| 44 | !isPromise(accumulation)) {
|
---|
| 45 | return accumulation
|
---|
| 46 | }
|
---|
| 47 |
|
---|
| 48 | if (isPromise(accumulation)) {
|
---|
| 49 | return accumulation
|
---|
| 50 | .then(initialObj =>
|
---|
| 51 | Promise.all([initialObj, middleware(initialObj, yargs)])
|
---|
| 52 | )
|
---|
| 53 | .then(([initialObj, middlewareObj]) =>
|
---|
| 54 | Object.assign(initialObj, middlewareObj)
|
---|
| 55 | )
|
---|
| 56 | } else {
|
---|
| 57 | const result = middleware(argv, yargs)
|
---|
| 58 | if (beforeValidation && isPromise(result)) throw beforeValidationError
|
---|
| 59 |
|
---|
| 60 | return isPromise(result)
|
---|
| 61 | ? result.then(middlewareObj => Object.assign(accumulation, middlewareObj))
|
---|
| 62 | : Object.assign(accumulation, result)
|
---|
| 63 | }
|
---|
| 64 | }, argv)
|
---|
| 65 | }
|
---|