UNPKG

@mintlify/prebuild

Version:

Helpful functions for Mintlify's prebuild step

110 lines (109 loc) 4.24 kB
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, }; };