UNPKG

@mui/internal-docs-infra

Version:

MUI Infra - internal documentation creation tools.

168 lines (160 loc) 4.46 kB
/** * Utility function for parsing function parameters and handling nested structures * in JavaScript/TypeScript code. */ /** * Parses function parameters, splitting by top-level commas and extracting object literals. * This combines comma-splitting with object extraction for common use cases. */ export function parseFunctionParameters(str) { var parts = []; var objects = []; var current = ''; var parenCount = 0; var braceCount = 0; var inSingleLineComment = false; var inMultiLineComment = false; var inString = false; var stringChar = ''; for (var i = 0; i < str.length; i += 1) { var _char = str[i]; var nextChar = str[i + 1]; // Handle comments if (!inString && !inSingleLineComment && !inMultiLineComment) { if (_char === '/' && nextChar === '/') { inSingleLineComment = true; current += _char; continue; } if (_char === '/' && nextChar === '*') { inMultiLineComment = true; current += _char; continue; } } if (inSingleLineComment && _char === '\n') { inSingleLineComment = false; current += _char; continue; } if (inMultiLineComment && _char === '*' && nextChar === '/') { inMultiLineComment = false; current += _char + nextChar; i += 1; // Skip next character continue; } if (inSingleLineComment || inMultiLineComment) { current += _char; continue; } // Handle strings if (!inString && (_char === '"' || _char === "'" || _char === '`')) { inString = true; stringChar = _char; current += _char; continue; } if (inString && _char === stringChar && str[i - 1] !== '\\') { inString = false; stringChar = ''; current += _char; continue; } if (inString) { current += _char; continue; } // Handle brackets and parentheses if (_char === '(') { parenCount += 1; } else if (_char === ')') { parenCount -= 1; } else if (_char === '{') { braceCount += 1; } else if (_char === '}') { braceCount -= 1; } else if (_char === ',' && parenCount === 0 && braceCount === 0) { var trimmedPart = current.trim(); parts.push(trimmedPart); objects.push(extractBalancedBraces(trimmedPart)); current = ''; continue; } current += _char; } if (current.trim()) { var _trimmedPart = current.trim(); parts.push(_trimmedPart); objects.push(extractBalancedBraces(_trimmedPart)); } return { parts: parts, objects: objects }; } /** * Extracts a balanced brace object from a string, handling leading whitespace and comments */ export function extractBalancedBraces(str) { // Find the first opening brace, skipping whitespace and comments var startIndex = -1; var inSingleLineComment = false; var inMultiLineComment = false; for (var i = 0; i < str.length; i += 1) { var _char2 = str[i]; var nextChar = str[i + 1]; // Handle comments if (!inSingleLineComment && !inMultiLineComment) { if (_char2 === '/' && nextChar === '/') { inSingleLineComment = true; continue; } if (_char2 === '/' && nextChar === '*') { inMultiLineComment = true; i += 1; // Skip next character continue; } } if (inSingleLineComment && _char2 === '\n') { inSingleLineComment = false; continue; } if (inMultiLineComment && _char2 === '*' && nextChar === '/') { inMultiLineComment = false; i += 1; // Skip next character continue; } if (inSingleLineComment || inMultiLineComment) { continue; } // Skip whitespace if (_char2 === ' ' || _char2 === '\t' || _char2 === '\n' || _char2 === '\r') { continue; } // Found first non-whitespace, non-comment character if (_char2 === '{') { startIndex = i; break; } else { // If it's not a brace, this isn't a valid object return null; } } if (startIndex === -1) { return null; } var braceCount = 0; var endIndex = -1; for (var _i = startIndex; _i < str.length; _i += 1) { if (str[_i] === '{') { braceCount += 1; } else if (str[_i] === '}') { braceCount -= 1; if (braceCount === 0) { endIndex = _i; break; } } } return endIndex !== -1 ? str.substring(startIndex, endIndex + 1) : null; }