# babel-plugin-react-svg

> Babel plugin to transform svg to react component

Latest version **3.0.3** (published 2019-06-03) · MIT license · 0 weekly downloads

## Install

```sh
npm install babel-plugin-react-svg
pnpm add babel-plugin-react-svg
yarn add babel-plugin-react-svg
bun add babel-plugin-react-svg
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 3.0.3 |
| Published | 2019-06-03 |
| First published | 2017-10-11 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Node | >=8 |
| Dependencies | 0 |
| Unpacked size | 9.4 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 637 |
| Author | boopathi |
| Maintainers | boopathi |
| Keywords | babel, babel-plugin, react, react-svg-loader, svg, webpack, webpack-loader |

## Links

- npm: https://www.npmjs.com/package/babel-plugin-react-svg
- Repository: https://github.com/boopathi/react-svg-loader
- Homepage: https://github.com/boopathi/react-svg-loader/tree/master/packages/babel-plugin-react-svg
- Issues: https://github.com/boopathi/react-svg-loader/issues
- npm.io page: https://npm.io/package/babel-plugin-react-svg

## Alternatives

- [mobx-react](https://npm.io/package/mobx-react.md) — 2.8M weekly downloads
- [rc-tree](https://npm.io/package/rc-tree.md) — 2.6M weekly downloads
- [@react-oauth/google](https://npm.io/package/@react-oauth/google.md) — 1.3M weekly downloads
- [@wagmi/connectors](https://npm.io/package/@wagmi/connectors.md) — 877.0K weekly downloads
- [vee-validate](https://npm.io/package/vee-validate.md) — 836.4K weekly downloads

## Recent versions

- 3.0.3 (latest) — 2019-06-03
- 3.0.4-alpha.3 (canary) — 2019-07-11
- 3.0.1 — 2019-05-06
- 3.0.0 — 2019-05-03
- 2.1.1-alpha.36 — 2019-02-13
- 2.2.0-alpha.90436959 — 2018-03-17
- 2.2.0-alpha.b8e3c6d5 — 2018-02-28
- 2.2.0-alpha.02daccb2 — 2018-02-22
- 2.2.0-alpha.10f9a762 — 2018-01-05
- 2.2.0-alpha.038ff855 — 2017-12-28
- 2.2.0-alpha.52f0a7dd — 2017-11-28
- 2.2.0-alpha.a1496904 — 2017-11-27
- 2.2.0-nightly.58aa6b3c — 2017-11-27
- 2.2.0-alpha.58aa6b3c — 2017-11-27
- 2.1.0 — 2017-10-12
- … 3 more at https://npm.io/package/babel-plugin-react-svg/versions

## README

# babel-plugin-react-svg

A plugin that converts svg to a react component. Used in [react-svg-loader](/packages/react-svg-loader)

## Install

```sh
npm i babel-plugin-react-svg --save-dev

# or with yarn

yarn add babel-plugin-react-svg --dev
```

## Example

Input SVG:

```html
<svg class="foo" style='text-align: center; width: 100px' pointer-events="stroke">
  <circle cx="50" cy="50" r="25" style="text-align: center;" stroke-width="5" />
</svg>
```

Output React Component:

```js
import React from "react";
export default ({ styles = {}, ...props}) => <svg
  className={styles["foo"] || "foo"}
  style={{ textAlign: "center", width: "100px" }}
  pointerEvents="stroke"
  {...props}>
    <circle cx="50" cy="50" r="25" style={{textAlign: "center"}} strokeWidth="5" />
</svg>;
```

## Transformations

Going from bottom up, the following transformations are applied and the same can be checked in the partly annotated source - [babel-plugin](src/plugin.js)

#### 1. Hyphenated attributes to camelCase

```html
<svg pointer-events="none">
  <path stroke-width="5"/>
</svg>
```

is transformed to

```html
<svg pointerEvents="none">
  <path strokeWidth="5"/>
</svg>
```

#### 2. Style attr string to object

React expects style attribute value to be an object. Also, Hyphenated style names are converted to camel case.

```html
<svg style="text-align: center">
  <circle style="width: 10px"/>
</svg>
```

is transformed to

```html
<svg style={{textAlign: 'center'}}>
  <circle style={{width: '10px'}}/>
</svg>
```

#### 3. Propagate props to root element

The props passed to the output component is passed on to the root SVG node and the props already defined are overridden by the props passed.

```html
<svg width="50">
  ...
</svg>
```

is transformed to

```html
<svg width="50" {...props}>
  ...
</svg>
```

#### 4. class to className & class values to styles prop

```html
<svg class="foo bar"/>
```

is transformed to

```jsx
<svg className={ (styles["foo"] || "foo") + " " + (styles["bar"] || "bar") }>
```

#### 5. export React.Component

The loader should now export the svg component. And this is done by wrapping it in an ArrowFunctionExpression.

```html
<svg>...</svg>
```

is transformed to

```js
import React from 'react';
export default ({ styles = {}, ...props }) => <svg {...props}>...</svg>;
```

## Assumptions and Other gotchas

+ Root element is always `<svg>`
+ SVG is optimized using SVGO

## LICENSE

[MIT](https://github.com/boopathi/react-svg-loader/blob/master/LICENSE)

---
_Source: https://npm.io/package/babel-plugin-react-svg · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
