12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- "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;
|