UNPKG

@godspeedsystems/core

Version:

> 4th Generation Declarative Microservice Framework

177 lines (176 loc) 6.83 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "generateSwaggerJSON", { enumerable: true, get: function() { return generateSwaggerJSON; } }); function _define_property(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _object_spread(target) { for(var i = 1; i < arguments.length; i++){ var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === "function") { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function(key) { _define_property(target, key, source[key]); }); } return target; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function(sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _object_spread_props(target, source) { source = source != null ? source : {}; if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function(key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } const generateSwaggerJSON = (events, definitions, eventSourceConfig)=>{ var _eventSourceConfig_authn; const finalSpecs = { openapi: "3.0.0", paths: {} }; const { port, docs } = eventSourceConfig; const info = docs === null || docs === void 0 ? void 0 : docs.info; const servers = docs === null || docs === void 0 ? void 0 : docs.servers; const jwt = ((_eventSourceConfig_authn = eventSourceConfig.authn) === null || _eventSourceConfig_authn === void 0 ? void 0 : _eventSourceConfig_authn.jwt) || eventSourceConfig.jwt; const eventObjStr = JSON.stringify(events); const modifiedStr = eventObjStr.replace(/https:\/\/godspeed\.systems\/definitions\.json/g, ''); const eventObj = JSON.parse(modifiedStr); Object.keys(eventObj).forEach((event)=>{ var _eventSchema_summary; let apiEndPoint = event.split('.')[2]; apiEndPoint = apiEndPoint.replace(/:([^\/]+)/g, '{$1}'); //We take :path_param. OAS3 takes {path_param} const method = event.split('.')[1]; const eventSchema = eventObj[event]; const eventAuthn = jwt && eventSchema.authn !== false; //Initialize the schema for this method, for given event let methodSpec = _object_spread({ summary: eventSchema.summary, description: eventSchema.description, tags: eventSchema.tags, operationId: eventSchema.operationId || eventSchema.id || ((_eventSchema_summary = eventSchema.summary) === null || _eventSchema_summary === void 0 ? void 0 : _eventSchema_summary.replace(' ', '_')) || `${method}_${apiEndPoint}`.replace(/\//g, '_'), requestBody: eventSchema.body, parameters: eventSchema.params, responses: eventSchema.responses }, eventAuthn && { security: [ { bearerAuth: [] } ] }); //Set it in the overall schema // @ts-ignore finalSpecs.paths[apiEndPoint] = _object_spread_props(_object_spread({}, finalSpecs.paths[apiEndPoint]), { [method]: methodSpec }); }); if (servers && Array.isArray(servers)) { finalSpecs.servers = servers; } else { finalSpecs.servers = [ { "url": `http://localhost:${port}` } ]; } finalSpecs.info = info; setDefinitions(finalSpecs, definitions); if (jwt) { finalSpecs.components.securitySchemes = { bearerAuth: { type: 'http', scheme: 'bearer', bearerFormat: 'JWT' } }; } return finalSpecs; }; function setDefinitions(finalSpecs, definitions) { definitions = JSON.parse(JSON.stringify(definitions)); //Flatten the definitions object to store as component schema as per swagger format const removedKeys = []; Object.keys(definitions).forEach((key)=>{ var _definitions_key; if (!((_definitions_key = definitions[key]) === null || _definitions_key === void 0 ? void 0 : _definitions_key.type)) { const innerObj = definitions[key]; delete definitions[key]; const updatedInnerObj = {}; Object.keys(innerObj).forEach((subKey)=>{ removedKeys.push(`${key}/${subKey}`); updatedInnerObj[`${key}_${subKey}`] = innerObj[subKey]; }); definitions = _object_spread({}, definitions, updatedInnerObj); } }); //finalSpecs.definitions = definitions; finalSpecs.components = { schemas: definitions }; for (let key of removedKeys){ replaceStringInJSON(finalSpecs, `#/definitions/${key}`, `#/components/schemas/${key.replace("/", "_")}`); } } function replaceStringInJSON(jsonObj, stringToMatch, replacementString) { if (jsonObj === null) { return; } // If jsonObj is an array, iterate through its elements if (Array.isArray(jsonObj)) { for(let i = 0; i < jsonObj.length; i++){ jsonObj[i] = replaceStringInJSON(jsonObj[i], stringToMatch, replacementString); } } else if (typeof jsonObj === 'object') { // Iterate through the object keys for(let key in jsonObj){ if (jsonObj.hasOwnProperty(key)) { // Recursively call the function for nested objects or arrays jsonObj[key] = replaceStringInJSON(jsonObj[key], stringToMatch, replacementString); } } } else if (typeof jsonObj === 'string') { // If jsonObj is a leaf string value and contains the string to match, replace it if (jsonObj.includes(stringToMatch)) { return jsonObj.replace(new RegExp(stringToMatch, 'g'), replacementString); } } return jsonObj; }