const path = require('path') as typeof import('path') const fs = require('fs') as typeof import('fs') import { transform } from '@svgr/core' const iconFileDirectory = path.resolve(__dirname, './iconic/svg') const iconFileNames = fs.readdirSync(iconFileDirectory) const getIconSvg = async (filename: string) => { return new Promise((resolve) => fs.readFile(path.resolve(iconFileDirectory, filename), 'utf8', (_, svg) => resolve(svg) ) ) } const srcDirectory = path.resolve(__dirname, '../src') const run = async () => { await Promise.all( iconFileNames.map(async (filename) => { const svg = await getIconSvg(filename) const componentName = getComponentName(filename) const transformed = await transform( svg, { native: true, ref: false, expandProps: 'end', typescript: true, svgProps: {}, }, { componentName, } ) const outDirectory = srcDirectory const outPath = path.resolve(outDirectory, filename.replace('svg', 'tsx')) await new Promise((resolve) => { fs.writeFile(outPath, heading + '\n' + transformed, resolve) }) }) ) const generateIndexFile = () => { const contents = iconFileNames .map( (filename) => `export { default as ${getComponentName(filename)} } from './${ filename.split('.')[0] }'` ) .join('\n') fs.writeFileSync( path.resolve(srcDirectory, 'index.ts'), heading + '\n' + contents ) } generateIndexFile() } const heading = `// 🌊 this file is auto-generated by Fernando Rojo's script. don't edit it. // https://fernandorojo.co` run() // pascal case const getComponentName = (filename: string) => { return filename .split('.')[0] .toLowerCase() .replace(new RegExp(/[-_]+/, 'g'), ' ') .replace(new RegExp(/[^\w\s]/, 'g'), '') .replace( new RegExp(/\s+(.)(\w*)/, 'g'), // @ts-expect-error idk ($1, $2, $3) => `${$2.toUpperCase() + $3}` ) .replace(new RegExp(/\w/), (s) => s.toUpperCase()) }