Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@hakatashi/babel-plugin-react-svg

Package Overview
Dependencies
Maintainers
1
Versions
2
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@hakatashi/babel-plugin-react-svg

Babel plugin to transform svg to react component

  • 2.1.0
  • Source
  • npm
  • Socket score

Version published
Maintainers
1
Created
Source

babel-plugin-react-svg

A plugin that converts svg to a react component. Used in react-svg-loader

Install

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

# or with yarn

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

Example

Input SVG:

<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:

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

1. Hyphenated attributes to camelCase
<svg pointer-events="none">
  <path stroke-width="5"/>
</svg>

is transformed to

<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.

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

is transformed to

<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.

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

is transformed to

<svg width="50" {...props}>
  ...
</svg>
4. class to className & class values to styles prop
<svg class="foo bar"/>

is transformed to

<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.

<svg>...</svg>

is transformed to

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

Keywords

FAQs

Package last updated on 06 Feb 2018

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc