UNPKG

@mintlify/validation

Version:

Validates mint.json files

70 lines (69 loc) 4.08 kB
import { v4 as uuidv4 } from 'uuid'; import { buildRefUuidMap } from './buildRefUuidMap.js'; import { mapDocument } from './mapDocument.js'; import { mapExampleComponents } from './mapExampleComponents.js'; import { mapHeaderComponents } from './mapHeaderComponents.js'; import { mapParameterComponents } from './mapParameterComponents.js'; import { mapPathComponents } from './mapPathComponents.js'; import { mapPaths } from './mapPaths.js'; import { mapRequestBodyComponents } from './mapRequestBodyComponents.js'; import { mapResponseComponents } from './mapResponseComponents.js'; import { mapSchemaComponents } from './mapSchemaComponents.js'; import { mapSecurityRequirements } from './mapSecurityRequirements.js'; import { mapSecuritySchemeComponents } from './mapSecuritySchemeComponents.js'; import { mapServers } from './mapServers.js'; import { mapWebhooks } from './mapWebhooks.js'; export const openApiToSchemaGraph = ({ spec, filename, originalFileLocation, }) => { // build map of component refs -> uuids const refUuidMap = buildRefUuidMap(spec); // build map of uuids -> object hashes const uuidObjectHashMap = {}; // object hashes -> full objects const hashedNodeMap = {}; // for each section of the spec document, break into nodes // in each node, swap refs for uuids // if children can become nodes, add them // for each new node created, hash it and check if content matches a hash // add to uuid and object hash maps // (starting with the components section, which already have uuids in refUuidMap) // document.components.schemas -> Schema mapSchemaComponents({ spec, refUuidMap, uuidObjectHashMap, hashedNodeMap }); // document.components.responses -> Response, possibly Header, Schema, Example, Media, Encoding mapResponseComponents({ spec, refUuidMap, uuidObjectHashMap, hashedNodeMap }); // document.components.parameters -> Parameter, possibly Schema, Example, Media, Encoding mapParameterComponents({ spec, refUuidMap, uuidObjectHashMap, hashedNodeMap }); // document.components.examples -> Example mapExampleComponents({ spec, refUuidMap, uuidObjectHashMap, hashedNodeMap }); // document.components.requestBodies -> RequestBody, possibly Media, Schema, Example, Encoding mapRequestBodyComponents({ spec, refUuidMap, uuidObjectHashMap, hashedNodeMap }); // document.components.headers -> Header, possibly Schema, Example, Media, Encoding mapHeaderComponents({ spec, refUuidMap, uuidObjectHashMap, hashedNodeMap }); // document.components.securitySchemes -> SecurityScheme mapSecuritySchemeComponents({ spec, refUuidMap, uuidObjectHashMap, hashedNodeMap }); // document.components.links -> TODO (unsupported) // document.components.callbacks -> TODO (unsupported) // document.components.pathItems -> Path, possibly Parameter, Operation, RequestBody, Response, SecurityRequirement, Server mapPathComponents({ spec, refUuidMap, uuidObjectHashMap, hashedNodeMap }); // document -> Document const documentId = uuidv4(); mapDocument({ spec, uuidObjectHashMap, hashedNodeMap, uuid: documentId }); // document.servers -> Server mapServers({ spec, uuidObjectHashMap, hashedNodeMap, documentId }); // document.security -> SecurityRequirement mapSecurityRequirements({ spec, refUuidMap, uuidObjectHashMap, hashedNodeMap, documentId }); // add paths and webhooks to ref-uuid map for fast lookup per page in client // document.paths -> Path, possibly Parameter, Operation, RequestBody, Response, SecurityRequirement, Server mapPaths({ spec, refUuidMap, uuidObjectHashMap, hashedNodeMap, documentId }); // document.webhooks -> Path, possibly Parameter, Operation, RequestBody, Response, SecurityRequirement, Server mapWebhooks({ spec, refUuidMap, uuidObjectHashMap, hashedNodeMap, documentId }); return { filename, originalFileLocation, documentId, spec: { refUuidMap, uuidObjectHashMap, hashedNodeMap, }, }; };