This is a codemod, written using jscodeshift. It's built to simplify code migration from babel-plugin-react-css-modules
This codemod performs the following transformations to the source code:
- Renames the
styleNameattribute toclassNamein JSX elements. - Modifies the
classNamevalue to use the importedstylesobject. - Replaces multiple class names in a
styleNameattribute with aclsxexpression. - Adds the
clsximport if not already present. - Renames the import identifier for
clsxif it's not 'clsx'. - Updates the SCSS import statements to import the CSS modules as 'styles'.
- Removes the
classNameattribute from JSX elements if they also have astyleNameattribute.
Note: Files that do not contain import "./ModuleName.scss" attribute will not be modified. This is to prevent the codemod from modifying files that do not use "babel-plugin-react-css-modules" syntax.
This codemod requires the following:
- Node.js 10.13.0 or later
- jscodeshift v0.13.0
# with npm
npm add react-stylename-codemod
# with yarn
yarn add react-stylename-codemod
# with pnpm
pnpm add react-stylename-codemod
To use this codemod, simply run the following command:
jscodeshift -t path/to/this/codemod.ts path/to/your/source/code
#example
jscodeshift -t node_modules/react-stylename-codemod/stylename-codemod.ts ./src/* --extensions=tsxPlease note that this codemod assumes the use of the styles object imported from the SCSS files and the clsx library for handling multiple or conditional class names. Make sure to install the clsx library if you haven't already:
yarn install clsx
import React from "react";
import cn from "clsx";
import "./MyComponent.scss";
const MyComponent = ({ isActive, className }) => {
return (
<div
className={cn(className, { "active-class": isActive })}
styleName="camelCase kebab-case"
>
Hello World
</div>
);
};
export default MyComponent;import React from 'react';
import clsx from 'clsx';
import styles from './MyComponent.scss';
const MyComponent = ({ isActive, className }) => {
return (
<div
className={clsx(
className,
{ [styles['active-class']]: isActive },
styles.camelCase,
styles.['kebab-case']
)}
>
Hello World
</div>
);
};
export default MyComponent;In this example, the following transformations have occurred:
- The
cnimport has been renamed toclsx. - The SCSS import has been updated to import the CSS module as 'styles'.
- The
styleNameattribute has been replaced with aclassName - The
clsxexpression now utilizes thestylesobject.