From af599b68dbf458b7fa93cf7be90c0b2e4e15dd7c Mon Sep 17 00:00:00 2001 From: Eric Olkowski Date: Tue, 5 Mar 2024 09:10:07 -0500 Subject: [PATCH 1/5] chore(helpers): extract findAncestor helper --- .../src/rules/helpers/findAncestor.ts | 28 ++++++++++ .../src/rules/helpers/helpers.js | 14 ----- .../src/rules/helpers/index.ts | 7 ++- .../accordionToggle-move-isExpanded-prop.ts | 55 ++++++++++--------- 4 files changed, 62 insertions(+), 42 deletions(-) create mode 100644 packages/eslint-plugin-pf-codemods/src/rules/helpers/findAncestor.ts diff --git a/packages/eslint-plugin-pf-codemods/src/rules/helpers/findAncestor.ts b/packages/eslint-plugin-pf-codemods/src/rules/helpers/findAncestor.ts new file mode 100644 index 000000000..807f4190d --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/src/rules/helpers/findAncestor.ts @@ -0,0 +1,28 @@ +import { JSXElement, JSXOpeningElement } from "estree-jsx"; + +type ElementWithParent = (JSXOpeningElement | JSXElement) & { + parent?: ElementWithParent | null; +}; + +export function findElementAncestor( + node: ElementWithParent, + ancestorNameToFind: string +): JSXElement | undefined { + if (!node) { + return; + } + + let current = node.parent; + + while (current) { + if ( + current.type === "JSXElement" && + current.openingElement.name.type === "JSXIdentifier" && + current.openingElement.name.name === ancestorNameToFind + ) { + return current; + } + + current = current.parent; + } +} diff --git a/packages/eslint-plugin-pf-codemods/src/rules/helpers/helpers.js b/packages/eslint-plugin-pf-codemods/src/rules/helpers/helpers.js index 4cd0375cf..171ce02a8 100644 --- a/packages/eslint-plugin-pf-codemods/src/rules/helpers/helpers.js +++ b/packages/eslint-plugin-pf-codemods/src/rules/helpers/helpers.js @@ -880,17 +880,3 @@ export function findVariableDeclaration(name, scope) { } return undefined; } - -export function findAncestor(node, conditionCallback = (_current) => false) { - let current = node?.parent; - - while (current) { - if (conditionCallback(current)) { - return current; - } - - current = current.parent; - } - - return undefined; -} diff --git a/packages/eslint-plugin-pf-codemods/src/rules/helpers/index.ts b/packages/eslint-plugin-pf-codemods/src/rules/helpers/index.ts index ed9f266fd..999c2b481 100644 --- a/packages/eslint-plugin-pf-codemods/src/rules/helpers/index.ts +++ b/packages/eslint-plugin-pf-codemods/src/rules/helpers/index.ts @@ -1,3 +1,4 @@ -export * from './helpers'; -export * from './pfPackageMatches'; -export * from './getFromPackage'; \ No newline at end of file +export * from "./findAncestor"; +export * from "./helpers"; +export * from "./pfPackageMatches"; +export * from "./getFromPackage"; diff --git a/packages/eslint-plugin-pf-codemods/src/rules/v6/accordionToggleMoveIsExpandedProp/accordionToggle-move-isExpanded-prop.ts b/packages/eslint-plugin-pf-codemods/src/rules/v6/accordionToggleMoveIsExpandedProp/accordionToggle-move-isExpanded-prop.ts index 74e8c3e26..70e0d1eb8 100644 --- a/packages/eslint-plugin-pf-codemods/src/rules/v6/accordionToggleMoveIsExpandedProp/accordionToggle-move-isExpanded-prop.ts +++ b/packages/eslint-plugin-pf-codemods/src/rules/v6/accordionToggleMoveIsExpandedProp/accordionToggle-move-isExpanded-prop.ts @@ -1,6 +1,6 @@ -import { getFromPackage, findAncestor } from "../../helpers"; +import { getFromPackage, findElementAncestor } from "../../helpers"; import { Rule } from "eslint"; -import { JSXOpeningElement } from "estree-jsx"; +import { JSXOpeningElement, JSXElement } from "estree-jsx"; // https://github.com/patternfly/patternfly-react/pull/9876 module.exports = { @@ -26,30 +26,35 @@ module.exports = { attr.type === "JSXAttribute" && attr.name.name === "isExpanded" ); - if (attribute) { - context.report({ - node, - message: - "The `isExpanded` prop for AccordionToggle has been moved to AccordionItem.", - fix(fixer) { - const accordionItemAncestor = findAncestor( - node, - (current) => - current?.openingElement?.name?.name === "AccordionItem" - ); - const attributeValue = context - .getSourceCode() - .getText(attribute); - return [ - fixer.replaceText(attribute, ""), - fixer.insertTextAfter( - accordionItemAncestor.openingElement.name, - ` ${attributeValue}` - ), - ]; - }, - }); + + if (!attribute) { + return; } + + context.report({ + node, + message: + "The `isExpanded` prop for AccordionToggle has been moved to AccordionItem.", + fix(fixer) { + const accordionItemAncestor = findElementAncestor( + node, + "AccordionItem" + ); + const attributeValue = context + .getSourceCode() + .getText(attribute); + + return accordionItemAncestor + ? [ + fixer.replaceText(attribute, ""), + fixer.insertTextAfter( + accordionItemAncestor.openingElement.name, + ` ${attributeValue}` + ), + ] + : []; + }, + }); } }, }; From 3389b0e3a6bcb0375f5f0b028314af88889a56cb Mon Sep 17 00:00:00 2001 From: Eric Olkowski Date: Tue, 5 Mar 2024 09:13:13 -0500 Subject: [PATCH 2/5] Removed extraneous import --- .../accordionToggle-move-isExpanded-prop.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/eslint-plugin-pf-codemods/src/rules/v6/accordionToggleMoveIsExpandedProp/accordionToggle-move-isExpanded-prop.ts b/packages/eslint-plugin-pf-codemods/src/rules/v6/accordionToggleMoveIsExpandedProp/accordionToggle-move-isExpanded-prop.ts index 70e0d1eb8..02c11e93b 100644 --- a/packages/eslint-plugin-pf-codemods/src/rules/v6/accordionToggleMoveIsExpandedProp/accordionToggle-move-isExpanded-prop.ts +++ b/packages/eslint-plugin-pf-codemods/src/rules/v6/accordionToggleMoveIsExpandedProp/accordionToggle-move-isExpanded-prop.ts @@ -1,6 +1,6 @@ import { getFromPackage, findElementAncestor } from "../../helpers"; import { Rule } from "eslint"; -import { JSXOpeningElement, JSXElement } from "estree-jsx"; +import { JSXOpeningElement } from "estree-jsx"; // https://github.com/patternfly/patternfly-react/pull/9876 module.exports = { From e7fee3b7fc0114a18145f26aa619fc56626d4e1c Mon Sep 17 00:00:00 2001 From: Eric Olkowski Date: Tue, 5 Mar 2024 09:33:57 -0500 Subject: [PATCH 3/5] Add back conditionCallback --- .../src/rules/helpers/findAncestor.ts | 20 ++++++++----------- .../src/rules/helpers/helpers.js | 1 + .../accordionToggle-move-isExpanded-prop.ts | 13 +++++++----- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/packages/eslint-plugin-pf-codemods/src/rules/helpers/findAncestor.ts b/packages/eslint-plugin-pf-codemods/src/rules/helpers/findAncestor.ts index 807f4190d..6b4aae545 100644 --- a/packages/eslint-plugin-pf-codemods/src/rules/helpers/findAncestor.ts +++ b/packages/eslint-plugin-pf-codemods/src/rules/helpers/findAncestor.ts @@ -1,13 +1,13 @@ -import { JSXElement, JSXOpeningElement } from "estree-jsx"; +import { Node } from "estree-jsx"; -type ElementWithParent = (JSXOpeningElement | JSXElement) & { - parent?: ElementWithParent | null; +type NodeWithParent = Node & { + parent?: NodeWithParent | null; }; -export function findElementAncestor( - node: ElementWithParent, - ancestorNameToFind: string -): JSXElement | undefined { +export function findAncestor( + node: NodeWithParent, + conditionCallback: (_current: NodeWithParent) => boolean +) { if (!node) { return; } @@ -15,11 +15,7 @@ export function findElementAncestor( let current = node.parent; while (current) { - if ( - current.type === "JSXElement" && - current.openingElement.name.type === "JSXIdentifier" && - current.openingElement.name.name === ancestorNameToFind - ) { + if (conditionCallback(current)) { return current; } diff --git a/packages/eslint-plugin-pf-codemods/src/rules/helpers/helpers.js b/packages/eslint-plugin-pf-codemods/src/rules/helpers/helpers.js index 171ce02a8..c369cb084 100644 --- a/packages/eslint-plugin-pf-codemods/src/rules/helpers/helpers.js +++ b/packages/eslint-plugin-pf-codemods/src/rules/helpers/helpers.js @@ -1,5 +1,6 @@ import { getFromPackage } from "./getFromPackage"; import { pfPackageMatches } from "./pfPackageMatches"; +import { findAncestor } from "./findAncestor"; const evk = require("eslint-visitor-keys"); diff --git a/packages/eslint-plugin-pf-codemods/src/rules/v6/accordionToggleMoveIsExpandedProp/accordionToggle-move-isExpanded-prop.ts b/packages/eslint-plugin-pf-codemods/src/rules/v6/accordionToggleMoveIsExpandedProp/accordionToggle-move-isExpanded-prop.ts index 02c11e93b..0d3fc3f48 100644 --- a/packages/eslint-plugin-pf-codemods/src/rules/v6/accordionToggleMoveIsExpandedProp/accordionToggle-move-isExpanded-prop.ts +++ b/packages/eslint-plugin-pf-codemods/src/rules/v6/accordionToggleMoveIsExpandedProp/accordionToggle-move-isExpanded-prop.ts @@ -1,6 +1,6 @@ -import { getFromPackage, findElementAncestor } from "../../helpers"; +import { getFromPackage, findAncestor } from "../../helpers"; import { Rule } from "eslint"; -import { JSXOpeningElement } from "estree-jsx"; +import { JSXElement, JSXOpeningElement } from "estree-jsx"; // https://github.com/patternfly/patternfly-react/pull/9876 module.exports = { @@ -36,10 +36,13 @@ module.exports = { message: "The `isExpanded` prop for AccordionToggle has been moved to AccordionItem.", fix(fixer) { - const accordionItemAncestor = findElementAncestor( + const accordionItemAncestor = findAncestor( node, - "AccordionItem" - ); + (current) => + current.type === "JSXElement" && + current.openingElement.name.type === "JSXIdentifier" && + current.openingElement.name.name === "AccordionItem" + ) as JSXElement | undefined; const attributeValue = context .getSourceCode() .getText(attribute); From c7e04b42f72f4e94e7b6842db3f85255f4cd6cb1 Mon Sep 17 00:00:00 2001 From: Eric Olkowski Date: Wed, 20 Mar 2024 09:01:53 -0400 Subject: [PATCH 4/5] Updated typing --- .../src/rules/helpers/findAncestor.ts | 35 +++++++++++++++++-- .../accordionToggle-move-isExpanded-prop.ts | 5 +-- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/packages/eslint-plugin-pf-codemods/src/rules/helpers/findAncestor.ts b/packages/eslint-plugin-pf-codemods/src/rules/helpers/findAncestor.ts index 6b4aae545..44dd3abc8 100644 --- a/packages/eslint-plugin-pf-codemods/src/rules/helpers/findAncestor.ts +++ b/packages/eslint-plugin-pf-codemods/src/rules/helpers/findAncestor.ts @@ -1,13 +1,13 @@ -import { Node } from "estree-jsx"; +import { JSXElement, JSXOpeningElement } from "estree-jsx"; -type NodeWithParent = Node & { +type NodeWithParent = (JSXOpeningElement | JSXElement) & { parent?: NodeWithParent | null; }; export function findAncestor( node: NodeWithParent, conditionCallback: (_current: NodeWithParent) => boolean -) { +): NodeWithParent | undefined { if (!node) { return; } @@ -22,3 +22,32 @@ export function findAncestor( current = current.parent; } } + +// import { JSXElement, JSXOpeningElement } from "estree-jsx"; + +// type ElementWithParent = (JSXOpeningElement | JSXElement) & { +// parent?: ElementWithParent | null; +// }; + +// export function findAncestorByName( +// node: ElementWithParent, +// ancestorNameToFind: string +// ): JSXElement | undefined { +// if (!node) { +// return; +// } + +// let current = node.parent; + +// while (current) { +// if ( +// current.type === "JSXElement" && +// current.openingElement.name.type === "JSXIdentifier" && +// current.openingElement.name.name === ancestorNameToFind +// ) { +// return current; +// } + +// current = current.parent; +// } +// } diff --git a/packages/eslint-plugin-pf-codemods/src/rules/v6/accordionToggleMoveIsExpandedProp/accordionToggle-move-isExpanded-prop.ts b/packages/eslint-plugin-pf-codemods/src/rules/v6/accordionToggleMoveIsExpandedProp/accordionToggle-move-isExpanded-prop.ts index 0d3fc3f48..69bee7da1 100644 --- a/packages/eslint-plugin-pf-codemods/src/rules/v6/accordionToggleMoveIsExpandedProp/accordionToggle-move-isExpanded-prop.ts +++ b/packages/eslint-plugin-pf-codemods/src/rules/v6/accordionToggleMoveIsExpandedProp/accordionToggle-move-isExpanded-prop.ts @@ -42,12 +42,13 @@ module.exports = { current.type === "JSXElement" && current.openingElement.name.type === "JSXIdentifier" && current.openingElement.name.name === "AccordionItem" - ) as JSXElement | undefined; + ); const attributeValue = context .getSourceCode() .getText(attribute); - return accordionItemAncestor + return accordionItemAncestor && + accordionItemAncestor.type === "JSXElement" ? [ fixer.replaceText(attribute, ""), fixer.insertTextAfter( From b3eb4f00434451bf6a405f00af108f2f8844ade4 Mon Sep 17 00:00:00 2001 From: Eric Olkowski Date: Wed, 20 Mar 2024 09:08:27 -0400 Subject: [PATCH 5/5] Removed comments --- .../src/rules/helpers/findAncestor.ts | 29 ------------------- 1 file changed, 29 deletions(-) diff --git a/packages/eslint-plugin-pf-codemods/src/rules/helpers/findAncestor.ts b/packages/eslint-plugin-pf-codemods/src/rules/helpers/findAncestor.ts index 44dd3abc8..cbd6b2ca0 100644 --- a/packages/eslint-plugin-pf-codemods/src/rules/helpers/findAncestor.ts +++ b/packages/eslint-plugin-pf-codemods/src/rules/helpers/findAncestor.ts @@ -22,32 +22,3 @@ export function findAncestor( current = current.parent; } } - -// import { JSXElement, JSXOpeningElement } from "estree-jsx"; - -// type ElementWithParent = (JSXOpeningElement | JSXElement) & { -// parent?: ElementWithParent | null; -// }; - -// export function findAncestorByName( -// node: ElementWithParent, -// ancestorNameToFind: string -// ): JSXElement | undefined { -// if (!node) { -// return; -// } - -// let current = node.parent; - -// while (current) { -// if ( -// current.type === "JSXElement" && -// current.openingElement.name.type === "JSXIdentifier" && -// current.openingElement.name.name === ancestorNameToFind -// ) { -// return current; -// } - -// current = current.parent; -// } -// }