@mui/internal-docs-infra
Version:
MUI Infra - internal documentation creation tools.
168 lines (160 loc) • 4.46 kB
JavaScript
/**
* 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;
}