@mintlify/prebuild
Version:
Helpful functions for Mintlify's prebuild step
110 lines (109 loc) • 4.24 kB
JavaScript
import { validate, validateAsyncApi, buildImportMap, getFileCategory, isSnippetExtension, getAST, } from '@mintlify/common';
import { readFile } from 'fs/promises';
import yaml from 'js-yaml';
import * as path from 'path';
import { formatError } from '../errorMessages/formatError.js';
import { getFileList } from '../fs/index.js';
import { getFileExtension } from '../utils.js';
import { addWarning } from './warnings.js';
export const categorizeFilePaths = async (contentDirectoryPath, mintIgnore = [], disableOpenApi) => {
const allFiles = getFileList(contentDirectoryPath, contentDirectoryPath, mintIgnore);
const mdxFiles = [];
const nonMdxFiles = [];
for await (const filename of allFiles) {
const extension = getFileExtension(filename);
if (isSnippetExtension(extension)) {
const filePath = path.join(contentDirectoryPath, filename);
const content = await readFile(filePath, 'utf8');
try {
const tree = getAST(content, filePath);
mdxFiles.push({ path: filename, tree });
}
catch (error) {
console.error(formatError(error, filePath, contentDirectoryPath));
}
}
else {
nonMdxFiles.push({ filename, extension });
}
}
const { importedFiles, fileImportsMap } = buildImportMap(mdxFiles);
const contentFilenames = [];
const snippets = [];
const snippetsV2 = [];
for (const file of mdxFiles) {
const category = getFileCategory(file.path, { importedFiles });
switch (category) {
case 'snippet':
snippets.push(file.path);
break;
case 'snippet-v2':
snippetsV2.push(file.path);
break;
case 'page':
contentFilenames.push(file.path);
break;
}
}
const staticFilenames = [];
const openApiFiles = [];
const asyncApiFiles = [];
for (const { filename, extension } of nonMdxFiles) {
switch (extension) {
case 'json':
case 'yaml':
case 'yml':
const filePath = path.join(contentDirectoryPath, filename);
const str = await readFile(filePath, 'utf8');
const obj = yaml.load(str);
if (!obj || typeof obj !== 'object')
break;
const isOpenApi = Object.keys(obj).includes('openapi');
const isAsyncApi = Object.keys(obj).includes('asyncapi');
const fileName = path.parse(filename).name;
if (isOpenApi && !disableOpenApi) {
try {
const { schema: openApiDocument } = await validate(obj);
if (openApiDocument) {
openApiFiles.push({
filename: fileName,
spec: obj,
originalFileLocation: filename,
});
}
}
catch (error) {
addWarning({
type: 'openapi',
message: `Error validating OpenAPI file ${filename}: ${error}`,
});
}
}
if (isAsyncApi) {
try {
const { document: asyncApiDocument } = await validateAsyncApi(str);
if (asyncApiDocument) {
asyncApiFiles.push({
filename: fileName,
spec: asyncApiDocument,
originalFileLocation: filename,
});
}
}
catch { }
}
break;
default:
staticFilenames.push(filename);
}
}
return {
contentFilenames,
staticFilenames,
openApiFiles,
asyncApiFiles,
snippets,
snippetsV2,
fileImportsMap,
};
};