@mintlify/validation
Version:
Validates mint.json files
70 lines (69 loc) • 4.08 kB
JavaScript
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,
},
};
};