Skip to content
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
2 changes: 2 additions & 0 deletions packages/eslint-plugin-pf-codemods/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down
38 changes: 38 additions & 0 deletions packages/eslint-plugin-pf-codemods/lib/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand All @@ -64,5 +101,6 @@ function renameComponent(componentMap, message) {
module.exports = {
getPackageImports,
renameProp,
renameProps,
renameComponent
}
43 changes: 5 additions & 38 deletions packages/eslint-plugin-pf-codemods/lib/rules/aria-props.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { getPackageImports } = require('../helpers');
const { renameProps } = require('../helpers');

// https://github.com/patternfly/patternfly-react/pull/3924
const renames = {
Expand All @@ -13,7 +13,7 @@ const renames = {
'ariaHasPopup': 'aria-haspopup'
},
'LoginForm': {
'rememberMeAriaLabel': 'REMOVE'
'rememberMeAriaLabel': ''
},
'Modal': {
'ariaDescribedById': 'modalContentAriaDescribedById'
Expand All @@ -22,7 +22,7 @@ const renames = {
'ariaDescribedById': 'modalBoxAriaDescribedById'
},
'OptionsMenu': {
'ariaLabelMenu': 'REMOVE'
'ariaLabelMenu': ''
},
'OptionsMenuItemGroup': {
'ariaLabel': 'aria-label'
Expand Down Expand Up @@ -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]);
}
});
}
});
}
}
};
}
};
create: renameProps(renames)
};
Original file line number Diff line number Diff line change
@@ -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`
)
};
Original file line number Diff line number Diff line change
@@ -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)
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
const ruleTester = require('./ruletester');
const rule = require('../../lib/rules/label-remove-isCompact');

ruleTester.run("label-remove-isCompact", rule, {
valid: [
{
code: `<Label isCompact />`,
},
{
code: `<Label isCompact />`,
}
],
invalid: [
{
code: `import { Label } from '@patternfly/react-core'; <Label isCompact>Label</Label>`,
output: `import { Label } from '@patternfly/react-core'; <Label >Label</Label>`,
errors: [{
message: `isCompact prop for Label has been removed`,
type: "JSXOpeningElement",
}]
},
]
});
Original file line number Diff line number Diff line change
@@ -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'; <Button />`,
}
],
invalid: [
{
code: `import { Button } from '@patternfly/react-core'; <Button isHover isFocus />`,
output: `import { Button } from '@patternfly/react-core'; <Button />`,
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'; <ContextSelectorToggle isHovered isFocused />`,
output: `import { ContextSelectorToggle } from '@patternfly/react-core'; <ContextSelectorToggle />`,
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'; <Chip isReadOnly />`,
output: `import { Chip } from '@patternfly/react-core'; <Chip />`,
errors: [
{
message: `isReadOnly prop for Chip has been removed`,
type: "JSXOpeningElement",
},
]
},
]
});