index.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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(ctx, next){
  20. return next().then(() => {
  21. var body = ctx.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(ctx.query, param);
  31. var prettify = pretty || hasParam;
  32. // always stringify object streams
  33. if (stream) {
  34. ctx.response.type = 'json';
  35. var stringify = Stringify();
  36. if (prettify) stringify.space = spaces;
  37. ctx.body = body.pipe(stringify);
  38. return;
  39. }
  40. // prettify JSON responses
  41. if (json && prettify) {
  42. return ctx.body = JSON.stringify(body, null, spaces);
  43. }
  44. });
  45. }
  46. };