swagger-typescript-api-nextgen
Version:
Nextgen TypeScript/JavaScript API generator from Swagger schema
94 lines (79 loc) • 2.27 kB
JavaScript
const _ = require("lodash");
const { parseSchema } = require("./schema");
const { config } = require("./config");
/**
* @typedef {"schemas" | "examples" | "headers" | "parameters" | "requestBodies" | "responses" | "securitySchemes"} ComponentName
* @typedef {object} RawTypeData
* @typedef {{ type, typeIdentifier, name, description, content }} TypeData
*
* @typedef {{
* typeName: string;
* componentName: ComponentName;
* rawTypeData: RawTypeData;
* typeData: TypeData | null;
* }} TypeInfo
*/
/**
*
* @param {ComponentName} componentName
* @param {string} typeName
* @param {RawTypeData} rawTypeData
* @returns {TypeInfo}
*/
const createComponent = (componentName, typeName, rawTypeData) => {
const $ref = `#/components/${componentName}/${typeName}`;
const componentSchema = {
$ref,
typeName,
rawTypeData,
componentName,
typeData: null,
};
const usageComponent = config.hooks.onCreateComponent(componentSchema) || componentSchema;
config.componentsMap[$ref] = usageComponent;
return usageComponent;
};
/**
* @returns {{ [key: string]: TypeInfo }}
*/
const createComponentsMap = (components) => {
config.componentsMap = {};
_.each(components, (component, componentName) =>
_.each(component, (rawTypeData, typeName) =>
createComponent(componentName, typeName, rawTypeData),
),
);
return config.componentsMap;
};
/**
*
* @param {{ [key: string]: TypeInfo }} componentsMap
* @param {ComponentName} componentName
* @returns {TypeInfo[]}
*/
const filterComponentsMap = (componentsMap, componentName) =>
_.filter(componentsMap, (v, ref) => _.startsWith(ref, `#/components/${componentName}`));
/**
*
* @param {TypeInfo} typeInfo
* @returns {TypeData}
*/
const getTypeData = (typeInfo) => {
if (!typeInfo.typeData) {
typeInfo.typeData = parseSchema(typeInfo.rawTypeData, typeInfo.typeName);
}
return typeInfo.typeData;
};
/**
*
* @param {string} ref
* @returns {TypeInfo | undefined}
*/
const getComponentByRef = (ref) => config.componentsMap[ref];
module.exports = {
getTypeData,
createComponent,
createComponentsMap,
filterComponentsMap,
getComponentByRef,
};