{"version":3,"file":"index.js","sources":["../../../src/babel-plugin/index.ts"],"sourcesContent":["/* oxlint-disable max-lines */\n/**\n * MIT License\n *\n * Copyright (c) 2020 Engineering at FullStory\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n */\n\n/**\n * The following code is based on the FullStory Babel plugin, but has been modified to work\n * with Sentry products:\n *\n * - Added `sentry` to data properties, i.e `data-sentry-component`\n * - Converted to TypeScript\n * - Code cleanups\n */\n\nimport type * as Babel from '@babel/core';\nimport type { PluginObj, PluginPass } from '@babel/core';\n\nimport {\n getComponentAnnotationAttributes,\n NATIVE_COMPONENT_NAME,\n NATIVE_ELEMENT_NAME,\n NATIVE_SOURCE_FILE_NAME,\n WEB_COMPONENT_NAME,\n WEB_ELEMENT_NAME,\n WEB_SOURCE_FILE_NAME,\n type ComponentAnnotationAttributeNames,\n} from './component-annotation';\nimport { KNOWN_INCOMPATIBLE_PLUGINS } from './constants';\n\nconst SENTRY_LABEL_ATTRIBUTE = 'sentry-label';\nconst MAX_LABEL_LENGTH = 64;\nconst DEFAULT_TEXT_COMPONENT_NAMES = ['Text', 'text'];\nconst MAX_TEXT_SEARCH_DEPTH = 3;\n\ninterface AutoInjectSentryLabelOpts {\n textComponentNames?: string[];\n}\n\ninterface AnnotationOpts {\n native?: boolean;\n 'annotate-fragments'?: boolean;\n ignoredComponents?: string[];\n /** @hidden */\n autoInjectSentryLabel?: boolean | AutoInjectSentryLabelOpts;\n}\n\ninterface FragmentContext {\n fragmentAliases: Set;\n reactNamespaceAliases: Set;\n}\n\ninterface AnnotationPluginPass extends PluginPass {\n opts: AnnotationOpts;\n sentryFragmentContext?: FragmentContext;\n}\n\ntype AnnotationPlugin = PluginObj;\n\n// Shared context object for all JSX processing functions\ninterface JSXProcessingContext {\n /** Whether to annotate React fragments */\n annotateFragments: boolean;\n /** Babel types object */\n t: typeof Babel.types;\n /** Name of the React component */\n componentName: string;\n /** Source file name (optional) */\n sourceFileName?: string;\n /** Array of attribute names [component, element, sourceFile] */\n attributeNames: ComponentAnnotationAttributeNames;\n /** Array of component names to ignore */\n ignoredComponents: string[];\n /** Fragment context for identifying React fragments */\n fragmentContext?: FragmentContext;\n /** Whether to auto-inject sentry-label from static text children */\n autoInjectSentryLabel: boolean;\n /** Component names whose JSXText children are considered text content */\n textComponentNames: string[];\n}\n\nexport { experimentalComponentNameAnnotatePlugin } from './experimental';\n\n// We must export the plugin as default, otherwise the Babel loader will not be able to resolve it when configured using its string identifier\nexport default function componentNameAnnotatePlugin({ types: t }: typeof Babel): AnnotationPlugin {\n return {\n visitor: {\n Program: {\n enter(path, state) {\n const fragmentContext = collectFragmentContext(path);\n state.sentryFragmentContext = fragmentContext;\n },\n },\n FunctionDeclaration(path, state) {\n if (!path.node.id?.name) {\n return;\n }\n if (isKnownIncompatiblePluginFromState(state)) {\n return;\n }\n\n const context = createJSXProcessingContext(state, t, path.node.id.name);\n functionBodyPushAttributes(context, path);\n },\n ArrowFunctionExpression(path, state) {\n // We're expecting a `VariableDeclarator` like `const MyComponent =`\n const parent = path.parent;\n\n if (!parent || !('id' in parent) || !parent.id || !('name' in parent.id) || !parent.id.name) {\n return;\n }\n\n if (isKnownIncompatiblePluginFromState(state)) {\n return;\n }\n\n const context = createJSXProcessingContext(state, t, parent.id.name);\n functionBodyPushAttributes(context, path);\n },\n ClassDeclaration(path, state) {\n const name = path.get('id');\n const properties = path.get('body').get('body');\n const render = properties.find(prop => {\n return prop.isClassMethod() && prop.get('key').isIdentifier({ name: 'render' });\n });\n\n if (!render?.traverse || isKnownIncompatiblePluginFromState(state)) {\n return;\n }\n\n const context = createJSXProcessingContext(state, t, name.node?.name || '');\n\n render.traverse({\n ReturnStatement(returnStatement) {\n const arg = returnStatement.get('argument');\n\n if (!arg.isJSXElement() && !arg.isJSXFragment()) {\n return;\n }\n\n processJSX(context, arg);\n },\n });\n },\n },\n };\n}\n\n/**\n * Creates a JSX processing context from the plugin state\n */\nfunction createJSXProcessingContext(\n state: AnnotationPluginPass,\n t: typeof Babel.types,\n componentName: string,\n): JSXProcessingContext {\n return {\n annotateFragments: state.opts['annotate-fragments'] === true,\n t,\n componentName,\n sourceFileName: sourceFileNameFromState(state),\n attributeNames: attributeNamesFromState(state),\n ignoredComponents: state.opts.ignoredComponents ?? [],\n fragmentContext: state.sentryFragmentContext,\n autoInjectSentryLabel: !!state.opts.autoInjectSentryLabel,\n textComponentNames:\n (state.opts.autoInjectSentryLabel && typeof state.opts.autoInjectSentryLabel === 'object'\n ? state.opts.autoInjectSentryLabel.textComponentNames\n : undefined) ?? DEFAULT_TEXT_COMPONENT_NAMES,\n };\n}\n\n/**\n * Processes the body of a function to add Sentry tracking attributes to JSX elements.\n * Handles various function body structures including direct JSX returns, conditional expressions,\n * and nested JSX elements.\n */\nfunction functionBodyPushAttributes(context: JSXProcessingContext, path: Babel.NodePath): void {\n let jsxNode: Babel.NodePath;\n\n const functionBody = path.get('body').get('body');\n\n if (\n !('length' in functionBody) &&\n functionBody.parent &&\n (functionBody.parent.type === 'JSXElement' || functionBody.parent.type === 'JSXFragment')\n ) {\n const maybeJsxNode = functionBody.find(c => {\n return c.type === 'JSXElement' || c.type === 'JSXFragment';\n });\n\n if (!maybeJsxNode) {\n return;\n }\n\n jsxNode = maybeJsxNode;\n } else {\n const returnStatement = functionBody.find(c => {\n return c.type === 'ReturnStatement';\n });\n if (!returnStatement) {\n return;\n }\n\n const arg = returnStatement.get('argument');\n if (!arg) {\n return;\n }\n\n if (Array.isArray(arg)) {\n return;\n }\n\n // Handle the case of a function body returning a ternary operation.\n // `return (maybeTrue ? '' : ())`\n if (arg.isConditionalExpression()) {\n const consequent = arg.get('consequent');\n if (consequent.isJSXFragment() || consequent.isJSXElement()) {\n processJSX(context, consequent);\n }\n const alternate = arg.get('alternate');\n if (alternate.isJSXFragment() || alternate.isJSXElement()) {\n processJSX(context, alternate);\n }\n return;\n }\n\n if (!arg.isJSXFragment() && !arg.isJSXElement()) {\n return;\n }\n\n jsxNode = arg;\n }\n\n if (!jsxNode) {\n return;\n }\n\n processJSX(context, jsxNode);\n}\n\n/**\n * Recursively processes JSX elements to add Sentry tracking attributes.\n * Handles both JSX elements and fragments, applying appropriate attributes\n * based on configuration and component context.\n */\nfunction processJSX(context: JSXProcessingContext, jsxNode: Babel.NodePath, componentName?: string): void {\n if (!jsxNode) {\n return;\n }\n\n // Use provided componentName or fall back to context componentName\n const currentComponentName = componentName ?? context.componentName;\n const isRootElement = componentName === undefined;\n\n // NOTE: I don't know of a case where `openingElement` would have more than one item,\n // but it's safer to always iterate\n const paths = jsxNode.get('openingElement');\n const openingElements = Array.isArray(paths) ? paths : [paths];\n\n openingElements.forEach(openingElement => {\n applyAttributes(context, openingElement as Babel.NodePath, currentComponentName);\n });\n\n let children = jsxNode.get('children');\n // TODO: See why `Array.isArray` doesn't have correct behaviour here\n if (children && !('length' in children)) {\n // A single child was found, maybe a bit of static text\n children = [children];\n }\n\n let shouldSetComponentName = context.annotateFragments;\n\n children.forEach(child => {\n // Happens for some node types like plain text\n if (!child.node) {\n return;\n }\n\n // Children don't receive the data-component attribute so we pass null for componentName unless it's the first child of a Fragment with a node and `annotateFragments` is true\n const openingElement = child.get('openingElement');\n // TODO: Improve this. We never expect to have multiple opening elements\n // but if it's possible, this should work\n if (Array.isArray(openingElement)) {\n return;\n }\n\n if (shouldSetComponentName && openingElement?.node) {\n shouldSetComponentName = false;\n processJSX(context, child, currentComponentName);\n } else {\n processJSX(context, child, '');\n }\n });\n\n if (isRootElement && context.autoInjectSentryLabel) {\n maybeInjectSentryLabel(context, jsxNode);\n }\n}\n\n/**\n * Applies Sentry tracking attributes to a JSX opening element.\n * Adds component name, element name, and source file attributes while\n * respecting ignore lists and fragment detection.\n */\nfunction applyAttributes(\n context: JSXProcessingContext,\n openingElement: Babel.NodePath,\n componentName: string,\n): void {\n const { t, attributeNames, ignoredComponents, fragmentContext, sourceFileName } = context;\n\n // e.g., Raw JSX text like the `A` in `

a

`\n if (!openingElement.node) {\n return;\n }\n\n if (!openingElement.node.attributes) openingElement.node.attributes = [];\n const elementName = getPathName(t, openingElement);\n\n for (const [name, value] of getComponentAnnotationAttributes({\n attributeNames,\n componentName,\n elementName,\n existingAttributes: getExistingAttributeNames(openingElement),\n ignoredComponents,\n isFragment: isReactFragment(t, openingElement, fragmentContext),\n sourceFileName,\n })) {\n openingElement.node.attributes.push(t.jSXAttribute(t.jSXIdentifier(name), t.stringLiteral(value)));\n }\n}\n\nfunction sourceFileNameFromState(state: AnnotationPluginPass): string | undefined {\n const name = fullSourceFileNameFromState(state);\n if (!name) {\n return undefined;\n }\n\n if (name.indexOf('/') !== -1) {\n return name.split('/').pop();\n } else if (name.indexOf('\\\\') !== -1) {\n return name.split('\\\\').pop();\n } else {\n return name;\n }\n}\n\nfunction fullSourceFileNameFromState(state: AnnotationPluginPass): string | null {\n // @ts-expect-error This type is incorrect in Babel, `sourceFileName` is the correct type\n const name = state.file.opts.parserOpts?.sourceFileName as unknown;\n\n if (typeof name === 'string') {\n return name;\n }\n\n return null;\n}\n\nfunction isKnownIncompatiblePluginFromState(state: AnnotationPluginPass): boolean {\n const fullSourceFileName = fullSourceFileNameFromState(state);\n\n if (!fullSourceFileName) {\n return false;\n }\n\n return KNOWN_INCOMPATIBLE_PLUGINS.some(pluginName => {\n if (\n fullSourceFileName.includes(`/node_modules/${pluginName}/`) ||\n fullSourceFileName.includes(`\\\\node_modules\\\\${pluginName}\\\\`)\n ) {\n return true;\n }\n\n return false;\n });\n}\n\nfunction attributeNamesFromState(state: AnnotationPluginPass): ComponentAnnotationAttributeNames {\n if (state.opts.native) {\n return [NATIVE_COMPONENT_NAME, NATIVE_ELEMENT_NAME, NATIVE_SOURCE_FILE_NAME];\n }\n\n return [WEB_COMPONENT_NAME, WEB_ELEMENT_NAME, WEB_SOURCE_FILE_NAME];\n}\n\nfunction collectFragmentContext(programPath: Babel.NodePath): FragmentContext {\n const fragmentAliases = new Set();\n const reactNamespaceAliases = new Set(['React']); // Default React namespace\n\n programPath.traverse({\n ImportDeclaration(importPath) {\n const source = importPath.node.source.value;\n\n // Handle React imports\n if (source === 'react' || source === 'React') {\n importPath.node.specifiers.forEach(spec => {\n if (spec.type === 'ImportSpecifier' && spec.imported.type === 'Identifier') {\n // Detect aliased React.Fragment imports (e.g., `Fragment as F`)\n // so we can later identify as a fragment in JSX.\n if (spec.imported.name === 'Fragment') {\n fragmentAliases.add(spec.local.name);\n }\n } else if (spec.type === 'ImportDefaultSpecifier' || spec.type === 'ImportNamespaceSpecifier') {\n // import React from 'react' -> React OR\n // import * as React from 'react' -> React\n reactNamespaceAliases.add(spec.local.name);\n }\n });\n }\n },\n\n // Handle simple variable assignments only (avoid complex cases)\n VariableDeclarator(varPath) {\n if (varPath.node.init) {\n const init = varPath.node.init;\n\n // Handle identifier assignments: const MyFragment = Fragment\n if (varPath.node.id.type === 'Identifier') {\n // Handle: const MyFragment = Fragment (only if Fragment is a known alias)\n if (init.type === 'Identifier' && fragmentAliases.has(init.name)) {\n fragmentAliases.add(varPath.node.id.name);\n }\n\n // Handle: const MyFragment = React.Fragment (only for known React namespaces)\n if (\n init.type === 'MemberExpression' &&\n init.object.type === 'Identifier' &&\n init.property.type === 'Identifier' &&\n init.property.name === 'Fragment' &&\n reactNamespaceAliases.has(init.object.name)\n ) {\n fragmentAliases.add(varPath.node.id.name);\n }\n }\n\n // Handle destructuring assignments: const { Fragment } = React\n if (varPath.node.id.type === 'ObjectPattern') {\n if (init.type === 'Identifier' && reactNamespaceAliases.has(init.name)) {\n const properties = varPath.node.id.properties;\n\n for (const prop of properties) {\n if (\n prop.type === 'ObjectProperty' &&\n prop.key?.type === 'Identifier' &&\n prop.value?.type === 'Identifier' &&\n prop.key.name === 'Fragment'\n ) {\n fragmentAliases.add(prop.value.name);\n }\n }\n }\n }\n }\n },\n });\n\n return { fragmentAliases, reactNamespaceAliases };\n}\n\nfunction isReactFragment(\n t: typeof Babel.types,\n openingElement: Babel.NodePath,\n context?: FragmentContext, // Add this optional parameter\n): boolean {\n // Handle JSX fragments (<>)\n if (openingElement.isJSXFragment()) {\n return true;\n }\n\n const elementName = getPathName(t, openingElement);\n\n // Direct fragment references\n if (elementName === 'Fragment' || elementName === 'React.Fragment') {\n return true;\n }\n\n // TODO: All these objects are typed as unknown, maybe an oversight in Babel types?\n\n // Check if the element name is a known fragment alias\n if (context && elementName && context.fragmentAliases.has(elementName)) {\n return true;\n }\n\n // Handle JSXMemberExpression\n if (\n openingElement.node &&\n 'name' in openingElement.node &&\n openingElement.node.name &&\n typeof openingElement.node.name === 'object' &&\n 'type' in openingElement.node.name &&\n openingElement.node.name.type === 'JSXMemberExpression'\n ) {\n const nodeName = openingElement.node.name;\n if (typeof nodeName !== 'object' || !nodeName) {\n return false;\n }\n\n if ('object' in nodeName && 'property' in nodeName) {\n const nodeNameObject = nodeName.object;\n const nodeNameProperty = nodeName.property;\n\n if (typeof nodeNameObject !== 'object' || typeof nodeNameProperty !== 'object') {\n return false;\n }\n\n if (!nodeNameObject || !nodeNameProperty) {\n return false;\n }\n\n const objectName = 'name' in nodeNameObject && nodeNameObject.name;\n const propertyName = 'name' in nodeNameProperty && nodeNameProperty.name;\n\n // React.Fragment check\n if (objectName === 'React' && propertyName === 'Fragment') {\n return true;\n }\n\n // Enhanced checks using context\n if (context) {\n // Check React.Fragment pattern with known React namespaces\n if (context.reactNamespaceAliases.has(objectName as string) && propertyName === 'Fragment') {\n return true;\n }\n\n // Check MyFragment.Fragment pattern\n if (context.fragmentAliases.has(objectName as string) && propertyName === 'Fragment') {\n return true;\n }\n }\n }\n }\n\n return false;\n}\n\nfunction getExistingAttributeNames(openingElement: Babel.NodePath): Set {\n const names = new Set();\n\n openingElement.node.attributes.forEach(node => {\n if (node.type === 'JSXAttribute' && typeof node.name.name === 'string') {\n names.add(node.name.name);\n }\n });\n\n return names;\n}\n\nfunction getPathName(t: typeof Babel.types, path: Babel.NodePath): string {\n if (!path.node) return UNKNOWN_ELEMENT_NAME;\n if (!('name' in path.node)) {\n return UNKNOWN_ELEMENT_NAME;\n }\n\n const name = path.node.name;\n\n if (typeof name === 'string') {\n return name;\n }\n\n if (t.isIdentifier(name) || t.isJSXIdentifier(name)) {\n return name.name;\n }\n\n if (t.isJSXNamespacedName(name)) {\n return name.name.name;\n }\n\n // Handle JSX member expressions like Tab.Group\n if (t.isJSXMemberExpression(name)) {\n const objectName = getJSXMemberExpressionObjectName(t, name.object);\n const propertyName = name.property.name;\n return `${objectName}.${propertyName}`;\n }\n\n return UNKNOWN_ELEMENT_NAME;\n}\n\n// Recursively handle nested member expressions (e.g. Components.UI.Header)\nfunction getJSXMemberExpressionObjectName(\n t: typeof Babel.types,\n object: Babel.types.JSXMemberExpression | Babel.types.JSXIdentifier,\n): string {\n if (t.isJSXIdentifier(object)) {\n return object.name;\n }\n if (t.isJSXMemberExpression(object)) {\n const objectName = getJSXMemberExpressionObjectName(t, object.object);\n return `${objectName}.${object.property.name}`;\n }\n\n return UNKNOWN_ELEMENT_NAME;\n}\n\n/**\n * Extracts static text content from JSX children, searching up to a depth limit.\n * Collects text from JSXText nodes of the root element and from recognized\n * text components (e.g. ). Non-text custom components are traversed\n * but their own JSXText is not collected.\n *\n * Returns null when dynamic content is found anywhere in the subtree,\n * signaling that the entire label should be skipped.\n */\nfunction extractStaticTextFromChildren(\n t: typeof Babel.types,\n node: Babel.types.JSXElement | Babel.types.JSXFragment,\n textComponentNames: string[],\n depth: number,\n isRoot: boolean,\n): string[] | null {\n if (depth <= 0) {\n return [];\n }\n\n const texts: string[] = [];\n\n for (const child of node.children) {\n if (t.isJSXText(child)) {\n if (isRoot) {\n const trimmed = child.value.replace(/\\s+/g, ' ').trim();\n if (trimmed) {\n texts.push(trimmed);\n }\n }\n } else if (t.isJSXElement(child)) {\n const childName = getElementName(t, child.openingElement);\n\n if (textComponentNames.includes(childName)) {\n const innerTexts = extractTextFromTextComponent(t, child, textComponentNames);\n if (innerTexts === null) {\n return null;\n }\n texts.push(...innerTexts);\n } else {\n const result = extractStaticTextFromChildren(t, child, textComponentNames, depth - 1, false);\n if (result === null) {\n return null;\n }\n texts.push(...result);\n }\n } else if (t.isJSXFragment(child)) {\n const result = extractStaticTextFromChildren(t, child, textComponentNames, depth, isRoot);\n if (result === null) {\n return null;\n }\n texts.push(...result);\n } else if (t.isJSXExpressionContainer(child)) {\n if (!t.isJSXEmptyExpression(child.expression)) {\n return null;\n }\n } else if (t.isJSXSpreadChild(child)) {\n return null;\n }\n }\n\n return texts;\n}\n\n/**\n * Recursively extracts static text from within a recognized text component.\n * Handles nested text components (e.g. Hello world)\n * which is the standard React Native pattern for inline styling.\n *\n * Returns null when any dynamic content is found, signaling bail-out.\n */\nfunction extractTextFromTextComponent(\n t: typeof Babel.types,\n node: Babel.types.JSXElement | Babel.types.JSXFragment,\n textComponentNames: string[],\n): string[] | null {\n const texts: string[] = [];\n\n for (const child of node.children) {\n if (t.isJSXText(child)) {\n const trimmed = child.value.replace(/\\s+/g, ' ').trim();\n if (trimmed) {\n texts.push(trimmed);\n }\n } else if (t.isJSXExpressionContainer(child)) {\n if (!t.isJSXEmptyExpression(child.expression)) {\n return null;\n }\n } else if (t.isJSXElement(child)) {\n const childName = getElementName(t, child.openingElement);\n if (textComponentNames.includes(childName)) {\n const innerTexts = extractTextFromTextComponent(t, child, textComponentNames);\n if (innerTexts === null) {\n return null;\n }\n texts.push(...innerTexts);\n } else {\n const innerTexts = extractTextFromTextComponent(t, child, textComponentNames);\n if (innerTexts === null) {\n return null;\n }\n }\n } else if (t.isJSXFragment(child)) {\n const innerTexts = extractTextFromTextComponent(t, child, textComponentNames);\n if (innerTexts === null) {\n return null;\n }\n texts.push(...innerTexts);\n } else if (t.isJSXSpreadChild(child)) {\n return null;\n }\n }\n\n return texts;\n}\n\nfunction getElementName(t: typeof Babel.types, openingElement: Babel.types.JSXOpeningElement): string {\n const name = openingElement.name;\n if (t.isJSXIdentifier(name)) {\n return name.name;\n }\n if (t.isJSXMemberExpression(name)) {\n return `${getJSXMemberExpressionObjectName(t, name.object)}.${name.property.name}`;\n }\n return '';\n}\n\n/**\n * Injects a sentry-label attribute on the root JSX element of a component if\n * static text content can be extracted from its children.\n *\n * When the root is a JSX fragment, the first JSXElement child is used as the\n * target for both text extraction and attribute injection (since fragments\n * cannot carry attributes).\n */\nfunction maybeInjectSentryLabel(context: JSXProcessingContext, jsxNode: Babel.NodePath): void {\n const { t, textComponentNames, ignoredComponents, componentName } = context;\n const node = jsxNode.node;\n\n let targetElement: Babel.types.JSXElement;\n\n if (t.isJSXElement(node)) {\n targetElement = node;\n } else if (t.isJSXFragment(node)) {\n const firstChild = node.children.find((c): c is Babel.types.JSXElement => t.isJSXElement(c));\n if (!firstChild) {\n return;\n }\n targetElement = firstChild;\n } else {\n return;\n }\n\n const targetElementName = getElementName(t, targetElement.openingElement);\n\n if (ignoredComponents.some(ignored => ignored === componentName || ignored === targetElementName)) {\n return;\n }\n\n if (\n targetElement.openingElement.attributes.some(\n attr => t.isJSXAttribute(attr) && attr.name.name === SENTRY_LABEL_ATTRIBUTE,\n )\n ) {\n return;\n }\n\n const texts = extractStaticTextFromChildren(t, targetElement, textComponentNames, MAX_TEXT_SEARCH_DEPTH, true);\n\n if (texts === null) {\n return;\n }\n\n let label = texts.join(' ').replace(/\\s+/g, ' ').trim();\n\n if (!label) {\n return;\n }\n\n if (label.length > MAX_LABEL_LENGTH) {\n label = `${label.substring(0, MAX_LABEL_LENGTH - 3)}...`;\n }\n\n targetElement.openingElement.attributes.push(\n t.jSXAttribute(t.jSXIdentifier(SENTRY_LABEL_ATTRIBUTE), t.stringLiteral(label)),\n );\n}\n\nconst UNKNOWN_ELEMENT_NAME = 'unknown';\n"],"names":["getComponentAnnotationAttributes","KNOWN_INCOMPATIBLE_PLUGINS","NATIVE_COMPONENT_NAME","NATIVE_ELEMENT_NAME","NATIVE_SOURCE_FILE_NAME","WEB_COMPONENT_NAME","WEB_ELEMENT_NAME","WEB_SOURCE_FILE_NAME"],"mappings":"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"}