@godspeedsystems/core
Version:
> 4th Generation Declarative Microservice Framework
177 lines (176 loc) • 6.83 kB
JavaScript
;
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;
}