diff --git a/generate.js b/generate.js index 9e4c1c757..1246bdd16 100644 --- a/generate.js +++ b/generate.js @@ -29,7 +29,7 @@ module.exports = { if (attribute) { context.report({ node, - message: 'YOUR MESSAGE HERE', + message: 'YOUR_MESSAGE_HERE', fix(fixer) { return fixer.replaceText(attribute, ''); } diff --git a/packages/eslint-plugin-pf-codemods/index.js b/packages/eslint-plugin-pf-codemods/index.js index 9809d791d..f981627ac 100644 --- a/packages/eslint-plugin-pf-codemods/index.js +++ b/packages/eslint-plugin-pf-codemods/index.js @@ -32,6 +32,7 @@ const rules = { "rename-noPadding": require('./lib/rules/rename-noPadding'), "tab-title-text": require('./lib/rules/tab-title-text'), "table-removed-transforms": require('./lib/rules/table-removed-transforms'), + "select-rename-checkbox": require('./lib/rules/select-rename-checkbox'), }; module.exports = { diff --git a/packages/eslint-plugin-pf-codemods/lib/helpers.js b/packages/eslint-plugin-pf-codemods/lib/helpers.js index d242c9071..fb5d4801c 100644 --- a/packages/eslint-plugin-pf-codemods/lib/helpers.js +++ b/packages/eslint-plugin-pf-codemods/lib/helpers.js @@ -16,9 +16,10 @@ function renameProp(components, propMap, message, replaceAttribute) { return imports.length === 0 ? {} : { JSXOpeningElement(node) { - if (imports.map(imp => imp.local.name).includes(node.name.name)) { + const imp = imports.find(imp => imp.local.name === node.name.name); + if (imp) { node.attributes - .filter(node => Object.keys(propMap).includes(node.name.name)) + .filter(node => Object.keys(propMap).includes(imp.imported.name)) .forEach(attribute => { const newName = propMap[attribute.name.name]; context.report({ diff --git a/packages/eslint-plugin-pf-codemods/lib/rules/select-rename-checkbox.js b/packages/eslint-plugin-pf-codemods/lib/rules/select-rename-checkbox.js new file mode 100644 index 000000000..f27a1c3b9 --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/lib/rules/select-rename-checkbox.js @@ -0,0 +1,38 @@ +const { getPackageImports } = require('../helpers'); + +// https://github.com/patternfly/patternfly-react/pull/3945 +// CheckboxSelectOption -> SelectOption +// CheckboxSelect -> Select variant="checkbox" +module.exports = { + create: function(context) { + const imports = getPackageImports(context, '@patternfly/react-core') + .filter(specifier => ['CheckboxSelect', 'CheckboxSelectOption'].includes(specifier.imported.name)); + + return imports.length === 0 ? {} : { + JSXIdentifier(node) { + const imp = imports.find(imp => imp.local.name === node.name); + if (imp) { + if (imp.imported.name === 'CheckboxSelect') { + context.report({ + node, + message: `${node.name} has been removed. Use + option1 + option2 +`, + } + ], + invalid: [ + { + code: `import { CheckboxSelect } from '@patternfly/react-core'; {items}`, + output: `import { CheckboxSelect } from '@patternfly/react-core'; `, + errors: [ + { + message: `CheckboxSelect has been removed. Use instead.`, + type: "JSXIdentifier", + }, + ] + }, + { + code: `import { CheckboxSelectOption } from '@patternfly/react-core'; {items}`, + output: `import { CheckboxSelectOption } from '@patternfly/react-core'; {items}`, + errors: [ + { + message: `CheckboxSelectOption has been removed. Use instead.`, + type: "JSXIdentifier", + }, + { + message: `CheckboxSelectOption has been removed. Use instead.`, + type: "JSXIdentifier", + }, + ] + }, + { + code: `import { CheckboxSelect, CheckboxSelectOption } from '@patternfly/react-core'; + + option1 + option2 +`, + output: `import { CheckboxSelect, CheckboxSelectOption } from '@patternfly/react-core'; +`, + errors: [ + { + message: 'CheckboxSelect has been removed. Use instead.', + type: 'JSXIdentifier' + } + ] + }, + ] +});