diff --git a/lib/svgo/coa.js b/lib/svgo/coa.js index 4b434fe5c..37a44ae56 100644 --- a/lib/svgo/coa.js +++ b/lib/svgo/coa.js @@ -1,4 +1,5 @@ import fs from 'fs'; +import os from 'os'; import path from 'path'; import colors from 'picocolors'; import { fileURLToPath } from 'url'; @@ -300,23 +301,32 @@ function optimizeFolder(config, dir, output) { * @param {string} output output directory * @return {Promise} */ -function processDirectory(config, dir, files, output) { +async function processDirectory(config, dir, files, output) { // take only *.svg files, recursively if necessary var svgFilesDescriptions = getFilesDescriptions(config, dir, files, output); - - return svgFilesDescriptions.length - ? Promise.all( - svgFilesDescriptions.map((fileDescription) => - optimizeFile( - config, - fileDescription.inputPath, - fileDescription.outputPath, - ), - ), - ) - : Promise.reject( - new Error(`No SVG files have been found in '${dir}' directory.`), - ); + + if ( svgFilesDescriptions.length == 0 ) { + throw 'No SVG files have been found in "' + dir + '" directory.'; + } + + let results = [ ], + cpus = os.cpus().length; + + while ( svgFilesDescriptions.length > 0 ) { + let _svgFilesDescriptions = svgFilesDescriptions.splice(0, cpus); + + _svgFilesDescriptions = _svgFilesDescriptions.map(function(fileDescription) { + return optimizeFile( + config, + fileDescription.inputPath, + fileDescription.outputPath, + ); + }); + + results = results.concat(await Promise.all(_svgFilesDescriptions)); + } + + return results; } /**