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: ``,
+ },
+ {
+ code: ``,
+ }
+ ],
+ invalid: [
+ {
+ code: `import { Label } from '@patternfly/react-core'; `,
+ output: `import { Label } from '@patternfly/react-core'; `,
+ errors: [{
+ message: `isCompact prop for Label has been removed`,
+ type: "JSXOpeningElement",
+ }]
+ },
+ ]
+});
diff --git a/packages/eslint-plugin-pf-codemods/test/rules/remove-isPseudo-props.js b/packages/eslint-plugin-pf-codemods/test/rules/remove-isPseudo-props.js
new file mode 100644
index 000000000..b7478d5fb
--- /dev/null
+++ b/packages/eslint-plugin-pf-codemods/test/rules/remove-isPseudo-props.js
@@ -0,0 +1,50 @@
+const ruleTester = require('./ruletester');
+const rule = require('../../lib/rules/remove-isPseudo-props');
+
+ruleTester.run("remove-isPseudo-props", rule, {
+ valid: [
+ {
+ code: `import { Button } from '@patternfly/react-core'; `,
+ }
+ ],
+ invalid: [
+ {
+ code: `import { Button } from '@patternfly/react-core'; `,
+ output: `import { Button } from '@patternfly/react-core'; `,
+ errors: [
+ {
+ message: `isHover prop for Button has been removed`,
+ type: "JSXOpeningElement",
+ },
+ {
+ message: `isFocus prop for Button has been removed`,
+ type: "JSXOpeningElement",
+ },
+ ]
+ },
+ {
+ code: `import { ContextSelectorToggle } from '@patternfly/react-core'; `,
+ output: `import { ContextSelectorToggle } from '@patternfly/react-core'; `,
+ errors: [
+ {
+ message: `isHovered prop for ContextSelectorToggle has been removed`,
+ type: "JSXOpeningElement",
+ },
+ {
+ message: `isFocused prop for ContextSelectorToggle has been removed`,
+ type: "JSXOpeningElement",
+ },
+ ]
+ },
+ {
+ code: `import { Chip } from '@patternfly/react-core'; `,
+ output: `import { Chip } from '@patternfly/react-core'; `,
+ errors: [
+ {
+ message: `isReadOnly prop for Chip has been removed`,
+ type: "JSXOpeningElement",
+ },
+ ]
+ },
+ ]
+});