Repository URL to install this package:
|
Version:
3.5.1 ▾
|
/* 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;