uui-build/scripts/processIcons.js (119 lines of code) (raw):

const path = require('path'); const fs = require('fs'); const SVGO = require('svgo'); const uniqueId = require('lodash.uniqueid'); const svgPrefix = {}; svgPrefix.toString = () => `${uniqueId()}_`; const isModule = process.env.IS_MODULE === 'true'; const appDirectory = fs.realpathSync(process.cwd()); const resolveRoot = (relativePath) => isModule ? path.resolve(appDirectory, '..', relativePath) : path.resolve(appDirectory, relativePath); const svgo = new SVGO({ plugins: [ { cleanupAttrs: true, }, { removeDoctype: true, }, { removeXMLProcInst: true, }, { removeComments: true, }, { removeMetadata: true, }, { removeTitle: true, }, { removeDesc: true, }, { removeUselessDefs: true, }, { removeEditorsNSData: true, }, { removeEmptyAttrs: true, }, { removeHiddenElems: true, }, { removeEmptyText: true, }, { removeEmptyContainers: true, }, { removeViewBox: false, }, { cleanupEnableBackground: true, }, { convertStyleToAttrs: true, }, { convertColors: true, }, { convertPathData: true, }, { convertTransform: true, }, { removeUnknownsAndDefaults: true, }, { removeNonInheritableGroupAttrs: true, }, { removeUselessStrokeAndFill: true, }, { removeUnusedNS: true, }, { cleanupIDs: { prefix: svgPrefix, }, }, { cleanupNumericValues: true, }, { moveElemsAttrsToGroup: true, }, { moveGroupAttrsToElems: true, }, { collapseGroups: true, }, { removeRasterImages: false, }, { mergePaths: true, }, { convertShapeToPath: true, }, { sortAttrs: true, }, { removeDimensions: false, }, { removeAttrs: { attrs: '(stroke|fill)' }, }, ], }); const [,, iconType] = process.argv; let inputFolder = ''; let outputFolder = ''; switch (iconType) { case 'icons': inputFolder = 'icons-source'; outputFolder = 'epam-assets/icons'; break; } function getNewFilePath(filePath, fileName) { const relativePath = path.relative(resolveRoot(inputFolder), filePath); const newPath = path.join(outputFolder, relativePath); if (!fs.existsSync(resolveRoot(newPath))) { fs.mkdirSync(resolveRoot(newPath), { recursive: true }); } return resolveRoot(path.join(newPath, fileName)); } function iterateFolder(folder) { if (fs.lstatSync(folder).isFile()) { if (folder.indexOf('.svg') > 0) { const data = fs.readFileSync(folder); svgo.optimize(data).then((result) => { const fileName = path.basename(folder); const newFilePath = getNewFilePath(path.dirname(folder), fileName); fs.writeFileSync(newFilePath, result.data); console.log(`file ${folder} has been optimized`); }); } return; } fs.readdirSync(folder).forEach((subFolder) => { iterateFolder(path.resolve(folder, subFolder)); }); } iterateFolder(resolveRoot(inputFolder));