"use strict"; exports.__esModule = true; exports.default = void 0; const elements = ['svg', 'Svg']; const plugin = ({ types: t }) => ({ visitor: { JSXElement(path) { if (!elements.some(element => path.get('openingElement.name').isJSXIdentifier({ name: element }))) { return; } function createTitle(children = [], attributes = []) { return t.jsxElement(t.jsxOpeningElement(t.jsxIdentifier('title'), attributes), t.jsxClosingElement(t.jsxIdentifier('title')), children); } function createTitleIdAttribute() { return t.jsxAttribute(t.jsxIdentifier('id'), t.jsxExpressionContainer(t.identifier('titleId'))); } function enhanceAttributes(attributes) { const existingId = attributes.find(attribute => attribute.name.name === 'id'); if (!existingId) { return [...attributes, createTitleIdAttribute()]; } existingId.value = t.jsxExpressionContainer(t.logicalExpression('||', t.identifier('titleId'), existingId.value)); return attributes; } function getTitleElement(existingTitle) { const titleExpression = t.identifier('title'); if (existingTitle) { existingTitle.openingElement.attributes = enhanceAttributes(existingTitle.openingElement.attributes); } let titleElement = t.conditionalExpression(titleExpression, createTitle([t.jsxExpressionContainer(titleExpression)], existingTitle ? existingTitle.openingElement.attributes : [t.jsxAttribute(t.jsxIdentifier('id'), t.jsxExpressionContainer(t.identifier('titleId')))]), t.nullLiteral()); if (existingTitle && existingTitle.children && existingTitle.children.length) { // if title already exists // render as follows const fallbackTitleElement = existingTitle; // {title === undefined ? fallbackTitleElement : titleElement} const conditionalExpressionForTitle = t.conditionalExpression(t.binaryExpression('===', titleExpression, t.identifier('undefined')), fallbackTitleElement, titleElement); titleElement = t.jsxExpressionContainer(conditionalExpressionForTitle); } else { titleElement = t.jsxExpressionContainer(titleElement); } return titleElement; } // store the title element let titleElement; const hasTitle = path.get('children').some(childPath => { if (!childPath.isJSXElement()) return false; if (childPath.node === titleElement) return false; if (childPath.node.openingElement.name.name !== 'title') return false; titleElement = getTitleElement(childPath.node); childPath.replaceWith(titleElement); return true; }); // create a title element if not already create titleElement = titleElement || getTitleElement(); if (!hasTitle) { // path.unshiftContainer is not working well :( // path.unshiftContainer('children', titleElement) path.node.children.unshift(titleElement); path.replaceWith(path.node); } } } }); var _default = plugin; exports.default = _default;