Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(react-component-annotate): Handle function body returning a ternary #598

Merged
merged 3 commits into from
Aug 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 31 additions & 1 deletion packages/babel-plugin-component-annotate/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ export default function componentNameAnnotatePlugin({ types: t }: typeof Babel):
ArrowFunctionExpression(path, state) {
// We're expecting a `VariableDeclarator` like `const MyComponent =`
const parent = path.parent;

if (
!parent ||
!("id" in parent) ||
Expand Down Expand Up @@ -189,6 +190,36 @@ function functionBodyPushAttributes(
return;
}

// Handle the case of a function body returning a ternary operation.
// `return (maybeTrue ? '' : (<SubComponent />))`
if (arg.isConditionalExpression()) {
const consequent = arg.get("consequent");
if (consequent.isJSXFragment() || consequent.isJSXElement()) {
processJSX(
annotateFragments,
t,
consequent,
componentName,
sourceFileName,
attributeNames,
ignoredComponents
);
}
const alternate = arg.get("alternate");
if (alternate.isJSXFragment() || alternate.isJSXElement()) {
processJSX(
annotateFragments,
t,
alternate,
componentName,
sourceFileName,
attributeNames,
ignoredComponents
);
}
return;
}

if (!arg.isJSXFragment() && !arg.isJSXElement()) {
return;
}
Expand Down Expand Up @@ -223,7 +254,6 @@ function processJSX(
if (!jsxNode) {
return;
}

// NOTE: I don't know of a case where `openingElement` would have more than one item,
// but it's safer to always iterate
const paths = jsxNode.get("openingElement");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,16 @@ class componentName extends Component {
export default componentName;"
`;

exports[`handles ternary operation returned by function body 1`] = `
"const maybeTrue = Math.random() > 0.5;
export default function componentName() {
return maybeTrue ? '' : /*#__PURE__*/React.createElement(SubComponent, {
\\"data-sentry-element\\": \\"SubComponent\\",
\\"data-sentry-component\\": \\"componentName\\"
});
}"
`;

exports[`nonJSX snapshot matches 1`] = `
"import React, { Component } from 'react';
class TestClass extends Component {
Expand Down
14 changes: 14 additions & 0 deletions packages/babel-plugin-component-annotate/test/test-plugin.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2236,3 +2236,17 @@ it("Bananas incompatible plugin @react-navigation source snapshot matches", () =
}"
`);
});

it("handles ternary operation returned by function body", () => {
const result = transform(
`const maybeTrue = Math.random() > 0.5;
export default function componentName() {
return (maybeTrue ? '' : (<SubComponent />))
}`,
{
presets: ["@babel/preset-react"],
plugins: [[plugin, { "annotate-fragments": true }]],
}
);
expect(result?.code).toMatchSnapshot();
});
Loading