UNPKG

@mui/internal-docs-infra

Version:

MUI Infra - internal documentation creation tools.

68 lines (62 loc) 2.42 kB
/** * Add path utility to add path property to each file in a variant * Uses calculateMainFilePath utility and URL resolution for simplified path calculation */ import { calculateMaxBackNavigation, createSyntheticDirectories } from "./pathUtils.mjs"; import { calculateMainFilePath } from "./calculateMainFilePath.mjs"; /** * Add flat paths to all files in a variant */ export function addPathsToVariant(variant) { const url = variant.url || ''; const fileName = variant.fileName || ''; // Calculate actual back navigation needed based on extraFiles const backNavResult = variant.extraFiles ? calculateMaxBackNavigation(variant.extraFiles) : { maxBackNavigation: 0, maxSourceBackNavigation: 0 }; // Create a synthetic URL for variants without URL to ensure consistent processing let effectiveUrl = url; if (!url && fileName) { effectiveUrl = `file:///${fileName}`; } // Calculate main file path using only the back navigation needed by source files const mainFileUrl = effectiveUrl ? calculateMainFilePath(effectiveUrl, backNavResult.maxBackNavigation, backNavResult.maxSourceBackNavigation, variant.metadataPrefix, fileName || undefined // Only pass fileName if it's not empty ) : undefined; // Extract just the path part from the file:// URL and remove leading slash const path = mainFileUrl ? new URL(mainFileUrl).pathname.slice(1) : undefined; return { ...variant, path, extraFiles: calculateExtraFilesPaths(variant.extraFiles, mainFileUrl || `file:///${backNavResult.maxBackNavigation > 0 ? `${createSyntheticDirectories(backNavResult.maxBackNavigation).join('/')}/` : ''}temp.txt`) }; } /** * Calculate paths for all extra files using the same logic as the main file */ function calculateExtraFilesPaths(extraFiles, mainFileUrl) { if (!extraFiles) { return undefined; } const result = {}; for (const [relativePath, fileContent] of Object.entries(extraFiles)) { // Resolve the relative path against the main file URL try { const resolvedUrl = new URL(relativePath, mainFileUrl); const file = typeof fileContent === 'string' ? { source: fileContent } : fileContent; result[relativePath] = { ...file, path: resolvedUrl.pathname.slice(1) }; } catch { // If URL resolution fails, skip this file continue; } } return { ...extraFiles, ...result }; }