diff --git a/packages/eslint-plugin-pf-codemods/index.js b/packages/eslint-plugin-pf-codemods/index.js index 7a03895fa..2a8082bfb 100644 --- a/packages/eslint-plugin-pf-codemods/index.js +++ b/packages/eslint-plugin-pf-codemods/index.js @@ -57,6 +57,8 @@ const rules = { "simpleList-remove-isCurrent": require('./lib/rules/v5/simpleList-remove-isCurrent'), "spinner-svg-default": require('./lib/rules/v5/spinner-svg-default'), "tableComposable-remove-hasSelectableRowCaption": require('./lib/rules/v5/tableComposable-remove-hasSelectableRowCaption'), + "tabs-rename-hasBorderBottom": require('./lib/rules/v5/tabs-rename-hasBorderBottom'), + "tabs-remove-hasSecondaryBorderBottom": require('./lib/rules/v5/tabs-rename-hasSecondaryBorderBottom'), "toggle-remove-isPrimary": require('./lib/rules/v5/toggle-remove-isPrimary'), "toolbar-remove-visiblity": require('./lib/rules/v5/toolbar-remove-visiblity'), "tooltip-remove-props": require('./lib/rules/v5/tooltip-remove-props'), diff --git a/packages/eslint-plugin-pf-codemods/lib/rules/v5/tabs-remove-hasSecondaryBorderBottom.js b/packages/eslint-plugin-pf-codemods/lib/rules/v5/tabs-remove-hasSecondaryBorderBottom.js new file mode 100644 index 000000000..e4498cce9 --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/lib/rules/v5/tabs-remove-hasSecondaryBorderBottom.js @@ -0,0 +1,11 @@ +const { renameProp } = require('../../helpers'); + +// https://github.com/patternfly/patternfly-react/pull/8517 +module.exports = { + meta: { fixable: 'code' }, + create: renameProp( + 'Tabs', + {'hasSecondaryBorderBottom': ''}, + node => `hasSecondaryBorderBottom prop has been removed for ${node.name.name}.` + ), +}; diff --git a/packages/eslint-plugin-pf-codemods/lib/rules/v5/tabs-rename-hasBorderBottom.js b/packages/eslint-plugin-pf-codemods/lib/rules/v5/tabs-rename-hasBorderBottom.js new file mode 100644 index 000000000..48ab86237 --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/lib/rules/v5/tabs-rename-hasBorderBottom.js @@ -0,0 +1,32 @@ +const { getPackageImports } = require('../../helpers'); + +// https://github.com/patternfly/patternfly-react/pull/8517 +module.exports = { + meta: { fixable: 'code' }, + create: function(context) { + const imports = getPackageImports(context, '@patternfly/react-core') + .filter(specifier => specifier.imported.name === 'Tabs'); + const sourceCode = context.getSourceCode(); + + return imports.length == 0 ? {} : { + JSXOpeningElement(node) { + if (imports.map(imp => imp.local.name).includes(node.name.name)) { + const attribute = node.attributes.find(node => node.name && node.name.name === 'hasBorderBottom'); + if (attribute) { + context.report({ + node, + message: `hasBorderBottom prop has been removed for ${node.name.name}. Use hasNoBorderBottom instead`, + fix(fixer) { + const attrText = attribute.value ? sourceCode.getText(attribute.value.expression) : 'true'; + if (['true', 'false'].includes(attrText.trim())) { + return fixer.replaceText(attribute, attrText && attrText.trim() === 'false' ? 'hasNoBorderBottom' : ''); + } + return fixer.replaceText(attribute, `hasNoBorderBottom={!(${attrText})}`) + } + }); + } + } + } + }; + } +}; diff --git a/packages/eslint-plugin-pf-codemods/test/rules/v5/tabs-remove-hasSecondaryBorderBottom.js b/packages/eslint-plugin-pf-codemods/test/rules/v5/tabs-remove-hasSecondaryBorderBottom.js new file mode 100644 index 000000000..a99052975 --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/test/rules/v5/tabs-remove-hasSecondaryBorderBottom.js @@ -0,0 +1,26 @@ +const ruleTester = require("../../ruletester"); +const rule = require("../../../lib/rules/v5/tabs-remove-hasSecondaryBorderBottom"); + +ruleTester.run("tabs-remove-hasSecondaryBorderBottom", rule, { + valid: [ + { + code: `import { Tabs } from '@patternfly/react-core'; `, + }, + { + // No @patternfly/react-core import + code: ``, + }, + ], + invalid: [ + { + code: `import { Tabs } from '@patternfly/react-core'; `, + output: `import { Tabs } from '@patternfly/react-core'; `, + errors: [ + { + message: `hasSecondaryBorderBottom prop has been removed for Tabs.`, + type: "JSXOpeningElement", + }, + ], + }, + ], +}); diff --git a/packages/eslint-plugin-pf-codemods/test/rules/v5/tabs-rename-hasBorderBottom.js b/packages/eslint-plugin-pf-codemods/test/rules/v5/tabs-rename-hasBorderBottom.js new file mode 100644 index 000000000..b85b7b110 --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/test/rules/v5/tabs-rename-hasBorderBottom.js @@ -0,0 +1,56 @@ +const ruleTester = require("../../ruletester"); +const rule = require("../../../lib/rules/v5/tabs-rename-hasBorderBottom"); + +ruleTester.run("tabs-rename-hasBorderBottom", rule, { + valid: [ + { + code: `import { Tabs } from '@patternfly/react-core'; `, + }, + { + // No @patternfly/react-core import + code: ``, + }, + ], + invalid: [ + { + code: `import { Tabs } from '@patternfly/react-core'; `, + output: `import { Tabs } from '@patternfly/react-core'; `, + errors: [ + { + message: `hasBorderBottom prop has been removed for Tabs. Use hasNoBorderBottom instead`, + type: "JSXOpeningElement", + }, + ], + }, + { + code: `import { Tabs } from '@patternfly/react-core'; `, + output: `import { Tabs } from '@patternfly/react-core'; `, + errors: [ + { + message: `hasBorderBottom prop has been removed for Tabs. Use hasNoBorderBottom instead`, + type: "JSXOpeningElement", + }, + ], + }, + { + code: `import { Tabs } from '@patternfly/react-core'; `, + output: `import { Tabs } from '@patternfly/react-core'; `, + errors: [ + { + message: `hasBorderBottom prop has been removed for Tabs. Use hasNoBorderBottom instead`, + type: "JSXOpeningElement", + }, + ], + }, + { + code: `import { Tabs } from '@patternfly/react-core'; `, + output: `import { Tabs } from '@patternfly/react-core'; `, + errors: [ + { + message: `hasBorderBottom prop has been removed for Tabs. Use hasNoBorderBottom instead`, + type: "JSXOpeningElement", + }, + ], + }, + ], +}); diff --git a/packages/pf-codemods/README.md b/packages/pf-codemods/README.md index 40184412a..163e20891 100644 --- a/packages/pf-codemods/README.md +++ b/packages/pf-codemods/README.md @@ -368,6 +368,48 @@ Out: ``` +### tabs-rename-hasBorderBottom [(#8517)](https://github.com/patternfly/patternfly-react/pull/8517) + +We've renamed the `hasBorderBottom` prop to `hasNoBorderBottom`. + +#### Examples + +In: + +```jsx + + + + +``` + +Out: + +```jsx + + + + +``` + +### tabs-rename-hasSecondaryBorderBottom [(#8517)](https://github.com/patternfly/patternfly-react/pull/8517) + +We've removed the deprecated `hasSecondaryBorderBottom` prop. + +#### Examples + +In: + +```jsx + +``` + +Out: + +```jsx + +``` + ### toggle-remove-isprimary [(#8179)](https://github.com/patternfly/patternfly-react/pull/8179) We've removed the deprecated `isPrimary` prop. This rule wil replace it with the "primary" value on the `toggleVariant` prop.