let path = require('path'); const fs = require('fs'); const { createReadStream, createWriteStream } = require('fs'); const { createGzip } = require('zlib'); const chalk = require('chalk'); let distPath = path.normalize(__dirname + '/../dist/'); let srcPath = path.normalize(__dirname + '/../assets/'); let headerPath = path.normalize( __dirname + '/../../esp3d/src/modules/http/favicon.h' ); const convertToC = (filepath) => { console.log(chalk.yellow('Converting bin to text file')); //Cleaning files if (fs.existsSync(distPath + 'out.tmp')) fs.rmSync(distPath + 'out.tmp'); if (fs.existsSync(distPath + 'favicon.h')) fs.rmSync(distPath + 'favicon.h'); const data = new Uint8Array(fs.readFileSync(filepath, { flag: 'r' })); console.log('data size is ', data.length); let out = '#define favicon_size ' + data.length + '\n'; out += 'const unsigned char favicon[' + data.length + '] PROGMEM = {\n '; let nb = 0; data.forEach((byte, index) => { out += ' 0x' + (byte.toString(16).length == 1 ? '0' : '') + byte.toString(16); if (index < data.length - 1) out += ','; if (nb == 15) { out += '\n '; nb = 0; } else { nb++; } }); out += '\n};\n'; fs.writeFileSync(distPath + 'out.tmp', out); //Check conversion if (fs.existsSync(distPath + 'out.tmp')) { console.log(chalk.green('[ok]')); } else { console.log(chalk.red('[error]Conversion failed')); return; } //Format header file console.log(chalk.yellow('Building header')); fs.writeFileSync( distPath + 'favicon.h', fs.readFileSync(srcPath + 'header.txt') ); let bin2cfile = fs.readFileSync(distPath + 'out.tmp').toString(); fs.appendFileSync(distPath + 'favicon.h', bin2cfile); fs.appendFileSync( distPath + 'favicon.h', fs.readFileSync(srcPath + 'footer.txt') ); //Check format result if (fs.existsSync(distPath + 'favicon.h')) { console.log(chalk.green('[ok]')); } else { console.log(chalk.red('[error]Conversion failed')); return; } //Move file to src console.log(chalk.yellow('Overwriting header in sources')); fs.writeFileSync(headerPath, fs.readFileSync(distPath + 'favicon.h')); if (fs.existsSync(headerPath)) { console.log(chalk.green('[ok]')); } else { console.log(chalk.red('[error]Overwriting failed')); return; } }; // Create a gzip function for reusable purpose const compressFile = (filePath, targetPath) => { const stream = createReadStream(filePath); stream .pipe(createGzip(targetPath)) .pipe(createWriteStream(targetPath)) .on('finish', () => { console.log(`Successfully compressed at ${targetPath}`); convertToC(targetPath); }); }; compressFile(srcPath + 'favicon.ico', distPath + 'favicon.ico.gz');