diff --git a/packages/eslint-plugin-pf-codemods/index.js b/packages/eslint-plugin-pf-codemods/index.js index 33baea5ca..d61541cbd 100644 --- a/packages/eslint-plugin-pf-codemods/index.js +++ b/packages/eslint-plugin-pf-codemods/index.js @@ -55,6 +55,7 @@ const rules = { "pagination-rename-props": require('./lib/rules/v5/pagination-rename-props'), "resizeObserver-function-param": require('./lib/rules/v5/resizeObserver-function-param'), "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'), "toggle-remove-isPrimary": require('./lib/rules/v5/toggle-remove-isPrimary'), "toolbar-remove-visiblity": require('./lib/rules/v5/toolbar-remove-visiblity'), diff --git a/packages/eslint-plugin-pf-codemods/lib/rules/v5/spinner-svg-default.js b/packages/eslint-plugin-pf-codemods/lib/rules/v5/spinner-svg-default.js new file mode 100644 index 000000000..995eb1629 --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/lib/rules/v5/spinner-svg-default.js @@ -0,0 +1,28 @@ +const { getPackageImports } = require('../../helpers'); + +// https://github.com/patternfly/patternfly-react/pull/8183 +module.exports = { + meta: { fixable: 'code' }, + create: function(context) { + const spinnerImports = getPackageImports(context, '@patternfly/react-core') + .filter(specifier => specifier.imported.name == 'Spinner'); + + return spinnerImports.length === 0 ? {} : { + JSXOpeningElement(node) { + if (spinnerImports.map(imp => imp.local.name).includes(node.name.name)) { + const svgAttribute = node.attributes.find(n => n.name && n.name.name === 'isSVG'); + if (svgAttribute && svgAttribute?.value?.expression?.value !== false) { + context.report({ + node, + message: `Spinner isSVG prop default value has changed from false to true.`, + fix(fixer) { + return fixer.replaceText(svgAttribute, ``); + } + }); + } + } + } + }; + } +}; + diff --git a/packages/eslint-plugin-pf-codemods/test/rules/v5/spinner-svg-default.js b/packages/eslint-plugin-pf-codemods/test/rules/v5/spinner-svg-default.js new file mode 100644 index 000000000..5d4cae035 --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/test/rules/v5/spinner-svg-default.js @@ -0,0 +1,35 @@ +const ruleTester = require('../../ruletester'); +const rule = require('../../../lib/rules/v5/spinner-svg-default'); + +ruleTester.run("spinner-svg-default", rule, { + valid: [ + { + code: `import { Spinner } from '@patternfly/react-core'; `, + }, + { + code: `import { Spinner } from '@patternfly/react-core'; `, + }, + { + // No @patternfly/react-core import + code: ``, + } + ], + invalid: [ + { + code: `import { Spinner } from '@patternfly/react-core'; `, + output: `import { Spinner } from '@patternfly/react-core'; `, + errors: [{ + message: `Spinner isSVG prop default value has changed from false to true.`, + type: "JSXOpeningElement", + }] + }, + { + code: `import { Spinner } from '@patternfly/react-core'; `, + output: `import { Spinner } from '@patternfly/react-core'; `, + errors: [{ + message: `Spinner isSVG prop default value has changed from false to true.`, + type: "JSXOpeningElement", + }] + } + ] +}); diff --git a/packages/pf-codemods/README.md b/packages/pf-codemods/README.md index 5104dd74a..f0188cfe8 100644 --- a/packages/pf-codemods/README.md +++ b/packages/pf-codemods/README.md @@ -182,15 +182,15 @@ In: ```jsx ``` @@ -198,13 +198,13 @@ Out: ```jsx ``` @@ -271,6 +271,24 @@ Out: ``` +### spinner-svg-default [(#8183)](https://github.com/patternfly/patternfly-react/pull/8183) + +We've updated the Spinner to default to an svg, so the `isSVG` property is no longer required. + +#### 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.