svelteesp32
Version:
Convert Svelte (or any frontend) JS application to serve it from ESP32 webserver (PsychicHttp)
83 lines (82 loc) • 3.76 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const node_crypto_1 = require("node:crypto");
const node_fs_1 = require("node:fs");
const node_path_1 = __importDefault(require("node:path"));
const node_zlib_1 = require("node:zlib");
const mime_types_1 = require("mime-types");
const commandLine_1 = require("./commandLine");
const consoleColor_1 = require("./consoleColor");
const cppCode_1 = require("./cppCode");
const file_1 = require("./file");
const summary = {
filecount: 0,
size: 0,
gzipsize: 0
};
const sources = [];
const filesByExtension = [];
console.log('Collecting source files');
const files = (0, file_1.getFiles)();
if (files.size === 0) {
console.error(`Directory ${commandLine_1.cmdLine.sourcepath} is empty`);
process.exit(1);
}
console.log();
console.log('Translation to header file');
const longestFilename = [...files.keys()].reduce((p, c) => Math.max(c.length, p), 0);
for (const [originalFilename, content] of files) {
const mimeType = (0, mime_types_1.lookup)(originalFilename) || 'text/plain';
summary.filecount++;
const filename = originalFilename.replace(/\\/g, '/');
const dataname = filename.replace(/[!&()+./@{}~-]/g, '_');
let extension = node_path_1.default.extname(filename).toUpperCase();
if (extension.startsWith('.'))
extension = extension.slice(1);
const group = filesByExtension.find((fe) => fe.extension === extension);
if (group)
group.count += 1;
else
filesByExtension.push({ extension, count: 1 });
const md5 = (0, node_crypto_1.createHash)('md5').update(content).digest('hex');
summary.size += content.length;
const zipContent = (0, node_zlib_1.gzipSync)(content, { level: 9 });
summary.gzipsize += zipContent.length;
const zipRatio = Math.round((zipContent.length / content.length) * 100);
if (content.length > 1024 && zipContent.length < content.length * 0.85) {
sources.push({
filename,
dataname,
datanameUpperCase: dataname.toUpperCase(),
content,
contentGzip: zipContent,
isGzip: true,
mime: mimeType,
md5
});
console.log((0, consoleColor_1.greenLog)(` [${originalFilename}] ${' '.repeat(longestFilename - originalFilename.length)} ✓ gzip used (${content.length} -> ${zipContent.length} = ${zipRatio}%)`));
}
else {
sources.push({
filename,
dataname,
datanameUpperCase: dataname.toUpperCase(),
content,
contentGzip: content,
isGzip: false,
mime: mimeType,
md5
});
console.log((0, consoleColor_1.yellowLog)(` [${originalFilename}] ${' '.repeat(longestFilename - originalFilename.length)} x gzip unused ${content.length <= 1024 ? `(too small) ` : ''}(${content.length} -> ${zipContent.length} = ${zipRatio}%)`));
}
}
console.log('');
filesByExtension.sort((left, right) => left.extension.localeCompare(right.extension));
const cppFile = (0, cppCode_1.getCppCode)(sources, filesByExtension);
(0, node_fs_1.mkdirSync)(node_path_1.default.normalize(node_path_1.default.dirname(commandLine_1.cmdLine.outputfile)), { recursive: true });
(0, node_fs_1.writeFileSync)(commandLine_1.cmdLine.outputfile, cppFile, { flush: true, encoding: 'utf8' });
console.log(`${summary.filecount} files, ${Math.round(summary.size / 1024)}kB original size, ${Math.round(summary.gzipsize / 1024)}kB gzip size`);
console.log(`${commandLine_1.cmdLine.outputfile} ${Math.round(cppFile.length / 1024)}kB size`);
;