// Copyright 2017-2023 @polkadot/apps authors & contributors // SPDX-License-Identifier: Apache-2.0 import fs from 'node:fs'; import path from 'node:path'; import { zlibSync } from 'fflate/node'; import { formatNumber, stringCamelCase } from '@polkadot/util'; const WITH_ZLIB = false; const MAX_SIZE = 48 * 1024; const MIME = { gif: 'image/gif', jpeg: 'image/jpeg', png: 'image/png', svg: 'image/svg+xml' } const all = {}; const sizes = {}; for (let dir of ['extensions', 'external', 'chains', 'nodes']) { const sub = path.join('packages/apps-config/src/ui/logos', dir); const result = {}; fs .readdirSync(sub) .forEach((file) => { const full = path.join(sub, file); if (!['index.ts', '.DS_Store'].includes(file) && fs.lstatSync(full).isFile()) { const parts = file.split('.'); const ext = parts[parts.length - 1]; const mime = MIME[ext]; if (!mime) { throw new Error(`Unable to determine mime for ${file}`); } else { const data = `data:${mime};base64,${fs.readFileSync(full).toString('base64')}`; const compressed = Buffer.from(zlibSync(Buffer.from(data), { level: 9 })); const base64 = compressed.toString('base64'); const k = `${stringCamelCase(`${dir}_${parts.slice(0, parts.length - 1).join('_')}`)}${ext.toUpperCase()}`; const v = WITH_ZLIB ? `unz(';base64,${base64}', ${compressed.length}, ${data.length})` : `'${data}'`; result[k] = v; all[k] = v; sizes[k] = v.length; } } }); if (Object.keys(result).length) { let srcs = ''; for (let dir of ['endpoints', 'extensions', 'links']) { const srcroot = path.join('packages/apps-config/src', dir); fs .readdirSync(srcroot) .forEach((file) => { const full = path.join(srcroot, file); if (fs.lstatSync(full).isFile() && file.endsWith('.ts')) { srcs += fs.readFileSync(full).toString(); } }); } const notfound = Object .keys(result) .filter((k) => !srcs.includes(k)); if (notfound.length) { console.log('\n', notfound.length.toString().padStart(3), 'not referenced in', dir, '::\n\n\t', notfound.join(', '), '\n'); } fs.writeFileSync(path.join(sub, 'index.ts'), `// Copyright 2017-2023 @polkadot/apps-config authors & contributors // SPDX-License-Identifier: Apache-2.0 // do not edit // auto-generated by scripts/imgConvert.mjs ${ WITH_ZLIB ? "\nimport { unz } from '../../../util';\n" : '' } ${Object.keys(result).sort().map((k) => `export const ${k} = ${result[k]};`).join('\n')} `); } } const allKeys = Object.keys(all); const dupes = {}; allKeys.forEach((a) => { const d = allKeys.filter((b) => a !== b && all[a] === all[b] ); if (d.length) { dupes[a] = d; } }); if (Object.keys(dupes).length) { const dupeMsg = `${Object.keys(dupes).length.toString().padStart(3)} dupes found`; console.log('\n', dupeMsg, '::\n'); for (let [k, d] of Object.entries(dupes)) { console.log('\t', k.padStart(30), ' >> ', d.join(', ')); } throw new Error(`FATAL: ${dupeMsg}`); } const large = Object .entries(sizes) .sort((a, b) => b[1] - a[1]) .filter(([, v]) => v > MAX_SIZE); if (Object.keys(large).length) { console.log('\n', `${Object.keys(large).length.toString().padStart(3)} large images found ::\n`); large.forEach(([k, v]) => console.log('\t', k.padStart(30), formatNumber(v).padStart(15)) ); console.log(); }