@mintlify/common
Version:
Commonly shared code within Mintlify
61 lines (60 loc) • 2.52 kB
JavaScript
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;
};