index.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. var isJSON = require('koa-is-json');
  2. var Stringify = require('streaming-json-stringify');
  3. var hasOwnProperty = Object.hasOwnProperty
  4. /**
  5. * Pretty JSON response middleware.
  6. *
  7. * - `pretty` default to pretty response [true]
  8. * - `param` optional query-string param for pretty responses [none]
  9. *
  10. * @param {Object} opts
  11. * @return {GeneratorFunction}
  12. * @api public
  13. */
  14. module.exports = function(opts){
  15. var opts = opts || {};
  16. var param = opts.param;
  17. var pretty = null == opts.pretty ? true : opts.pretty;
  18. var spaces = opts.spaces || 2;
  19. return function *filter(next){
  20. yield *next;
  21. var body = this.body;
  22. // unsupported body type
  23. var stream = body
  24. && typeof body.pipe === 'function'
  25. && body._readableState
  26. && body._readableState.objectMode;
  27. var json = isJSON(body);
  28. if (!json && !stream) return;
  29. // query
  30. var hasParam = param && hasOwnProperty.call(this.query, param);
  31. var prettify = pretty || hasParam;
  32. // always stringify object streams
  33. if (stream) {
  34. this.response.type = 'json';
  35. var stringify = Stringify();
  36. if (prettify) stringify.space = spaces;
  37. this.body = body.pipe(stringify);
  38. return;
  39. }
  40. // prettify JSON responses
  41. if (json && prettify) {
  42. return this.body = JSON.stringify(body, null, spaces);
  43. }
  44. }
  45. };