| 58 | }; |
| 59 | |
| 60 | const parseAttribute = (expression: any): any => { |
| 61 | if (expression === null) { |
| 62 | return true; |
| 63 | } |
| 64 | |
| 65 | switch (expression.type) { |
| 66 | case 'Literal': |
| 67 | return expression.value; |
| 68 | case 'Identifier': |
| 69 | return expression.name; |
| 70 | case 'JSXElement': |
| 71 | return parseNode(expression); |
| 72 | case 'JSXExpressionContainer': |
| 73 | return parseAttribute(expression.expression); |
| 74 | case 'ArrayExpression': |
| 75 | return expression.elements.map(parseAttribute); |
| 76 | case 'TemplateLiteral': |
| 77 | return expression.quasis.reduce((acc: string, quasi: any) => acc + quasi.value.cooked, ''); |
| 78 | case 'ObjectExpression': |
| 79 | return expression.properties.reduce((properties: Record<string, any>, property: any) => { |
| 80 | const key = parseAttribute(property.key); |
| 81 | const value = parseAttribute(property.value); |
| 82 | |
| 83 | if (key === undefined || value === undefined) { |
| 84 | return properties; |
| 85 | } |
| 86 | |
| 87 | properties[key] = value; |
| 88 | |
| 89 | return properties; |
| 90 | }, {}); |
| 91 | case 'BinaryExpression': |
| 92 | switch (expression.operator) { |
| 93 | case '+': |
| 94 | return parseAttribute(expression.left) + parseAttribute(expression.right); |
| 95 | case '-': |
| 96 | return parseAttribute(expression.left) - parseAttribute(expression.right); |
| 97 | case '*': |
| 98 | return parseAttribute(expression.left) * parseAttribute(expression.right); |
| 99 | case '**': |
| 100 | return parseAttribute(expression.left) ** parseAttribute(expression.right); |
| 101 | case '/': |
| 102 | return parseAttribute(expression.left) / parseAttribute(expression.right); |
| 103 | case '%': |
| 104 | return parseAttribute(expression.left) % parseAttribute(expression.right); |
| 105 | case '==': |
| 106 | // biome-ignore lint/suspicious/noDoubleEquals: Allowing loose equality for compatibility |
| 107 | return parseAttribute(expression.left) == parseAttribute(expression.right); |
| 108 | case '===': |
| 109 | return parseAttribute(expression.left) === parseAttribute(expression.right); |
| 110 | case '!=': |
| 111 | // biome-ignore lint/suspicious/noDoubleEquals: Allowing loose inequality for compatibility |
| 112 | return parseAttribute(expression.left) != parseAttribute(expression.right); |
| 113 | case '!==': |
| 114 | return parseAttribute(expression.left) !== parseAttribute(expression.right); |
| 115 | case '<': |
| 116 | return parseAttribute(expression.left) < parseAttribute(expression.right); |
| 117 | case '<=': |