UNPKG

@mintlify/common

Version:

Commonly shared code within Mintlify

61 lines (60 loc) 2.52 kB
import { parseApiTargetFromMetadata } from '../api-reference/parseApiTargetFromMetadata.js'; import { normalizeRelativePath } from '../fs/normalizeRelativePath.js'; import { isAbsoluteUrl } from '../isAbsoluteUrl.js'; export const getMatchingOpenApiFile = ({ metadata, refs, files, }) => { var _a, _b; const target = parseApiTargetFromMetadata(metadata); if (!target || target.type === 'asyncapi') { return undefined; } let targetPath = ''; if (target.type === 'operation') { targetPath = `${target.endpoint}/${target.method}`; // Want to make it explicit when we're doing what here, even // if the conditional check is unnecessary. // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition } else if (target.type === 'schema') { targetPath = `#/components/schemas/${target.name}`; } const matchingUuids = findAllMatchingFileUuids({ refs, targetPath }); if (!target.filename) { return matchingUuids[0]; } const filename = isAbsoluteUrl(target.filename) ? target.filename : normalizeRelativePath(target.filename); // exact original file location match const exactFileUuid = files[filename]; if (exactFileUuid && matchingUuids.includes(exactFileUuid)) { return exactFileUuid; } // substring original location > exact filename match > substring filename let substringOriginalMatch; let exactFilenameMatch; let substringFilenameMatch; for (const uuid of matchingUuids) { const ref = refs[uuid]; if (!ref) continue; if (!substringOriginalMatch && ref.originalFileLocation.includes(filename)) { substringOriginalMatch = uuid; } if (!exactFilenameMatch && ref.filename === filename) { exactFilenameMatch = uuid; } if (!substringFilenameMatch && ref.filename.includes(filename)) { substringFilenameMatch = uuid; } } return (_b = (_a = substringOriginalMatch !== null && substringOriginalMatch !== void 0 ? substringOriginalMatch : exactFilenameMatch) !== null && _a !== void 0 ? _a : substringFilenameMatch) !== null && _b !== void 0 ? _b : matchingUuids[0]; }; const findAllMatchingFileUuids = ({ refs, targetPath, }) => { const matchingUuids = []; for (const [uuid, value] of Object.entries(refs)) { if (value.refs[targetPath]) { matchingUuids.push(uuid); } } return matchingUuids; };