Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@doodle/frontend-config / webpack / mockHelper.js
Size: Mime:
/* eslint-disable no-restricted-syntax */
const SwaggerParser = require('swagger-parser');
const JsonSchemaFaker = require('json-schema-faker');
const { Router } = require('express');

/**
 * Parses the swagger file.
 * Uses swagger-parser under the hood.
 * @see https://apidevtools.org/swagger-parser/docs/swagger-parser.html#dereferenceapi-options-callback
 * @param {string|object} swaggerJson The swagger json or the path to the file
 * @returns {Promise}
 */
async function getSchema(swaggerJson) {
  return SwaggerParser.dereference(swaggerJson);
}

function sendDataResponse(req, res, next) {
  res.json(res.locals.data);
}

/**
 * Creates the routing for the mock methods using the express Router, based on the swagger schema.
 * It's possible to pass an optional map of functions to handle custom behaviour.
 * Keys for this map should be in the form '<method> <endpoint>' e.g. 'GET /foo'.
 * @see https://expressjs.com/en/api.html#router
 * @param {Promise} schema The Swagger promise
 * @param {object<string, function>=} handlers Map of custom routing handlers.
 */
function createRouter(schema, handlers = {}) {
  const router = Router();

  for (const [schemaPath, methods] of Object.entries(schema.paths)) {
    for (const [method, endpoint] of Object.entries(methods)) {
      const middlewares = [
        function generateResponse(req, res, next) {
          res.locals.data = JsonSchemaFaker.generate(endpoint.responses[200].schema);
          next();
        },
        handlers[`${method} ${endpoint}`],
        sendDataResponse,
      ].filter(middleware => middleware);

      router[method](schemaPath, middlewares);
    }
  }

  return router;
}

module.exports.createRouter = createRouter;
module.exports.getSchema = getSchema;