From cd3e3166c26699e1b6ef9694ddf226a9b9d3eb8d Mon Sep 17 00:00:00 2001 From: Eric Olkowski <70952936+thatblindgeye@users.noreply.github.com> Date: Thu, 20 Jun 2024 09:54:30 -0400 Subject: [PATCH] feat(DualListSelector): promoted Next implementation (#661) --- .../dualListSelector-deprecated.md | 17 +++ .../dualListSelector-deprecated.test.ts | 124 ++++++++++++++++++ .../dualListSelector-deprecated.ts | 27 ++++ .../dualListSelectorDeprecatedInput.tsx | 1 + .../dualListSelectorDeprecatedOutput.tsx | 3 + .../dualListSelectorNext-promoted.md | 17 +++ .../dualListSelectorNext-promoted.test.ts | 118 +++++++++++++++++ .../dualListSelectorNext-promoted.ts | 25 ++++ .../dualListSelectorNextPromotedInput.tsx | 1 + .../dualListSelectorNextPromotedOutput.tsx | 3 + 10 files changed, 336 insertions(+) create mode 100644 packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelector-deprecated.md create mode 100644 packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelector-deprecated.test.ts create mode 100644 packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelector-deprecated.ts create mode 100644 packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelectorDeprecatedInput.tsx create mode 100644 packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelectorDeprecatedOutput.tsx create mode 100644 packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNext-promoted.md create mode 100644 packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNext-promoted.test.ts create mode 100644 packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNext-promoted.ts create mode 100644 packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNextPromotedInput.tsx create mode 100644 packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNextPromotedOutput.tsx diff --git a/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelector-deprecated.md b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelector-deprecated.md new file mode 100644 index 000000000..374beb64b --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelector-deprecated.md @@ -0,0 +1,17 @@ +### dualListSelector-deprecated [(#10359)](https://github.com/patternfly/patternfly-react/pull/10359) + +Our previous implementation of DualListSelector has been deprecated. This rule will update import paths to our deprecated directory, but we recommend using our newly promoted implementation. + +#### Examples + +In: + +```jsx +%inputExample% +``` + +Out: + +```jsx +%outputExample% +``` diff --git a/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelector-deprecated.test.ts b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelector-deprecated.test.ts new file mode 100644 index 000000000..c99e30cee --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelector-deprecated.test.ts @@ -0,0 +1,124 @@ +const ruleTester = require("../../ruletester"); +import * as rule from "./dualListSelector-deprecated"; +import { + ValidTests, + InvalidTests, + createValidTest, + createInvalidTest, +} from "../../helpers/testHelpers"; + +const specifiersToMove = [ + "DualListSelector", + "DualListSelectorContext", + "DualListSelectorControl", + "DualListSelectorControlsWrapper", + "DualListSelectorPane", + "DualListSelectorList", + "DualListSelectorListItem", + "DualListSelectorTree", +]; + +const validTests: ValidTests = []; +const invalidTests: InvalidTests = []; + +specifiersToMove.forEach((specifier) => { + validTests.push(createValidTest(`<${specifier} />`)); + validTests.push( + createValidTest( + `import { ${specifier} /* data-codemods */ } from '@patternfly/react-core';` + ) + ); + validTests.push( + createValidTest( + `import { ${specifier} } from '@patternfly/react-core/deprecated';` + ) + ); + validTests.push( + createValidTest( + `export { ${specifier} /* data-codemods */ } from '@patternfly/react-core';` + ) + ); + validTests.push( + createValidTest( + `export { ${specifier} } from '@patternfly/react-core/deprecated';` + ) + ); + + const errorMessage = `${specifier} has been deprecated. This rule will update import paths to our deprecated directory, but we recommend using our newly promoted DualListSelector implementation.`; + invalidTests.push( + createInvalidTest( + `import { ${specifier} } from '@patternfly/react-core';`, + `import {\n\t${specifier}\n} from '@patternfly/react-core/deprecated';`, + [{ message: errorMessage, type: "ImportDeclaration" }] + ) + ); + invalidTests.push( + createInvalidTest( + `import { ${specifier} as CustomSpecifier } from '@patternfly/react-core';`, + `import {\n\t${specifier} as CustomSpecifier\n} from '@patternfly/react-core/deprecated';`, + [{ message: errorMessage, type: "ImportDeclaration" }] + ) + ); + invalidTests.push( + createInvalidTest( + `import { ${specifier} } from '@patternfly/react-core/dist/esm/components/Modal/index.js';`, + `import {\n\t${specifier}\n} from '@patternfly/react-core/dist/esm/deprecated/components/Modal/index.js';`, + [{ message: errorMessage, type: "ImportDeclaration" }] + ) + ); + invalidTests.push( + createInvalidTest( + `import { ${specifier} } from '@patternfly/react-core/dist/js/components/Modal/index.js';`, + `import {\n\t${specifier}\n} from '@patternfly/react-core/deprecated';`, + [{ message: errorMessage, type: "ImportDeclaration" }] + ) + ); + invalidTests.push( + createInvalidTest( + `import { ${specifier} } from '@patternfly/react-core/dist/dynamic/components/Modal/index.js';`, + `import {\n\t${specifier}\n} from '@patternfly/react-core/deprecated';`, + [{ message: errorMessage, type: "ImportDeclaration" }] + ) + ); + invalidTests.push( + createInvalidTest( + `export { ${specifier} } from '@patternfly/react-core';`, + `export {\n\t${specifier}\n} from '@patternfly/react-core/deprecated';`, + [{ message: errorMessage, type: "ExportNamedDeclaration" }] + ) + ); + invalidTests.push( + createInvalidTest( + `export { ${specifier} } from '@patternfly/react-core/dist/esm/components/Modal/index.js';`, + `export {\n\t${specifier}\n} from '@patternfly/react-core/dist/esm/deprecated/components/Modal/index.js';`, + [{ message: errorMessage, type: "ExportNamedDeclaration" }] + ) + ); + invalidTests.push( + createInvalidTest( + `export { ${specifier} } from '@patternfly/react-core/dist/js/components/Modal/index.js';`, + `export {\n\t${specifier}\n} from '@patternfly/react-core/deprecated';`, + [{ message: errorMessage, type: "ExportNamedDeclaration" }] + ) + ); + invalidTests.push( + createInvalidTest( + `export { ${specifier} } from '@patternfly/react-core/dist/dynamic/components/Modal/index.js';`, + `export {\n\t${specifier}\n} from '@patternfly/react-core/deprecated';`, + [{ message: errorMessage, type: "ExportNamedDeclaration" }] + ) + ); + invalidTests.push( + createInvalidTest( + `import { ${specifier}, Button } from '@patternfly/react-core';`, + `import {\n\tButton\n} from '@patternfly/react-core'; +import {\n\t${specifier}\n} from '@patternfly/react-core/deprecated';`, + [{ message: errorMessage, type: "ImportDeclaration" }] + ) + ); +}); + +ruleTester.run("dualListSelector-deprecated", rule, { + valid: validTests, + invalid: invalidTests, +}); diff --git a/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelector-deprecated.ts b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelector-deprecated.ts new file mode 100644 index 000000000..2717397c2 --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelector-deprecated.ts @@ -0,0 +1,27 @@ +import { moveSpecifiers } from "../../helpers"; + +// https://github.com/patternfly/patternfly-react/pull/10359 + +const specifiersToMove = [ + "DualListSelector", + "DualListSelectorContext", + "DualListSelectorControl", + "DualListSelectorControlsWrapper", + "DualListSelectorPane", + "DualListSelectorList", + "DualListSelectorListItem", + "DualListSelectorTree", +]; +const fromPackage = "@patternfly/react-core"; +const toPackage = "@patternfly/react-core/deprecated"; +const messageAfterImportNameChange = + "been deprecated. This rule will update import paths to our deprecated directory, but we recommend using our newly promoted DualListSelector implementation."; +module.exports = { + meta: { fixable: "code" }, + create: moveSpecifiers( + specifiersToMove, + fromPackage, + toPackage, + messageAfterImportNameChange + ), +}; diff --git a/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelectorDeprecatedInput.tsx b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelectorDeprecatedInput.tsx new file mode 100644 index 000000000..290ffc582 --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelectorDeprecatedInput.tsx @@ -0,0 +1 @@ +import { DualListSelector } from "@patternfly/react-core"; diff --git a/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelectorDeprecatedOutput.tsx b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelectorDeprecatedOutput.tsx new file mode 100644 index 000000000..404899ec2 --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorDeprecated/dualListSelectorDeprecatedOutput.tsx @@ -0,0 +1,3 @@ +import { + DualListSelector +} from '@patternfly/react-core/deprecated'; diff --git a/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNext-promoted.md b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNext-promoted.md new file mode 100644 index 000000000..ff47dad24 --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNext-promoted.md @@ -0,0 +1,17 @@ +### dualListSelectorNext-promoted [(#10359)](https://github.com/patternfly/patternfly-react/pull/10359) + +Our Next implementation of DualListSelector has been promoted as our recommended implementation. This rule will update import paths. + +#### Examples + +In: + +```jsx +%inputExample% +``` + +Out: + +```jsx +%outputExample% +``` diff --git a/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNext-promoted.test.ts b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNext-promoted.test.ts new file mode 100644 index 000000000..eb877d5ee --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNext-promoted.test.ts @@ -0,0 +1,118 @@ +const ruleTester = require("../../ruletester"); +import * as rule from "./dualListSelectorNext-promoted"; +import { + ValidTests, + InvalidTests, + createValidTest, + createInvalidTest, +} from "../../helpers/testHelpers"; + +const specifiersToMove = [ + "DualListSelector", + "DualListSelectorControl", + "DualListSelectorControlsWrapper", + "DualListSelectorPane", + "DualListSelectorList", + "DualListSelectorListItem", + "DualListSelectorTree", +]; + +const validTests: ValidTests = []; +const invalidTests: InvalidTests = []; + +specifiersToMove.forEach((specifier) => { + validTests.push(createValidTest(`<${specifier} />`)); + validTests.push( + createValidTest( + `import { ${specifier} /* data-codemods */ } from '@patternfly/react-core';` + ) + ); + validTests.push( + createValidTest(`import { ${specifier} } from '@patternfly/react-core';`) + ); + validTests.push( + createValidTest( + `export { ${specifier} /* data-codemods */ } from '@patternfly/react-core';` + ) + ); + validTests.push( + createValidTest(`export { ${specifier} } from '@patternfly/react-core';`) + ); + + const errorMessage = `${specifier} has been promoted. This rule will update import paths.`; + invalidTests.push( + createInvalidTest( + `import { ${specifier} } from '@patternfly/react-core/next';`, + `import {\n\t${specifier} /* data-codemods */\n} from '@patternfly/react-core';`, + [{ message: errorMessage, type: "ImportDeclaration" }] + ) + ); + invalidTests.push( + createInvalidTest( + `import { ${specifier} as CustomSpecifier } from '@patternfly/react-core/next';`, + `import {\n\t${specifier} as CustomSpecifier /* data-codemods */\n} from '@patternfly/react-core';`, + [{ message: errorMessage, type: "ImportDeclaration" }] + ) + ); + invalidTests.push( + createInvalidTest( + `import { ${specifier} } from '@patternfly/react-core/dist/esm/next/components/Modal/index.js';`, + `import {\n\t${specifier} /* data-codemods */\n} from '@patternfly/react-core/dist/esm/components/Modal/index.js';`, + [{ message: errorMessage, type: "ImportDeclaration" }] + ) + ); + invalidTests.push( + createInvalidTest( + `import { ${specifier} } from '@patternfly/react-core/dist/js/next/components/Modal/index.js';`, + `import {\n\t${specifier} /* data-codemods */\n} from '@patternfly/react-core';`, + [{ message: errorMessage, type: "ImportDeclaration" }] + ) + ); + invalidTests.push( + createInvalidTest( + `import { ${specifier} } from '@patternfly/react-core/dist/dynamic/next/components/Modal/index.js';`, + `import {\n\t${specifier} /* data-codemods */\n} from '@patternfly/react-core';`, + [{ message: errorMessage, type: "ImportDeclaration" }] + ) + ); + invalidTests.push( + createInvalidTest( + `export { ${specifier} } from '@patternfly/react-core/next';`, + `export {\n\t${specifier} /* data-codemods */\n} from '@patternfly/react-core';`, + [{ message: errorMessage, type: "ExportNamedDeclaration" }] + ) + ); + invalidTests.push( + createInvalidTest( + `export { ${specifier} } from '@patternfly/react-core/dist/esm/next/components/Modal/index.js';`, + `export {\n\t${specifier} /* data-codemods */\n} from '@patternfly/react-core/dist/esm/components/Modal/index.js';`, + [{ message: errorMessage, type: "ExportNamedDeclaration" }] + ) + ); + invalidTests.push( + createInvalidTest( + `export { ${specifier} } from '@patternfly/react-core/dist/js/next/components/Modal/index.js';`, + `export {\n\t${specifier} /* data-codemods */\n} from '@patternfly/react-core';`, + [{ message: errorMessage, type: "ExportNamedDeclaration" }] + ) + ); + invalidTests.push( + createInvalidTest( + `export { ${specifier} } from '@patternfly/react-core/dist/dynamic/next/components/Modal/index.js';`, + `export {\n\t${specifier} /* data-codemods */\n} from '@patternfly/react-core';`, + [{ message: errorMessage, type: "ExportNamedDeclaration" }] + ) + ); + invalidTests.push( + createInvalidTest( + `import { ${specifier} } from '@patternfly/react-core/next';\nimport { Button } from '@patternfly/react-core';`, + `\nimport {\n\tButton,\n\t${specifier} /* data-codemods */\n} from '@patternfly/react-core';`, + [{ message: errorMessage, type: "ImportDeclaration" }] + ) + ); +}); + +ruleTester.run("dualListSelectorNext-promoted", rule, { + valid: validTests, + invalid: invalidTests, +}); diff --git a/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNext-promoted.ts b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNext-promoted.ts new file mode 100644 index 000000000..bc01b9e52 --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNext-promoted.ts @@ -0,0 +1,25 @@ +import { moveSpecifiers } from "../../helpers"; + +// https://github.com/patternfly/patternfly-react/pull/10359 +const specifiersToMove = [ + "DualListSelector", + "DualListSelectorControl", + "DualListSelectorControlsWrapper", + "DualListSelectorPane", + "DualListSelectorList", + "DualListSelectorListItem", + "DualListSelectorTree", +]; +const fromPackage = "@patternfly/react-core/next"; +const toPackage = "@patternfly/react-core"; +const messageAfterImportNameChange = + "been promoted. This rule will update import paths."; +module.exports = { + meta: { fixable: "code" }, + create: moveSpecifiers( + specifiersToMove, + fromPackage, + toPackage, + messageAfterImportNameChange + ), +}; diff --git a/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNextPromotedInput.tsx b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNextPromotedInput.tsx new file mode 100644 index 000000000..81782eabb --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNextPromotedInput.tsx @@ -0,0 +1 @@ +import { DualListSelector } from "@patternfly/react-core/next"; diff --git a/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNextPromotedOutput.tsx b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNextPromotedOutput.tsx new file mode 100644 index 000000000..df8119ebb --- /dev/null +++ b/packages/eslint-plugin-pf-codemods/src/rules/v6/dualListSelectorNextPromoted/dualListSelectorNextPromotedOutput.tsx @@ -0,0 +1,3 @@ +import { + DualListSelector /* data-codemods */ +} from '@patternfly/react-core';