diff --git a/packages/eslint-plugin-pf-codemods/index.js b/packages/eslint-plugin-pf-codemods/index.js index bce8f1dcb..54a654a59 100644 --- a/packages/eslint-plugin-pf-codemods/index.js +++ b/packages/eslint-plugin-pf-codemods/index.js @@ -27,6 +27,8 @@ const rules = { "dropdown-toggle-rename-iconComponent": require('./lib/rules/dropdown-toggle-rename-iconComponent'), "empty-state-icon-removed-props": require('./lib/rules/empty-state-icon-removed-props'), "pagination-removed-variant": require('./lib/rules/pagination-removed-variant'), + "remove-isPseudo-props": require('./lib/rules/remove-isPseudo-props'), + "label-remove-isCompact": require('./lib/rules/label-remove-isCompact'), }; module.exports = { diff --git a/packages/eslint-plugin-pf-codemods/lib/helpers.js b/packages/eslint-plugin-pf-codemods/lib/helpers.js index f223e8447..c6f432e02 100644 --- a/packages/eslint-plugin-pf-codemods/lib/helpers.js +++ b/packages/eslint-plugin-pf-codemods/lib/helpers.js @@ -39,6 +39,43 @@ function renameProp(components, propMap, message, replaceAttribute) { } } +function renameProps(renames) { + return function(context) { + const imports = getPackageImports(context, '@patternfly/react-core') + .filter(specifier => Object.keys(renames).includes(specifier.imported.name)); + + return !imports ? {} : { + JSXOpeningElement(node) { + if (imports.map(imp => imp.local.name).includes(node.name.name)) { + const renamedProps = renames[node.name.name]; + node.attributes + .filter(attribute => renamedProps.hasOwnProperty(attribute.name.name)) + .forEach(attribute => { + if (renamedProps[attribute.name.name] === '') { + context.report({ + node, + message: `${attribute.name.name} prop for ${node.name.name} has been removed`, + fix(fixer) { + return fixer.replaceText(attribute, ''); + } + }); + } + else { + context.report({ + node, + message: `${attribute.name.name} prop for ${node.name.name} has been renamed to ${renamedProps[attribute.name.name]}`, + fix(fixer) { + return fixer.replaceText(attribute.name, renamedProps[attribute.name.name]); + } + }); + } + }); + } + } + }; + } +} + function renameComponent(componentMap, message) { return function(context) { const imports = getPackageImports(context, '@patternfly/react-core') @@ -64,5 +101,6 @@ function renameComponent(componentMap, message) { module.exports = { getPackageImports, renameProp, + renameProps, renameComponent } \ No newline at end of file diff --git a/packages/eslint-plugin-pf-codemods/lib/rules/aria-props.js b/packages/eslint-plugin-pf-codemods/lib/rules/aria-props.js index 2f6d1b2d5..4505ca266 100644 --- a/packages/eslint-plugin-pf-codemods/lib/rules/aria-props.js +++ b/packages/eslint-plugin-pf-codemods/lib/rules/aria-props.js @@ -1,4 +1,4 @@ -const { getPackageImports } = require('../helpers'); +const { renameProps } = require('../helpers'); // https://github.com/patternfly/patternfly-react/pull/3924 const renames = { @@ -13,7 +13,7 @@ const renames = { 'ariaHasPopup': 'aria-haspopup' }, 'LoginForm': { - 'rememberMeAriaLabel': 'REMOVE' + 'rememberMeAriaLabel': '' }, 'Modal': { 'ariaDescribedById': 'modalContentAriaDescribedById' @@ -22,7 +22,7 @@ const renames = { 'ariaDescribedById': 'modalBoxAriaDescribedById' }, 'OptionsMenu': { - 'ariaLabelMenu': 'REMOVE' + 'ariaLabelMenu': '' }, 'OptionsMenuItemGroup': { 'ariaLabel': 'aria-label' @@ -60,38 +60,5 @@ const renames = { }; module.exports = { - create: function(context) { - const imports = getPackageImports(context, '@patternfly/react-core') - .filter(specifier => Object.keys(renames).includes(specifier.imported.name)); - - return !imports ? {} : { - JSXOpeningElement(node) { - if (imports.map(imp => imp.local.name).includes(node.name.name)) { - const renamedProps = renames[node.name.name]; - node.attributes - .filter(attribute => renamedProps[attribute.name.name]) - .forEach(ariaAttribute => { - if (renamedProps[ariaAttribute.name.name] === 'REMOVE') { - context.report({ - node, - message: `${ariaAttribute.name.name} prop for ${node.name.name} has been removed`, - fix(fixer) { - return fixer.replaceText(ariaAttribute, ''); - } - }); - } - else { - context.report({ - node, - message: `${ariaAttribute.name.name} prop for ${node.name.name} has been renamed to ${renamedProps[ariaAttribute.name.name]}`, - fix(fixer) { - return fixer.replaceText(ariaAttribute.name, renamedProps[ariaAttribute.name.name]); - } - }); - } - }); - } - } - }; - } -}; \ No newline at end of file + create: renameProps(renames) +}; diff --git a/packages/eslint-plugin-pf-codemods/lib/rules/label-remove-isCompact.js b/packages/eslint-plugin-pf-codemods/lib/rules/label-remove-isCompact.js new file mode 100644 index 000000000..435a3a1b2 --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/lib/rules/label-remove-isCompact.js @@ -0,0 +1,10 @@ +const { renameProp } = require('../helpers'); + +// https://github.com/patternfly/patternfly-react/pull/4116 +module.exports = { + create: renameProp( + 'Label', + { isCompact: '' }, + (node, attribute) => `${attribute.name.name} prop for ${node.name.name} has been removed` + ) +}; diff --git a/packages/eslint-plugin-pf-codemods/lib/rules/remove-isPseudo-props.js b/packages/eslint-plugin-pf-codemods/lib/rules/remove-isPseudo-props.js new file mode 100644 index 000000000..92e59e171 --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/lib/rules/remove-isPseudo-props.js @@ -0,0 +1,55 @@ +const { renameProps } = require('../helpers'); + +// https://github.com/patternfly/patternfly-react/pull/4116 +const renames = { + 'Button': { + isHover: '', + isFocus: '' + }, + 'Chip': { + isReadOnly: '' + }, + 'Toggle': { + isHover: '', + isFocus: '' + }, + 'KebabToggle': { + isHover: '', + isFocus: '' + }, + 'DropdownToggle': { + isHover: '', + isFocus: '' + }, + 'SelectToggle': { + isHovered: '', + isFocus: '' + }, + 'Expandable': { + isHover: '', + isFocus: '' + }, + 'ExpandableSection': { + isHover: '', + isFocus: '' + }, + 'OptionsMenuToggle': { + isFocused: '', + isHovered: '' + }, + 'OptionsMenuToggleWithText': { + isFocused: '', + isHovered: '' + }, + 'ContextSelectorItem': { + isHovered: '' + }, + 'ContextSelectorToggle': { + isFocused: '', + isHovered: '' + }, +}; + +module.exports = { + create: renameProps(renames) +}; diff --git a/packages/eslint-plugin-pf-codemods/test/rules/label-remove-isCompact.js b/packages/eslint-plugin-pf-codemods/test/rules/label-remove-isCompact.js new file mode 100644 index 000000000..9c4efb33c --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/test/rules/label-remove-isCompact.js @@ -0,0 +1,23 @@ +const ruleTester = require('./ruletester'); +const rule = require('../../lib/rules/label-remove-isCompact'); + +ruleTester.run("label-remove-isCompact", rule, { + valid: [ + { + code: `