all files / swagger-node-runner/fittings/ swagger_raw.js

97.56% Statements 40/41
94.44% Branches 17/18
100% Functions 5/5
100% Lines 39/39
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70                15×   15× 15×   15× 15× 15×   15×     15× 15×   15×   16×   16×   16× 16×           3130× 1737× 14×   1603× 1603× 3291× 3115× 3115× 3101×   14× 14×       1603×     1527×    
'use strict';
 
var debug = require('debug')('swagger:swagger_raw');
var YAML = require('js-yaml');
var _ = require('lodash');
 
// default filter just drops all the x- labels
var DROP_SWAGGER_EXTENSIONS = /^(?!x-.*)/;
 
// default filter drops anything labeled x-private
var X_PRIVATE = ['x-private'];
 
module.exports = function create(fittingDef, bagpipes) {
 
  debug('config: %j', fittingDef);
 
  var filter = DROP_SWAGGER_EXTENSIONS;
  if (fittingDef.filter) {
    filter = new RegExp(fittingDef.filter);
  }
  debug('swagger doc filter: %s', filter);
  var privateTags = fittingDef.privateTags || X_PRIVATE;
  var filteredSwagger = filterKeysRecursive(bagpipes.config.swaggerNodeRunner.swagger, filter, privateTags);
 
  Iif (!filteredSwagger) { return next(null, ''); }
 
  // should this just be based on accept type?
  var yaml = YAML.safeDump(filteredSwagger, { indent: 2 });
  var json = JSON.stringify(filteredSwagger, null, 2);
 
  return function swagger_raw(context, next) {
 
    debug('exec');
 
    var req = context.request;
 
    var accept = req.headers['accept'];
    if (accept && accept.indexOf('yaml') != -1) {
      context.headers['Content-Type'] = 'application/yaml';
      next(null, yaml);
    } else {
      context.headers['Content-Type'] = 'application/json';
      next(null, json);
    }
  }
};
 
function filterKeysRecursive(object, dropTagRegex, privateTags) {
  if (_.isPlainObject(object)) {
    if (_.any(privateTags, function(tag) { return object[tag]; })) {
      object = undefined;
    } else {
      var result = {};
      _.each(object, function(value, key) {
        if (dropTagRegex.test(key)) {
          var v = filterKeysRecursive(value, dropTagRegex, privateTags);
          if (v !== undefined) {
            result[key] = v;
          } else {
            debug('dropping object at %s', key);
            delete(result[key]);
          }
        }
      });
      return result;
    }
  }
  return object;
}