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.

58 lines
1.3 KiB

8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
  1. 'use strict'
  2. const arrayify = require('array-back')
  3. const path = require('path')
  4. const url = require('url')
  5. const debug = require('./debug')
  6. const mw = require('./middleware')
  7. const t = require('typical')
  8. const compose = require('koa-compose')
  9. const flatten = require('reduce-flatten')
  10. /**
  11. * @module middleware-stack
  12. */
  13. /**
  14. * @extends Array
  15. * @alias module:middleware-stack
  16. */
  17. class MiddlewareStack extends Array {
  18. /**
  19. * @param {module:middleware-stack~middleware}
  20. * @chainable
  21. */
  22. add (middleware) {
  23. this.push(middleware)
  24. return this
  25. }
  26. getOptionDefinitions () {
  27. return this
  28. .filter(mw => mw.optionDefinitions)
  29. .map(mw => mw.optionDefinitions)
  30. .reduce(flatten, [])
  31. .map(def => {
  32. def.group = 'middleware'
  33. return def
  34. })
  35. }
  36. compose (options) {
  37. const convert = require('koa-convert')
  38. const middlewareStack = this
  39. .filter(mw => mw.middleware)
  40. .map(mw => mw.middleware)
  41. .map(middleware => middleware(options))
  42. .filter(middleware => middleware)
  43. .reduce(flatten, [])
  44. .map(convert)
  45. return compose(middlewareStack)
  46. }
  47. }
  48. module.exports = MiddlewareStack
  49. /**
  50. * @typedef middleware
  51. * @property optionDefinitions {object|object[]}
  52. * @property middleware {function}
  53. */