diff --git a/react/bin/build.js b/react/bin/build.js
new file mode 100644
index 0000000..f08715e
--- /dev/null
+++ b/react/bin/build.js
@@ -0,0 +1,128 @@
+/* eslint-disable import/no-extraneous-dependencies */
+/* eslint-disable prefer-template */
+const path = require('path')
+const fs = require('fs')
+const format = require('prettier-eslint')
+const upperCamelCase = require('uppercamelcase')
+const cheerio = require('cheerio')
+
+const rootDir = path.join(__dirname, '..')
+
+const iconDir = path.join(rootDir, '../src/images/icons')
+const icons = fs.readdirSync(iconDir).map((name) => name.split('.')[0])
+
+const outputDir = path.join(rootDir, 'src/icons')
+
+console.log({ iconDir, icons, outputDir })
+
+if (!fs.existsSync(outputDir)) {
+ fs.mkdirSync(outputDir)
+}
+
+const initialTypeDefinitions = `///
+import { FC, SVGAttributes } from 'react';
+interface Props extends SVGAttributes {
+ color?: string;
+ size?: string | number;
+}
+type Icon = FC;
+`
+
+fs.writeFileSync(path.join(rootDir, 'src', 'index.js'), '', 'utf-8')
+fs.writeFileSync(
+ path.join(rootDir, 'src', 'index.d.ts'),
+ initialTypeDefinitions,
+ 'utf-8'
+)
+
+const attrsToString = (attrs) => {
+ return Object.keys(attrs)
+ .map((key) => {
+ if (key === 'width' || key === 'height' || key === 'stroke') {
+ return key + '={' + attrs[key] + '}'
+ }
+ if (key === 'rest') {
+ return '{...rest}'
+ }
+ return key + '="' + attrs[key] + '"'
+ })
+ .join(' ')
+}
+
+const getIconContents = (path) => {
+ const icon = fs.readFileSync(path, 'utf8')
+ return cheerio.load(icon)('svg').html()
+}
+
+icons.forEach((i) => {
+ const sourcePath = path.join(iconDir, `${i}.svg`)
+ const location = path.join(outputDir, `${i}.js`)
+ const ComponentName = upperCamelCase(i)
+
+ // read SVG, extract whatever is inside