Skip to content

Commit

Permalink
Feat(codemods): Add Tabs props rename codemod #DS-1096
Browse files Browse the repository at this point in the history
Rename TabItem prop `forTab` to `forTabPane`.
Rename TabPane prop `tabId` to `id`.
  • Loading branch information
crishpeen committed May 14, 2024
1 parent 077a525 commit 506f268
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import React from 'react';
// @ts-ignore: No declaration -- The library is not installed; we don't need to install it for fixtures.
import { TabItem, TabPane } from '@lmc-eu/spirit-web-react';

export const MyComponent = () => (
<>
<TabItem forTab="tab1" data-test="test" />
<TabPane tabId="tab1" />
</>
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import React from 'react';
// @ts-ignore: No declaration -- The library is not installed; we don't need to install it for fixtures.
import { TabItem, TabPane } from '@lmc-eu/spirit-web-react';

export const MyComponent = () => (
<>
<TabItem forTabPane="tab1" data-test="test" />
<TabPane id="tab1" />
</>
);
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { testTransform } from '../../../../../tests/testUtils';

testTransform(__dirname, 'tabs-tabitem-tabpane-props');
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import { API, FileInfo } from 'jscodeshift';

const transform = (fileInfo: FileInfo, api: API) => {
const j = api.jscodeshift;
const root = j(fileInfo.source);

// Find import statements for the specific module and TabItem or TabPane specifier
const importStatements = root.find(j.ImportDeclaration, {
source: {
value: (value: string) => /^@lmc-eu\/spirit-web-react(\/.*)?$/.test(value),
},
});

// Check if the module is imported
if (importStatements.length > 0) {
const tabItemComponentSpecifier = importStatements.find(j.ImportSpecifier, {
imported: {
type: 'Identifier',
name: 'TabItem',
},
});

const tabPaneComponentSpecifier = importStatements.find(j.ImportSpecifier, {
imported: {
type: 'Identifier',
name: 'TabPane',
},
});

// Check if TabItem specifier is present
if (tabItemComponentSpecifier.length > 0) {
// Find TabItem components in the module
const components = root.find(j.JSXOpeningElement, {
name: {
type: 'JSXIdentifier',
name: 'TabItem',
},
});

// Rename 'forTab' attribute to 'forTabPane'
components
.find(j.JSXAttribute, {
name: {
type: 'JSXIdentifier',
name: 'forTab',
},
})
.forEach((attributePath) => {
attributePath.node.name.name = 'forTabPane';
});
}

// Check if TabPane specifier is present
if (tabPaneComponentSpecifier.length > 0) {
// Find TabPane components in the module
const components = root.find(j.JSXOpeningElement, {
name: {
type: 'JSXIdentifier',
name: 'TabPane',
},
});

// Rename 'tabId' attribute to 'id'
components
.find(j.JSXAttribute, {
name: {
type: 'JSXIdentifier',
name: 'tabId',
},
})
.forEach((attributePath) => {
attributePath.node.name.name = 'id';
});
}
}

return root.toSource();
};

export default transform;

0 comments on commit 506f268

Please sign in to comment.