packages/bui-icons/builder.js (51 lines of code) (raw):

const path = require('path'); const chalk = require('chalk'); const fse = require('fs-extra'); const rimraf = require('rimraf'); const globAsync = require('fast-glob'); const svgo = require('svgo'); const inputDir = path.resolve(__dirname, './src/svgs'); const outputDir = path.resolve(__dirname, './src/components'); /** * Converts directory separators to slashes, so the path can be used in fast-glob. */ function normalizePath(pathToNormalize) { return pathToNormalize.replace(/\\/g, '/'); } async function generateIndex() { const files = await globAsync(normalizePath(path.join(outputDir, '*.tsx'))); const index = files .map((file) => { const typename = path.basename(file).replace('.tsx', ''); return `export { default as ${typename}Icon } from './${typename}';\n`; }) .join(''); fse.writeFileSync(path.join(outputDir, 'index.ts'), index); } async function createIcons() { rimraf.sync(`${outputDir}/*.tsx`); const tsxFiles = []; const svgPaths = await globAsync( normalizePath(path.join(inputDir, '**/*.svg')), ); svgPaths.forEach((svgPath) => { const data = fse.readFileSync(svgPath, { encoding: 'utf8' }); const iconName = path.basename(svgPath).replace('.svg', ''); const result = svgo.optimize(data); const pathData = result.data.match(/<svg[^>]+?>([^$]+?)<\/svg>/)[1]; tsxFiles.push({ name: iconName, content: `// Automatically generated by cli tools, please do not modify this file directly import createSvgIcon from '../utils/createSvgIcon'; export default createSvgIcon( '${pathData}', '${iconName}Icon', ); `, }); }); tsxFiles.forEach(({ name, content }) => { console.log(`${chalk.blue(name)} icon created`); const absDestPath = path.join(outputDir, `${name}.tsx`); fse.writeFileSync(absDestPath, content); }); generateIndex(); } createIcons();