diff --git a/libs/babel-transform-react-display-name/index.js b/libs/babel-transform-react-display-name/index.js index 274d02a6ea..b9a70dddc9 100644 --- a/libs/babel-transform-react-display-name/index.js +++ b/libs/babel-transform-react-display-name/index.js @@ -54,9 +54,14 @@ module.exports = function ({ types: t }) { if (!isExpressionFn) return + // Should only apply to top level components + const parentStatement = componentFn.getStatementParent() + if (!t.isProgram(parentStatement.parent)) { + return + } + const declarator = componentFn.findParent((path) => t.isVariableDeclarator(path)) if (declarator) { - const parentStatement = componentFn.getStatementParent() const name = declarator.node.id.name parentStatement.insertAfter(genDisplayName(path, name)) return @@ -66,11 +71,10 @@ module.exports = function ({ types: t }) { t.isAssignmentExpression(path) ) if (assignmentExpression) { - const parentStatement = componentFn.getStatementParent() const leftHandSide = assignmentExpression.node.left - // Only want to do this step for top level components - if (!t.isProgram(parentStatement.parent) || !t.isMemberExpression(leftHandSide)) { + // Don't add display names to nested member expressions + if (!t.isMemberExpression(leftHandSide)) { return } diff --git a/libs/babel-transform-react-display-name/index.spec.tsx b/libs/babel-transform-react-display-name/index.spec.tsx index 6798abf1a8..d6db45e473 100644 --- a/libs/babel-transform-react-display-name/index.spec.tsx +++ b/libs/babel-transform-react-display-name/index.spec.tsx @@ -185,6 +185,29 @@ describe('classed template tag literals', () => { }) }) +describe('cases that should not be transformed', () => { + it('should not transform a non-top level JSX function', () => { + const result = transform` + export function f() { + const nestedComponent = () =>
+ } + ` + + expect(result).toMatchInlineSnapshot(` + "\\"use strict\\"; + + Object.defineProperty(exports, \\"__esModule\\", { + value: true + }); + exports.f = f; + + function f() { + const nestedComponent = () => /*#__PURE__*/React.createElement(\\"div\\", null); + }" + `) + }) +}) + /** * Helper to streamline babel transforms */