This is a CLI tool for generating React icons from SVG files. It generates a React component for each SVG file and exports them as a single module with a common interface and types for the icons.
To install the package run the following command:
npm install @onlyredcats/svg-to-reactUse the following command to generate React icons from SVG files:
svg-to-react --input="./src/assets/" --output="./src/components/Icon/" --cleanIn this command:
--inputspecifies the path to the directory where the SVG files are located.--outputspecifies the path to the output directory where the generated React icon files will be saved.--cleanflag is optional and specifies whether to clean width, height and fill attributes from the SVG files in input directory. By default, it is set tofalse.
Let's assume you have the following directory structure:
my-project/
├── src/
│ ├── assets/
│ │ ├── icon1.svg
│ │ └── icon2.svg
│ └── components/
│ └── common/
│ └── Icon/
└── package.json
To generate React icons from SVG files in the src/assets directory and save them in src/components/common/Icon, you can run the mentioned command
svg-to-react --input="./src/assets/" --output="./src/components/Icon/"After running CLI command, the src/components/common/Icon directory will contain generated React icon files based on the SVG files.
my-project/
├── src/
│ ├── assets/
│ │ ├── icon1.svg
│ │ └── icon2.svg
│ ├── components/
│ │ ├── common/
│ │ │ ├── Icon/
│ │ │ │ ├── Icon.tsx
│ │ │ │ ├── icons.ts
│ │ │ │ ├── index.tsx
│ │ │ │ └── types.ts
└── package.json
Icon.tsx - contains the React component for the icon.
import {CSSProperties, DOMAttributes, FC, FunctionComponent, memo, SVGProps} from 'react';
import * as iconComponents from './icons';
import { IconType } from './types';
export interface IconProps {
className?: string;
name: IconType;
size?: number;
width?: number;
height?: number;
fill?: string;
style?: CSSProperties;
onClick?: DOMAttributes<SVGSVGElement>['onClick'];
}
export const iconTestId = 'icon';
const getIconName = (name: IconType) => `Icon${name}`;
export const Icon: FC<IconProps> = memo(({ className, name, fill = 'currentColor', size, width, height, style, onClick, ...rest }) => {
const IconComponent =
(iconComponents[getIconName(name) as keyof typeof iconComponents] as FunctionComponent<SVGProps<SVGSVGElement>>) ||
null;
return (
IconComponent && (
<IconComponent
onClick={onClick}
data-testid={iconTestId}
fill={fill}
data-name={name}
className={className}
style={{ ...style, width: size ?? width, height: size ?? height }}
{...rest}
/>
)
);
});icons.ts - contains the imports of the icons.
export { ReactComponent as IconIcon1 } from '../../svg/icon1.svg';
export { ReactComponent as IconIcon2 } from '../../svg/icon2.svg';index.tsx - contains the exports of the icons.
export * from './Icon';
export * from './types';types.ts - contains the types of the icons.
export const iconNames = [
'icon1',
'icon2',
] as const;
export type IconType = typeof iconNames[number];Contributions are welcome. Please open an issue or submit a pull request.
Oleksandr Ratushnyi
This package is distributed under the MIT license.